From 52bcb81c2b13da5bc8303497caebfa25ed902253 Mon Sep 17 00:00:00 2001 From: Pietro Abate Date: Fri, 20 Mar 2009 14:09:38 +0100 Subject: Import xmlrpc-light_0.6.1.orig.tar.gz [dgit import orig xmlrpc-light_0.6.1.orig.tar.gz] --- LICENSE | 199 ++ META | 6 + Makefile | 18 + OCamlMakefile | 1154 ++++++ README.txt | 84 + XmlRpc.ml | 575 +++ XmlRpc.mli | 338 ++ XmlRpcBase64.ml | 138 + XmlRpcBase64.mli | 73 + XmlRpcDateTime.ml | 109 + XmlRpcDateTime.mli | 97 + XmlRpcServer.ml | 394 +++ XmlRpcServer.mli | 146 + doc/xmlrpc-light/html/XmlRpc.client.html | 124 + doc/xmlrpc-light/html/XmlRpc.html | 179 + doc/xmlrpc-light/html/XmlRpc.multicall.html | 100 + doc/xmlrpc-light/html/XmlRpcBase64.html | 72 + doc/xmlrpc-light/html/XmlRpcDateTime.html | 124 + doc/xmlrpc-light/html/XmlRpcServer.base.html | 98 + doc/xmlrpc-light/html/XmlRpcServer.cgi.html | 32 + doc/xmlrpc-light/html/XmlRpcServer.html | 82 + doc/xmlrpc-light/html/XmlRpcServer.netplex.html | 30 + doc/xmlrpc-light/html/XmlRpcServer.server.html | 34 + doc/xmlrpc-light/html/index.html | 50 + doc/xmlrpc-light/html/index_attributes.html | 92 + doc/xmlrpc-light/html/index_class_types.html | 30 + doc/xmlrpc-light/html/index_classes.html | 53 + doc/xmlrpc-light/html/index_exceptions.html | 49 + doc/xmlrpc-light/html/index_methods.html | 195 + doc/xmlrpc-light/html/index_module_types.html | 24 + doc/xmlrpc-light/html/index_modules.html | 45 + doc/xmlrpc-light/html/index_types.html | 62 + doc/xmlrpc-light/html/index_values.html | 215 ++ doc/xmlrpc-light/html/style.css | 33 + doc/xmlrpc-light/html/type_XmlRpc.client.html | 48 + doc/xmlrpc-light/html/type_XmlRpc.html | 105 + doc/xmlrpc-light/html/type_XmlRpc.multicall.html | 26 + doc/xmlrpc-light/html/type_XmlRpcBase64.html | 32 + doc/xmlrpc-light/html/type_XmlRpcDateTime.html | 39 + doc/xmlrpc-light/html/type_XmlRpcServer.base.html | 44 + doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html | 19 + doc/xmlrpc-light/html/type_XmlRpcServer.html | 90 + .../html/type_XmlRpcServer.netplex.html | 20 + .../html/type_XmlRpcServer.server.html | 44 + doc/xmlrpc-light/latex/doc.aux | 116 + doc/xmlrpc-light/latex/doc.dvi | Bin 0 -> 30196 bytes doc/xmlrpc-light/latex/doc.log | 128 + doc/xmlrpc-light/latex/doc.pdf | Bin 0 -> 119656 bytes doc/xmlrpc-light/latex/doc.ps | 3723 ++++++++++++++++++++ doc/xmlrpc-light/latex/doc.tex | 1551 ++++++++ doc/xmlrpc-light/latex/doc.toc | 17 + doc/xmlrpc-light/latex/ocamldoc.sty | 75 + examples/README.txt | 9 + examples/adder/Makefile | 9 + examples/adder/OCamlMakefile | 1154 ++++++ examples/adder/adder.conf | 43 + examples/adder/adder.ml | 37 + examples/adder/run.sh | 2 + examples/genclient/Makefile | 7 + examples/genclient/OCamlMakefile | 1154 ++++++ examples/genclient/genclient.ml | 266 ++ examples/ubigraph/Makefile | 7 + examples/ubigraph/OCamlMakefile | 1154 ++++++ examples/ubigraph/Ubigraph.ml | 169 + examples/ubigraph/Ubigraph.mli | 51 + examples/ubigraph/test.ml | 54 + examples/wordpress/Makefile | 7 + examples/wordpress/OCamlMakefile | 1154 ++++++ examples/wordpress/WordPress.ml | 746 ++++ examples/wordpress/WordPress.mli | 242 ++ examples/wordpress/test.ml | 34 + test/test.ml | 40 + test/test_base64.ml | 46 + test/test_datetime.ml | 198 ++ test/test_message.ml | 236 ++ test/test_serve.ml | 85 + test/test_value.ml | 284 ++ 77 files changed, 18319 insertions(+) create mode 100644 LICENSE create mode 100644 META create mode 100644 Makefile create mode 100644 OCamlMakefile create mode 100644 README.txt create mode 100644 XmlRpc.ml create mode 100644 XmlRpc.mli create mode 100644 XmlRpcBase64.ml create mode 100644 XmlRpcBase64.mli create mode 100644 XmlRpcDateTime.ml create mode 100644 XmlRpcDateTime.mli create mode 100644 XmlRpcServer.ml create mode 100644 XmlRpcServer.mli create mode 100644 doc/xmlrpc-light/html/XmlRpc.client.html create mode 100644 doc/xmlrpc-light/html/XmlRpc.html create mode 100644 doc/xmlrpc-light/html/XmlRpc.multicall.html create mode 100644 doc/xmlrpc-light/html/XmlRpcBase64.html create mode 100644 doc/xmlrpc-light/html/XmlRpcDateTime.html create mode 100644 doc/xmlrpc-light/html/XmlRpcServer.base.html create mode 100644 doc/xmlrpc-light/html/XmlRpcServer.cgi.html create mode 100644 doc/xmlrpc-light/html/XmlRpcServer.html create mode 100644 doc/xmlrpc-light/html/XmlRpcServer.netplex.html create mode 100644 doc/xmlrpc-light/html/XmlRpcServer.server.html create mode 100644 doc/xmlrpc-light/html/index.html create mode 100644 doc/xmlrpc-light/html/index_attributes.html create mode 100644 doc/xmlrpc-light/html/index_class_types.html create mode 100644 doc/xmlrpc-light/html/index_classes.html create mode 100644 doc/xmlrpc-light/html/index_exceptions.html create mode 100644 doc/xmlrpc-light/html/index_methods.html create mode 100644 doc/xmlrpc-light/html/index_module_types.html create mode 100644 doc/xmlrpc-light/html/index_modules.html create mode 100644 doc/xmlrpc-light/html/index_types.html create mode 100644 doc/xmlrpc-light/html/index_values.html create mode 100644 doc/xmlrpc-light/html/style.css create mode 100644 doc/xmlrpc-light/html/type_XmlRpc.client.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpc.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpc.multicall.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpcBase64.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpcDateTime.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpcServer.base.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpcServer.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html create mode 100644 doc/xmlrpc-light/html/type_XmlRpcServer.server.html create mode 100644 doc/xmlrpc-light/latex/doc.aux create mode 100644 doc/xmlrpc-light/latex/doc.dvi create mode 100644 doc/xmlrpc-light/latex/doc.log create mode 100644 doc/xmlrpc-light/latex/doc.pdf create mode 100644 doc/xmlrpc-light/latex/doc.ps create mode 100644 doc/xmlrpc-light/latex/doc.tex create mode 100644 doc/xmlrpc-light/latex/doc.toc create mode 100644 doc/xmlrpc-light/latex/ocamldoc.sty create mode 100644 examples/README.txt create mode 100644 examples/adder/Makefile create mode 100644 examples/adder/OCamlMakefile create mode 100644 examples/adder/adder.conf create mode 100644 examples/adder/adder.ml create mode 100755 examples/adder/run.sh create mode 100644 examples/genclient/Makefile create mode 100644 examples/genclient/OCamlMakefile create mode 100644 examples/genclient/genclient.ml create mode 100644 examples/ubigraph/Makefile create mode 100644 examples/ubigraph/OCamlMakefile create mode 100644 examples/ubigraph/Ubigraph.ml create mode 100644 examples/ubigraph/Ubigraph.mli create mode 100644 examples/ubigraph/test.ml create mode 100644 examples/wordpress/Makefile create mode 100644 examples/wordpress/OCamlMakefile create mode 100644 examples/wordpress/WordPress.ml create mode 100644 examples/wordpress/WordPress.mli create mode 100644 examples/wordpress/test.ml create mode 100644 test/test.ml create mode 100644 test/test_base64.ml create mode 100644 test/test_datetime.ml create mode 100644 test/test_message.ml create mode 100644 test/test_serve.ml create mode 100644 test/test_value.ml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..256edef --- /dev/null +++ b/LICENSE @@ -0,0 +1,199 @@ +The Library is distributed under the terms of the GNU Library General +Public License version 2 (included below). + +As a special exception to the GNU Library General Public License, you +may link, statically or dynamically, a "work that uses the Library" +with a publicly distributed version of the Library to produce an +executable file containing portions of the Library, and distribute +that executable file under terms of your choice, without any of the +additional requirements listed in clause 6 of the GNU Library General +Public License. By "a publicly distributed version of the Library", +we mean either the unmodified Library as distributed, or a +modified version of the Library that is distributed under the +conditions defined in clause 3 of the GNU Library General Public +License. This exception does not however invalidate any other reasons +why the executable file might be covered by the GNU Library General +Public License. + +------------ + +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[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. + + +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. + + +one line to give the library's name and an idea of what it does. +Copyright (C) year name of author + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! diff --git a/META b/META new file mode 100644 index 0000000..9e153c9 --- /dev/null +++ b/META @@ -0,0 +1,6 @@ +name = "xmlrpc-light" +version = "0.6.1" +description = "XML-RPC client based on Xml-Light" +requires = "xml-light,netclient,nethttpd-for-netcgi2" +archive(byte) = "xmlrpc-light.cma" +archive(native) = "xmlrpc-light.cmxa" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e9f50e6 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +OCAMLMAKEFILE = OCamlMakefile + +RESULT = xmlrpc-light +SOURCES = XmlRpcBase64.mli XmlRpcBase64.ml XmlRpcDateTime.mli XmlRpcDateTime.ml XmlRpc.mli XmlRpc.ml XmlRpcServer.mli XmlRpcServer.ml +PACKS = xml-light,netclient,nethttpd-for-netcgi2 +LIBINSTALL_FILES = XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi xmlrpc-light.cma xmlrpc-light.cmxa xmlrpc-light.a +OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd-for-netcgi2 +DOC_FILES = XmlRpc.mli XmlRpcServer.mli XmlRpcDateTime.mli XmlRpcBase64.mli + +all: native-code-library byte-code-library +install: libinstall +uninstall: libuninstall + +.PHONY: test +test: byte-code-library + ocaml test/test.ml + +include $(OCAMLMAKEFILE) diff --git a/OCamlMakefile b/OCamlMakefile new file mode 100644 index 0000000..9955029 --- /dev/null +++ b/OCamlMakefile @@ -0,0 +1,1154 @@ +########################################################################### +# OCamlMakefile +# Copyright (C) 1999-2004 Markus Mottl +# +# For updates see: +# http://www.ocaml.info/home/ocaml_sources.html +# +# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $ +# +########################################################################### + +# Modified by damien for .glade.ml compilation + +# Set these variables to the names of the sources to be processed and +# the result variable. Order matters during linkage! + +ifndef SOURCES + SOURCES := foo.ml +endif +export SOURCES + +ifndef RES_CLIB_SUF + RES_CLIB_SUF := _stubs +endif +export RES_CLIB_SUF + +ifndef RESULT + RESULT := foo +endif +export RESULT + +export LIB_PACK_NAME + +ifndef DOC_FILES + DOC_FILES := $(filter %.mli, $(SOURCES)) +endif +export DOC_FILES + +export BCSUFFIX +export NCSUFFIX + +ifndef TOPSUFFIX + TOPSUFFIX := .top +endif +export TOPSUFFIX + +# Eventually set include- and library-paths, libraries to link, +# additional compilation-, link- and ocamlyacc-flags +# Path- and library information needs not be written with "-I" and such... +# Define THREADS if you need it, otherwise leave it unset (same for +# USE_CAMLP4)! + +export THREADS +export VMTHREADS +export ANNOTATE +export USE_CAMLP4 + +export INCDIRS +export LIBDIRS +export EXTLIBDIRS +export RESULTDEPS +export OCAML_DEFAULT_DIRS + +export LIBS +export CLIBS + +export OCAMLFLAGS +export OCAMLNCFLAGS +export OCAMLBCFLAGS + +export OCAMLLDFLAGS +export OCAMLNLDFLAGS +export OCAMLBLDFLAGS + +ifndef OCAMLCPFLAGS + OCAMLCPFLAGS := a +endif + +export OCAMLCPFLAGS + +export PPFLAGS + +export YFLAGS +export IDLFLAGS + +export OCAMLDOCFLAGS + +export OCAMLFIND_INSTFLAGS + +export DVIPSFLAGS + +export STATIC + +# Add a list of optional trash files that should be deleted by "make clean" +export TRASH + +#################### variables depending on your OCaml-installation + +ifdef MINGW + export MINGW + WIN32 := 1 + CFLAGS_WIN32 := -mno-cygwin +endif +ifdef MSVC + export MSVC + WIN32 := 1 + ifndef STATIC + CPPFLAGS_WIN32 := -DCAML_DLL + endif + CFLAGS_WIN32 += -nologo + EXT_OBJ := obj + EXT_LIB := lib + ifeq ($(CC),gcc) + # work around GNU Make default value + ifdef THREADS + CC := cl -MT + else + CC := cl + endif + endif + ifeq ($(CXX),g++) + # work around GNU Make default value + CXX := $(CC) + endif + CFLAG_O := -Fo +endif +ifdef WIN32 + EXT_CXX := cpp + EXE := .exe +endif + +ifndef EXT_OBJ + EXT_OBJ := o +endif +ifndef EXT_LIB + EXT_LIB := a +endif +ifndef EXT_CXX + EXT_CXX := cc +endif +ifndef EXE + EXE := # empty +endif +ifndef CFLAG_O + CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! +endif + +export CC +export CXX +export CFLAGS +export CXXFLAGS +export LDFLAGS +export CPPFLAGS + +ifndef RPATH_FLAG + RPATH_FLAG := -R +endif +export RPATH_FLAG + +ifndef MSVC +ifndef PIC_CFLAGS + PIC_CFLAGS := -fPIC +endif +ifndef PIC_CPPFLAGS + PIC_CPPFLAGS := -DPIC +endif +endif + +export PIC_CFLAGS +export PIC_CPPFLAGS + +BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) +NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) +TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) + +ifndef OCAMLFIND + OCAMLFIND := ocamlfind +endif +export OCAMLFIND + +ifndef OCAMLC + OCAMLC := ocamlc +endif +export OCAMLC + +ifndef OCAMLOPT + OCAMLOPT := ocamlopt +endif +export OCAMLOPT + +ifndef OCAMLMKTOP + OCAMLMKTOP := ocamlmktop +endif +export OCAMLMKTOP + +ifndef OCAMLCP + OCAMLCP := ocamlcp +endif +export OCAMLCP + +ifndef OCAMLDEP + OCAMLDEP := ocamldep +endif +export OCAMLDEP + +ifndef OCAMLLEX + OCAMLLEX := ocamllex +endif +export OCAMLLEX + +ifndef OCAMLYACC + OCAMLYACC := ocamlyacc +endif +export OCAMLYACC + +ifndef OCAMLMKLIB + OCAMLMKLIB := ocamlmklib +endif +export OCAMLMKLIB + +ifndef OCAML_GLADECC + OCAML_GLADECC := lablgladecc2 +endif +export OCAML_GLADECC + +ifndef OCAML_GLADECC_FLAGS + OCAML_GLADECC_FLAGS := +endif +export OCAML_GLADECC_FLAGS + +ifndef CAMELEON_REPORT + CAMELEON_REPORT := report +endif +export CAMELEON_REPORT + +ifndef CAMELEON_REPORT_FLAGS + CAMELEON_REPORT_FLAGS := +endif +export CAMELEON_REPORT_FLAGS + +ifndef CAMELEON_ZOGGY + CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo +endif +export CAMELEON_ZOGGY + +ifndef CAMELEON_ZOGGY_FLAGS + CAMELEON_ZOGGY_FLAGS := +endif +export CAMELEON_ZOGGY_FLAGS + +ifndef OXRIDL + OXRIDL := oxridl +endif +export OXRIDL + +ifndef CAMLIDL + CAMLIDL := camlidl +endif +export CAMLIDL + +ifndef CAMLIDLDLL + CAMLIDLDLL := camlidldll +endif +export CAMLIDLDLL + +ifndef NOIDLHEADER + MAYBE_IDL_HEADER := -header +endif +export NOIDLHEADER + +export NO_CUSTOM + +ifndef CAMLP4 + CAMLP4 := camlp4 +endif +export CAMLP4 + +ifndef REAL_OCAMLFIND + ifdef PACKS + ifndef CREATE_LIB + ifdef THREADS + PACKS += threads + endif + endif + empty := + space := $(empty) $(empty) + comma := , + ifdef PREDS + PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) + PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) + OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) + # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) + OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + else + OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) + OCAML_DEP_PACKAGES := + endif + OCAML_FIND_LINKPKG := -linkpkg + REAL_OCAMLFIND := $(OCAMLFIND) + endif +endif + +export OCAML_FIND_PACKAGES +export OCAML_DEP_PACKAGES +export OCAML_FIND_LINKPKG +export REAL_OCAMLFIND + +ifndef OCAMLDOC + OCAMLDOC := ocamldoc +endif +export OCAMLDOC + +ifndef LATEX + LATEX := latex +endif +export LATEX + +ifndef DVIPS + DVIPS := dvips +endif +export DVIPS + +ifndef PS2PDF + PS2PDF := ps2pdf +endif +export PS2PDF + +ifndef OCAMLMAKEFILE + OCAMLMAKEFILE := OCamlMakefile +endif +export OCAMLMAKEFILE + +ifndef OCAMLLIBPATH + OCAMLLIBPATH := \ + $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) +endif +export OCAMLLIBPATH + +ifndef OCAML_LIB_INSTALL + OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib +endif +export OCAML_LIB_INSTALL + +########################################################################### + +#################### change following sections only if +#################### you know what you are doing! + +# delete target files when a build command fails +.PHONY: .DELETE_ON_ERROR +.DELETE_ON_ERROR: + +# for pedants using "--warn-undefined-variables" +export MAYBE_IDL +export REAL_RESULT +export CAMLIDLFLAGS +export THREAD_FLAG +export RES_CLIB +export MAKEDLL +export ANNOT_FLAG +export C_OXRIDL +export SUBPROJS +export CFLAGS_WIN32 +export CPPFLAGS_WIN32 + +INCFLAGS := + +SHELL := /bin/sh + +MLDEPDIR := ._d +BCDIDIR := ._bcdi +NCDIDIR := ._ncdi + +FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade + +FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) +SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) + +FILTERED_REP := $(filter %.rep, $(FILTERED)) +DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) +AUTO_REP := $(FILTERED_REP:.rep=.ml) + +FILTERED_ZOG := $(filter %.zog, $(FILTERED)) +DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) +AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) + +FILTERED_GLADE := $(filter %.glade, $(FILTERED)) +DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) +AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) + +FILTERED_ML := $(filter %.ml, $(FILTERED)) +DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) + +FILTERED_MLI := $(filter %.mli, $(FILTERED)) +DEP_MLI := $(FILTERED_MLI:.mli=.di) + +FILTERED_MLL := $(filter %.mll, $(FILTERED)) +DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) +AUTO_MLL := $(FILTERED_MLL:.mll=.ml) + +FILTERED_MLY := $(filter %.mly, $(FILTERED)) +DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) +AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) + +FILTERED_IDL := $(filter %.idl, $(FILTERED)) +DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) +C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) +ifndef NOIDLHEADER + C_IDL += $(FILTERED_IDL:.idl=.h) +endif +OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) +AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) + +FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) +DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) +AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) + +FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED)) +OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) +OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) + +PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) + +ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) + +MLDEPS := $(filter %.d, $(ALL_DEPS)) +MLIDEPS := $(filter %.di, $(ALL_DEPS)) +BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) +NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) + +ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) + +IMPLO_INTF := $(ALLML:%.mli=%.mli.__) +IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ + $(basename $(file)).cmi $(basename $(file)).cmo) +IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) +IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) + +IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) + +INTF := $(filter %.cmi, $(IMPLO_INTF)) +IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) +IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) +IMPL_ASM := $(IMPL_CMO:.cmo=.asm) +IMPL_S := $(IMPL_CMO:.cmo=.s) + +OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) +OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) + +EXECS := $(addsuffix $(EXE), \ + $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) +ifdef WIN32 + EXECS += $(BCRESULT).dll $(NCRESULT).dll +endif + +CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) +ifneq ($(strip $(OBJ_LINK)),) + RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) +endif + +ifdef WIN32 +DLLSONAME := $(CLIB_BASE).dll +else +DLLSONAME := dll$(CLIB_BASE).so +endif + +NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ + $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ + $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ + $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ + $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ + $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o + +ifndef STATIC + NONEXECS += $(DLLSONAME) +endif + +ifndef LIBINSTALL_FILES + LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ + $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + LIBINSTALL_FILES += $(DLLSONAME) + endif + endif +endif + +export LIBINSTALL_FILES + +ifdef WIN32 + # some extra stuff is created while linking DLLs + NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib +endif + +TARGETS := $(EXECS) $(NONEXECS) + +# If there are IDL-files +ifneq ($(strip $(FILTERED_IDL)),) + MAYBE_IDL := -cclib -lcamlidl +endif + +ifdef USE_CAMLP4 + CAMLP4PATH := \ + $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) + INCFLAGS := -I $(CAMLP4PATH) + CINCFLAGS := -I$(CAMLP4PATH) +endif + +DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) +INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) +CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) + +ifndef MSVC +CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ + $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-L%) +endif + +ifndef PROFILING + INTF_OCAMLC := $(OCAMLC) +else + ifndef THREADS + INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) + else + # OCaml does not support profiling byte code + # with threads (yet), therefore we force an error. + ifndef REAL_OCAMLC + $(error Profiling of multithreaded byte code not yet supported by OCaml) + endif + INTF_OCAMLC := $(OCAMLC) + endif +endif + +ifndef MSVC +COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ + $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ + $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-ccopt -L%) +else +COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ + $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ + $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " +endif + +CLIBS_OPTS := $(CLIBS:%=-cclib -l%) +ifdef MSVC + ifndef STATIC + # MSVC libraries do not have 'lib' prefix + CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) + endif +endif + +ifneq ($(strip $(OBJ_LINK)),) + ifdef CREATE_LIB + OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) + else + OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) + endif +else + OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) +endif + +# If we have to make byte-code +ifndef REAL_OCAMLC + BYTE_OCAML := y + + # EXTRADEPS is added dependencies we have to insert for all + # executable files we generate. Ideally it should be all of the + # libraries we use, but it's hard to find the ones that get searched on + # the path since I don't know the paths built into the compiler, so + # just include the ones with slashes in their names. + EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) + + REAL_OCAMLC := $(INTF_OCAMLC) + + REAL_IMPL := $(IMPL_CMO) + REAL_IMPL_INTF := $(IMPLO_INTF) + IMPL_SUF := .cmo + + DEPFLAGS := + MAKE_DEPS := $(MLDEPS) $(BCDEPIS) + + ifdef CREATE_LIB + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + MAKEDLL := $(DLLSONAME) + ALL_LDFLAGS := -dllib $(DLLSONAME) + endif + endif + endif + + ifndef NO_CUSTOM + ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" "" + ALL_LDFLAGS += -custom + endif + endif + + ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ + $(COMMON_LDFLAGS) $(LIBS:%=%.cma) + CAMLIDLDLLFLAGS := + + ifdef THREADS + ifdef VMTHREADS + THREAD_FLAG := -vmthread + else + THREAD_FLAG := -thread + endif + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) + endif + endif + endif + +# we have to make native-code +else + EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + ifndef PROFILING + SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) + PLDFLAGS := + else + SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) + PLDFLAGS := -p + endif + + REAL_IMPL := $(IMPL_CMX) + REAL_IMPL_INTF := $(IMPLX_INTF) + IMPL_SUF := .cmx + + override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) + + DEPFLAGS := -native + MAKE_DEPS := $(MLDEPS) $(NCDEPIS) + + ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ + $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) + CAMLIDLDLLFLAGS := -opt + + ifndef CREATE_LIB + ALL_LDFLAGS += $(LIBS:%=%.cmxa) + else + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + endif + + ifdef THREADS + THREAD_FLAG := -thread + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) + endif + endif + endif +endif + +export MAKE_DEPS + +ifdef ANNOTATE + ANNOT_FLAG := -dtypes +else +endif + +ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ + $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) + +ifdef make_deps + -include $(MAKE_DEPS) + PRE_TARGETS := +endif + +########################################################################### +# USER RULES + +# Call "OCamlMakefile QUIET=" to get rid of all of the @'s. +QUIET=@ + +# generates byte-code (default) +byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bc: byte-code + +byte-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bcnl: byte-code-nolink + +top: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes + +# generates native-code + +native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +nc: native-code + +native-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncnl: native-code-nolink + +# generates byte-code libraries +byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" \ + CREATE_LIB=yes \ + make_deps=yes +bcl: byte-code-library + +# generates native-code libraries +native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +ncl: native-code-library + +ifdef WIN32 +# generates byte-code dll +byte-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).dll \ + REAL_RESULT="$(BCRESULT)" \ + make_deps=yes +bcd: byte-code-dll + +# generates native-code dll +native-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).dll \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncd: native-code-dll +endif + +# generates byte-code with debugging information +debug-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dc: debug-code + +debug-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcnl: debug-code-nolink + +# generates byte-code libraries with debugging information +debug-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + CREATE_LIB=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcl: debug-code-library + +# generates byte-code for profiling +profiling-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + make_deps=yes +pbc: profiling-byte-code + +# generates native-code + +profiling-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PROFILING="y" \ + make_deps=yes +pnc: profiling-native-code + +# generates byte-code libraries +profiling-byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + CREATE_LIB=yes \ + make_deps=yes +pbcl: profiling-byte-code-library + +# generates native-code libraries +profiling-native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" PROFILING="y" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +pncl: profiling-native-code-library + +# packs byte-code objects +pack-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ + REAL_RESULT="$(BCRESULT)" \ + PACK_LIB=yes make_deps=yes +pabc: pack-byte-code + +# packs native-code objects +pack-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(NCRESULT).cmx $(NCRESULT).o \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PACK_LIB=yes make_deps=yes +panc: pack-native-code + +# generates HTML-documentation +htdoc: doc/$(RESULT)/html + +# generates Latex-documentation +ladoc: doc/$(RESULT)/latex + +# generates PostScript-documentation +psdoc: doc/$(RESULT)/latex/doc.ps + +# generates PDF-documentation +pdfdoc: doc/$(RESULT)/latex/doc.pdf + +# generates all supported forms of documentation +doc: htdoc ladoc psdoc pdfdoc + +########################################################################### +# LOW LEVEL RULES + +$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) + +ifdef WIN32 +$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) + $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ + -o $@ $(REAL_IMPL) +endif + +%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ + .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \ + .rep .zog .glade + +ifndef STATIC +ifdef MINGW +$(DLLSONAME): $(OBJ_LINK) + $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ + -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ + $(OCAMLLIBPATH)/ocamlrun.a \ + -Wl,--export-all-symbols \ + -Wl,--no-whole-archive +else +ifdef MSVC +$(DLLSONAME): $(OBJ_LINK) + link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ + $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ + $(OCAMLLIBPATH)/ocamlrun.lib + +else +$(DLLSONAME): $(OBJ_LINK) + $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ + -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \ + $(OCAMLMKLIB_FLAGS) +endif +endif +endif + +ifndef LIB_PACK_NAME +$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL) + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL) +else +ifdef BYTE_OCAML +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL) +else +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL) +endif + +$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx +endif + +$(RES_CLIB): $(OBJ_LINK) +ifndef MSVC + ifneq ($(strip $(OBJ_LINK)),) + $(AR) rcs $@ $(OBJ_LINK) + endif +else + ifneq ($(strip $(OBJ_LINK)),) + lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) + endif +endif + +.mli.cmi: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + fi + +.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ + fi + +ifdef PACK_LIB +$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(REAL_IMPL) +endif + +.PRECIOUS: %.ml +%.ml: %.mll + $(OCAMLLEX) $< + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.mly + $(OCAMLYACC) $(YFLAGS) $< + $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ + if [ ! -z "$$pp" ]; then \ + mv $*.ml $*.ml.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ + cat $*.ml.temporary >> $*.ml; \ + rm $*.ml.temporary; \ + mv $*.mli $*.mli.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ + cat $*.mli.temporary >> $*.mli; \ + rm $*.mli.temporary; \ + fi + + +.PRECIOUS: %.ml +%.ml: %.rep + $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< + +.PRECIOUS: %.ml +%.ml: %.zog + $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ + +.PRECIOUS: %.ml +%.ml: %.glade + $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.oxridl + $(OXRIDL) $< + +.PRECIOUS: %.ml %.mli %_stubs.c %.h +%.ml %.mli %_stubs.c %.h: %.idl + $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ + $(CAMLIDLFLAGS) $< + $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi + +.c.$(EXT_OBJ): + $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ + $(CPPFLAGS) $(CPPFLAGS_WIN32) \ + $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< + +.$(EXT_CXX).$(EXT_OBJ): + $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ + -I'$(OCAMLLIBPATH)' \ + $< $(CFLAG_O)$@ + +$(MLDEPDIR)/%.d: %.ml + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +doc/$(RESULT)/html: $(DOC_FILES) + mkdir -p $@ + find $@ -maxdepth 1 -type f -delete + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + fi + +doc/$(RESULT)/latex: $(DOC_FILES) + mkdir -p $@ + find $@ -maxdepth 1 -type f -delete + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ + $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ + -o $@/doc.tex; \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + fi + +doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex + cd doc/$(RESULT)/latex && \ + $(LATEX) doc.tex && \ + $(LATEX) doc.tex && \ + $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) + +doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps + cd doc/$(RESULT)/latex && $(PS2PDF) $( `String "Hello!"); + server#run () + +See the Ocamldoc-generated documentation in the "doc" directory for more +details. + +Contributors: +------------- + +Dave Benjamin (dave@ramenlabs.com) + +License: +-------- + +See LICENSE diff --git a/XmlRpc.ml b/XmlRpc.ml new file mode 100644 index 0000000..b398318 --- /dev/null +++ b/XmlRpc.ml @@ -0,0 +1,575 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +let version = "0.6.1" + +exception Error of (int * string) + +type value = + [ `Array of value list + | `Binary of string + | `Boolean of bool + | `DateTime of XmlRpcDateTime.t + | `Double of float + | `Int of int + | `Int32 of int32 + | `Nil + | `String of string + | `Struct of (string * value) list ] + +type message = + | MethodCall of (string * value list) + | MethodResponse of value + | Fault of (int * string) + +let safe_map f xs = + List.rev (List.rev_map f xs) + +let invalid_xml () = + raise (Error (-32700, "parse error. not well formed")) + +let invalid_xmlrpc () = + raise (Error (-32600, + "server error. invalid xml-rpc. not conforming to spec")) + +let rec dump = function + | `String data -> data + | `Int data -> string_of_int data + | `Int32 data -> Int32.to_string data + | `Nil -> "(nil)" + | `Boolean data -> if data then "true" else "false" + | `Double data -> string_of_float data + | `Binary data -> data + | `Array data -> "[" ^ (String.concat ", " + (safe_map dump data)) ^ "]" + | `Struct data -> "{" ^ (String.concat ", " + (safe_map + (fun (n, v) -> + n ^ ": " ^ (dump v)) + data)) ^ "}" + | `DateTime data -> XmlRpcDateTime.to_string data + +let rec xml_element_of_value + ?(base64_encoder=fun s -> XmlRpcBase64.str_encode s) + ?(datetime_encoder=XmlRpcDateTime.to_string) + value = + Xml.Element + (match value with + | `String data -> ("string", [], [Xml.PCData data]) + | `Int data -> ("int", [], [Xml.PCData (string_of_int data)]) + | `Int32 data -> ("int", [], [Xml.PCData (Int32.to_string data)]) + | `Nil -> ("nil", [], []) + | `Boolean data -> ("boolean", [], [Xml.PCData + (if data then "1" else "0")]) + | `Double data -> ("double", [], [Xml.PCData (string_of_float data)]) + | `Binary data -> ("base64", [], [Xml.PCData (base64_encoder data)]) + | `Array data -> + ("array", [], [Xml.Element + ("data", [], + safe_map + (fun item -> + Xml.Element ("value", [], + [xml_element_of_value + ~base64_encoder + ~datetime_encoder + item])) + data)]) + | `Struct data -> + ("struct", [], + safe_map + (fun (name, value) -> + Xml.Element + ("member", [], + [Xml.Element ("name", [], [Xml.PCData name]); + Xml.Element ("value", [], + [xml_element_of_value + ~base64_encoder + ~datetime_encoder + value])])) + data) + | `DateTime data -> + ("dateTime.iso8601", [], + [Xml.PCData (datetime_encoder data)])) + +let rec value_of_xml_element + ?(base64_decoder=fun s -> XmlRpcBase64.str_decode s) + ?(datetime_decoder=XmlRpcDateTime.of_string) + = function + | Xml.Element ("string", [], []) -> `String "" + | Xml.Element ("string", [], [Xml.PCData data]) -> `String data + | Xml.Element ("int", [], [Xml.PCData data]) + | Xml.Element ("i4", [], [Xml.PCData data]) -> + (try `Int (int_of_string data) + with Failure "int_of_string" -> `Int32 (Int32.of_string data)) + | Xml.Element ("nil", [], []) -> `Nil + | Xml.Element ("boolean", [], [Xml.PCData data]) -> + `Boolean (data <> "0") + | Xml.Element ("double", [], [Xml.PCData data]) -> + `Double (float_of_string data) + | Xml.Element ("base64", [], []) -> `Binary "" + | Xml.Element ("base64", [], [Xml.PCData data]) -> + `Binary (base64_decoder data) + | Xml.Element ("array", [], [Xml.Element ("data", [], data)]) -> + `Array + (safe_map + (function + | Xml.Element ("value", [], []) -> + (* Empty value is assumed to be an empty string. *) + `String "" + | Xml.Element ("value", [], [value]) -> + value_of_xml_element + ~base64_decoder + ~datetime_decoder + value + | _ -> invalid_xmlrpc ()) + data) + | Xml.Element ("struct", [], members) -> + `Struct + (safe_map + (function + | Xml.Element ("member", [], + [Xml.Element ("name", [], []); + Xml.Element ("value", [], [])]) -> + (* Empty value is assumed to be an empty string. *) + ("", `String "") + | Xml.Element ("member", [], + [Xml.Element ("name", [], [Xml.PCData name]); + Xml.Element ("value", [], [])]) -> + (* Empty value is assumed to be an empty string. *) + (name, `String "") + | Xml.Element ("member", [], + [Xml.Element ("name", [], []); + Xml.Element ("value", [], [value])]) -> + ("", + value_of_xml_element + ~base64_decoder + ~datetime_decoder + value) + | Xml.Element ("member", [], + [Xml.Element ("name", [], [Xml.PCData name]); + Xml.Element ("value", [], [value])]) -> + (name, + value_of_xml_element + ~base64_decoder + ~datetime_decoder + value) + | _ -> invalid_xmlrpc ()) + members) + | Xml.Element ("dateTime.iso8601", [], [Xml.PCData data]) + | Xml.Element ("dateTime:iso8601", [], [Xml.PCData data]) -> + (* The colon above is intentional. (See fix_dotted_tags.) *) + `DateTime (datetime_decoder data) + | Xml.PCData data -> + (* Untyped data is assumed to be a string. *) + `String data + | _ -> invalid_xmlrpc () + +let xml_element_of_message + ?(base64_encoder=fun s -> XmlRpcBase64.str_encode s) + ?(datetime_encoder=XmlRpcDateTime.to_string) + message = + let make_param param = + Xml.Element ("param", [], + [Xml.Element ("value", [], + [xml_element_of_value + ~base64_encoder + ~datetime_encoder + param])]) in + let make_fault code string = + Xml.Element ("value", [], + [xml_element_of_value ~base64_encoder ~datetime_encoder + (`Struct ["faultCode", `Int code; + "faultString", `String string])]) in + match message with + | MethodCall (name, params) -> + Xml.Element + ("methodCall", [], + [Xml.Element ("methodName", [], [Xml.PCData name]); + Xml.Element ("params", [], safe_map make_param params)]) + | MethodResponse value -> + Xml.Element + ("methodResponse", [], + [Xml.Element ("params", [], [make_param value])]) + | Fault (code, string) -> + Xml.Element ("methodResponse", [], + [Xml.Element ("fault", [], [make_fault code string])]) + +let message_of_xml_element + ?(base64_decoder=fun s -> XmlRpcBase64.str_decode s) + ?(datetime_decoder=XmlRpcDateTime.of_string) + xml_element = + let parse_params params = + safe_map + (function + | Xml.Element ("param", [], [Xml.Element ("value", [], [])]) -> + (* Empty value is assumed to be an empty string. *) + `String "" + | Xml.Element ("param", [], + [Xml.Element ("value", [], [element])]) -> + value_of_xml_element ~base64_decoder ~datetime_decoder element + | _ -> invalid_xmlrpc ()) + params in + let parse_fault = function + | [Xml.Element ("value", [], [element])] -> + (match value_of_xml_element ~base64_decoder ~datetime_decoder element + with + | `Struct ["faultCode", `Int code; + "faultString", `String string] + | `Struct ["faultString", `String string; + "faultCode", `Int code] -> + (code, string) + | _ -> invalid_xmlrpc ()) + | _ -> invalid_xmlrpc () in + match xml_element with + | Xml.Element ("methodCall", [], + [Xml.Element ("methodName", [], [Xml.PCData name]); + Xml.Element ("params", [], params)]) -> + MethodCall (name, parse_params params) + | Xml.Element ("methodCall", [], + [Xml.Element ("methodName", [], [Xml.PCData name])]) -> + MethodCall (name, []) + | Xml.Element ("methodResponse", [], + [Xml.Element ("params", [], params)]) -> + MethodResponse (List.hd (parse_params params)) + | Xml.Element (_, [], [Xml.Element ("fault", [], fault)]) -> + Fault (parse_fault fault) + | _ -> invalid_xmlrpc () + +(* Workaround for Xml-Light, which doesn't like dots in tag names. *) +let fix_dotted_tags s = + let len = String.length s in + let in_tag = ref false in + for i = 0 to len - 1 do + match s.[i] with + | '<' -> in_tag := true + | '>' -> in_tag := false + | '.' when !in_tag -> s.[i] <- ':' + | _ -> () + done + +let pipe_process command data = + let (in_channel, out_channel) = Unix.open_process command in + try + output_string out_channel data; + close_out out_channel; + let buffer_size = 2048 in + let buffer = Buffer.create buffer_size in + let string = String.create buffer_size in + let chars_read = ref 1 in + while !chars_read <> 0 do + chars_read := input in_channel string 0 buffer_size; + Buffer.add_substring buffer string 0 !chars_read + done; + let status = Unix.close_process (in_channel, out_channel) in + (status, Buffer.contents buffer) + with e -> + ignore (Unix.close_process (in_channel, out_channel)); + raise e + +let shell_escape = + let unsafe = String.contains "\"$\\`" in + fun arg -> + let buf = Buffer.create 32 in + Buffer.add_char buf '"'; + String.iter + (fun c -> + if unsafe c then Buffer.add_char buf '\\'; + Buffer.add_char buf c) + arg; + Buffer.add_char buf '"'; + Buffer.contents buf + +class client + ?(debug=false) + ?(headers=[]) + ?(insecure_ssl=false) + ?(timeout=300.0) + ?(useragent="XmlRpc-Light/" ^ version) + url = +object (self) + val url = url + + val mutable debug = debug + val mutable headers = headers + val mutable insecure_ssl = insecure_ssl + val mutable timeout = timeout + val mutable useragent = useragent + + val mutable base64_encoder = fun s -> XmlRpcBase64.str_encode s + val mutable base64_decoder = fun s -> XmlRpcBase64.str_decode s + + val mutable datetime_encoder = XmlRpcDateTime.to_string + val mutable datetime_decoder = XmlRpcDateTime.of_string + + method url = + let parsed_url = Neturl.parse_url url in + try + let password = Neturl.url_password parsed_url in + Neturl.string_of_url + (Neturl.modify_url + ~password:(String.make (String.length password) '.') + parsed_url) + with Not_found -> + url + + method debug = debug + method headers = headers + method insecure_ssl = insecure_ssl + method timeout = timeout + method useragent = useragent + + method set_debug debug' = debug <- debug' + method set_headers headers' = headers <- headers' + method set_insecure_ssl insecure_ssl' = insecure_ssl <- insecure_ssl' + method set_timeout timeout' = timeout <- timeout' + method set_useragent useragent' = useragent <- useragent' + + method set_base64_encoder f = base64_encoder <- f + method set_base64_decoder f = base64_decoder <- f + + method set_datetime_encoder f = datetime_encoder <- f + method set_datetime_decoder f = datetime_decoder <- f + + method call name params = + let xml_element = + xml_element_of_message + ~base64_encoder + ~datetime_encoder + (MethodCall (name, params)) in + + let xml = + "\n" + ^ Xml.to_string_fmt xml_element in + + if String.length url >= 5 && String.sub url 0 5 = "https" + then + begin + let command = + String.concat " " + (["curl"; + "--user-agent"; shell_escape useragent; + "--header"; "\"Content-Type: text/xml\""] + @ (List.flatten + (List.map + (fun (n, v) -> + ["--header"; shell_escape (n ^ ": " ^ v)]) + headers)) + @ ["--connect-timeout"; string_of_float timeout; + "--fail"; + if debug then "--verbose" else "--silent"; + if insecure_ssl then "--insecure" else ""; + "--data-binary"; "@-"; + shell_escape url]) in + + if debug then (prerr_endline command; prerr_endline xml); + let (status, contents) = pipe_process command xml in + + match status with + | Unix.WEXITED 0 -> + if debug then prerr_endline contents; + fix_dotted_tags contents; + (match (message_of_xml_element + ~base64_decoder + ~datetime_decoder + (Xml.parse_string contents)) + with + | MethodResponse value -> value + | Fault (code, string) -> raise (Error (code, string)) + | _ -> invalid_xmlrpc ()) + | Unix.WEXITED 22 -> + raise (Error (-32300, "transport error. client error")) + | Unix.WEXITED code -> + (if debug then Printf.eprintf "Received exit code %d\n" code); + raise (Error (-32300, "transport error. protocol error")) + | Unix.WSIGNALED _ + | Unix.WSTOPPED _ -> + raise (Error (-32300, "transport error. client error")) + end + else + begin + let parsed_url = Neturl.parse_url url in + let basic_auth = + try + Some (Neturl.url_user parsed_url, + Neturl.url_password parsed_url) + with Not_found -> + None in + let url = + Neturl.string_of_url + (Neturl.remove_from_url ~user:true ~password:true parsed_url) in + + let call = new Http_client.post_raw url xml in + call#set_req_header "User-Agent" useragent; + call#set_req_header "Content-Type" "text/xml"; + List.iter (fun (n, v) -> call#set_req_header n v) headers; + + begin + match basic_auth with + | Some (user, password) -> + call#set_req_header "Authorization" + ("Basic " ^ + Netencoding.Base64.encode (user ^ ":" ^ password)) + | None -> () + end; + + let pipeline = new Http_client.pipeline in + pipeline#set_proxy_from_environment (); + + let opt = pipeline#get_options in + pipeline#set_options + {opt with Http_client. + connection_timeout = timeout; + }; + + if debug then + begin + let opt = pipeline#get_options in + pipeline#set_options + {opt with Http_client. + verbose_status = true; + verbose_request_header = true; + verbose_response_header = true; + verbose_request_contents = true; + verbose_response_contents = true; + verbose_connection = true; + } + end; + + pipeline#add call; + pipeline#run (); + + match call#status with + | `Successful -> + let contents = call#get_resp_body () in + fix_dotted_tags contents; + (match (message_of_xml_element + ~base64_decoder + ~datetime_decoder + (Xml.parse_string contents)) + with + | MethodResponse value -> value + | Fault (code, string) -> raise (Error (code, string)) + | _ -> invalid_xmlrpc ()) + | `Client_error -> + raise (Error (-32300, ("transport error. client error. " + ^ (string_of_int + (call#response_status_code)) + ^ " " ^ call#response_status_text))) + | `Http_protocol_error e -> + raise (Error (-32300, "transport error. protocol error")) + | `Redirection -> + raise (Error (-32300, "transport error. redirected")) + | `Server_error -> + raise (Error (-32300, "transport error. server error")) + | `Unserved -> + assert false + end +end + +class multicall (client : client) = +object (self) + val client = client + val mutable queue = [] + val mutable executed = false + val mutable results = None + val counter = ref 0 + + method call name params = + if self#executed then failwith "multicall#call: already executed"; + let num = !counter in + incr counter; + queue <- (name, params) :: queue; + lazy (self#result num) + + method execute () = + if self#completed then failwith "multicall#execute: already completed"; + executed <- true; + let calls = List.rev queue in + let args = [`Array + (safe_map + (fun (name, params) -> + `Struct ["methodName", `String name; + "params", `Array params]) + calls)] in + match client#call "system.multicall" args with + | `Array values -> results <- Some (Array.of_list values) + | _ -> invalid_xmlrpc () + + method result num = + if not self#completed then self#execute (); + match results with + | Some values -> + (match values.(num) with + | `Array [v] -> v + | `Struct ["faultCode", `Int code; + "faultString", `String string] + | `Struct ["faultString", `String string; + "faultCode", `Int code] -> + raise (Error (code, string)) + | _ -> invalid_xmlrpc ()) + | None -> assert false + + method executed = executed + method completed = results <> None +end + +let default_error_handler e = + raise (Error (-32500, "application error. " ^ Printexc.to_string e)) + +let quiet_error_handler e = + raise e + +let serve_message ?(error_handler=default_error_handler) f message = + try + match message with + | MethodCall (name, params) -> + (try MethodResponse (f name params) with + | Error _ as e -> raise e + | e -> error_handler e) + | _ -> invalid_xmlrpc () + with Error (code, string) -> + Fault (code, string) + +let serve + ?(base64_encoder=fun s -> XmlRpcBase64.str_encode s) + ?(base64_decoder=fun s -> XmlRpcBase64.str_decode s) + ?(datetime_encoder=XmlRpcDateTime.to_string) + ?(datetime_decoder=XmlRpcDateTime.of_string) + ?(error_handler=default_error_handler) + f s = + fix_dotted_tags s; + try + begin + try + let message = + message_of_xml_element + ~base64_decoder + ~datetime_decoder + (Xml.parse_string s) in + let response = + xml_element_of_message + ~base64_encoder + ~datetime_encoder + (serve_message ~error_handler f message) in + Xml.to_string_fmt response + with Xml.Error _ -> + invalid_xml () + end + with Error (code, string) -> + Xml.to_string_fmt (xml_element_of_message (Fault (code, string))) diff --git a/XmlRpc.mli b/XmlRpc.mli new file mode 100644 index 0000000..e7ad56e --- /dev/null +++ b/XmlRpc.mli @@ -0,0 +1,338 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +(** XmlRpc Light. + + XmlRpc Light is a minimal XmlRpc library based on Xml Light and Ocamlnet. + + It provides a type for values, a client class with a simple calling + interface, and low-level tools that can be used to implement a server. + + {i (c) 2007-2009 Dave Benjamin} +*) + +(** Version of XmlRpc-Light as a string. *) +val version : string + +(** {2 High-level interface} *) + +(** Example: {[ + let rpc = new XmlRpc.client "http://localhost:8000" in + let result = rpc#call "echo" [`String "hello!"] in + print_endline (XmlRpc.dump result) ]} +*) + +(** Raised for all errors including XmlRpc faults (code, string). *) +exception Error of (int * string) + +(** Polymorphic variant type for XmlRpc values: + - [`Array]: An ordered list of values + - [`Binary]: A string containing binary data + - [`Boolean]: A boolean + - [`DateTime]: A date/time value + - [`Double]: A floating-point value + - [`Int]: An integer + - [`Int32]: A 32-bit integer + - [`Nil]: A null value + - [`String]: A string + - [`Struct]: An association list of (name, value) pairs + + Note that base64-encoding of [`Binary] values is done automatically. + You do not need to do the encoding yourself. +*) +type value = + [ `Array of value list + | `Binary of string + | `Boolean of bool + | `DateTime of XmlRpcDateTime.t + | `Double of float + | `Int of int + | `Int32 of int32 + | `Nil + | `String of string + | `Struct of (string * value) list ] + +(** Class for XmlRpc clients. Takes a single mandatory argument, [url]. + + If [url] is of the form "http://username:password@...", basic + authentication will be used. + + If [url] starts with "https", Curl will be used instead of Ocamlnet. + The "curl" command-line program must be in your path for this to work. + You can use the [insecure_ssl] setting to allow connections to servers + with self-signed certificates; by default this is false and certificates + must be valid. + + [timeout] can be used to specify the maximum amount of time + elapsed before a connection is cancelled. It defaults to 300.0 seconds. + + [headers] may contain an array of (name, value) pairs of additional + headers to send with each request. + + The [useragent] setting provides a convenient way to change the + User-Agent header, which defaults to "XmlRpc-Light/". + + The [debug] setting, if true, will enable verbose debugging output to + the standard error stream. +*) +class client : + ?debug:bool -> + ?headers:(string * string) list -> + ?insecure_ssl:bool -> + ?timeout:float -> + ?useragent:string -> + string -> +object + (** Url of the remote XmlRpc server. *) + val url : string + + (** If true, Xml messages will be printed to standard error. *) + val mutable debug : bool + + (** List of custom HTTP headers to send with each request. *) + val mutable headers : (string * string) list + + (** If true, SSL will be allowed even if the certificate is self-signed. *) + val mutable insecure_ssl : bool + + (** Maximum time to wait for a request to complete, in seconds. *) + val mutable timeout : float + + (** User-agent to send in request headers. *) + val mutable useragent : string + + (** Gets [url]. *) + method url : string + + (** Gets [debug]. *) + method debug : bool + + (** Sets [debug]. *) + method set_debug : bool -> unit + + (** Gets [headers]. *) + method headers : (string * string) list + + (** Sets [headers]. *) + method set_headers : (string * string) list -> unit + + (** Gets [insecure_ssl]. *) + method insecure_ssl : bool + + (** Sets [insecure_ssl]. *) + method set_insecure_ssl : bool -> unit + + (** Gets [timeout]. *) + method timeout : float + + (** Sets [timeout]. *) + method set_timeout : float -> unit + + (** Gets [useragent]. *) + method useragent : string + + (** Sets [useragent]. *) + method set_useragent : string -> unit + + (** Sets an alternate Base-64 binary encoding function. *) + method set_base64_encoder : (string -> string) -> unit + + (** Sets an alternate Base-64 binary decoding function. *) + method set_base64_decoder : (string -> string) -> unit + + (** Sets an alternate ISO-8601 date/time encoding function. *) + method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit + + (** Sets an alternate ISO-8601 date/time decoding function. *) + method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit + + (** [call name params] invokes an XmlRpc method and returns the result, + or raises {!XmlRpc.Error} on error. *) + method call : string -> value list -> value +end + +(** Convenience class for [system.multicall] calls. + + Instances take an {!XmlRpc.client} as an argument: {[ + # let mc = new XmlRpc.multicall client;; + val mc : XmlRpc.multicall = + ]} + The "call" method works like [client#call], but it returns a lazy + value: {[ + # let a = mc#call "demo.addTwoNumbers" [`Int 3; `Int 4];; + val a : XmlRpc.value Lazy.t = + # let b = mc#call "demo.addTwoNumbers" [`Int 42; `String "oh noes!"];; + val b : XmlRpc.value Lazy.t = + # let c = mc#call "demo.addTwoNumbers" [`Double 3.0; `Double 4.0];; + val c : XmlRpc.value Lazy.t = + ]} + At this point, the call has not been executed yet: {[ + # mc#executed;; + -- : bool = false + ]} + As soon as one of the return values is forced, the call is executed: {[ + # Lazy.force a;; + -- : XmlRpc.value = `Int 7 + # mc#executed;; + -- : bool = true + ]} + Once a call has been executed, this instance cannot be used to make any + further calls; instead, a new [multicall] instance must be created: {[ + # mc#call "demo.addTwoNumbers" [`Int 2; `Int 2];; + Exception: Failure "multicall#call: already executed". + ]} + If an XmlRpc fault occurred, the exception will be thrown when the lazy + value is forced: {[ + # Lazy.force b;; + Exception: XmlRpc.Error (-32602, "server error. invalid method parameters"). + ]} + This will not prevent further methods from executing successfully: {[ + # Lazy.force c;; + -- : XmlRpc.value = `Double 7. + ]} + It is possible for a [multicall] to be executed but not completed, for + example if a transport error occurs. Aside from catching the exception, + the [completed] property indicates if the call actually went through + or not: {[ + # mc#completed;; + -- : bool = true + ]} + It is not necessary to use lazy values. Instead, the call can be + executed explicitly, and the results can be retrieved by number: {[ + # let mc = new XmlRpc.multicall client;; + val mc : XmlRpc.multicall = + # ignore (mc#call "demo.addTwoNumbers" [`Int 2; `Int 2]);; + -- : unit = () + # ignore (mc#call "demo.addTwoNumbers" [`Int 3; `Int 3]);; + -- : unit = () + # mc#result 1;; + -- : XmlRpc.value = `Int 6 + ]} +*) +class multicall : client -> +object + (** Adds a call to this [multicall] instance. + If the call has already executed, the following exception will + be raised: + Failure "multicall#call: already executed". *) + method call : string -> value list -> value Lazy.t + + (** Forces the call to execute immediately. + If the call has already executed and completed successfully, the + following exception will be raised: + Failure "multicall#execute: already completed". *) + method execute : unit -> unit + + (** Returns a [multicall] result, executing the call if necessary. + The results are numbered starting with zero. *) + method result : int -> value + + (** True if the call has executed, whether or not it succeeded. *) + method executed : bool + + (** True of the call has executed and completed successfully. *) + method completed : bool +end + +(** {2 Utility functions} *) + +(** Converts an XmlRpc value to a human-readable string. *) +val dump : value -> string + +(** {2 Low-level interface} *) + +(** Type for XmlRpc messages. *) +type message = + | MethodCall of (string * value list) + | MethodResponse of value + | Fault of (int * string) + +(** Converts an Xml Light element to an XmlRpc message. *) +val message_of_xml_element : + ?base64_decoder:(string -> string) -> + ?datetime_decoder:(string -> XmlRpcDateTime.t) -> + Xml.xml -> message + +(** Converts an XmlRpc message to an Xml Light element. *) +val xml_element_of_message : + ?base64_encoder:(string -> string) -> + ?datetime_encoder:(XmlRpcDateTime.t -> string) -> + message -> Xml.xml + +(** Converts an Xml Light element to an XmlRpc value. *) +val value_of_xml_element : + ?base64_decoder:(string -> string) -> + ?datetime_decoder:(string -> XmlRpcDateTime.t) -> + Xml.xml -> value + +(** Converts an XmlRpc value to an Xml Light element. *) +val xml_element_of_value : + ?base64_encoder:(string -> string) -> + ?datetime_encoder:(XmlRpcDateTime.t -> string) -> + value -> Xml.xml + +(** {2 Server tools} *) + +(** Creates a function from string (Xml representing a [MethodCall]) to + string (Xml representing a [MethodResult] or [Fault]) given a function + of the form: ([name] -> [params] -> [result]), where [name] is the + name of the method, [params] is a list of parameter values, and + [result] is the result value. + + This function can be used to build many different kinds of XmlRpc + servers since it makes no assumptions about the network library + or other communications method used. + + If an exception other than {!XmlRpc.Error} occurs, the exception is + passed to [error_handler]. If [error_handler] returns a message, + the message will be used as the result. If an {!XmlRpc.Error} is + raised by either the main function or [error_handler], it will be + converted to an XmlRpc [Fault]. Any other exception raised by + [error_handler] is allowed to escape. + + For a full-featured, easy-to-use, network-capable server implementation, + see the {!XmlRpcServer} module. *) +val serve : + ?base64_encoder:(string -> string) -> + ?base64_decoder:(string -> string) -> + ?datetime_encoder:(XmlRpcDateTime.t -> string) -> + ?datetime_decoder:(string -> XmlRpcDateTime.t) -> + ?error_handler:(exn -> message) -> + (string -> value list -> value) -> string -> string + +(** Performs the same function as [serve], but operates on typed messages + instead of strings. *) +val serve_message : + ?error_handler:(exn -> message) -> + (string -> value list -> value) -> message -> message + +(** The default error handler for [serve]. + + This error handler catches all exceptions and converts them into + faults by wrapping them in [XmlRpc.Error]. *) +val default_error_handler : exn -> message + +(** A "quiet" error handler for [serve]. + + This error handler simply re-raises the exception. Use this if you + want exceptions to remain unhandled so that they will escape to the + error log. The client will receive a generic "transport error", + which is more secure since it does not reveal any information about + the specific exception that occurred. *) +val quiet_error_handler : exn -> message diff --git a/XmlRpcBase64.ml b/XmlRpcBase64.ml new file mode 100644 index 0000000..91c53a3 --- /dev/null +++ b/XmlRpcBase64.ml @@ -0,0 +1,138 @@ +(* + * XmlRpcBase64 - Base64 codec for XmlRpc + * Copyright (C) 2007-2009 Dave Benjamin + * Copyright (C) 2003 Nicolas Cannasse + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version, + * with the special exception on linking described in file LICENSE. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * This module is based on the ExtLib Base64 codec, written by + * Nicolas Cannasse, with the following modifications to enable + * compatibility with various XmlRpc implementations: + * + * - For encoding, output is padded with '=' to a multiple of four characters. + * - For decoding, the input characters '\r', '\n', and '=' are ignored. + * + * To avoid a dependency on ExtLib, this version uses OCaml's built-in Stream + * type instead of ExtLib's IO type. + * + * Original copyright: + * + * Base64 - Base64 codec + * Copyright (C) 2003 Nicolas Cannasse + *) + +exception Invalid_char +exception Invalid_table + +external unsafe_char_of_int : int -> char = "%identity" + +type encoding_table = char array +type decoding_table = int array + +let chars = [| + 'A';'B';'C';'D';'E';'F';'G';'H';'I';'J';'K';'L';'M';'N';'O';'P'; + 'Q';'R';'S';'T';'U';'V';'W';'X';'Y';'Z';'a';'b';'c';'d';'e';'f'; + 'g';'h';'i';'j';'k';'l';'m';'n';'o';'p';'q';'r';'s';'t';'u';'v'; + 'w';'x';'y';'z';'0';'1';'2';'3';'4';'5';'6';'7';'8';'9';'+';'/' + |] + +let make_decoding_table tbl = + if Array.length tbl <> 64 then raise Invalid_table; + let d = Array.make 256 (-1) in + for i = 0 to 63 do + Array.unsafe_set d (int_of_char (Array.unsafe_get tbl i)) i; + done; + d + +let inv_chars = make_decoding_table chars + +let encode ?(tbl=chars) strm = + if Array.length tbl <> 64 then raise Invalid_table; + let data = ref 0 in + let count = ref 0 in + let pad = ref None in + let rec next i = + if !count >= 6 + then + begin + count := !count - 6; + let d = (!data asr !count) land 63 in + Some (Array.unsafe_get tbl d) + end + else + begin + try + let c = int_of_char (Stream.next strm) in + data := (!data lsl 8) lor c; + count := !count + 2; + let d = (!data asr !count) land 63 in + Some (Array.unsafe_get tbl d) + with Stream.Failure -> + match !pad with + | Some 0 -> + None + | Some n -> + pad := Some (n - 1); + Some '=' + | None -> + if !count > 0 + then (pad := Some (3 - (i mod 4)); + let d = (!data lsl (6 - !count)) land 63 in + Some (Array.unsafe_get tbl d)) + else None + end in + Stream.from next + +let decode ?(tbl=inv_chars) strm = + if Array.length tbl <> 256 then raise Invalid_table; + let data = ref 0 in + let count = ref 0 in + let rec next i = + if !count >= 8 + then + begin + count := !count - 8; + let d = (!data asr !count) land 0xFF in + Some (unsafe_char_of_int d) + end + else + begin + try + match Stream.next strm with + | '\r' | '\n' | '=' -> + next i + | c -> + let c = int_of_char c in + let c = Array.unsafe_get tbl c in + if c = -1 then raise Invalid_char; + data := (!data lsl 6) lor c; + count := !count + 6; + next i + with Stream.Failure -> + None + end in + Stream.from next + +let string_of_stream stream = + let buffer = Buffer.create 16 in + Stream.iter (Buffer.add_char buffer) stream; + Buffer.contents buffer + +let str_encode ?(tbl=chars) s = + string_of_stream (encode ~tbl (Stream.of_string s)) + +let str_decode ?(tbl=inv_chars) s = + string_of_stream (decode ~tbl (Stream.of_string s)) diff --git a/XmlRpcBase64.mli b/XmlRpcBase64.mli new file mode 100644 index 0000000..1614d4c --- /dev/null +++ b/XmlRpcBase64.mli @@ -0,0 +1,73 @@ +(* + * XmlRpcBase64 - Base64 codec for XmlRpc + * Copyright (C) 2007-2009 Dave Benjamin + * Copyright (C) 2003 Nicolas Cannasse + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version, + * with the special exception on linking described in file LICENSE. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * This module is based on the ExtLib Base64 codec, written by + * Nicolas Cannasse, with the following modifications to enable + * compatibility with various XmlRpc implementations: + * + * - For encoding, output is padded with '=' to a multiple of four characters. + * - For decoding, the input characters '\r', '\n', and '=' are ignored. + * + * To avoid a dependency on ExtLib, this version uses OCaml's built-in Stream + * type instead of ExtLib's IO type. + * + * Original copyright: + * + * Base64 - Base64 codec + * Copyright (C) 2003 Nicolas Cannasse + *) + +(** Base64 codec. + + 8-bit characters are encoded into 6-bit ones using ASCII lookup tables. + Default tables maps 0..63 values on characters A-Z, a-z, 0-9, '+' and '/' + (in that order). +*) + +(** This exception is raised when reading an invalid character + from a base64 input. *) +exception Invalid_char + +(** This exception is raised if the encoding or decoding table + size is not correct. *) +exception Invalid_table + +(** An encoding table maps integers 0..63 to the corresponding char. *) +type encoding_table = char array + +(** A decoding table maps chars 0..255 to the corresponding 0..63 value + or -1 if the char is not accepted. *) +type decoding_table = int array + +(** Encode a string into Base64. *) +val str_encode : ?tbl:encoding_table -> string -> string + +(** Decode a string encoded into Base64, raise [Invalid_char] if a + character in the input string is not a valid one. *) +val str_decode : ?tbl:decoding_table -> string -> string + +(** Generic base64 encoding over a character stream. *) +val encode : ?tbl:encoding_table -> char Stream.t -> char Stream.t + +(** Generic base64 decoding over a character stream. *) +val decode : ?tbl:decoding_table -> char Stream.t -> char Stream.t + +(** Create a valid decoding table from an encoding one. *) +val make_decoding_table : encoding_table -> decoding_table diff --git a/XmlRpcDateTime.ml b/XmlRpcDateTime.ml new file mode 100644 index 0000000..d38d7b0 --- /dev/null +++ b/XmlRpcDateTime.ml @@ -0,0 +1,109 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +exception Parse_error of string + +type t = (int * int * int * int * int * int * int) + +let local_tz_offset () = + let time = Unix.time () in + let utc = fst (Unix.mktime (Unix.gmtime time)) in + int_of_float (time -. utc) / 60 + +let from_unixtm tm = + (tm.Unix.tm_year + 1900, + tm.Unix.tm_mon + 1, + tm.Unix.tm_mday, + tm.Unix.tm_hour, + tm.Unix.tm_min, + tm.Unix.tm_sec, + local_tz_offset ()) + +let from_unixtm_utc tm = + (tm.Unix.tm_year + 1900, + tm.Unix.tm_mon + 1, + tm.Unix.tm_mday, + tm.Unix.tm_hour, + tm.Unix.tm_min, + tm.Unix.tm_sec, + 0) + +let from_unixfloat time = from_unixtm (Unix.localtime time) +let from_unixfloat_utc time = from_unixtm_utc (Unix.localtime time) + +let to_unixfloat_utc (y, m, d, h, m', s, tz) = + fst (Unix.mktime {Unix.tm_year=y - 1900; + tm_mon=m - 1; + tm_mday=d; + tm_hour=h; + tm_min=m'; + tm_sec=s; + tm_wday=0; + tm_yday=0; + tm_isdst=false}) -. (float tz *. 60.0) + +let to_unixfloat dt = + to_unixfloat_utc dt +. (float (local_tz_offset ()) *. 60.0) + +let to_unixtm dt = Unix.localtime (to_unixfloat dt) +let to_unixtm_utc dt = Unix.localtime (to_unixfloat_utc dt) + +let now () = from_unixfloat (Unix.time ()) +let now_utc () = + from_unixfloat_utc (Unix.time () -. (float (local_tz_offset ()) *. 60.0)) + +let set_tz_offset offset dt = + let time = to_unixfloat_utc dt +. (float offset *. 60.0) in + match from_unixfloat_utc time + with (y, m, d, h, m', s, _) -> (y, m, d, h, m', s, offset) + +let fix_tz_offset offset dt = + match dt with (y, m, d, h, m', s, _) -> (y, m, d, h, m', s, offset) + +let compare a b = compare (to_unixfloat_utc a) (to_unixfloat_utc b) +let equal a b = (to_unixfloat_utc a) = (to_unixfloat_utc b) +let hash a = Hashtbl.hash (to_unixfloat_utc a) + +let string_of_tz_offset offset = + if offset = 0 then "" else + Printf.sprintf "%c%02d:%02d" + (if offset >= 0 then '+' else '-') + (abs (offset / 60)) + (abs (offset mod 60)) + +let tz_offset_of_string = function + | "" | "Z" -> 0 + | string -> + Scanf.sscanf string "%c%02d%_[:]%02d" + (fun sign hour min -> + min + hour * (if sign = '-' then -60 else 60)) + +let to_string (y, m, d, h, m', s, tz_offset) = + Printf.sprintf "%04d%02d%02dT%02d:%02d:%02d%s" + y m d h m' s (string_of_tz_offset tz_offset) + +let of_string string = + try + Scanf.sscanf string "%04d%_[-]%02d%_[-]%02d%_[T ]%02d:%02d:%02d%s" + (fun y m d h m' s tz -> + (y, m, d, h, m', s, (tz_offset_of_string tz))) + with + | Scanf.Scan_failure _ + | End_of_file -> + raise (Parse_error string) diff --git a/XmlRpcDateTime.mli b/XmlRpcDateTime.mli new file mode 100644 index 0000000..f90cf14 --- /dev/null +++ b/XmlRpcDateTime.mli @@ -0,0 +1,97 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +(** Date/time type. *) + +(** {2 Types} *) + +(** Raised by {!of_string} if a string could not be parsed. The exception + contains the input string. *) +exception Parse_error of string + +(** Type of XmlRpc-compatible date/time values. + (year, month, day, hour, minute, second, time zone offset in minutes) *) +type t = (int * int * int * int * int * int * int) + +(** {2 Comparison} *) + +(** Standard comparator for date/time values. Converts all values to UTC + before comparing to ensure correct behavior with values of differing + time zones. *) +val compare : t -> t -> int + +(** Standard equality function for date/time values. Converts all values + to UTC before comparing. *) +val equal : t -> t -> bool + +(** Standard hash function for date/time values. Converts values to UTC + before hashing. *) +val hash : t -> int + +(** {2 Current date and time} *) + +(** Returns the current date and time in the local time zone. *) +val now : unit -> t + +(** Returns the current date and time in UTC. *) +val now_utc : unit -> t + +(** {2 Time zone adjustments} *) + +(** Adjusts the time zone offset, preserving equality. *) +val set_tz_offset : int -> t -> t + +(** Forces the time zone offset to a different value, ignoring all other + fields. Use this to correct the time zone of a date/time value that + was received without a time zone offset and is known not to be UTC. *) +val fix_tz_offset : int -> t -> t + +(** {2 Conversion} *) + +(** Builds a date/time value from epoch seconds in the local time zone. *) +val from_unixfloat : float -> t + +(** Builds a date/time value from epoch seconds in UTC. *) +val from_unixfloat_utc : float -> t + +(** Converts a date/time value to epoch seconds in the local time zone. *) +val to_unixfloat : t -> float + +(** Converts a date/time value to epoch seconds in UTC. *) +val to_unixfloat_utc : t -> float + +(** Builds a date/time value from a Unix.tm value in the local time zone. *) +val from_unixtm : Unix.tm -> t + +(** Builds a date/time value from a Unix.tm value in UTC. *) +val from_unixtm_utc : Unix.tm -> t + +(** Converts a date/time value to a Unix.tm value in the local time zone. *) +val to_unixtm : t -> Unix.tm + +(** Converts a date/time value to a Unix.tm value in UTC. *) +val to_unixtm_utc : t -> Unix.tm + +(** {2 ISO-8601 parsing and generation} *) + +(** Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string. *) +val of_string : string -> t + +(** Generates an ISO-8601 string from a date/time value. *) +val to_string : t -> string diff --git a/XmlRpcServer.ml b/XmlRpcServer.ml new file mode 100644 index 0000000..3d4f130 --- /dev/null +++ b/XmlRpcServer.ml @@ -0,0 +1,394 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +type param_type = + [ `Array + | `Binary + | `Boolean + | `DateTime + | `Double + | `Int + | `String + | `Struct + | `Undefined ] + +let invalid_method name = + raise + (XmlRpc.Error + (-32601, "server error. requested method " ^ name ^ " not found")) + +let invalid_params () = + raise + (XmlRpc.Error + (-32602, "server error. invalid method parameters")) + +let wrong_num_params () = + raise + (XmlRpc.Error + (-32602, "server error. wrong number of method parameters")) + +let system_get_capabilities introspection _ = + let capabilities = + [ + "system.multicall", + `Struct + [ + "specUrl", `String "http://www.xmlrpc.com/discuss/msgReader$1208"; + "specVersion", `Int 1; + ]; + + "xmlrpc", + `Struct + [ + "specUrl", `String "http://www.xmlrpc.com/spec"; + "specVersion", `Int 1; + ]; + + "faults_interop", + `Struct + [ + "specUrl", `String "http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php"; + "specVersion", `Int 20010516; + ]; + + "nil", + `Struct + [ + "specUrl", `String "http://www.ontosys.com/xml-rpc/extensions.php"; + "specVersion", `Int 20010518; + ]; + ] in + let capabilities = + if introspection + then capabilities @ + [ + "introspection", + `Struct + [ + "specUrl", `String "http://xmlrpc.usefulinc.com/doc/reserved.html"; + "specVersion", `Int 1 + ] + ] + else capabilities in + `Struct capabilities + +let system_list_methods methods _ = + let names = ref [] in + Hashtbl.iter + (fun n _ -> names := `String n :: !names) + methods; + `Array (List.sort compare !names) + +let system_method_help method_help = function + | [`String name] -> + (try `String (Hashtbl.find method_help name) + with Not_found -> invalid_method name) + | _ -> invalid_params () + +let system_method_signature method_signatures = function + | [`String name] -> + (try `Array (List.map + (fun signature -> + `Array + (List.map + (function + | `Array -> `String "array" + | `Binary -> `String "base64" + | `Boolean -> `String "boolean" + | `DateTime -> `String "dateTime.iso8601" + | `Double -> `String "double" + | `Int -> `String "int" + | `String -> `String "string" + | `Struct -> `String "struct" + | `Undefined -> `String "undefined") + signature)) + (Hashtbl.find method_signatures name)) + with Not_found -> invalid_method name) + | _ -> invalid_params () + +let system_multicall methods = function + | [`Array calls] -> + `Array + (List.map + (function + | `Struct ["methodName", `String name; + "params", `Array params] + | `Struct ["params", `Array params; + "methodName", `String name] -> + (try `Array [(try Hashtbl.find methods name + with Not_found -> invalid_method name) + params] + with + | XmlRpc.Error (code, string) -> + `Struct ["faultCode", `Int code; + "faultString", `String string] + | e -> + `Struct ["faultCode", `Int (-32500); + "faultString", + `String + ("application error. " + ^ Printexc.to_string e)]) + | _ -> invalid_params ()) + calls) + | _ -> invalid_params () + +let check_signatures signatures f params = + let num_params = List.length params in + + let valid_num_params signature = + List.length signature - 1 = num_params in + + let valid_params signature = + let passed = ref true in + begin + match signature with + | [] -> () + | _ :: param_types -> + List.iter2 + (fun expected actual -> + match (expected, actual) with + | (`Array, `Array _) + | (`Binary, `Binary _) + | (`Boolean, `Boolean _) + | (`DateTime, `DateTime _) + | (`Double, `Double _) + | (`Int, `Int _) + | (`Int, `Int32 _) + | (`String, `String _) + | (`Struct, `Struct _) + | (`Undefined, _) + | (_, `Nil) + -> () + | _ -> passed := false) + param_types + params + end; + !passed in + + if signatures = [] + then () + else if not (List.exists valid_num_params signatures) + then wrong_num_params () + else if not (List.exists valid_params signatures) + then invalid_params (); + + f params + +let rec parse_version ver = + try let i = String.index ver '.' in + int_of_string (String.sub ver 0 i) :: + parse_version (String.sub ver (i + 1) (String.length ver - i - 1)) + with Not_found -> [int_of_string ver] + +let ocamlnet_version = parse_version Netconst.ocamlnet_version + +class virtual base = +object (self) + val methods = + (Hashtbl.create 0 : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t) + val method_help = + (Hashtbl.create 0 : (string, string) Hashtbl.t) + val method_signatures = + (Hashtbl.create 0 : (string, param_type list list) Hashtbl.t) + + val mutable base64_encoder = fun s -> XmlRpcBase64.str_encode s + val mutable base64_decoder = fun s -> XmlRpcBase64.str_decode s + + val mutable datetime_encoder = XmlRpcDateTime.to_string + val mutable datetime_decoder = XmlRpcDateTime.of_string + + val mutable error_handler = XmlRpc.default_error_handler + + method set_base64_encoder f = base64_encoder <- f + method set_base64_decoder f = base64_decoder <- f + + method set_datetime_encoder f = datetime_encoder <- f + method set_datetime_decoder f = datetime_decoder <- f + + method set_error_handler f = error_handler <- f + + method serve f input = + XmlRpc.serve + ~base64_encoder ~base64_decoder + ~datetime_encoder ~datetime_decoder + ~error_handler + f input + + method serve_message f input = + XmlRpc.serve_message + ~error_handler + f input + + method register name ?(help="") ?(signature=[]) ?(signatures=[]) f = + if help <> "" + then (Hashtbl.replace method_help name help; + self#enable_introspection ()); + let signatures = + if signature <> [] + then signature :: signatures + else signatures in + if signatures <> [] + then (Hashtbl.replace method_signatures name signatures; + self#enable_introspection ()); + Hashtbl.replace methods name (if signatures <> [] + then check_signatures signatures f + else f) + + method unregister name = + Hashtbl.remove methods name; + Hashtbl.remove method_help name; + Hashtbl.remove method_signatures name + + method virtual run : unit -> unit + + val mutable introspection = false + + method private enable_introspection () = + if not introspection + then + begin + introspection <- true; + self#register "system.getCapabilities" + ~help:"Returns a struct describing the XML-RPC specifications supported by this server" + ~signature:[`Struct] + (system_get_capabilities true); + self#register "system.listMethods" + ~help:"Returns an array of available methods on this server" + ~signature:[`Array] + (system_list_methods methods); + self#register "system.methodHelp" + ~help:"Returns a documentation string for the specified method" + ~signature:[`String; `String] + (system_method_help method_help); + self#register "system.methodSignature" + ~help:"Returns an array describing the return type and required parameters of a method" + ~signature:[`Array; `String] + (system_method_signature method_signatures); + self#register "system.multicall" + ~help:"Boxcar multiple RPC calls in one request" + ~signature:[`Array; `Array] + (system_multicall methods); + end + + initializer + self#register "system.getCapabilities" (system_get_capabilities false); + self#register "system.listMethods" (system_list_methods methods); + self#register "system.multicall" (system_multicall methods); +end + +class type server = +object + inherit base + method run : unit -> unit +end + +class cgi () = +object (self) + inherit base + + method private process (cgi : Netcgi.cgi) = + match cgi#request_method with + | `POST -> + let input = cgi#argument_value "BODY" in + let output = + self#serve + (fun name -> + try Hashtbl.find methods name + with Not_found -> invalid_method name) + input in + cgi#set_header ~content_type:"text/xml" (); + cgi#output#output_string "\n"; + cgi#output#output_string output; + cgi#output#commit_work () + | _ -> + cgi#output#output_string + "XML-RPC server accepts POST requests only.\n"; + cgi#output#commit_work () + + method run () = + let config = + { Netcgi.default_config with + Netcgi_common.permitted_input_content_types = [ "text/xml" ] + } in + + let buffered _ ch = new Netchannels.buffered_trans_channel ch in + Netcgi_cgi.run ~config ~output_type:(`Transactional buffered) self#process +end + +open Netcgi1_compat + +class netplex ?(parallelizer=Netplex_mp.mp()) ?(handler="xmlrpc") () = +object (self) + inherit base + + method private process env (cgi : Netcgi_types.cgi_activation) = + match cgi#request_method with + | `POST -> + let input = cgi#argument_value "BODY" in + let output = + self#serve + (fun name -> + try Hashtbl.find methods name + with Not_found -> invalid_method name) + input in + if ocamlnet_version < [2; 2; 8] + then env#send_output_header () + else (cgi#set_header ~content_type:"text/xml" (); + cgi#output#output_string "\n"); + cgi#output#output_string output; + cgi#output#commit_work () + | _ -> + if ocamlnet_version < [2; 2; 8] + then env#send_output_header (); + cgi#output#output_string + "XML-RPC server accepts POST requests only.\n"; + cgi#output#commit_work () + + method run () = + let (opt_list, cmdline_cfg) = Netplex_main.args () in + Arg.parse + opt_list + (fun s -> raise (Arg.Bad ("Don't know what to do with: " ^ s))) + ("usage: " ^ Sys.executable_name ^ " [options]"); + + let xmlrpc = + { Nethttpd_services.dyn_handler = self#process; + dyn_activation = + Nethttpd_services.std_activation `Std_activation_buffered; + dyn_uri = None; + dyn_translator = (fun _ -> ""); + dyn_accept_all_conditionals = false + } in + + let config_cgi = + { Netcgi_env.default_config with + Netcgi_env.permitted_input_content_types = [ "text/xml" ] + } in + + let handlers = [handler, xmlrpc] in + + Sys.set_signal Sys.sigpipe Sys.Signal_ignore; + + Netplex_main.startup + parallelizer + Netplex_log.logger_factories + Netplex_workload.workload_manager_factories + [ Nethttpd_plex.nethttpd_factory ~config_cgi ~handlers () ] + cmdline_cfg +end diff --git a/XmlRpcServer.mli b/XmlRpcServer.mli new file mode 100644 index 0000000..52a8615 --- /dev/null +++ b/XmlRpcServer.mli @@ -0,0 +1,146 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +(** XmlRpc Light server. *) + +(** Example: {[ + let server = new XmlRpcServer.cgi () in + server#register "demo.sayHello" + (fun _ -> `String "Hello!"); + server#run () ]} + + By inheriting from {!XmlRpcServer.base}, all servers provide + the following introspection functions by default: [system.listMethods], + [system.getCapabilities]. To prevent their use, use [server#unregister]. + + Additionally, the methods [system.methodHelp] and [system.methodSignature] + will be made available if at least one method help or method signature is + provided. +*) + +(** Type of parameters used in method signatures. *) +type param_type = + [ `Array | `Binary | `Boolean | `DateTime | `Double + | `Int | `String | `Struct | `Undefined ] + +(** {2 Base classes} *) + +(** Abstract base class for XmlRpc servers. *) +class virtual base : +object + (** Hashtable mapping method names to implementation functions. *) + val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t + + (** Base-64 binary encoding function. *) + val mutable base64_encoder : string -> string + + (** Base-64 binary decoding function. *) + val mutable base64_decoder : string -> string + + (** ISO-8601 date/time encoding function. *) + val mutable datetime_encoder : XmlRpcDateTime.t -> string + + (** ISO-8601 date/time decoding function. *) + val mutable datetime_decoder : string -> XmlRpcDateTime.t + + (** Handler for unhandled exceptions. *) + val mutable error_handler : exn -> XmlRpc.message + + (** Sets an alternate Base-64 binary encoding function. *) + method set_base64_encoder : (string -> string) -> unit + + (** Sets an alternate Base-64 binary decoding function. *) + method set_base64_decoder : (string -> string) -> unit + + (** Sets an alternate ISO-8601 date/time encoding function. *) + method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit + + (** Sets an alternate ISO-8601 date/time decoding function. *) + method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit + + (** Sets an alternate handler for unhandled exceptions. + See {!XmlRpc.default_error_handler} and + {!XmlRpc.quiet_error_handler} for examples. *) + method set_error_handler : (exn -> XmlRpc.message) -> unit + + (** For use in subclasses; calls {!XmlRpc.serve} with the current + encoders, decoders, and error handler. *) + method serve : + (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string + + (** Like [serve], but operates on messages instead of strings. *) + method serve_message : + (string -> XmlRpc.value list -> XmlRpc.value) -> + XmlRpc.message -> XmlRpc.message + + (** Registers a method with the server. + + If a [help] string is specified, its contents will be returned for + calls to [system.methodHelp] for this method. + + If [signature] is specified, this method's signature will be published + by [system.methodSignature] and (shallow) type-checking will be enabled + for parameters passed into this method. + + Multiple signatures can be supplied via [signatures] if desired to + provide for overloaded methods. + + Signatures are of the form [return-type; param1-type; param2-type; ...] + where each type is an instance of the {!param_type} variant. *) + method register : + string -> + ?help:string -> + ?signature:param_type list -> + ?signatures:param_type list list -> + (XmlRpc.value list -> XmlRpc.value) -> unit + + (** Removes a method from the server. *) + method unregister : string -> unit + + (** Starts the main server process. *) + method virtual run : unit -> unit +end + +(** Type of concrete XmlRpc server classes. *) +class type server = +object + inherit base + + (** Starts the main server process. *) + method run : unit -> unit +end + +(** {2 Server implementations} *) + +(** CGI XmlRpc server based on Netcgi2. *) +class cgi : unit -> server + +(** Stand-alone XmlRpc server based on Netplex. *) +class netplex : + ?parallelizer:Netplex_types.parallelizer -> + ?handler:string -> + unit -> server + +(** {2 Utility functions} *) + +(** Raise an {!XmlRpc.Error} indicating a method name not found. *) +val invalid_method : string -> 'a + +(** Raise an {!XmlRpc.Error} indicating invalid method parameters. *) +val invalid_params : unit -> 'a diff --git a/doc/xmlrpc-light/html/XmlRpc.client.html b/doc/xmlrpc-light/html/XmlRpc.client.html new file mode 100644 index 0000000..73c8eef --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpc.client.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + +XmlRpc.client + + + +

Class XmlRpc.client

+
+
class client : ?debug:bool -> ?headers:(string * string) list -> ?insecure_ssl:bool -> ?timeout:float -> ?useragent:string -> string -> object .. end
Class for XmlRpc clients. Takes a single mandatory argument, url. +

+ + If url is of the form "http://username:password@...", basic + authentication will be used. +

+ + If url starts with "https", Curl will be used instead of Ocamlnet. + The "curl" command-line program must be in your path for this to work. + You can use the insecure_ssl setting to allow connections to servers + with self-signed certificates; by default this is false and certificates + must be valid. +

+ + timeout can be used to specify the maximum amount of time + elapsed before a connection is cancelled. It defaults to 300.0 seconds. +

+ + headers may contain an array of (name, value) pairs of additional + headers to send with each request. +

+ + The useragent setting provides a convenient way to change the + User-Agent header, which defaults to "XmlRpc-Light/<version>". +

+ + The debug setting, if true, will enable verbose debugging output to + the standard error stream.
+


+
val url : string
+Url of the remote XmlRpc server.
+
+
val mutable debug : bool
+If true, Xml messages will be printed to standard error.
+
+
val mutable headers : (string * string) list
+List of custom HTTP headers to send with each request.
+
+
val mutable insecure_ssl : bool
+If true, SSL will be allowed even if the certificate is self-signed.
+
+
val mutable timeout : float
+Maximum time to wait for a request to complete, in seconds.
+
+
val mutable useragent : string
+User-agent to send in request headers.
+
+
method url : string
+Gets url.
+
+
method debug : bool
+Gets debug.
+
+
method set_debug : bool -> unit
+Sets debug.
+
+
method headers : (string * string) list
+Gets headers.
+
+
method set_headers : (string * string) list -> unit
+Sets headers.
+
+
method insecure_ssl : bool
+Gets insecure_ssl.
+
+
method set_insecure_ssl : bool -> unit
+Sets insecure_ssl.
+
+
method timeout : float
+Gets timeout.
+
+
method set_timeout : float -> unit
+Sets timeout.
+
+
method useragent : string
+Gets useragent.
+
+
method set_useragent : string -> unit
+Sets useragent.
+
+
method set_base64_encoder : (string -> string) -> unit
+Sets an alternate Base-64 binary encoding function.
+
+
method set_base64_decoder : (string -> string) -> unit
+Sets an alternate Base-64 binary decoding function.
+
+
method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+Sets an alternate ISO-8601 date/time encoding function.
+
+
method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+Sets an alternate ISO-8601 date/time decoding function.
+
+
method call : string -> value list -> value
+call name params invokes an XmlRpc method and returns the result, + or raises XmlRpc.Error on error.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpc.html b/doc/xmlrpc-light/html/XmlRpc.html new file mode 100644 index 0000000..1c58cff --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpc.html @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + +XmlRpc + + + +

Module XmlRpc

+
+
module XmlRpc: sig .. end
XmlRpc Light. +

+ + XmlRpc Light is a minimal XmlRpc library based on Xml Light and Ocamlnet. +

+ + It provides a type for values, a client class with a simple calling + interface, and low-level tools that can be used to implement a server. +

+ + (c) 2007-2009 Dave Benjamin
+


+
val version : string
+Version of XmlRpc-Light as a string.
+
+
+ +

High-level interface


+
+Example:
    let rpc = new XmlRpc.client "http://localhost:8000" in
+    let result = rpc#call "echo" [`String "hello!"] in
+    print_endline (XmlRpc.dump result) 

+
exception Error of (int * string)
+
+Raised for all errors including XmlRpc faults (code, string).
+
+
type value = [ `Array of value list
| `Binary of string
| `Boolean of bool
| `DateTime of XmlRpcDateTime.t
| `Double of float
| `Int of int
| `Int32 of int32
| `Nil
| `String of string
| `Struct of (string * value) list ]
+
+Polymorphic variant type for XmlRpc values:
    +
  • `Array: An ordered list of values
  • +
  • `Binary: A string containing binary data
  • +
  • `Boolean: A boolean
  • +
  • `DateTime: A date/time value
  • +
  • `Double: A floating-point value
  • +
  • `Int: An integer
  • +
  • `Int32: A 32-bit integer
  • +
  • `Nil: A null value
  • +
  • `String: A string
  • +
  • `Struct: An association list of (name, value) pairs
  • +
+ + Note that base64-encoding of `Binary values is done automatically. + You do not need to do the encoding yourself.
+
+ +
class client : ?debug:bool -> ?headers:(string * string) list -> ?insecure_ssl:bool -> ?timeout:float -> ?useragent:string -> string -> object .. end
+Class for XmlRpc clients. +
+
class multicall : client -> object .. end
+Convenience class for system.multicall calls. +
+
+ +

Utility functions


+
val dump : value -> string
+Converts an XmlRpc value to a human-readable string.
+
+
+ +

Low-level interface


+
type message = + + + + + + + + + + + + + + +
+| +MethodCall of (string * value list)
+| +MethodResponse of value
+| +Fault of (int * string)
+ +
+Type for XmlRpc messages.
+
+ +
val message_of_xml_element : ?base64_decoder:(string -> string) ->
?datetime_decoder:(string -> XmlRpcDateTime.t) -> Xml.xml -> message
+Converts an Xml Light element to an XmlRpc message.
+
+
val xml_element_of_message : ?base64_encoder:(string -> string) ->
?datetime_encoder:(XmlRpcDateTime.t -> string) -> message -> Xml.xml
+Converts an XmlRpc message to an Xml Light element.
+
+
val value_of_xml_element : ?base64_decoder:(string -> string) ->
?datetime_decoder:(string -> XmlRpcDateTime.t) -> Xml.xml -> value
+Converts an Xml Light element to an XmlRpc value.
+
+
val xml_element_of_value : ?base64_encoder:(string -> string) ->
?datetime_encoder:(XmlRpcDateTime.t -> string) -> value -> Xml.xml
+Converts an XmlRpc value to an Xml Light element.
+
+
+ +

Server tools


+
val serve : ?base64_encoder:(string -> string) ->
?base64_decoder:(string -> string) ->
?datetime_encoder:(XmlRpcDateTime.t -> string) ->
?datetime_decoder:(string -> XmlRpcDateTime.t) ->
?error_handler:(exn -> message) ->
(string -> value list -> value) -> string -> string
+Creates a function from string (Xml representing a MethodCall) to + string (Xml representing a MethodResult or Fault) given a function + of the form: (name -> params -> result), where name is the + name of the method, params is a list of parameter values, and + result is the result value. +

+ + This function can be used to build many different kinds of XmlRpc + servers since it makes no assumptions about the network library + or other communications method used. +

+ + If an exception other than XmlRpc.Error occurs, the exception is + passed to error_handler. If error_handler returns a message, + the message will be used as the result. If an XmlRpc.Error is + raised by either the main function or error_handler, it will be + converted to an XmlRpc Fault. Any other exception raised by + error_handler is allowed to escape. +

+ + For a full-featured, easy-to-use, network-capable server implementation, + see the XmlRpcServer module.
+

+
val serve_message : ?error_handler:(exn -> message) ->
(string -> value list -> value) ->
message -> message
+Performs the same function as serve, but operates on typed messages + instead of strings.
+
+
val default_error_handler : exn -> message
+The default error handler for serve. +

+ + This error handler catches all exceptions and converts them into + faults by wrapping them in XmlRpc.Error.
+

+
val quiet_error_handler : exn -> message
+A "quiet" error handler for serve. +

+ + This error handler simply re-raises the exception. Use this if you + want exceptions to remain unhandled so that they will escape to the + error log. The client will receive a generic "transport error", + which is more secure since it does not reveal any information about + the specific exception that occurred.
+

+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpc.multicall.html b/doc/xmlrpc-light/html/XmlRpc.multicall.html new file mode 100644 index 0000000..849e163 --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpc.multicall.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + +XmlRpc.multicall + + + +

Class XmlRpc.multicall

+
+
class multicall : client -> object .. end
Convenience class for system.multicall calls. +

+ + Instances take an XmlRpc.client as an argument:

        # let mc = new XmlRpc.multicall client;;
+        val mc : XmlRpc.multicall = <obj>
+    
+ The "call" method works like client#call, but it returns a lazy + value:
        # let a = mc#call "demo.addTwoNumbers" [`Int 3; `Int 4];;
+        val a : XmlRpc.value Lazy.t = <lazy>
+        # let b = mc#call "demo.addTwoNumbers" [`Int 42; `String "oh noes!"];;
+        val b : XmlRpc.value Lazy.t = <lazy>
+        # let c = mc#call "demo.addTwoNumbers" [`Double 3.0; `Double 4.0];;
+        val c : XmlRpc.value Lazy.t = <lazy>
+    
+ At this point, the call has not been executed yet:
        # mc#executed;;
+        -- : bool = false
+    
+ As soon as one of the return values is forced, the call is executed:
        # Lazy.force a;;
+        -- : XmlRpc.value = `Int 7
+        # mc#executed;;
+        -- : bool = true
+    
+ Once a call has been executed, this instance cannot be used to make any + further calls; instead, a new multicall instance must be created:
        # mc#call "demo.addTwoNumbers" [`Int 2; `Int 2];;
+        Exception: Failure "multicall#call: already executed".
+    
+ If an XmlRpc fault occurred, the exception will be thrown when the lazy + value is forced:
        # Lazy.force b;;
+        Exception: XmlRpc.Error (-32602, "server error. invalid method parameters").
+    
+ This will not prevent further methods from executing successfully:
        # Lazy.force c;;
+        -- : XmlRpc.value = `Double 7.
+    
+ It is possible for a multicall to be executed but not completed, for + example if a transport error occurs. Aside from catching the exception, + the completed property indicates if the call actually went through + or not:
        # mc#completed;;
+        -- : bool = true
+    
+ It is not necessary to use lazy values. Instead, the call can be + executed explicitly, and the results can be retrieved by number:
        # let mc = new XmlRpc.multicall client;;
+        val mc : XmlRpc.multicall = <obj>
+        # ignore (mc#call "demo.addTwoNumbers" [`Int 2; `Int 2]);;
+        -- : unit = ()
+        # ignore (mc#call "demo.addTwoNumbers" [`Int 3; `Int 3]);;
+        -- : unit = ()
+        # mc#result 1;;
+        -- : XmlRpc.value = `Int 6
+    

+
+
method call : string -> value list -> value Lazy.t
+Adds a call to this multicall instance. + If the call has already executed, the following exception will + be raised: + Failure "multicall#call: already executed".
+
+
method execute : unit -> unit
+Forces the call to execute immediately. + If the call has already executed and completed successfully, the + following exception will be raised: + Failure "multicall#execute: already completed".
+
+
method result : int -> value
+Returns a multicall result, executing the call if necessary. + The results are numbered starting with zero.
+
+
method executed : bool
+True if the call has executed, whether or not it succeeded.
+
+
method completed : bool
+True of the call has executed and completed successfully.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpcBase64.html b/doc/xmlrpc-light/html/XmlRpcBase64.html new file mode 100644 index 0000000..3cd397a --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpcBase64.html @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + +XmlRpcBase64 + + + +

Module XmlRpcBase64

+
+
module XmlRpcBase64: sig .. end
Base64 codec. +

+ + 8-bit characters are encoded into 6-bit ones using ASCII lookup tables. + Default tables maps 0..63 values on characters A-Z, a-z, 0-9, '+' and '/' + (in that order).
+


+
exception Invalid_char
+
+This exception is raised when reading an invalid character + from a base64 input.
+
+
exception Invalid_table
+
+This exception is raised if the encoding or decoding table + size is not correct.
+
+
type encoding_table = char array 
+
+An encoding table maps integers 0..63 to the corresponding char.
+
+ +
type decoding_table = int array 
+
+A decoding table maps chars 0..255 to the corresponding 0..63 value + or -1 if the char is not accepted.
+
+ +
val str_encode : ?tbl:encoding_table -> string -> string
+Encode a string into Base64.
+
+
val str_decode : ?tbl:decoding_table -> string -> string
+Decode a string encoded into Base64, raise Invalid_char if a + character in the input string is not a valid one.
+
+
val encode : ?tbl:encoding_table -> char Stream.t -> char Stream.t
+Generic base64 encoding over a character stream.
+
+
val decode : ?tbl:decoding_table -> char Stream.t -> char Stream.t
+Generic base64 decoding over a character stream.
+
+
val make_decoding_table : encoding_table -> decoding_table
+Create a valid decoding table from an encoding one.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpcDateTime.html b/doc/xmlrpc-light/html/XmlRpcDateTime.html new file mode 100644 index 0000000..3ff0ab1 --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpcDateTime.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +XmlRpcDateTime + + + +

Module XmlRpcDateTime

+
+
module XmlRpcDateTime: sig .. end
Date/time type.
+
+
+ +

Types


+
exception Parse_error of string
+
+Raised by XmlRpcDateTime.of_string if a string could not be parsed. The exception + contains the input string.
+
+
type t = int * int * int * int * int * int * int 
+
+Type of XmlRpc-compatible date/time values. + (year, month, day, hour, minute, second, time zone offset in minutes)
+
+ +
+ +

Comparison


+
val compare : t -> t -> int
+Standard comparator for date/time values. Converts all values to UTC + before comparing to ensure correct behavior with values of differing + time zones.
+
+
val equal : t -> t -> bool
+Standard equality function for date/time values. Converts all values + to UTC before comparing.
+
+
val hash : t -> int
+Standard hash function for date/time values. Converts values to UTC + before hashing.
+
+
+ +

Current date and time


+
val now : unit -> t
+Returns the current date and time in the local time zone.
+
+
val now_utc : unit -> t
+Returns the current date and time in UTC.
+
+
+ +

Time zone adjustments


+
val set_tz_offset : int -> t -> t
+Adjusts the time zone offset, preserving equality.
+
+
val fix_tz_offset : int -> t -> t
+Forces the time zone offset to a different value, ignoring all other + fields. Use this to correct the time zone of a date/time value that + was received without a time zone offset and is known not to be UTC.
+
+
+ +

Conversion


+
val from_unixfloat : float -> t
+Builds a date/time value from epoch seconds in the local time zone.
+
+
val from_unixfloat_utc : float -> t
+Builds a date/time value from epoch seconds in UTC.
+
+
val to_unixfloat : t -> float
+Converts a date/time value to epoch seconds in the local time zone.
+
+
val to_unixfloat_utc : t -> float
+Converts a date/time value to epoch seconds in UTC.
+
+
val from_unixtm : Unix.tm -> t
+Builds a date/time value from a Unix.tm value in the local time zone.
+
+
val from_unixtm_utc : Unix.tm -> t
+Builds a date/time value from a Unix.tm value in UTC.
+
+
val to_unixtm : t -> Unix.tm
+Converts a date/time value to a Unix.tm value in the local time zone.
+
+
val to_unixtm_utc : t -> Unix.tm
+Converts a date/time value to a Unix.tm value in UTC.
+
+
+ +

ISO-8601 parsing and generation


+
val of_string : string -> t
+Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string.
+
+
val to_string : t -> string
+Generates an ISO-8601 string from a date/time value.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpcServer.base.html b/doc/xmlrpc-light/html/XmlRpcServer.base.html new file mode 100644 index 0000000..e677dfe --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpcServer.base.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + +XmlRpcServer.base + + + +

Class virtual XmlRpcServer.base

+
+
class virtual base : object .. end
Abstract base class for XmlRpc servers.
+
+
val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t
+Hashtable mapping method names to implementation functions.
+
+
val mutable base64_encoder : string -> string
+Base-64 binary encoding function.
+
+
val mutable base64_decoder : string -> string
+Base-64 binary decoding function.
+
+
val mutable datetime_encoder : XmlRpcDateTime.t -> string
+ISO-8601 date/time encoding function.
+
+
val mutable datetime_decoder : string -> XmlRpcDateTime.t
+ISO-8601 date/time decoding function.
+
+
val mutable error_handler : exn -> XmlRpc.message
+Handler for unhandled exceptions.
+
+
method set_base64_encoder : (string -> string) -> unit
+Sets an alternate Base-64 binary encoding function.
+
+
method set_base64_decoder : (string -> string) -> unit
+Sets an alternate Base-64 binary decoding function.
+
+
method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+Sets an alternate ISO-8601 date/time encoding function.
+
+
method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+Sets an alternate ISO-8601 date/time decoding function.
+
+
method set_error_handler : (exn -> XmlRpc.message) -> unit
+Sets an alternate handler for unhandled exceptions. + See XmlRpc.default_error_handler and + XmlRpc.quiet_error_handler for examples.
+
+
method serve : (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+For use in subclasses; calls XmlRpc.serve with the current + encoders, decoders, and error handler.
+
+
method serve_message : (string -> XmlRpc.value list -> XmlRpc.value) ->
XmlRpc.message -> XmlRpc.message
+Like serve, but operates on messages instead of strings.
+
+
method register : string ->
?help:string ->
?signature:param_type list ->
?signatures:param_type list list ->
(XmlRpc.value list -> XmlRpc.value) -> unit
+Registers a method with the server. +

+ + If a help string is specified, its contents will be returned for + calls to system.methodHelp for this method. +

+ + If signature is specified, this method's signature will be published + by system.methodSignature and (shallow) type-checking will be enabled + for parameters passed into this method. +

+ + Multiple signatures can be supplied via signatures if desired to + provide for overloaded methods. +

+ + Signatures are of the form return-type; param1-type; param2-type; ... + where each type is an instance of the XmlRpcServer.param_type variant.
+

+
method unregister : string -> unit
+Removes a method from the server.
+
+
method virtual run : unit -> unit
+Starts the main server process.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpcServer.cgi.html b/doc/xmlrpc-light/html/XmlRpcServer.cgi.html new file mode 100644 index 0000000..d8449f9 --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpcServer.cgi.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + +XmlRpcServer.cgi + + + +

Class XmlRpcServer.cgi

+
+
class cgi : unit -> server
CGI XmlRpc server based on Netcgi2.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpcServer.html b/doc/xmlrpc-light/html/XmlRpcServer.html new file mode 100644 index 0000000..3feff10 --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpcServer.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + +XmlRpcServer + + + +

Module XmlRpcServer

+
+
module XmlRpcServer: sig .. end
XmlRpc Light server.
+
+
+Example:
    let server = new XmlRpcServer.cgi () in
+    server#register "demo.sayHello"
+      (fun _ -> `String "Hello!");
+    server#run () 
+

+ + By inheriting from XmlRpcServer.base, all servers provide + the following introspection functions by default: system.listMethods, + system.getCapabilities. To prevent their use, use server#unregister. +

+ + Additionally, the methods system.methodHelp and system.methodSignature + will be made available if at least one method help or method signature is + provided.
+

type param_type = [ `Array
| `Binary
| `Boolean
| `DateTime
| `Double
| `Int
| `String
| `Struct
| `Undefined ]
+
+Type of parameters used in method signatures.
+
+ +
+ +

Base classes


+
class virtual base : object .. end
+Abstract base class for XmlRpc servers. +
+
class type server = object .. end
+Type of concrete XmlRpc server classes. +
+
+ +

Server implementations


+
class cgi : unit -> server
+CGI XmlRpc server based on Netcgi2. +
+
class netplex : ?parallelizer:Netplex_types.parallelizer -> ?handler:string -> unit -> server
+Stand-alone XmlRpc server based on Netplex. +
+
+ +

Utility functions


+
val invalid_method : string -> 'a
+Raise an XmlRpc.Error indicating a method name not found.
+
+
val invalid_params : unit -> 'a
+Raise an XmlRpc.Error indicating invalid method parameters.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpcServer.netplex.html b/doc/xmlrpc-light/html/XmlRpcServer.netplex.html new file mode 100644 index 0000000..82876ed --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpcServer.netplex.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + +XmlRpcServer.netplex + + + +

Class XmlRpcServer.netplex

+
+
class netplex : ?parallelizer:Netplex_types.parallelizer -> ?handler:string -> unit -> server
Stand-alone XmlRpc server based on Netplex.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/XmlRpcServer.server.html b/doc/xmlrpc-light/html/XmlRpcServer.server.html new file mode 100644 index 0000000..a355870 --- /dev/null +++ b/doc/xmlrpc-light/html/XmlRpcServer.server.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + +XmlRpcServer.server + + + +

Class type XmlRpcServer.server

+
+
class type server = object .. end
Type of concrete XmlRpc server classes.
+Inherits +
+
method run : unit -> unit
+Starts the main server process.
+
+ \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index.html b/doc/xmlrpc-light/html/index.html new file mode 100644 index 0000000..3984511 --- /dev/null +++ b/doc/xmlrpc-light/html/index.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + +

+Index of types
+Index of exceptions
+Index of values
+Index of class attributes
+Index of class methods
+Index of classes
+Index of class types
+Index of modules
+

+ + + + + +
XmlRpc
+XmlRpc Light. +
+
XmlRpcServer
+XmlRpc Light server. +
+
XmlRpcDateTime
+Date/time type. +
+
XmlRpcBase64
+Base64 codec. +
+
+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_attributes.html b/doc/xmlrpc-light/html/index_attributes.html new file mode 100644 index 0000000..bd9a14b --- /dev/null +++ b/doc/xmlrpc-light/html/index_attributes.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + +Index of class attributes + + +

Index of class attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

B
base64_decoder [XmlRpcServer.base]
+Base-64 binary decoding function. +
+
base64_encoder [XmlRpcServer.base]
+Base-64 binary encoding function. +
+

D
datetime_decoder [XmlRpcServer.base]
+ISO-8601 date/time decoding function. +
+
datetime_encoder [XmlRpcServer.base]
+ISO-8601 date/time encoding function. +
+
debug [XmlRpc.client]
+If true, Xml messages will be printed to standard error. +
+

E
error_handler [XmlRpcServer.base]
+Handler for unhandled exceptions. +
+

H
headers [XmlRpc.client]
+List of custom HTTP headers to send with each request. +
+

I
insecure_ssl [XmlRpc.client]
+If true, SSL will be allowed even if the certificate is self-signed. +
+

M
methods [XmlRpcServer.base]
+Hashtable mapping method names to implementation functions. +
+

T
timeout [XmlRpc.client]
+Maximum time to wait for a request to complete, in seconds. +
+

U
url [XmlRpc.client]
+Url of the remote XmlRpc server. +
+
useragent [XmlRpc.client]
+User-agent to send in request headers. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_class_types.html b/doc/xmlrpc-light/html/index_class_types.html new file mode 100644 index 0000000..be00f5f --- /dev/null +++ b/doc/xmlrpc-light/html/index_class_types.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + +Index of class types + + +

Index of class types

+ + + + +

S
server [XmlRpcServer]
+Type of concrete XmlRpc server classes. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_classes.html b/doc/xmlrpc-light/html/index_classes.html new file mode 100644 index 0000000..e60a220 --- /dev/null +++ b/doc/xmlrpc-light/html/index_classes.html @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + +Index of classes + + +

Index of classes

+ + + + + + + + + + + + + + + +

B
base [XmlRpcServer]
+Abstract base class for XmlRpc servers. +
+

C
cgi [XmlRpcServer]
+CGI XmlRpc server based on Netcgi2. +
+
client [XmlRpc]
+Class for XmlRpc clients. +
+

M
multicall [XmlRpc]
+Convenience class for system.multicall calls. +
+

N
netplex [XmlRpcServer]
+Stand-alone XmlRpc server based on Netplex. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_exceptions.html b/doc/xmlrpc-light/html/index_exceptions.html new file mode 100644 index 0000000..d2eabd2 --- /dev/null +++ b/doc/xmlrpc-light/html/index_exceptions.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + +Index of exceptions + + +

Index of exceptions

+ + + + + + + + + + + + +

E
Error [XmlRpc]
+Raised for all errors including XmlRpc faults (code, string). +
+

I
Invalid_char [XmlRpcBase64]
+This exception is raised when reading an invalid character + from a base64 input. +
+
Invalid_table [XmlRpcBase64]
+This exception is raised if the encoding or decoding table + size is not correct. +
+

P
Parse_error [XmlRpcDateTime]
+Raised by XmlRpcDateTime.of_string if a string could not be parsed. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_methods.html b/doc/xmlrpc-light/html/index_methods.html new file mode 100644 index 0000000..e8054b5 --- /dev/null +++ b/doc/xmlrpc-light/html/index_methods.html @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + +Index of class methods + + +

Index of class methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

C
call [XmlRpc.multicall]
+Adds a call to this multicall instance. +
+
call [XmlRpc.client]
+call name params invokes an XmlRpc method and returns the result, + or raises XmlRpc.Error on error. +
+
completed [XmlRpc.multicall]
+True of the call has executed and completed successfully. +
+

D
debug [XmlRpc.client]
+Gets debug. +
+

E
execute [XmlRpc.multicall]
+Forces the call to execute immediately. +
+
executed [XmlRpc.multicall]
+True if the call has executed, whether or not it succeeded. +
+

H
headers [XmlRpc.client]
+Gets headers. +
+

I
insecure_ssl [XmlRpc.client]
+Gets insecure_ssl. +
+

R
register [XmlRpcServer.base]
+Registers a method with the server. +
+
result [XmlRpc.multicall]
+Returns a multicall result, executing the call if necessary. +
+
run [XmlRpcServer.server]
+Starts the main server process. +
+
run [XmlRpcServer.base]
+Starts the main server process. +
+

S
serve [XmlRpcServer.base]
+For use in subclasses; calls XmlRpc.serve with the current + encoders, decoders, and error handler. +
+
serve_message [XmlRpcServer.base]
+Like serve, but operates on messages instead of strings. +
+
set_base64_decoder [XmlRpcServer.base]
+Sets an alternate Base-64 binary decoding function. +
+
set_base64_decoder [XmlRpc.client]
+Sets an alternate Base-64 binary decoding function. +
+
set_base64_encoder [XmlRpcServer.base]
+Sets an alternate Base-64 binary encoding function. +
+
set_base64_encoder [XmlRpc.client]
+Sets an alternate Base-64 binary encoding function. +
+
set_datetime_decoder [XmlRpcServer.base]
+Sets an alternate ISO-8601 date/time decoding function. +
+
set_datetime_decoder [XmlRpc.client]
+Sets an alternate ISO-8601 date/time decoding function. +
+
set_datetime_encoder [XmlRpcServer.base]
+Sets an alternate ISO-8601 date/time encoding function. +
+
set_datetime_encoder [XmlRpc.client]
+Sets an alternate ISO-8601 date/time encoding function. +
+
set_debug [XmlRpc.client]
+Sets debug. +
+
set_error_handler [XmlRpcServer.base]
+Sets an alternate handler for unhandled exceptions. +
+
set_headers [XmlRpc.client]
+Sets headers. +
+
set_insecure_ssl [XmlRpc.client]
+Sets insecure_ssl. +
+
set_timeout [XmlRpc.client]
+Sets timeout. +
+
set_useragent [XmlRpc.client]
+Sets useragent. +
+

T
timeout [XmlRpc.client]
+Gets timeout. +
+

U
unregister [XmlRpcServer.base]
+Removes a method from the server. +
+
url [XmlRpc.client]
+Gets url. +
+
useragent [XmlRpc.client]
+Gets useragent. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_module_types.html b/doc/xmlrpc-light/html/index_module_types.html new file mode 100644 index 0000000..6fcbe62 --- /dev/null +++ b/doc/xmlrpc-light/html/index_module_types.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + +Index of module types + + +

Index of module types

+ +

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_modules.html b/doc/xmlrpc-light/html/index_modules.html new file mode 100644 index 0000000..b2f5eb5 --- /dev/null +++ b/doc/xmlrpc-light/html/index_modules.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + +Index of modules + + +

Index of modules

+ + + + + + + + + + +

X
XmlRpc
+XmlRpc Light. +
+
XmlRpcBase64
+Base64 codec. +
+
XmlRpcDateTime
+Date/time type. +
+
XmlRpcServer
+XmlRpc Light server. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_types.html b/doc/xmlrpc-light/html/index_types.html new file mode 100644 index 0000000..a5125e6 --- /dev/null +++ b/doc/xmlrpc-light/html/index_types.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + +Index of types + + +

Index of types

+ + + + + + + + + + + + + + + + + + + +

D
decoding_table [XmlRpcBase64]
+A decoding table maps chars 0..255 to the corresponding 0..63 value + or -1 if the char is not accepted. +
+

E
encoding_table [XmlRpcBase64]
+An encoding table maps integers 0..63 to the corresponding char. +
+

M
message [XmlRpc]
+Type for XmlRpc messages. +
+

P
param_type [XmlRpcServer]
+Type of parameters used in method signatures. +
+

T
t [XmlRpcDateTime]
+Type of XmlRpc-compatible date/time values. +
+

V
value [XmlRpc]
+Polymorphic variant type for XmlRpc values: `Array: An ordered list of values, `Binary: A string containing binary data, `Boolean: A boolean, `DateTime: A date/time value, `Double: A floating-point value, `Int: An integer, `Int32: A 32-bit integer, `Nil: A null value, `String: A string, `Struct: An association list of (name, value) pairs + Note that base64-encoding of `Binary values is done automatically. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/index_values.html b/doc/xmlrpc-light/html/index_values.html new file mode 100644 index 0000000..c8a4bd9 --- /dev/null +++ b/doc/xmlrpc-light/html/index_values.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + +Index of values + + +

Index of values

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

C
compare [XmlRpcDateTime]
+Standard comparator for date/time values. +
+

D
decode [XmlRpcBase64]
+Generic base64 decoding over a character stream. +
+
default_error_handler [XmlRpc]
+The default error handler for serve. +
+
dump [XmlRpc]
+Converts an XmlRpc value to a human-readable string. +
+

E
encode [XmlRpcBase64]
+Generic base64 encoding over a character stream. +
+
equal [XmlRpcDateTime]
+Standard equality function for date/time values. +
+

F
fix_tz_offset [XmlRpcDateTime]
+Forces the time zone offset to a different value, ignoring all other + fields. +
+
from_unixfloat [XmlRpcDateTime]
+Builds a date/time value from epoch seconds in the local time zone. +
+
from_unixfloat_utc [XmlRpcDateTime]
+Builds a date/time value from epoch seconds in UTC. +
+
from_unixtm [XmlRpcDateTime]
+Builds a date/time value from a Unix.tm value in the local time zone. +
+
from_unixtm_utc [XmlRpcDateTime]
+Builds a date/time value from a Unix.tm value in UTC. +
+

H
hash [XmlRpcDateTime]
+Standard hash function for date/time values. +
+

I
invalid_method [XmlRpcServer]
+Raise an XmlRpc.Error indicating a method name not found. +
+
invalid_params [XmlRpcServer]
+Raise an XmlRpc.Error indicating invalid method parameters. +
+

M
make_decoding_table [XmlRpcBase64]
+Create a valid decoding table from an encoding one. +
+
message_of_xml_element [XmlRpc]
+Converts an Xml Light element to an XmlRpc message. +
+

N
now [XmlRpcDateTime]
+Returns the current date and time in the local time zone. +
+
now_utc [XmlRpcDateTime]
+Returns the current date and time in UTC. +
+

O
of_string [XmlRpcDateTime]
+Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string. +
+

Q
quiet_error_handler [XmlRpc]
+A "quiet" error handler for serve. +
+

S
serve [XmlRpc]
+Creates a function from string (Xml representing a MethodCall) to + string (Xml representing a MethodResult or Fault) given a function + of the form: (name -> params -> result), where name is the + name of the method, params is a list of parameter values, and + result is the result value. +
+
serve_message [XmlRpc]
+Performs the same function as serve, but operates on typed messages + instead of strings. +
+
set_tz_offset [XmlRpcDateTime]
+Adjusts the time zone offset, preserving equality. +
+
str_decode [XmlRpcBase64]
+Decode a string encoded into Base64, raise Invalid_char if a + character in the input string is not a valid one. +
+
str_encode [XmlRpcBase64]
+Encode a string into Base64. +
+

T
to_string [XmlRpcDateTime]
+Generates an ISO-8601 string from a date/time value. +
+
to_unixfloat [XmlRpcDateTime]
+Converts a date/time value to epoch seconds in the local time zone. +
+
to_unixfloat_utc [XmlRpcDateTime]
+Converts a date/time value to epoch seconds in UTC. +
+
to_unixtm [XmlRpcDateTime]
+Converts a date/time value to a Unix.tm value in the local time zone. +
+
to_unixtm_utc [XmlRpcDateTime]
+Converts a date/time value to a Unix.tm value in UTC. +
+

V
value_of_xml_element [XmlRpc]
+Converts an Xml Light element to an XmlRpc value. +
+
version [XmlRpc]
+Version of XmlRpc-Light as a string. +
+

X
xml_element_of_message [XmlRpc]
+Converts an XmlRpc message to an Xml Light element. +
+
xml_element_of_value [XmlRpc]
+Converts an XmlRpc value to an Xml Light element. +
+

+ + \ No newline at end of file diff --git a/doc/xmlrpc-light/html/style.css b/doc/xmlrpc-light/html/style.css new file mode 100644 index 0000000..c0a80f3 --- /dev/null +++ b/doc/xmlrpc-light/html/style.css @@ -0,0 +1,33 @@ +a:visited {color : #416DFF; text-decoration : none; } +a:link {color : #416DFF; text-decoration : none;} +a:hover {color : Red; text-decoration : none; background-color: #5FFF88} +a:active {color : Red; text-decoration : underline; } +.keyword { font-weight : bold ; color : Red } +.keywordsign { color : #C04600 } +.superscript { font-size : 4 } +.subscript { font-size : 4 } +.comment { color : Green } +.constructor { color : Blue } +.type { color : #5C6585 } +.string { color : Maroon } +.warning { color : Red ; font-weight : bold } +.info { margin-left : 3em; margin-right : 3em } +.param_info { margin-top: 4px; margin-left : 3em; margin-right : 3em } +.code { color : #465F91 ; } +h1 { font-size : 20pt ; text-align: center; } +h2 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90BDFF ;padding: 2px; } +h3 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90DDFF ;padding: 2px; } +h4 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90EDFF ;padding: 2px; } +h5 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90FDFF ;padding: 2px; } +h6 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #C0FFFF ; padding: 2px; } +div.h7 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #E0FFFF ; padding: 2px; } +div.h8 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #F0FFFF ; padding: 2px; } +div.h9 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #FFFFFF ; padding: 2px; } +.typetable { border-style : hidden } +.indextable { border-style : hidden } +.paramstable { border-style : hidden ; padding: 5pt 5pt} +body { background-color : White } +tr { background-color : White } +td.typefieldcomment { background-color : #FFFFFF ; font-size: smaller ;} +pre { margin-bottom: 4px } +div.sig_block {margin-left: 2em} \ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpc.client.html b/doc/xmlrpc-light/html/type_XmlRpc.client.html new file mode 100644 index 0000000..ce6e2a8 --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpc.client.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + +XmlRpc.client + + +?debug:bool ->
+?headers:(string * string) list ->
+?insecure_ssl:bool ->
+?timeout:float ->
+?useragent:string ->
+string ->
+object
+  val mutable debug : bool
+  val mutable headers : (string * string) list
+  val mutable insecure_ssl : bool
+  val mutable timeout : float
+  val url : string
+  val mutable useragent : string
+  method call : string -> XmlRpc.value list -> XmlRpc.value
+  method debug : bool
+  method headers : (string * string) list
+  method insecure_ssl : bool
+  method set_base64_decoder : (string -> string) -> unit
+  method set_base64_encoder : (string -> string) -> unit
+  method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+  method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+  method set_debug : bool -> unit
+  method set_headers : (string * string) list -> unit
+  method set_insecure_ssl : bool -> unit
+  method set_timeout : float -> unit
+  method set_useragent : string -> unit
+  method timeout : float
+  method url : string
+  method useragent : string
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpc.html b/doc/xmlrpc-light/html/type_XmlRpc.html new file mode 100644 index 0000000..5dcf84a --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpc.html @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + +XmlRpc + + +sig
+  val version : string
+  exception Error of (int * string)
+  type value =
+      [ `Array of XmlRpc.value list
+      | `Binary of string
+      | `Boolean of bool
+      | `DateTime of XmlRpcDateTime.t
+      | `Double of float
+      | `Int of int
+      | `Int32 of int32
+      | `Nil
+      | `String of string
+      | `Struct of (string * XmlRpc.value) list ]
+  class client :
+    ?debug:bool ->
+    ?headers:(string * string) list ->
+    ?insecure_ssl:bool ->
+    ?timeout:float ->
+    ?useragent:string ->
+    string ->
+    object
+      val mutable debug : bool
+      val mutable headers : (string * string) list
+      val mutable insecure_ssl : bool
+      val mutable timeout : float
+      val url : string
+      val mutable useragent : string
+      method call : string -> XmlRpc.value list -> XmlRpc.value
+      method debug : bool
+      method headers : (string * string) list
+      method insecure_ssl : bool
+      method set_base64_decoder : (string -> string) -> unit
+      method set_base64_encoder : (string -> string) -> unit
+      method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+      method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+      method set_debug : bool -> unit
+      method set_headers : (string * string) list -> unit
+      method set_insecure_ssl : bool -> unit
+      method set_timeout : float -> unit
+      method set_useragent : string -> unit
+      method timeout : float
+      method url : string
+      method useragent : string
+    end
+  class multicall :
+    XmlRpc.client ->
+    object
+      method call : string -> XmlRpc.value list -> XmlRpc.value Lazy.t
+      method completed : bool
+      method execute : unit -> unit
+      method executed : bool
+      method result : int -> XmlRpc.value
+    end
+  val dump : XmlRpc.value -> string
+  type message =
+      MethodCall of (string * XmlRpc.value list)
+    | MethodResponse of XmlRpc.value
+    | Fault of (int * string)
+  val message_of_xml_element :
+    ?base64_decoder:(string -> string) ->
+    ?datetime_decoder:(string -> XmlRpcDateTime.t) ->
+    Xml.xml -> XmlRpc.message
+  val xml_element_of_message :
+    ?base64_encoder:(string -> string) ->
+    ?datetime_encoder:(XmlRpcDateTime.t -> string) ->
+    XmlRpc.message -> Xml.xml
+  val value_of_xml_element :
+    ?base64_decoder:(string -> string) ->
+    ?datetime_decoder:(string -> XmlRpcDateTime.t) -> Xml.xml -> XmlRpc.value
+  val xml_element_of_value :
+    ?base64_encoder:(string -> string) ->
+    ?datetime_encoder:(XmlRpcDateTime.t -> string) -> XmlRpc.value -> Xml.xml
+  val serve :
+    ?base64_encoder:(string -> string) ->
+    ?base64_decoder:(string -> string) ->
+    ?datetime_encoder:(XmlRpcDateTime.t -> string) ->
+    ?datetime_decoder:(string -> XmlRpcDateTime.t) ->
+    ?error_handler:(exn -> XmlRpc.message) ->
+    (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+  val serve_message :
+    ?error_handler:(exn -> XmlRpc.message) ->
+    (string -> XmlRpc.value list -> XmlRpc.value) ->
+    XmlRpc.message -> XmlRpc.message
+  val default_error_handler : exn -> XmlRpc.message
+  val quiet_error_handler : exn -> XmlRpc.message
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpc.multicall.html b/doc/xmlrpc-light/html/type_XmlRpc.multicall.html new file mode 100644 index 0000000..39b0102 --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpc.multicall.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + +XmlRpc.multicall + + +XmlRpc.client ->
+object
+  method call : string -> XmlRpc.value list -> XmlRpc.value Lazy.t
+  method completed : bool
+  method execute : unit -> unit
+  method executed : bool
+  method result : int -> XmlRpc.value
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpcBase64.html b/doc/xmlrpc-light/html/type_XmlRpcBase64.html new file mode 100644 index 0000000..973bb1f --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpcBase64.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + +XmlRpcBase64 + + +sig
+  exception Invalid_char
+  exception Invalid_table
+  type encoding_table = char array
+  type decoding_table = int array
+  val str_encode : ?tbl:XmlRpcBase64.encoding_table -> string -> string
+  val str_decode : ?tbl:XmlRpcBase64.decoding_table -> string -> string
+  val encode :
+    ?tbl:XmlRpcBase64.encoding_table -> char Stream.t -> char Stream.t
+  val decode :
+    ?tbl:XmlRpcBase64.decoding_table -> char Stream.t -> char Stream.t
+  val make_decoding_table :
+    XmlRpcBase64.encoding_table -> XmlRpcBase64.decoding_table
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpcDateTime.html b/doc/xmlrpc-light/html/type_XmlRpcDateTime.html new file mode 100644 index 0000000..5ae797c --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpcDateTime.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + +XmlRpcDateTime + + +sig
+  exception Parse_error of string
+  type t = int * int * int * int * int * int * int
+  val compare : XmlRpcDateTime.t -> XmlRpcDateTime.t -> int
+  val equal : XmlRpcDateTime.t -> XmlRpcDateTime.t -> bool
+  val hash : XmlRpcDateTime.t -> int
+  val now : unit -> XmlRpcDateTime.t
+  val now_utc : unit -> XmlRpcDateTime.t
+  val set_tz_offset : int -> XmlRpcDateTime.t -> XmlRpcDateTime.t
+  val fix_tz_offset : int -> XmlRpcDateTime.t -> XmlRpcDateTime.t
+  val from_unixfloat : float -> XmlRpcDateTime.t
+  val from_unixfloat_utc : float -> XmlRpcDateTime.t
+  val to_unixfloat : XmlRpcDateTime.t -> float
+  val to_unixfloat_utc : XmlRpcDateTime.t -> float
+  val from_unixtm : Unix.tm -> XmlRpcDateTime.t
+  val from_unixtm_utc : Unix.tm -> XmlRpcDateTime.t
+  val to_unixtm : XmlRpcDateTime.t -> Unix.tm
+  val to_unixtm_utc : XmlRpcDateTime.t -> Unix.tm
+  val of_string : string -> XmlRpcDateTime.t
+  val to_string : XmlRpcDateTime.t -> string
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.base.html b/doc/xmlrpc-light/html/type_XmlRpcServer.base.html new file mode 100644 index 0000000..b1a92cb --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpcServer.base.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + +XmlRpcServer.base + + +object
+  val mutable base64_decoder : string -> string
+  val mutable base64_encoder : string -> string
+  val mutable datetime_decoder : string -> XmlRpcDateTime.t
+  val mutable datetime_encoder : XmlRpcDateTime.t -> string
+  val mutable error_handler : exn -> XmlRpc.message
+  val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t
+  method register :
+    string ->
+    ?help:string ->
+    ?signature:XmlRpcServer.param_type list ->
+    ?signatures:XmlRpcServer.param_type list list ->
+    (XmlRpc.value list -> XmlRpc.value) -> unit
+  method virtual run : unit -> unit
+  method serve :
+    (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+  method serve_message :
+    (string -> XmlRpc.value list -> XmlRpc.value) ->
+    XmlRpc.message -> XmlRpc.message
+  method set_base64_decoder : (string -> string) -> unit
+  method set_base64_encoder : (string -> string) -> unit
+  method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+  method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+  method set_error_handler : (exn -> XmlRpc.message) -> unit
+  method unregister : string -> unit
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html b/doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html new file mode 100644 index 0000000..4f09b3b --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + +XmlRpcServer.cgi + + +unit -> XmlRpcServer.server \ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.html b/doc/xmlrpc-light/html/type_XmlRpcServer.html new file mode 100644 index 0000000..63936c0 --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpcServer.html @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + +XmlRpcServer + + +sig
+  type param_type =
+      [ `Array
+      | `Binary
+      | `Boolean
+      | `DateTime
+      | `Double
+      | `Int
+      | `String
+      | `Struct
+      | `Undefined ]
+  class virtual base :
+    object
+      val mutable base64_decoder : string -> string
+      val mutable base64_encoder : string -> string
+      val mutable datetime_decoder : string -> XmlRpcDateTime.t
+      val mutable datetime_encoder : XmlRpcDateTime.t -> string
+      val mutable error_handler : exn -> XmlRpc.message
+      val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t
+      method register :
+        string ->
+        ?help:string ->
+        ?signature:XmlRpcServer.param_type list ->
+        ?signatures:XmlRpcServer.param_type list list ->
+        (XmlRpc.value list -> XmlRpc.value) -> unit
+      method virtual run : unit -> unit
+      method serve :
+        (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+      method serve_message :
+        (string -> XmlRpc.value list -> XmlRpc.value) ->
+        XmlRpc.message -> XmlRpc.message
+      method set_base64_decoder : (string -> string) -> unit
+      method set_base64_encoder : (string -> string) -> unit
+      method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+      method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+      method set_error_handler : (exn -> XmlRpc.message) -> unit
+      method unregister : string -> unit
+    end
+  class type server =
+    object
+      val mutable base64_decoder : string -> string
+      val mutable base64_encoder : string -> string
+      val mutable datetime_decoder : string -> XmlRpcDateTime.t
+      val mutable datetime_encoder : XmlRpcDateTime.t -> string
+      val mutable error_handler : exn -> XmlRpc.message
+      val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t
+      method register :
+        string ->
+        ?help:string ->
+        ?signature:param_type list ->
+        ?signatures:param_type list list ->
+        (XmlRpc.value list -> XmlRpc.value) -> unit
+      method run : unit -> unit
+      method serve :
+        (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+      method serve_message :
+        (string -> XmlRpc.value list -> XmlRpc.value) ->
+        XmlRpc.message -> XmlRpc.message
+      method set_base64_decoder : (string -> string) -> unit
+      method set_base64_encoder : (string -> string) -> unit
+      method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+      method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+      method set_error_handler : (exn -> XmlRpc.message) -> unit
+      method unregister : string -> unit
+    end
+  class cgi : unit -> server
+  class netplex :
+    ?parallelizer:Netplex_types.parallelizer ->
+    ?handler:string -> unit -> server
+  val invalid_method : string -> 'a
+  val invalid_params : unit -> 'a
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html b/doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html new file mode 100644 index 0000000..aa4967a --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + +XmlRpcServer.netplex + + +?parallelizer:Netplex_types.parallelizer ->
+?handler:string -> unit -> XmlRpcServer.server
\ No newline at end of file diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.server.html b/doc/xmlrpc-light/html/type_XmlRpcServer.server.html new file mode 100644 index 0000000..b98337f --- /dev/null +++ b/doc/xmlrpc-light/html/type_XmlRpcServer.server.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + +XmlRpcServer.server + + +object
+  val mutable base64_decoder : string -> string
+  val mutable base64_encoder : string -> string
+  val mutable datetime_decoder : string -> XmlRpcDateTime.t
+  val mutable datetime_encoder : XmlRpcDateTime.t -> string
+  val mutable error_handler : exn -> XmlRpc.message
+  val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t
+  method register :
+    string ->
+    ?help:string ->
+    ?signature:param_type list ->
+    ?signatures:param_type list list ->
+    (XmlRpc.value list -> XmlRpc.value) -> unit
+  method run : unit -> unit
+  method serve :
+    (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+  method serve_message :
+    (string -> XmlRpc.value list -> XmlRpc.value) ->
+    XmlRpc.message -> XmlRpc.message
+  method set_base64_decoder : (string -> string) -> unit
+  method set_base64_encoder : (string -> string) -> unit
+  method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+  method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+  method set_error_handler : (exn -> XmlRpc.message) -> unit
+  method unregister : string -> unit
+end
\ No newline at end of file diff --git a/doc/xmlrpc-light/latex/doc.aux b/doc/xmlrpc-light/latex/doc.aux new file mode 100644 index 0000000..21e264f --- /dev/null +++ b/doc/xmlrpc-light/latex/doc.aux @@ -0,0 +1,116 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {1}Module {\tt {XmlRpc}} : XmlRpc Light.}{1}} +\newlabel{module:XmlRpc}{{1}{1}} +\newlabel{val:XmlRpc.version}{{1}{1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}High-level interface}{1}} +\newlabel{exception:XmlRpc.Error}{{1.1}{1}} +\newlabel{type:XmlRpc.value}{{1.1}{2}} +\newlabel{class:XmlRpc.client}{{1.1}{2}} +\newlabel{val:XmlRpc.client.url}{{1.1}{2}} +\newlabel{val:XmlRpc.client.debug}{{1.1}{2}} +\newlabel{val:XmlRpc.client.headers}{{1.1}{2}} +\newlabel{val:XmlRpc.client.insecure-underscoressl}{{1.1}{2}} +\newlabel{val:XmlRpc.client.timeout}{{1.1}{2}} +\newlabel{val:XmlRpc.client.useragent}{{1.1}{3}} +\newlabel{method:XmlRpc.client.url}{{1.1}{3}} +\newlabel{method:XmlRpc.client.debug}{{1.1}{3}} +\newlabel{method:XmlRpc.client.set-underscoredebug}{{1.1}{3}} +\newlabel{method:XmlRpc.client.headers}{{1.1}{3}} +\newlabel{method:XmlRpc.client.set-underscoreheaders}{{1.1}{3}} +\newlabel{method:XmlRpc.client.insecure-underscoressl}{{1.1}{3}} +\newlabel{method:XmlRpc.client.set-underscoreinsecure-underscoressl}{{1.1}{3}} +\newlabel{method:XmlRpc.client.timeout}{{1.1}{3}} +\newlabel{method:XmlRpc.client.set-underscoretimeout}{{1.1}{3}} +\newlabel{method:XmlRpc.client.useragent}{{1.1}{3}} +\newlabel{method:XmlRpc.client.set-underscoreuseragent}{{1.1}{3}} +\newlabel{method:XmlRpc.client.set-underscorebase64-underscoreencoder}{{1.1}{3}} +\newlabel{method:XmlRpc.client.set-underscorebase64-underscoredecoder}{{1.1}{4}} +\newlabel{method:XmlRpc.client.set-underscoredatetime-underscoreencoder}{{1.1}{4}} +\newlabel{method:XmlRpc.client.set-underscoredatetime-underscoredecoder}{{1.1}{4}} +\newlabel{method:XmlRpc.client.call}{{1.1}{4}} +\newlabel{class:XmlRpc.multicall}{{1.1}{4}} +\newlabel{method:XmlRpc.multicall.call}{{1.1}{4}} +\newlabel{method:XmlRpc.multicall.execute}{{1.1}{4}} +\newlabel{method:XmlRpc.multicall.result}{{1.1}{4}} +\newlabel{method:XmlRpc.multicall.executed}{{1.1}{5}} +\newlabel{method:XmlRpc.multicall.completed}{{1.1}{5}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Utility functions}{6}} +\newlabel{val:XmlRpc.dump}{{1.2}{6}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Low-level interface}{6}} +\newlabel{type:XmlRpc.message}{{1.3}{6}} +\newlabel{val:XmlRpc.message-underscoreof-underscorexml-underscoreelement}{{1.3}{7}} +\newlabel{val:XmlRpc.xml-underscoreelement-underscoreof-underscoremessage}{{1.3}{7}} +\newlabel{val:XmlRpc.value-underscoreof-underscorexml-underscoreelement}{{1.3}{7}} +\newlabel{val:XmlRpc.xml-underscoreelement-underscoreof-underscorevalue}{{1.3}{7}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.4}Server tools}{7}} +\newlabel{val:XmlRpc.serve}{{1.4}{7}} +\newlabel{val:XmlRpc.serve-underscoremessage}{{1.4}{8}} +\newlabel{val:XmlRpc.default-underscoreerror-underscorehandler}{{1.4}{8}} +\newlabel{val:XmlRpc.quiet-underscoreerror-underscorehandler}{{1.4}{8}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Module {\tt {XmlRpcServer}} : XmlRpc Light server.}{8}} +\newlabel{module:XmlRpcServer}{{2}{8}} +\newlabel{type:XmlRpcServer.param-underscoretype}{{2}{8}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Base classes}{9}} +\newlabel{class:XmlRpcServer.base}{{2.1}{9}} +\newlabel{val:XmlRpcServer.base.methods}{{2.1}{9}} +\newlabel{val:XmlRpcServer.base.base64-underscoreencoder}{{2.1}{9}} +\newlabel{val:XmlRpcServer.base.base64-underscoredecoder}{{2.1}{9}} +\newlabel{val:XmlRpcServer.base.datetime-underscoreencoder}{{2.1}{9}} +\newlabel{val:XmlRpcServer.base.datetime-underscoredecoder}{{2.1}{9}} +\newlabel{val:XmlRpcServer.base.error-underscorehandler}{{2.1}{9}} +\newlabel{method:XmlRpcServer.base.set-underscorebase64-underscoreencoder}{{2.1}{9}} +\newlabel{method:XmlRpcServer.base.set-underscorebase64-underscoredecoder}{{2.1}{9}} +\newlabel{method:XmlRpcServer.base.set-underscoredatetime-underscoreencoder}{{2.1}{9}} +\newlabel{method:XmlRpcServer.base.set-underscoredatetime-underscoredecoder}{{2.1}{9}} +\newlabel{method:XmlRpcServer.base.set-underscoreerror-underscorehandler}{{2.1}{9}} +\newlabel{method:XmlRpcServer.base.serve}{{2.1}{9}} +\newlabel{method:XmlRpcServer.base.serve-underscoremessage}{{2.1}{10}} +\newlabel{method:XmlRpcServer.base.register}{{2.1}{10}} +\newlabel{method:XmlRpcServer.base.unregister}{{2.1}{10}} +\newlabel{method:XmlRpcServer.base.run}{{2.1}{10}} +\newlabel{classtype:XmlRpcServer.server}{{2.1}{10}} +\newlabel{method:XmlRpcServer.server.run}{{2.1}{10}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Server implementations}{11}} +\newlabel{class:XmlRpcServer.cgi}{{2.2}{11}} +\newlabel{class:XmlRpcServer.netplex}{{2.2}{11}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Utility functions}{11}} +\newlabel{val:XmlRpcServer.invalid-underscoremethod}{{2.3}{11}} +\newlabel{val:XmlRpcServer.invalid-underscoreparams}{{2.3}{11}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Module {\tt {XmlRpcDateTime}} : Date/time type.}{11}} +\newlabel{module:XmlRpcDateTime}{{3}{11}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Types}{11}} +\newlabel{exception:XmlRpcDateTime.Parse-underscoreerror}{{3.1}{11}} +\newlabel{type:XmlRpcDateTime.t}{{3.1}{11}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Comparison}{11}} +\newlabel{val:XmlRpcDateTime.compare}{{3.2}{11}} +\newlabel{val:XmlRpcDateTime.equal}{{3.2}{11}} +\newlabel{val:XmlRpcDateTime.hash}{{3.2}{11}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Current date and time}{12}} +\newlabel{val:XmlRpcDateTime.now}{{3.3}{12}} +\newlabel{val:XmlRpcDateTime.now-underscoreutc}{{3.3}{12}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Time zone adjustments}{12}} +\newlabel{val:XmlRpcDateTime.set-underscoretz-underscoreoffset}{{3.4}{12}} +\newlabel{val:XmlRpcDateTime.fix-underscoretz-underscoreoffset}{{3.4}{12}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Conversion}{12}} +\newlabel{val:XmlRpcDateTime.from-underscoreunixfloat}{{3.5}{12}} +\newlabel{val:XmlRpcDateTime.from-underscoreunixfloat-underscoreutc}{{3.5}{12}} +\newlabel{val:XmlRpcDateTime.to-underscoreunixfloat}{{3.5}{12}} +\newlabel{val:XmlRpcDateTime.to-underscoreunixfloat-underscoreutc}{{3.5}{12}} +\newlabel{val:XmlRpcDateTime.from-underscoreunixtm}{{3.5}{12}} +\newlabel{val:XmlRpcDateTime.from-underscoreunixtm-underscoreutc}{{3.5}{12}} +\newlabel{val:XmlRpcDateTime.to-underscoreunixtm}{{3.5}{12}} +\newlabel{val:XmlRpcDateTime.to-underscoreunixtm-underscoreutc}{{3.5}{12}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}ISO-8601 parsing and generation}{13}} +\newlabel{val:XmlRpcDateTime.of-underscorestring}{{3.6}{13}} +\newlabel{val:XmlRpcDateTime.to-underscorestring}{{3.6}{13}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Module {\tt {XmlRpcBase64}} : Base64 codec.}{13}} +\newlabel{module:XmlRpcBase64}{{4}{13}} +\newlabel{exception:XmlRpcBase64.Invalid-underscorechar}{{4}{13}} +\newlabel{exception:XmlRpcBase64.Invalid-underscoretable}{{4}{13}} +\newlabel{type:XmlRpcBase64.encoding-underscoretable}{{4}{13}} +\newlabel{type:XmlRpcBase64.decoding-underscoretable}{{4}{13}} +\newlabel{val:XmlRpcBase64.str-underscoreencode}{{4}{13}} +\newlabel{val:XmlRpcBase64.str-underscoredecode}{{4}{13}} +\newlabel{val:XmlRpcBase64.encode}{{4}{13}} +\newlabel{val:XmlRpcBase64.decode}{{4}{13}} +\newlabel{val:XmlRpcBase64.make-underscoredecoding-underscoretable}{{4}{13}} diff --git a/doc/xmlrpc-light/latex/doc.dvi b/doc/xmlrpc-light/latex/doc.dvi new file mode 100644 index 0000000..a92defc Binary files /dev/null and b/doc/xmlrpc-light/latex/doc.dvi differ diff --git a/doc/xmlrpc-light/latex/doc.log b/doc/xmlrpc-light/latex/doc.log new file mode 100644 index 0000000..ae8ed4f --- /dev/null +++ b/doc/xmlrpc-light/latex/doc.log @@ -0,0 +1,128 @@ +This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=latex 2008.11.2) 19 JAN 2009 17:36 +entering extended mode + %&-line parsing enabled. +**doc.tex +(./doc.tex +LaTeX2e <2005/12/01> +Babel and hyphenation patterns for english, usenglishmax, dumylang, noh +yphenation, croatian, ukrainian, russian, bulgarian, czech, slovak, danish, dut +ch, finnish, basque, french, german, ngerman, ibycus, greek, monogreek, ancient +greek, hungarian, italian, latin, mongolian, norsk, icelandic, interlingua, tur +kish, coptic, romanian, welsh, serbian, slovenian, estonian, esperanto, upperso +rbian, indonesian, polish, portuguese, spanish, catalan, galician, swedish, loa +ded. +(/usr/share/texmf-texlive/tex/latex/base/article.cls +Document Class: article 2005/09/16 v1.4f Standard LaTeX document class +(/usr/share/texmf-texlive/tex/latex/base/size11.clo +File: size11.clo 2005/09/16 v1.4f Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texmf-texlive/tex/latex/base/inputenc.sty +Package: inputenc 2006/05/05 v1.1b Input encoding file +\inpenc@prehook=\toks14 +\inpenc@posthook=\toks15 + +(/usr/share/texmf-texlive/tex/latex/base/latin1.def +File: latin1.def 2006/05/05 v1.1b Input encoding file +)) +(/usr/share/texmf-texlive/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package + +(/usr/share/texmf-texlive/tex/latex/base/t1enc.def +File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding T1 on input line 43. +)) +(/usr/share/texmf-texlive/tex/latex/preprint/fullpage.sty +Package: fullpage 1999/02/23 1.1 (PWD) +\FP@margin=\skip43 +) +(/usr/share/texmf-texlive/tex/latex/ltxmisc/url.sty +\Urlmuskip=\muskip10 +Package: url 2005/06/27 ver 3.2 Verb mode for urls, etc. +) (./ocamldoc.sty +Package: ocamldoc 2001/12/04 v1.0 ocamldoc support +) +(./doc.aux) +\openout1 = `doc.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. + (./doc.toc +LaTeX Font Info: Try loading font information for T1+cmtt on input line 1. + (/usr/share/texmf-texlive/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 2. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 2. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 2. +) +\tf@toc=\write3 +\openout3 = `doc.toc'. + + +[1 + +] +LaTeX Font Info: Try loading font information for OMS+cmr on input line 85. + (/usr/share/texmf-texlive/tex/latex/base/omscmr.fd +File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10.95> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 85. + +Overfull \hbox (294.12506pt too wide) in paragraph at lines 107--107 +[]\T1/cmtt/m/n/10.95 class client : ?debug:bool -> ?headers:(string * string) l +ist -> ?insecure_ssl:bool -> ?timeout:float -> ?useragent:string -> string -> + [] + +[2] [3] [4] [5] +Overfull \hbox (32.9232pt too wide) in paragraph at lines 514--514 + [] \T1/cmtt/m/n/10.95 Exception: XmlRpc.Error (-32602, "server error. i +nvalid method parameters").[] + [] + +[6] [7] [8] [9] [10] +Overfull \hbox (56.47348pt too wide) in paragraph at lines 1081--1081 +[]\T1/cmtt/m/n/10.95 class netplex : ?parallelizer:Netplex_types.parallelizer - +> ?handler:string -> unit -> server + [] + +[11] [12] [13] (./doc.aux) + +LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. + + ) +Here is how much of TeX's memory you used: + 742 strings out of 94102 + 11159 string characters out of 1165833 + 53000 words of memory out of 1500000 + 4060 multiletter control sequences out of 10000+50000 + 12330 words of font info for 32 fonts, out of 1200000 for 2000 + 637 hyphenation exceptions out of 8191 + 22i,5n,20p,232b,304s stack positions out of 5000i,500n,6000p,200000b,5000s + +Output written on doc.dvi (13 pages, 30196 bytes). diff --git a/doc/xmlrpc-light/latex/doc.pdf b/doc/xmlrpc-light/latex/doc.pdf new file mode 100644 index 0000000..e936e7d Binary files /dev/null and b/doc/xmlrpc-light/latex/doc.pdf differ diff --git a/doc/xmlrpc-light/latex/doc.ps b/doc/xmlrpc-light/latex/doc.ps new file mode 100644 index 0000000..3b2c002 --- /dev/null +++ b/doc/xmlrpc-light/latex/doc.ps @@ -0,0 +1,3723 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software +%%Title: doc.dvi +%%CreationDate: Mon Jan 19 17:36:42 2009 +%%Pages: 13 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentFonts: CMSY10 CMMI10 +%%DocumentPaperSizes: a4 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips doc.dvi -o doc.ps +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2009.01.19:1736 +%%BeginProcSet: tex.pro 0 0 +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S +/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy +setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.1: CMMI10 1.100 +%%CreationDate: 1996 Jul 23 07:53:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +dup 60 /less put +dup 62 /greater put +readonly def +/FontBBox{-32 -250 1048 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 +990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E +6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB +DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 +59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 +D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF +8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 +6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 +1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE +03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 +95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 +74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 +3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 +47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 +AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 +42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 +40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 +B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 +956017667094CD8DC214A666D7D12CB23EC030318B42CBAAF40FFB3841355872 +715967202E674F5ECE31075C2B1C5F53E28AE3C1491012441F34A19EE7421594 +8C7C9937E184D28A736BA38E5E2596B6541FD3FDFB0E3F2FDCD1C10D2F048B47 +01E771216915C6D5AA086DAE91E8581D5017146B452AC12080853B8BA982ED62 +439481801A9791BEE207032642F4B66ADFEDFF9C7C779E896DA0BFF61C4B2847 +94C5CE44B7F6ECA777491672DA62C4904A9D4A9BC8D49672446AE640BD50117A +6E2F3D44C38F21E572847884011309A71D567154A43D2BBEA13682287A5D63A3 +8C0FCCAD477B607D89F84E32868DC2D5CB6E2DBB39AE0FB7C049A517DF8AC902 +4B8A6982210B2D361A9E381E960E5D1F4C42599AED2677F84F23522A6D19653B +E6E0EA0D94F5649FE39A3666098D55AACD60AABA48EC29060611C411D34D0DB8 +383F260E1EB69D9F81BB6CE70ADC191C5F3A9690F1AAEE51D174CF24D4D687D3 +80BFDB524A54B5CA242E9B724C74B83B0F9F04C028B3F26EC2065E23434B2A47 +C067859462BB1EC0FF0FE19FD2B0539D7D82691518E48CE2D618C3FDA5ECC5CB +27A4096487A78DCACAF340BBFC7704B57514D8B041E527B0CD94DDD3BA2F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 15 /bullet put +dup 33 /arrowright put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A +27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF +5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 +0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 +DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A +71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 +4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C +515DB70A8D4F6146FE068DC1E5DE8BC57036431151EC603C8BCFE359BBD953AD +5F3D998C6EE18EABCDD31D35C7E933DEA008418A4F0845FC9A361328AB270359 +C974485C9BCBCB1E9EBBF3ACC647C4108F7E05961E22390303FD667A2294F500 +7A085C407875EB0F306D82AF2CD4829E70C8DDF7E27A57EE6D66713B450FB5D1 +E37EA9012BE3E4642F467847C3401CCDBF7987531B406162E82910D56F7AE6E0 +4587FAB307D874BEF0981B709F3C6847D141FF45F2C46CA337D65E6E31005EC9 +E1C970667034EAE2CEAD678E6F94BC880E81E288D425B4C078126B01D9374BAA +D20451839407F0174C7CDA9FBA9599BC29F1BC4D574290B8FF1DF4E1A737DBD5 +5D64259C877191547076B1C7684CD252C02D58B7810E95ADC8C1C4497EE27922 +D87EB5B4B2F7081AB03BEEFB555C6942C79F53C77FF154FD87EAC82AC3A3A8C2 +2D91DF7C509A1838C72ADA3CB65BAF59E392FD8936DF8DC002A0C41215A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +TeXDict begin 39158280 55380996 1000 600 600 (doc.dvi) +@start /Fa 193[71 1[71 1[25 58[{}3 90.9091 /CMMI10 rf +/Fb 222[91 17[45 15[{}2 90.9091 /CMSY10 rf +%DVIPSBitmapFont: Fc ecbx1200 12 41 +/Fc 41 123 df45 D<07C01FF03FF87FFCFFFEFFFEFFFEFFFEFFFEFFFEFF +FE7FFC3FF81FF007C00F0F788E1F>I<00003FF800000001FFFF0000000FFFFFE000003F +FFFFF800007FF01FFC0000FFC007FE0001FF0001FF0003FE0000FF8007FE0000FFC007FC +00007FC00FFC00007FE00FF800003FE01FF800003FF01FF800003FF03FF800003FF83FF8 +00003FF83FF000001FF87FF000001FFC7FF000001FFC7FF000001FFC7FF000001FFC7FF0 +00001FFC7FF000001FFCFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0 +00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0 +00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0 +00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFE7FF000001FFC7FF0 +00001FFC7FF000001FFC7FF000001FFC7FF000001FFC3FF800003FF83FF800003FF83FF8 +00003FF81FF800003FF01FF800003FF00FF800003FE00FFC00007FE007FC00007FC007FE +0000FFC003FF0001FF8001FF8003FF0000FFC007FE00007FF01FFC00003FFFFFF800000F +FFFFE0000003FFFF800000003FF800002F427CC038>48 D<000003C000000007C0000000 +1FC00000007FC0000003FFC000003FFFC000FFFFFFC000FFFFFFC000FFFFFFC000FFFFFF +C000FFC3FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0 +000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000 +0003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC00000 +03FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003 +FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FF +C0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0 +000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000 +FFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFC264177C038>I<0000FFE0 +0000000FFFFE0000003FFFFF800000FFFFFFE00003FFFFFFF80007FC03FFFE000FE0007F +FF001F80003FFF803F00000FFFC07F000007FFC07FC00007FFE07FF00003FFE0FFF00001 +FFF0FFF80001FFF0FFF80001FFF8FFF80000FFF8FFF80000FFF8FFF80000FFF8FFF80000 +FFF87FF00000FFF83FE00000FFF81FC00000FFF800000000FFF800000000FFF000000001 +FFF000000001FFF000000001FFE000000003FFE000000003FFC000000007FF800000000F +FF000000000FFF000000001FFC000000003FF8000000003FF0000000007FE000000000FF +C000000001FF0000000003FE0000000007FC000000000FF0000000001FE0000000003F80 +000000007F0000780000FE0000780001FC0000780003F80000F80007E00000F0000FC000 +00F0001F800000F0003F000000F0007C000001F000F8000003F001FFFFFFFFF003FFFFFF +FFE007FFFFFFFFE00FFFFFFFFFE01FFFFFFFFFE03FFFFFFFFFE07FFFFFFFFFE0FFFFFFFF +FFE0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC02D417BC038>I<0000FF +F000000007FFFF0000001FFFFFC000007FFFFFF00000FF007FF80003F8003FFE0007E000 +1FFF0007E0000FFF000FF80007FF800FFE0007FF801FFE0007FFC01FFF0007FFC01FFF00 +07FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC00FFE0007FFC007FC00 +07FF8003F8000FFF800000000FFF000000001FFF000000001FFE000000003FFC00000000 +7FF800000000FFF000000001FFE00000000FFF80000007FFFE00000007FFF800000007FF +FF00000007FFFFC000000000FFF0000000003FFC000000000FFE000000000FFF80000000 +07FF8000000003FFC000000003FFE000000003FFE000000001FFF000000001FFF0000000 +01FFF800000001FFF800000001FFF80FC00001FFF83FF00001FFF87FF80001FFF87FF800 +01FFF8FFFC0001FFF8FFFC0001FFF8FFFC0001FFF0FFFC0001FFF0FFFC0003FFF0FFFC00 +03FFE07FF80003FFE07FF00007FFC07FE00007FFC03F80000FFF801FF0001FFF000FFE00 +FFFE0007FFFFFFF80001FFFFFFF000007FFFFFC000001FFFFE00000001FFE000002D427B +C038>I<000000003F0000000000003F0000000000007F000000000000FF000000000001 +FF000000000003FF000000000003FF000000000007FF00000000000FFF00000000001FFF +00000000003FFF00000000003FFF00000000007FFF0000000000FFFF0000000001F7FF00 +00000003E7FF0000000007E7FF0000000007C7FF000000000F87FF000000001F07FF0000 +00003E07FF000000007E07FF000000007C07FF00000000F807FF00000001F007FF000000 +03E007FF00000007E007FF00000007C007FF0000000F8007FF0000001F0007FF0000003E +0007FF0000007C0007FF0000007C0007FF000000F80007FF000001F00007FF000003E000 +07FF000007C00007FF00000FC00007FF00000F800007FF00001F000007FF00003E000007 +FF00007C000007FF0000FC000007FF0000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFF +FF80FFFFFFFFFFFF80FFFFFFFFFFFF800000000FFF00000000000FFF00000000000FFF00 +000000000FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF0000 +0000000FFF00000000000FFF00000000000FFF00000000000FFF000000007FFFFFFF8000 +007FFFFFFF8000007FFFFFFF8000007FFFFFFF8000007FFFFFFF8031417DC038>I<0700 +0000030007E000003F0007FF0007FF0007FFFFFFFF0007FFFFFFFE0007FFFFFFFC0007FF +FFFFF80007FFFFFFF00007FFFFFFE00007FFFFFF800007FFFFFE000007FFFFFC000007FF +FFE0000007FFFF00000007C00000000007C00000000007C00000000007C00000000007C0 +0000000007C00000000007C00000000007C00000000007C00000000007C00000000007C0 +3FF0000007C1FFFF000007C7FFFFC00007DFFFFFF00007FFE03FFC0007FF000FFE0007FC +0007FF0007F00003FF8007E00003FFC007C00001FFC003800001FFE000000001FFE00000 +0000FFF000000000FFF000000000FFF000000000FFF800000000FFF800000000FFF80000 +0000FFF80F800000FFF83FE00000FFF87FF00000FFF8FFF00000FFF8FFF80000FFF8FFF8 +0000FFF8FFF80000FFF8FFF80000FFF0FFF00000FFF0FFF00001FFF07FE00001FFE07FC0 +0001FFE07E000003FFC03E000003FFC03F000007FF801FC0000FFF000FF0001FFE0007FE +00FFFC0003FFFFFFF00000FFFFFFE000003FFFFF8000000FFFFC00000001FFC000002D42 +7BC038>I<000001FF800000001FFFF00000007FFFFC000001FFFFFF000007FF807F8000 +0FFC001F80003FF0001FC0007FE0007FC000FFC000FFE001FF8001FFE003FF8001FFE003 +FF0001FFE007FE0001FFE00FFE0001FFE00FFE0001FFE01FFC0000FFC01FFC00007F801F +FC00001E003FFC000000003FFC000000003FF8000000007FF8000000007FF8000000007F +F807FC00007FF81FFF8000FFF87FFFE000FFF8FFFFF800FFF9F01FFC00FFFBC007FE00FF +FF8003FF00FFFF8003FF80FFFF0001FFC0FFFE0001FFC0FFFE0000FFE0FFFE0000FFE0FF +FC0000FFF0FFFC0000FFF0FFFC0000FFF0FFFC0000FFF8FFF80000FFF8FFF80000FFF8FF +F80000FFF8FFF80000FFF87FF80000FFF87FF80000FFF87FF80000FFF87FF80000FFF87F +F80000FFF83FF80000FFF83FF80000FFF83FF80000FFF03FFC0000FFF01FFC0000FFF01F +FC0000FFF00FFC0001FFE00FFC0001FFE007FE0001FFC007FF0003FF8003FF8003FF0001 +FFC007FE0000FFE01FFC00007FFFFFF800001FFFFFF0000007FFFFC0000001FFFF000000 +003FF000002D427BC038>I<00007FF000000003FFFF0000000FFFFFC000003FFFFFF000 +007F801FFC0001FC0003FE0003F80001FF0003F00000FF0007E000007F8007E000003F80 +0FC000003FC00FC000003FC01FC000001FC01FC000001FC01FE000001FC01FE000001FC0 +1FF000001FC01FF800001FC01FFE00003FC01FFF00003F801FFFC0007F801FFFF0007F00 +0FFFFC00FF000FFFFE01FE0007FFFF83FC0007FFFFE7F80003FFFFFFE00001FFFFFFC000 +00FFFFFF0000007FFFFFC000003FFFFFE000000FFFFFF800000FFFFFFC00003FFFFFFE00 +00FFFFFFFF0001FF3FFFFF8007FC0FFFFFC00FF803FFFFE01FF000FFFFE01FE0007FFFF0 +3FE0001FFFF07FC00007FFF07F800003FFF87F800000FFF8FF8000007FF8FF0000003FF8 +FF0000001FF8FF0000000FF8FF0000000FF8FF00000007F8FF00000007F8FF00000007F8 +FF80000007F07F80000007F07F8000000FF07FC000000FE03FE000001FE03FF000003FC0 +1FF800007F800FFE0001FF0007FFC00FFE0003FFFFFFFC0000FFFFFFF000003FFFFFC000 +000FFFFF00000000FFF000002D427BC038>56 D66 +D<00000000FFF00000700000001FFFFF0000F0000001FFFFFFE001F0000007FFFFFFF803 +F000003FFFFFFFFE07F00000FFFFE001FF0FF00001FFFE00003F9FF00007FFF000000FFF +F0000FFFC0000007FFF0001FFF00000003FFF0003FFE00000001FFF0007FFC00000000FF +F000FFF8000000007FF001FFF0000000003FF003FFE0000000001FF007FFE0000000001F +F007FFC0000000000FF00FFF80000000000FF00FFF800000000007F01FFF000000000007 +F01FFF000000000003F03FFF000000000003F03FFE000000000003F03FFE000000000003 +F07FFE000000000001F07FFE000000000001F07FFE000000000001F07FFC000000000000 +00FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000000000 +00FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000000000 +00FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000000000 +00FFFC00000000000000FFFC000000000000007FFC000000000000007FFE000000000000 +007FFE000000000000F07FFE000000000000F03FFE000000000000F03FFE000000000000 +F03FFF000000000000F01FFF000000000001F01FFF000000000001E00FFF800000000001 +E00FFF800000000003E007FFC00000000003C007FFE00000000007C003FFE00000000007 +C001FFF0000000000F8000FFF8000000001F00007FFC000000003F00003FFE000000007E +00001FFF80000000FC00000FFFC0000001F8000007FFF0000007F0000001FFFE00001FE0 +000000FFFFF001FF800000003FFFFFFFFF0000000007FFFFFFFC0000000001FFFFFFF000 +000000001FFFFF80000000000000FFF800000044467AC451>I72 +DI76 +D<00000007FFC0000000000000FFFFFE000000000007FFFFFFC0000000001FFFFFFFF000 +0000007FFE00FFFC00000001FFF0001FFF00000007FF800003FFC000000FFF000001FFE0 +00001FFC0000007FF000003FF80000003FF800007FF00000001FFC0000FFF00000001FFE +0001FFE00000000FFF0003FFC000000007FF8003FFC000000007FF8007FF8000000003FF +C007FF8000000003FFC00FFF0000000001FFE00FFF0000000001FFE01FFF0000000001FF +F01FFE0000000000FFF03FFE0000000000FFF83FFE0000000000FFF83FFE0000000000FF +F87FFE0000000000FFFC7FFC00000000007FFC7FFC00000000007FFC7FFC00000000007F +FC7FFC00000000007FFCFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F +FEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F +FEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F +FEFFFC00000000007FFEFFFC00000000007FFE7FFC00000000007FFC7FFE0000000000FF +FC7FFE0000000000FFFC7FFE0000000000FFFC3FFE0000000000FFF83FFE0000000000FF +F83FFF0000000001FFF81FFF0000000001FFF01FFF0000000001FFF01FFF8000000003FF +F00FFF8000000003FFE00FFF8000000003FFE007FFC000000007FFC003FFC000000007FF +8003FFE00000000FFF8001FFF00000001FFF0000FFF80000003FFE00007FFC0000007FFC +00003FFE000000FFF800001FFF000001FFF000000FFFC00007FFE0000007FFF0001FFFC0 +000001FFFE00FFFF00000000FFFFFFFFFE000000003FFFFFFFF80000000007FFFFFFC000 +00000000FFFFFE00000000000007FFC000000047467AC454>79 D<0000FFE0001C000007 +FFFE003C00003FFFFF807C0000FFFFFFE0FC0001FFFFFFF9FC0003FF801FFFFC0007FC00 +01FFFC000FF800007FFC001FF000003FFC003FE000000FFC003FC0000007FC007FC00000 +03FC007F80000003FC007F80000001FC007F80000000FC00FF80000000FC00FF80000000 +7C00FF800000007C00FFC00000007C00FFC00000007C00FFE00000003C00FFF00000003C +00FFF80000003C00FFFC00000000007FFE00000000007FFFE0000000007FFFFE00000000 +3FFFFFF00000003FFFFFFF0000001FFFFFFFE000001FFFFFFFFC00000FFFFFFFFE000007 +FFFFFFFF800003FFFFFFFFC00001FFFFFFFFE000007FFFFFFFF000001FFFFFFFF8000007 +FFFFFFFC000000FFFFFFFC0000000FFFFFFE00000000FFFFFE0000000007FFFF00000000 +007FFF00000000003FFF00000000000FFF800000000007FF800000000003FF80F0000000 +03FF80F000000001FF80F000000001FF80F000000000FF80F000000000FF80F800000000 +FF80F800000000FF80F800000000FF00FC00000000FF00FC00000000FF00FE00000001FF +00FF00000001FE00FF80000003FE00FFC0000003FC00FFE0000007FC00FFF800000FF800 +FFFF00003FF000FFFFF800FFE000FE7FFFFFFFC000FC1FFFFFFF0000F807FFFFFC0000F0 +00FFFFF00000E00007FF80000031467AC43E>83 D<3FFFFFFFFFFFFFFFE03FFFFFFFFFFF +FFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFE000FFF80 +03FFE07FE0000FFF80003FF07FC0000FFF80001FF07F00000FFF800007F07F00000FFF80 +0007F07E00000FFF800003F07C00000FFF800001F07C00000FFF800001F07C00000FFF80 +0001F07800000FFF800000F07800000FFF800000F07800000FFF800000F07800000FFF80 +0000F0F800000FFF800000F8F000000FFF80000078F000000FFF80000078F000000FFF80 +000078F000000FFF80000078F000000FFF800000780000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000007FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFF +FF00000007FFFFFFFFFF000045437CC24E>II<0001FFE0 +000000001FFFFE000000007FFFFF80000001FFFFFFE0000003FE007FF8000007FC001FFC +000007FE000FFE00000FFF0007FF00000FFF0007FF00000FFF0003FF80000FFF0003FF80 +000FFF0003FF80000FFF0001FFC00007FE0001FFC00003FC0001FFC00000F00001FFC000 +00000001FFC00000000001FFC00000000001FFC00000000001FFC000000003FFFFC00000 +00FFFFFFC0000007FFFFFFC000003FFFF1FFC00000FFFC01FFC00003FFE001FFC00007FF +8001FFC0001FFE0001FFC0003FFC0001FFC0003FF80001FFC0007FF80001FFC0007FF000 +01FFC000FFF00001FFC000FFE00001FFC000FFE00001FFC000FFE00001FFC000FFE00003 +FFC000FFE00003FFC000FFF00007FFC0007FF8000FFFC0007FF8001FFFF0003FFE003EFF +FFC01FFF80FC7FFFC007FFFFF87FFFC003FFFFE01FFFC0007FFF8007FFC0000FFC000000 +00322F7DAD36>97 D<00003FFC00000001FFFFC000000FFFFFF000003FFFFFFC00007FF0 +03FE0000FFC001FF0003FF8003FF0007FF0007FF8007FE0007FF800FFE0007FF801FFC00 +07FF801FFC0007FF803FF80007FF803FF80003FF007FF80001FE007FF8000078007FF000 +0000007FF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000 +000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000 +000000FFF0000000007FF8000000007FF8000000007FF8000000003FF8000000003FFC00 +0003C03FFC000003C01FFE000007C00FFE000007800FFF00000F8007FF80001F0003FFC0 +003E0001FFF0007C00007FFC03F800003FFFFFF000000FFFFFC0000003FFFF000000003F +F800002A2F7CAD32>99 D<0000000003FE0000000007FFFE0000000007FFFE0000000007 +FFFE0000000007FFFE0000000007FFFE00000000001FFE00000000000FFE00000000000F +FE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE +00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00 +000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0000 +003FE00FFE000003FFFC0FFE00000FFFFF8FFE00003FFFFFCFFE0000FFF807FFFE0001FF +C001FFFE0003FF80007FFE0007FF00003FFE000FFE00001FFE000FFC00000FFE001FFC00 +000FFE003FF800000FFE003FF800000FFE003FF800000FFE007FF800000FFE007FF00000 +0FFE007FF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000F +FE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE +00FFF000000FFE00FFF000000FFE00FFF000000FFE007FF000000FFE007FF000000FFE00 +7FF000000FFE007FF800000FFE003FF800000FFE003FF800000FFE001FFC00001FFE001F +FC00001FFE000FFE00003FFE0007FE00007FFE0003FF0000FFFF0001FFC003FFFFFC00FF +F01FEFFFFC007FFFFF8FFFFC001FFFFE0FFFFC0007FFF80FFFFC00007FC00FF80036467C +C43E>I<00003FF800000003FFFF8000000FFFFFE000003FFFFFF000007FF83FF80000FF +C007FC0001FF8003FE0003FF0001FF0007FE0000FF800FFC0000FF801FFC00007FC01FF8 +00007FC03FF800003FE03FF800003FE07FF800003FE07FF000003FE07FF000003FF07FF0 +00001FF0FFF000001FF0FFF000001FF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFF +FFFFFFF0FFF000000000FFF000000000FFF000000000FFF000000000FFF0000000007FF0 +000000007FF0000000007FF8000000007FF8000000003FF8000000003FF8000000F01FFC +000000F01FFC000001F00FFE000001E007FF000003E003FF800007C001FFC0000F8000FF +F0003F00007FFE01FE00001FFFFFFC000007FFFFF0000001FFFFC00000001FFE00002C2F +7DAD33>I<000000FF8000000FFFE000007FFFF00001FFFFF80003FF8FFC000FFE0FFE00 +1FFC1FFE001FF81FFE003FF81FFE007FF01FFE007FF01FFE007FF00FFC00FFE00FFC00FF +E003F000FFE000C000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 +000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000FFFFFFF800FFFFFFF8 +00FFFFFFF800FFFFFFF800FFFFFFF80000FFE0000000FFE0000000FFE0000000FFE00000 +00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 +FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF +E0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 +000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 +0000FFE000007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE00027467DC522 +>I<0000FFE0007E00000FFFFE03FF80003FFFFF8FFF8000FFFFFFFFFFC001FFC07FFF3F +C003FF001FF83FC007FE000FFC3FC00FFC0007FE1F801FFC0007FF0F001FF80003FF0000 +1FF80003FF00003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003F +F80003FF80003FF80003FF80003FF80003FF80003FF80003FF80001FF80003FF00001FF8 +0003FF00001FFC0007FF00000FFC0007FE000007FE000FFC000003FF001FF8000001FFC0 +7FF0000003FFFFFFE0000003FFFFFF800000078FFFFE0000000780FFE00000000F800000 +0000000F8000000000000F8000000000000F8000000000000FC000000000000FE0000000 +00000FF000000000000FFFFFFFC000000FFFFFFFFC000007FFFFFFFF800007FFFFFFFFE0 +0003FFFFFFFFF00001FFFFFFFFFC0000FFFFFFFFFC0003FFFFFFFFFE000FFFFFFFFFFF00 +1FF000007FFF003FC0000007FF007F80000001FF807F80000000FF80FF00000000FF80FF +000000007F80FF000000007F80FF000000007F80FF000000007F80FF80000000FF807F80 +000000FF007FC0000001FF003FE0000003FE001FF0000007FC000FFE00003FF80007FFC0 +01FFF00001FFFFFFFFC000007FFFFFFF0000000FFFFFF8000000007FFF00000032427DAC +38>I<007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC00000 +0000FFFFC00000000003FFC00000000001FFC00000000001FFC00000000001FFC0000000 +0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 +01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 +FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC007FE000001FF +C03FFF800001FFC0FFFFE00001FFC1FFFFF80001FFC7F03FFC0001FFCF801FFC0001FFDF +000FFE0001FFDE000FFE0001FFFC000FFE0001FFF80007FF0001FFF00007FF0001FFF000 +07FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC00007FF0001FFC00007 +FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF +0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 +01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 +FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF +C00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF +83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE37457CC43E>I<007C0001FF0003FF8007FF +C007FFC00FFFE00FFFE00FFFE00FFFE00FFFE007FFC007FFC003FF8001FF00007C000000 +00000000000000000000000000000000000000000000000000000000007FC07FFFC07FFF +C07FFFC07FFFC07FFFC003FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF +C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF +C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF +C001FFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18467CC520>I<000003E000000FF80000 +1FFC00003FFE00003FFE00007FFF00007FFF00007FFF00007FFF00007FFF00003FFE0000 +3FFE00001FFC00000FF8000003E000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000001FF0003FFFF0003FFFF0003FFFF0003 +FFFF0003FFFF00000FFF000007FF000007FF000007FF000007FF000007FF000007FF0000 +07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000 +07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000 +07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000 +07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000 +07FF1F8007FF3FC007FF7FE007FFFFF007FFFFF00FFEFFF00FFEFFF00FFCFFF01FFCFFE0 +1FF87FE03FF03FC0FFE01FFFFF800FFFFF0003FFFC0000FFC000205A86C522>I<007FC0 +00FFFFC000FFFFC000FFFFC000FFFFC000FFFFC00003FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +00FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8019457CC420>108 +D<007F8007FE00000FFC0000FFFF803FFFC0007FFF8000FFFF80FFFFF001FFFFE000FFFF +81FFFFF803FFFFF000FFFF87F01FFC0FE03FF800FFFF8FC00FFE1F801FFC0003FF9F000F +FF3E001FFE0001FF9E0007FF3C000FFE0001FFBC0007FF78000FFE0001FFF80003FFF000 +07FF0001FFF80003FFF00007FF0001FFF00003FFE00007FF0001FFE00003FFC00007FF00 +01FFE00003FFC00007FF0001FFE00003FFC00007FF0001FFC00003FF800007FF0001FFC0 +0003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF +800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007 +FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001 +FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC000 +03FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF80 +0007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF +0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FF +C00003FF800007FF00FFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FF +FFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFE572D7CAC5E>I<00 +7F8007FE0000FFFF803FFF8000FFFF80FFFFE000FFFF81FFFFF800FFFF87F03FFC00FFFF +8F801FFC0003FF9F000FFE0001FF9E000FFE0001FFBC000FFE0001FFF80007FF0001FFF0 +0007FF0001FFF00007FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC000 +07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 +FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF +0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 +01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 +FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFF +FF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE372D7CAC3E>I<00001F +FC0000000001FFFFC000000007FFFFF00000001FFFFFFC0000007FF80FFF000000FFC001 +FF800001FF8000FFC00003FE00003FE00007FE00003FF0000FFC00001FF8000FF800000F +F8001FF800000FFC001FF800000FFC003FF800000FFE003FF0000007FE007FF0000007FF +007FF0000007FF007FF0000007FF007FF0000007FF00FFF0000007FF80FFF0000007FF80 +FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FF +F0000007FF80FFF0000007FF80FFF0000007FF807FF0000007FF007FF0000007FF007FF0 +000007FF007FF0000007FF003FF800000FFE003FF800000FFE001FF800000FFC001FFC00 +001FFC000FFC00001FF80007FE00003FF00007FE00003FF00003FF8000FFE00001FFC001 +FFC000007FF80FFF0000003FFFFFFE0000000FFFFFF800000001FFFFC0000000001FFC00 +0000312F7DAD38>I<007FC00FF80000FFFFC0FFFF8000FFFFC3FFFFE000FFFFCFFFFFF8 +00FFFFDFC03FFC00FFFFFF001FFE0003FFFC0007FF0001FFF80003FF8001FFF00003FFC0 +01FFE00001FFE001FFC00001FFE001FFC00000FFF001FFC00000FFF001FFC000007FF801 +FFC000007FF801FFC000007FF801FFC000007FF801FFC000003FFC01FFC000003FFC01FF +C000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC0 +00003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000 +007FF801FFC000007FF801FFC000007FF801FFC000007FF001FFC00000FFF001FFC00000 +FFF001FFC00001FFE001FFE00001FFC001FFF00003FFC001FFF80007FF8001FFFC000FFF +0001FFFE001FFE0001FFDFC07FFC0001FFCFFFFFF00001FFC3FFFFC00001FFC0FFFF0000 +01FFC01FF0000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 +FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF +C00000000001FFC00000000001FFC00000000001FFC000000000FFFFFF80000000FFFFFF +80000000FFFFFF80000000FFFFFF80000000FFFFFF8000000036407DAC3E>I<007F807F +00FFFF81FFE0FFFF83FFF0FFFF8FFFF8FFFF8F8FFCFFFF9F1FFE03FFBE1FFE01FFBC1FFE +01FFF81FFE01FFF81FFE01FFF01FFE01FFF00FFC01FFE007F801FFE001E001FFE0000001 +FFE0000001FFE0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FF +C0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0 +000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC000 +0001FFC0000001FFC0000001FFC00000FFFFFFE000FFFFFFE000FFFFFFE000FFFFFFE000 +FFFFFFE000272D7DAC2E>114 D<001FFC038000FFFF878003FFFFFF800FFFFFFF801FF0 +03FF803FC000FF803F80003F807F00001F807E00001F80FE00000F80FE00000F80FE0000 +0780FF00000780FF00000780FF80000780FFE0000000FFFE0000007FFFF000007FFFFF00 +003FFFFFC0003FFFFFF0001FFFFFFC000FFFFFFE0003FFFFFF0001FFFFFF80007FFFFF80 +000FFFFFC000003FFFC0000003FFE0000000FFE0F000003FE0F000003FE0F800001FE0F8 +00000FE0F800000FE0FC00000FE0FC00000FE0FE00000FC0FF00001FC0FF00001FC0FF80 +003F80FFE0007F00FFF803FE00FFFFFFFC00FCFFFFF800F03FFFE000E007FE0000232F7C +AD2C>I<0001E000000001E000000001E000000001E000000001E000000003E000000003 +E000000003E000000003E000000007E000000007E00000000FE00000000FE00000001FE0 +0000001FE00000003FE00000007FE0000000FFE0000003FFE000000FFFFFFF80FFFFFFFF +80FFFFFFFF80FFFFFFFF80FFFFFFFF8000FFE0000000FFE0000000FFE0000000FFE00000 +00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 +FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF +E0000000FFE0000000FFE0000000FFE001E000FFE001E000FFE001E000FFE001E000FFE0 +01E000FFE001E000FFE001E000FFE001E000FFE001E000FFE003E000FFF003C0007FF003 +C0007FF007C0003FF80F80001FFC1F00000FFFFF000007FFFC000001FFF80000003FE000 +23407EBE2C>I<007FC00001FF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF00FF +FFC003FFFF00FFFFC003FFFF0003FFC0000FFF0001FFC00007FF0001FFC00007FF0001FF +C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 +0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 +07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 +FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF +0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0000FFF0001FFC0000FFF00 +01FFC0001FFF0001FFC0001FFF0001FFC0003FFF0000FFC0003FFF0000FFE0007FFF8000 +7FE001F7FFFE007FF807E7FFFE003FFFFFC7FFFE000FFFFF07FFFE0003FFFE07FFFE0000 +7FF007FC00372E7CAC3E>III121 D<1FFFFFFFFF801FFFFFFFFF801FFFFFFFFF801FFFFFFFFF801FFC001FFF +001FE0003FFE001FC0003FFE001F80007FFC001F0000FFF8003F0001FFF0003E0001FFF0 +003E0003FFE0003E0007FFC0003C000FFF80003C000FFF80003C001FFF00003C003FFE00 +003C007FFC000000007FFC00000000FFF800000001FFF000000003FFE000000003FFE000 +000007FFC00000000FFF800780001FFF000780001FFF000780003FFE000780007FFC000F +8000FFF8000F0000FFF8000F0001FFF0000F0003FFE0001F0007FFC0001F0007FFC0001F +000FFF80003F001FFF00007F003FFE0000FF003FFE0003FF007FFC001FFE00FFFFFFFFFE +00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00292C7DAB32>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd ecti1095 10.95 17 +/Fd 17 119 df<000000018000000007800000000F000000001C00000000380000000070 +00000000E000000001E000000003C000000007800000000F000000001E000000003E0000 +00007C000000007800000000F000000001F000000003E000000003E000000007C0000000 +07800000000F800000001F000000001F000000003E000000003E000000007C000000007C +00000000FC00000000F800000001F800000001F000000001F000000003F000000003E000 +000007E000000007E000000007C00000000FC00000000FC00000000F800000000F800000 +001F800000001F800000001F000000001F000000003F000000003F000000003E00000000 +3E000000007E000000007E000000007C000000007C000000007C000000007C000000007C +000000007C00000000F800000000F800000000F800000000F800000000F800000000F800 +000000F800000000F800000000F800000000F800000000F8000000007800000000780000 +000078000000007800000000780000000078000000003C000000003C000000003C000000 +003C000000001E000000001E000000000E000000000F0000000007000000000700000000 +0380000000038000000001C000000000E00000000060000000215A73C325>40 +D<000003000000038000000380000001C0000000E0000000E00000007000000070000000 +78000000380000003C0000003C0000003C0000001E0000001E0000001E0000001E000000 +1F0000001F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 +1F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000 +3F0000003F0000003E0000003E0000003E0000007E0000007E0000007C0000007C000000 +FC000000FC000000F8000000F8000001F8000001F8000001F0000001F0000003F0000003 +E0000003E0000007E0000007C0000007C000000F8000000F8000001F8000001F0000003F +0000003E0000003E0000007C0000007C000000F8000000F8000001F0000001E0000003E0 +000007C00000078000000F8000001F0000001E0000003C0000007C000000F8000000F000 +0001E0000003C00000078000000F0000001E0000003C00000070000000E0000000C00000 +00205A7FC325>I<7FFFFC7FFFFC7FFFFCFFFFFCFFFFFC1605799520>45 +D<000000FE00000007FF8000001F07C000007C01F00000F000F00001E000F80003C00078 +0007C0007C000F80007C001F00007C001F00007E003E00007E007E00007E007E00007E00 +FC00007E00FC00007E01F800007E01F800007E03F80000FE03F80000FE03F00000FE07F0 +0000FC07F00000FC07E00001FC0FE00001FC0FE00001FC0FE00001FC1FC00003F81FC000 +03F81FC00003F81FC00003F83F800007F03F800007F03F800007F03F800007F07F00000F +E07F00000FE07F00000FE07F00000FC07E00001FC0FE00001FC0FE00001F80FE00003F80 +FE00003F80FC00003F00FC00003F00FC00007E00FC00007E00FC0000FC00FC0000FC00FC +0000F800F80001F800F80001F000FC0003E0007C0003E0007C0007C0007C000F80003E00 +1F00003E003E00001F007C00000FC1F0000003FFC0000000FE000000273F76BC2E>48 +D<000000FE0000000003FFC00000000F01F00000003C00F800000078007C000000F0003E +000001E0003F000003C0001F00000380001F80000700001F80000F00001F80000E0C001F +80001E0C001FC0001C0E001FC0003C06001FC0003806001FC0007806001FC0007006001F +C000700E003FC000F00C003F8000E00C003F8000E01C003F8000E018007F8001E018007F +0001C038007F0001C07000FE0001C06001FE0001C0E001FC0000E3C003F80000FF0007F0 +00003C000FE0000000001FC0000000001F80000000007F0000000000FC0000000001F800 +00000003F0000000000FC0000000001F00000000007E0000000000F80000000003E00000 +000007C0000000001F00000000003E00000000007C0000180000F000003C0001E0000038 +0003C00000380003C0000078000780000078000F000000F0000E000000F0001E000001E0 +003FE00003E0003FFF0007C0007C3FF01FC000780FFFFF80007003FFFF0000F001FFFE00 +00E0007FFC0000E0003FF80000E00007C000002A3F79BC2E>50 D<00703F0001C00070FF +8003C000F3FF80038000EFFFC0078000FFFFC00F0001FFFFC01E0001FF83C01E0003FE01 +C03C0003F801C07C0007F000C0F80007E000E3F0000FC0007FF0000F80003FE0001F0000 +01E0001E000003C0001E000007C0003C00000780003800000F80007800000F0000700000 +1F0000F000003E0000E000003E0000E000007C00000000007C0000000000F80000000000 +F80000000001F00000000001F00000000003F00000000003E00000000007E0000000000F +C0000000000FC0000000001FC0000000001F80000000001F80000000003F00000000003F +00000000007F00000000007E0000000000FE0000000000FE0000000001FC0000000001FC +0000000001FC0000000003F80000000003F80000000003F80000000007F80000000007F0 +000000000FF0000000000FF0000000000FE0000000001FE0000000001FE0000000001FE0 +000000001FC0000000003FC0000000003FC0000000003FC0000000003F80000000003F00 +000000001E000000002A3F73BC2E>55 D<0000007F8000000003FFE00000000FFFF00000 +001FC0F80000007F007C000000FC003E000001F8003E000003F0003F000007E0001F0000 +0FE0001F00000FC0001F00001F80001F80003F80001F80003F00001F80007F00001F8000 +7F00001F8000FE00001F8000FE00003F8000FE00003F8001FE00003F8001FC00003F8001 +FC00003F0001FC00007F0003FC00007F0003F800007F0003F80000FF0003F80000FF0003 +F80000FE0003F80001FE0003F00001FE0001F00003FE0001F00003FC0001F80007FC0000 +F8000FFC0000F8001FFC000078003BF800007C0073F800003E00E3F800001F03C7F00000 +07FF07F0000001FC07F0000000000FE0000000000FE0000000000FC0000000001FC00000 +00001F80000000003F00000000003F00000000007E00000000007E0000000000FC00003E +0001F800007F0003F000007F0003E000007F0007C00000FE000F800000FC001F00000070 +003E0000007800FC0000007E03F80000003FFFE00000000FFF8000000003FC0000000029 +3F78BC2E>57 D<0001FFFFFFFF80000001FFFFFFFFF0000001FFFFFFFFFC00000003FC00 +01FE00000003FC00007F00000003F800003F80000003F800003FC0000003F800001FC000 +0007F800001FC0000007F000001FE0000007F000001FE0000007F000000FE000000FF000 +000FE000000FE000001FE000000FE000001FE000000FE000001FE000001FE000001FC000 +001FC000003FC000001FC000003FC000001FC000003F8000003FC000007F0000003F8000 +00FF0000003F800001FE0000003F800001FC0000007F800003F80000007F00000FF00000 +007F00001FC00000007F00007F80000000FF0003FE00000000FFFFFFF000000000FFFFFF +FE00000000FE00003F80000001FE00001FC0000001FC00000FE0000001FC000007F00000 +01FC000003F8000003FC000003F8000003F8000001FC000003F8000001FC000003F80000 +01FC000007F8000001FE000007F0000001FE000007F0000001FE000007F0000001FE0000 +0FF0000001FC00000FE0000003FC00000FE0000003FC00000FE0000003F800001FE00000 +07F800001FC0000007F800001FC000000FF000001FC000001FE000003FC000001FE00000 +3F8000003FC000003F8000007F8000007F800000FF0000007F800003FE0000007F00000F +F8000000FF00003FF000007FFFFFFFFFC00000FFFFFFFFFF000000FFFFFFFFF00000003B +3E7BBD3F>66 D<0001FFFFFFFF80000001FFFFFFFFF0000001FFFFFFFFFC00000003FC00 +03FE00000003FC00007F80000003F800003F80000003F800000FC0000003F800000FE000 +0007F8000007F0000007F0000003F0000007F0000003F8000007F0000001F800000FF000 +0001F800000FE0000001FC00000FE0000000FC00000FE0000000FC00001FE0000000FC00 +001FC0000000FE00001FC0000000FE00001FC0000000FE00003FC0000000FE00003F8000 +0000FE00003F80000000FE00003F80000001FE00007F80000001FE00007F00000001FE00 +007F00000001FE00007F00000001FC0000FF00000001FC0000FE00000003FC0000FE0000 +0003FC0000FE00000003FC0001FE00000003F80001FC00000007F80001FC00000007F800 +01FC00000007F00003FC0000000FF00003F80000000FF00003F80000000FE00003F80000 +001FE00007F80000001FC00007F00000001FC00007F00000003F800007F00000003F8000 +0FF00000007F00000FE00000007E00000FE0000000FE00000FE0000001FC00001FE00000 +01F800001FC0000003F000001FC0000007F000001FC000000FE000003FC000001FC00000 +3F8000003F8000003F8000007F0000007F800001FC0000007F800003F80000007F00000F +E0000000FF00007FC000007FFFFFFFFF000000FFFFFFFFFC000000FFFFFFFFC00000003F +3E7BBD44>68 D<00007E00000001FF80000007C1C380001F80EFC0003F00FFC0007E007F +C000FC007F8001F8003F8003F0003F8003F0003F8007E0003F000FE0003F000FC0003F00 +1FC0007F001FC0007E003F80007E003F80007E003F8000FE007F8000FC007F0000FC007F +0000FC007F0001FC00FF0001F800FE0001F800FE0001F800FE0003F800FE0003F038FC00 +03F038FC0003F038FC0007F038FC0007E078FC000FE0707C000FE0707C001FE0F07E003F +E0E03E007FE0E03E00F3E1E01F01E3E1C00F8781E38003FF00FF0000FC003E00252977A7 +2E>97 D<00001FC00000FFF00003F07C000FC01E001F000E003E000F007C001F00FC007F +01F8007F03F0007F07F0007E07E0007E0FE000381FC000001FC000003F8000003F800000 +3F8000007F8000007F0000007F0000007F000000FF000000FE000000FE000000FE000000 +FE000000FE000000FC000000FC000006FC00000E7E00001E7E00003C7E0000783E0000F0 +3F0001E01F0007C00F800F0007C07E0001FFF000007F8000202977A729>99 +D<00003F000001FFE00007C0F0001F0078007E007800FC003C01F8003C03F0003C07F000 +3C0FE0007C0FC000781FC000783F8000F83F8001F07F8007E07F001FC07F01FF007FFFF8 +00FFFF8000FE000000FE000000FE000000FE000000FC000000FC000000FC000000FC0000 +00FC000000FC000000FC00000CFC00001CFC00003C7C0000787C0000F07E0001E03E0003 +C01F000F800F001E000780FC0003FFE00000FF00001E2976A729>101 +D<0000700001FC0001FC0001FC0001F80001F80000E00000000000000000000000000000 +00000000000000000000000000000000000000000000000000007C0001FF00038F800707 +800E07C01E07C01C07C03C0FC0380FC0380FC0781FC0701F80701F80F03F80F03F00003F +00007F00007E0000FE0000FC0000FC0001FC0001F80001F80003F80003F00003F03807F0 +3807E0380FE0780FC0700FC0700FC0F00F80E00F80E00F81C00F83C00F838007870003FE +0000F800163D79BB1C>105 D<00000003800000000FC00000001FC00000001FC0000000 +1FC00000001F800000000F00000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000007C00000003FF000000078F8000000E07C000001C07C000003C07C0000 +03807E000007007E000007007E00000E00FE00000E00FC00001E00FC00001C00FC00003C +01FC00003C01FC00000001F800000001F800000003F800000003F800000003F000000003 +F000000007F000000007F000000007E000000007E00000000FE00000000FE00000000FC0 +0000000FC00000001FC00000001FC00000001F800000001F800000003F800000003F8000 +00003F000000003F000000007F000000007F000000007E000000007E00000000FE000000 +00FE00000000FC00000000FC00000001FC00000001F800000001F800000001F800003C03 +F000007E03F00000FE07E00000FE07C00000FE0F800000FC1F000000F03E000000707C00 +00003FF00000000FC0000000224F83BB1C>I<01F0003F80007F000007FC01FFE003FFC0 +000F3E07C1F80F83F0000E1F0F00FC1E01F8001E1F1C007C3800F8001C1F38007E7000FC +003C1FF0007EE000FC00381FF0007FE000FC00381FE0007FC000FC00783FC0007F8000FC +00703FC0007F8000FC00703F80007F0000FC00703F00007E0000FC00F03F0000FE0001FC +00F07F0000FC0001F800007E0000FC0001F800007E0000FC0001F800007E0001FC0003F8 +0000FE0001FC0003F00000FC0001F80003F00000FC0001F80003F00000FC0003F80007F0 +0001FC0003F80007E00001F80003F00007E00001F80003F0000FE00001F80007F0000FC0 +0003F80007F0001FC0E003F00007E0001F80E003F00007E0001F80E003F0000FE0003F81 +E007F0000FE0003F01C007E0000FC0003F01C007E0000FC0003F01C007E0001FC0003E03 +800FE0001FC0003E03800FC0001F80003E07000FC0001F80003E07000FC0003F80003E0E +001FC0003F80001E1C001F80003F00000FF8000700000E000003E000432979A74A>109 +D<01F0003F800007FC01FFE0000F3E07C1F8000E1F0F00FC001E1F1C007C001C1F38007E +003C1FF0007E00381FF0007E00381FE0007E00783FC0007E00703FC0007E00703F80007E +00703F00007E00F03F0000FE00F07F0000FC00007E0000FC00007E0000FC00007E0001FC +0000FE0001F80000FC0001F80000FC0001F80000FC0003F80001FC0003F00001F80003F0 +0001F80007F00001F80007E00003F8000FE07003F0000FC07003F0000FC07003F0001FC0 +F007F0001F80E007E0001F80E007E0001F81E007E0001F01C00FE0001F01C00FC0001F03 +800FC0001F03800FC0001F07001FC0000F0E001F800007FC0007000001F0002C2979A733 +>I<007C00038001FF0007E0038F800FE00707800FE00E07C00FF01E07C00FF01C07C007 +F03C0FC007F0380FC003F0380FC003E0781FC001E0701F8001E0701F8001E0F03F8001E0 +F03F0001C0003F0001C0007F0001C0007E0003C0007E00038000FE00038000FC00038000 +FC00078001FC00070001F800070001F800070001F8000E0003F8000E0003F0000E0003F0 +001C0003F0001C0003F000380003F000380003F000700003F000700001F000E00001F001 +C00001F803C00000F8078000007E0F0000001FFC00000007F00000242979A729>118 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fe ectt1440 14.4 19 +/Fe 19 119 df<00000007FE00000000000FFF00000000000FFF00000000001FFF000000 +00001FFF00000000003FFF00000000007FBF00000000007F3F0000000000FF3F00000000 +01FE3F0000000001FE3F0000000003FC3F0000000003F83F0000000007F83F000000000F +F03F000000000FE03F000000001FE03F000000003FC03F000000003FC03F000000007F80 +3F000000007F003F00000000FF003F00000001FE003F00000001FC003F00000003FC003F +00000007F8003F00000007F8003F0000000FF0003F0000000FE0003F0000001FE0003F00 +00003FC0003F0000003F80003F0000007F80003F000000FF00003F000000FF00003F0000 +01FE00003F000001FC00003F000003FC00003F000007F800003F000007F000003F00000F +F000003F00001FE000003F00001FE000003F00003FC000003F00003F8000003F00007F80 +00003F0000FF0000003F0000FFFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFF +FFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF8000000003F000000000000 +3F0000000000003F0000000000003F0000000000003F0000000000003F0000000000003F +0000000000003F0000000000003F0000000000003F0000000000003F0000000000003F00 +00000000003F0000000000003F0000000000FFFFFFC0000001FFFFFFE0000003FFFFFFF0 +000003FFFFFFF0000003FFFFFFF0000001FFFFFFE0000000FFFFFFC0364B7DCA3D>52 +D<0000007FF000000003FFFE0000000FFFFF8000003FFFFFC00000FFFFFFE00001FFFFFF +F00007FFFFFFF8000FFFE01FF8001FFE0007FC003FF80003FC007FF00007FC007FC00007 +FC00FF800007FC01FF000007FC03FE000003F803FC000001F007FC0000000007F8000000 +000FF0000000000FF0000000001FE0000000001FC0000000003FC0000000003FC0000000 +003F80000000003F80000000007F8007FF00007F007FFFC0007F01FFFFF0007F07FFFFFC +00FF1FFFFFFE00FE3FFFFFFF00FE7FFFFFFF80FEFFF807FFC0FFFF8000FFE0FFFE00007F +F0FFFC00001FF0FFF800000FF8FFF0000007F8FFE0000007FCFFC0000003FCFF80000001 +FEFF80000001FEFF80000000FEFF00000000FFFF00000000FFFF000000007FFF00000000 +7F7F000000007F7F000000007F7F800000007F7F000000007F7F800000007F7F80000000 +7F3F800000007F3F80000000FF3FC0000000FE1FC0000000FE1FE0000001FE1FE0000001 +FE0FF0000003FC0FF0000007FC07F800000FF807FC00001FF003FE00003FF001FF00007F +E001FFC001FFC000FFF80FFF80007FFFFFFF00003FFFFFFE00001FFFFFFC000007FFFFF8 +000003FFFFE0000000FFFF800000001FFC0000304B7AC93D>54 D<7FFFFFFFC00000FFFF +FFFFF80000FFFFFFFFFE0000FFFFFFFFFF8000FFFFFFFFFFC000FFFFFFFFFFE0007FFFFF +FFFFF00001FC00007FF80001FC00000FFC0001FC000007FC0001FC000003FE0001FC0000 +01FF0001FC000000FF0001FC0000007F0001FC0000007F8001FC0000003F8001FC000000 +3F8001FC0000003F8001FC0000003F8001FC0000003F8001FC0000003F8001FC0000003F +8001FC0000007F8001FC0000007F0001FC000000FF0001FC000000FE0001FC000001FE00 +01FC000003FC0001FC000007FC0001FC00001FF80001FC00007FF00001FC000FFFE00001 +FFFFFFFFC00001FFFFFFFF000001FFFFFFFC000001FFFFFFFF000001FFFFFFFFC00001FF +FFFFFFE00001FFFFFFFFF00001FC00000FFC0001FC000007FC0001FC000001FE0001FC00 +0000FF0001FC0000007F8001FC0000003F8001FC0000003FC001FC0000001FC001FC0000 +001FC001FC0000001FC001FC0000000FE001FC0000000FE001FC0000000FE001FC000000 +0FE001FC0000000FE001FC0000000FE001FC0000000FE001FC0000001FE001FC0000001F +C001FC0000001FC001FC0000003FC001FC0000007FC001FC000000FF8001FC000001FF80 +01FC000003FF0001FC00000FFF0001FC00003FFE007FFFFFFFFFFC00FFFFFFFFFFF800FF +FFFFFFFFF000FFFFFFFFFFE000FFFFFFFFFF8000FFFFFFFFFE00007FFFFFFFF000003349 +7CC83D>66 D<3FFFFFFF0000007FFFFFFFE00000FFFFFFFFF80000FFFFFFFFFE0000FFFF +FFFFFF00007FFFFFFFFF80003FFFFFFFFFC00001FC0003FFE00001FC0000FFF00001FC00 +003FF80001FC00000FF80001FC000007FC0001FC000003FE0001FC000001FE0001FC0000 +01FF0001FC000000FF0001FC0000007F8001FC0000007F8001FC0000003FC001FC000000 +3FC001FC0000001FC001FC0000001FE001FC0000000FE001FC0000000FE001FC0000000F +F001FC00000007F001FC00000007F001FC00000007F001FC00000007F001FC00000007F0 +01FC00000003F801FC00000003F801FC00000003F801FC00000003F801FC00000003F801 +FC00000003F801FC00000003F801FC00000003F801FC00000003F801FC00000003F801FC +00000003F801FC00000003F801FC00000003F801FC00000003F801FC00000007F001FC00 +000007F001FC00000007F001FC00000007F001FC0000000FF001FC0000000FF001FC0000 +000FE001FC0000001FE001FC0000001FE001FC0000001FC001FC0000003FC001FC000000 +3FC001FC0000007F8001FC000000FF8001FC000000FF0001FC000001FF0001FC000003FE +0001FC000007FC0001FC00000FFC0001FC00003FF80001FC00007FF00001FC0003FFE000 +3FFFFFFFFFC0007FFFFFFFFF8000FFFFFFFFFF0000FFFFFFFFFE0000FFFFFFFFF800007F +FFFFFFE000003FFFFFFF00000035497DC83D>68 D<7FFFFFFC00000000FFFFFFFF800000 +00FFFFFFFFF0000000FFFFFFFFF8000000FFFFFFFFFE000000FFFFFFFFFF0000007FFFFF +FFFF80000001FC000FFFC0000001FC0001FFE0000001FC00007FF0000001FC00001FF000 +0001FC00000FF8000001FC000007F8000001FC000003FC000001FC000003FC000001FC00 +0001FC000001FC000001FE000001FC000000FE000001FC000000FE000001FC000000FE00 +0001FC000000FE000001FC000000FE000001FC000000FE000001FC000001FE000001FC00 +0001FC000001FC000003FC000001FC000003FC000001FC000007F8000001FC00000FF800 +0001FC00001FF0000001FC00007FF0000001FC0001FFE0000001FC000FFFC0000001FFFF +FFFF80000001FFFFFFFF00000001FFFFFFFE00000001FFFFFFF800000001FFFFFFFC0000 +0001FFFFFFFE00000001FFFFFFFF00000001FC000FFF80000001FC0001FF80000001FC00 +007FC0000001FC00003FE0000001FC00001FE0000001FC00000FE0000001FC00000FF000 +0001FC000007F0000001FC000007F0000001FC000007F0000001FC000007F0000001FC00 +0007F0000001FC000007F0000001FC000007F0000001FC000007F0000001FC000007F000 +0001FC000007F0000001FC000007F0000001FC000007F0000001FC000007F01F0001FC00 +0007F03F8001FC000007F03F8001FC000007F03F8001FC000007F03F8001FC000007F83F +8001FC000003F87F807FFFF00003FC7F00FFFFF80003FFFF00FFFFF80001FFFE00FFFFF8 +0001FFFE00FFFFF80000FFFC00FFFFF800007FF8007FFFF000003FF00000000000000FC0 +00394A7DC83D>82 D<0000FFE000F00007FFFC00F8001FFFFF81F8007FFFFFE1F801FFFF +FFF1F803FFFFFFFBF807FFFFFFFFF80FFF803FFFF80FFC0007FFF81FF00001FFF83FE000 +00FFF83FC000003FF87F8000003FF87F8000001FF87F0000000FF8FF0000000FF8FE0000 +0007F8FE00000007F8FE00000007F8FE00000003F8FE00000003F8FE00000003F8FF0000 +0003F87F00000001F07F00000000007F80000000003FC0000000003FE0000000001FF000 +0000001FFC000000000FFF0000000007FFF000000003FFFF00000001FFFFF80000007FFF +FF8000003FFFFFE000000FFFFFF8000001FFFFFE0000001FFFFF00000001FFFF80000000 +1FFFC000000001FFE0000000003FF0000000001FF80000000007F80000000003FC000000 +0003FC0000000001FE0000000000FE0000000000FE0000000000FF7C000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFF000000007FFF0000 +0000FFFF00000000FEFF80000000FEFF80000001FEFFC0000003FCFFE0000007FCFFF800 +000FF8FFFC00001FF8FFFF80007FF0FFFFF801FFE0FFFFFFFFFFC0FEFFFFFFFF80FC7FFF +FFFF00FC1FFFFFFE00FC07FFFFF800F800FFFFE00078000FFF0000304B7AC93D>I<3FFF +FFFFFFFFF87FFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFF +FFFFFFFCFFFFFFFFFFFFFCFE0000FE0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE +0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE00 +01FC7C0000FE0000F8000000FE000000000000FE000000000000FE000000000000FE0000 +00000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000 +000000FE000000000000FE000000000000FE000000000000FE000000000000FE00000000 +0000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000 +00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000 +FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE +000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00 +0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000 +00000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000 +000000FE000000000000FE000000000000FE000000000000FE0000000001FFFFFF000000 +03FFFFFF80000003FFFFFF80000003FFFFFF80000003FFFFFF80000003FFFFFF80000001 +FFFFFF000036497DC83D>I<1FFFE000FFFF803FFFF001FFFFC07FFFF801FFFFE07FFFF8 +01FFFFE07FFFF801FFFFE03FFFF001FFFFC01FFFE000FFFF80007F80000FE000007F8000 +1FE000003FC0001FC000003FC0003FC000001FE0003F8000001FE0007F8000000FF0007F +0000000FF000FF00000007F800FE00000007F801FE00000003FC01FC00000001FC03FC00 +000001FE03F800000000FE07F800000000FF07F0000000007F0FF0000000007F8FE00000 +00003F9FE0000000003FDFC0000000001FFFC0000000001FFF80000000000FFF80000000 +000FFF000000000007FF000000000007FE000000000003FE000000000001FC0000000000 +01FC000000000003FE000000000003FE000000000007FF000000000007FF00000000000F +FF80000000000FFF80000000001FFFC0000000001FDFC0000000003F9FE0000000003F8F +E0000000007F07F0000000007F07F000000000FE03F800000000FE03F800000001FE01FC +00000001FC01FE00000003FC00FE00000003F800FF00000007F8007F00000007F0007F80 +00000FF0003F8000000FE0003FC000001FE0001FC000001FC0001FE000003FC0000FE000 +003F80000FF000007F800007F000007F000007F80000FF000003F80000FE000003FC0001 +FE000001FE007FFFC0000FFFF0FFFFE0001FFFF8FFFFF0003FFFFCFFFFF0003FFFFCFFFF +F0003FFFFCFFFFE0001FFFF87FFFC0000FFFF036497DC83D>88 D<000FFFC000000000FF +FFF800000003FFFFFE00000007FFFFFF8000000FFFFFFFC000000FFFFFFFE000001FFFFF +FFF000001FF800FFF800001FF0001FFC00001FF00007FC00001FF00003FE00000FE00001 +FE000007C00000FF0000000000007F0000000000007F8000000000003F8000000000003F +8000000000003F8000000000003F8000000000003F8000000000003F80000000007FFF80 +0000001FFFFF80000001FFFFFF8000000FFFFFFF8000003FFFFFFF800000FFFFFFFF8000 +03FFFFFC3F800007FFFC003F80000FFFC0003F80001FFE00003F80003FF000003F80003F +E000003F80007F8000003F80007F0000003F8000FF0000003F8000FE0000003F8000FE00 +00003F8000FE0000003F8000FE0000003F8000FE0000003F8000FF0000007F80007F0000 +007F80007F800000FF80007FC00003FF80003FF0000FFFE0003FFE00FFFFFFF01FFFFFFF +FFFFF80FFFFFFFFFFFF807FFFFFFCFFFF803FFFFFF07FFF801FFFFFC03FFF8007FFFE000 +7FF0000FFE00000000353679B43D>97 D<00000FFFC0000000FFFFFC000003FFFFFF0000 +07FFFFFF80001FFFFFFFC0003FFFFFFFC0007FFFFFFFE000FFF8007FE001FFC0003FE003 +FF00003FE007FE00003FE007FC00001FC00FF800000F801FF0000000001FE0000000003F +C0000000003FC0000000003F80000000007F80000000007F00000000007F00000000007F +0000000000FF0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE +0000000000FE0000000000FE0000000000FE0000000000FE0000000000FF00000000007F +00000000007F00000000007F80000000007F80000000003FC0000000003FE0000001F01F +E0000003F81FF0000003F80FF8000007F80FFC000007F007FF00000FF003FF80001FE003 +FFF0007FE001FFFE01FFC000FFFFFFFF80003FFFFFFF00001FFFFFFE00000FFFFFFC0000 +03FFFFF0000000FFFFC00000001FFC00002D3677B43D>99 D<00001FF800000000FFFF80 +000003FFFFE000000FFFFFF800001FFFFFFC00003FFFFFFE00007FFFFFFF0000FFF80FFF +8001FFC001FFC003FF00007FE007FC00001FE00FF800000FF00FF000000FF01FE0000007 +F81FE0000003F83FC0000003F83F80000003FC3F80000001FC7F80000001FC7F00000001 +FC7F00000001FEFF00000000FEFE00000000FEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFF +FEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFCFE0000000000FF00000000 +007F00000000007F00000000007F00000000007F80000000003F80000000003FC0000000 +001FE00000007C1FE0000000FE0FF0000000FE0FF8000000FE07FC000001FE03FF000003 +FC03FF800007FC01FFF0001FF800FFFE00FFF0007FFFFFFFE0003FFFFFFFC0000FFFFFFF +800007FFFFFF000001FFFFFC0000007FFFE000000007FF00002F3679B43D>101 +D<00003C00000000007E0000000000FF0000000001FF8000000001FF8000000001FF8000 +000001FF8000000000FF00000000007E00000000003C0000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000001FFFFF0000 +003FFFFF8000007FFFFF8000007FFFFF8000007FFFFF8000003FFFFF8000001FFFFF8000 +0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000 +0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000 +0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000 +0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000 +0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000 +0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000 +0000003F8000003FFFFFFFFE007FFFFFFFFF00FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF +807FFFFFFFFF003FFFFFFFFE00294A76C93D>105 D<3FFFFF8000007FFFFFC00000FFFF +FFC00000FFFFFFC00000FFFFFFC000007FFFFFC000003FFFFFC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 +1FC0000000001FC0000000001FC0000000001FC000003FFFFFFFFFE07FFFFFFFFFF0FFFF +FFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF87FFFFFFFFFF03FFFFFFFFFE02D4978C83D>108 +D<00001FC000FE00007FE0FFF007FF8000FFF1FFF80FFFC000FFF7FFFC3FFFE000FFFFFF +FC7FFFE000FFFFFFFEFFFFF000FFFFFFFEFFFFF0007FFFE0FFFF07F80003FF807FFC03F8 +0003FF003FF801F80003FE003FF001FC0003FC003FE001FC0003FC001FE000FC0003FC00 +1FE000FC0003F8001FC000FC0003F8001FC000FC0003F8001FC000FC0003F0001F8000FC +0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000 +1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC +0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000 +1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC +0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000 +1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC +007FFF81FFFC0FFFE0FFFFC3FFFE1FFFF0FFFFC7FFFE3FFFF0FFFFC7FFFE3FFFF0FFFFC7 +FFFE3FFFF0FFFFC3FFFE1FFFF07FFF81FFFC0FFFE03C3480B33D>I<0000001FF000007F +FE00FFFC0000FFFF03FFFF0000FFFF0FFFFFC000FFFF3FFFFFE000FFFF7FFFFFF000FFFF +FFFFFFF8007FFFFFC07FFC00007FFF000FFE00007FFC0007FE00007FF80001FF00007FF0 +0000FF00007FE00000FF80007FC000007F80007F8000003FC0007F8000003FC0007F8000 +001FE0007F0000001FE0007F0000000FE0007F0000000FE0007F0000000FF0007F000000 +0FF0007F00000007F0007F00000007F0007F00000007F0007F00000007F0007F00000007 +F0007F00000007F0007F00000007F0007F00000007F0007F00000007F0007F0000000FF0 +007F0000000FF0007F0000000FE0007F8000000FE0007F8000001FE0007F8000001FC000 +7FC000003FC0007FC000003FC0007FE000007F80007FE00000FF80007FF00001FF00007F +F80003FF00007FFC0007FE00007FFE001FFC00007FFFC0FFF800007FFFFFFFF800007F7F +FFFFE000007F3FFFFFC000007F0FFFFF8000007F07FFFE0000007F01FFF80000007F003F +E00000007F0000000000007F0000000000007F0000000000007F0000000000007F000000 +0000007F0000000000007F0000000000007F0000000000007F0000000000007F00000000 +00007F0000000000007F0000000000007F0000000000007F0000000000007F0000000000 +007F0000000000007F0000000000007F0000000000007F00000000007FFFFF00000000FF +FFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF800000007FFF +FF00000000344F7DB33D>112 D<000000001FF8007FFFE000FFFF00FFFFF007FFFF80FF +FFF01FFFFFC0FFFFF03FFFFFC0FFFFF07FFFFFE0FFFFF1FFFFFFE07FFFF3FFF03FE00007 +F7FF803FE00007F7FE001FC00007FFF8000F800007FFF00000000007FFE00000000007FF +C00000000007FF800000000007FF000000000007FE000000000007FE000000000007FC00 +0000000007FC000000000007F8000000000007F8000000000007F8000000000007F80000 +00000007F0000000000007F0000000000007F0000000000007F0000000000007F0000000 +000007F0000000000007F0000000000007F0000000000007F0000000000007F000000000 +0007F0000000000007F0000000000007F0000000000007F0000000000007F00000000000 +07F0000000000007F0000000000007F0000000000007F0000000000007F0000000000007 +F0000000007FFFFFFFE00000FFFFFFFFF00000FFFFFFFFF80000FFFFFFFFF80000FFFFFF +FFF80000FFFFFFFFF000007FFFFFFFE0000033347BB33D>114 D<0001FFF00F00001FFF +FE0F8000FFFFFF9F8003FFFFFFFF8007FFFFFFFF800FFFFFFFFF801FFFFFFFFF803FFF00 +1FFF807FF00007FF807FC00001FF807F800000FF80FF0000007F80FE0000007F80FE0000 +003F80FE0000003F80FE0000003F80FF0000003F807F0000003F807F8000001F007FE000 +0000003FFC000000001FFFE00000000FFFFF00000007FFFFFC000001FFFFFF8000007FFF +FFE000000FFFFFF8000000FFFFFE00000007FFFF000000001FFF8000000001FFC0000000 +007FE07C0000001FE0FE0000000FF0FE00000007F0FE00000007F8FF00000003F8FF0000 +0003F8FF00000003F8FF80000003F8FFC0000003F8FFC0000007F8FFE000000FF0FFF000 +000FF0FFF800003FF0FFFE0000FFE0FFFFC007FFC0FFFFFFFFFFC0FFFFFFFFFF80FCFFFF +FFFF00FC3FFFFFFC00FC0FFFFFF000F803FFFFC00078007FFC00002D3678B43D>I<0000 +780000000000FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 +FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 +FC0000000001FC0000000001FC0000003FFFFFFFFFF87FFFFFFFFFFCFFFFFFFFFFFCFFFF +FFFFFFFCFFFFFFFFFFFCFFFFFFFFFFFC7FFFFFFFFFF80001FC0000000001FC0000000001 +FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 +FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 +FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 +FC0000000001FC0000000001FC0000000001FC0000000001FC00003E0001FC00007F0001 +FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001 +FC00007F0001FE0000FF0001FE0001FE0000FF0003FE0000FF8007FC00007FF01FFC0000 +7FFFFFF800003FFFFFF000003FFFFFE000001FFFFF80000007FFFF00000003FFFC000000 +007FC00030437DC13D>I<7FFFE0001FFFF8FFFFF0003FFFFCFFFFF8007FFFFCFFFFF800 +7FFFFCFFFFF8007FFFFCFFFFF0003FFFFC7FFFE0001FFFF800FC000000FC0000FC000000 +FC0000FE000001FC00007E000001F800007E000001F800007F000003F800003F000003F0 +00003F000003F000003F800007F000001F800007E000001F800007E000001FC0000FE000 +000FC0000FC000000FC0000FC000000FE0001FC0000007E0001F80000007E0001F800000 +07F0003F80000003F0003F00000003F0003F00000003F8007F00000001F8007E00000001 +F8007E00000001FC00FE00000000FC00FC00000000FC00FC00000000FE01FC000000007E +01F8000000007E01F8000000007F03F8000000003F03F0000000003F03F0000000003F87 +F0000000001F87E0000000001F87E0000000001FCFE0000000000FCFC0000000000FCFC0 +000000000FFFC00000000007FF800000000007FF800000000007FF800000000003FF0000 +00000003FF000000000000FC00000036347DB23D>118 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff ecrm1095 10.95 75 +/Ff 75 123 df<000003FF000FE000001FFFC07FF80000FE00F1F81C0001F8003BE07E00 +07E0007FC0FF000FC001FFC0FF001F8001FF80FF003F0001FF00FF007F0001FF00FF007E +0001FF007E00FE0000FE000000FC00007E000000FC00007E000000FC00007E000000FC00 +007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC0000 +7E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E +0000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF8000FC00007E000000FC00007E00 +0000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E0000 +00FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000 +FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC +00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00 +007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC0000 +7E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000001FE0000FF +00007FFFF83FFFFF007FFFF83FFFFF007FFFF83FFFFF0038407FBF35>27 +D<000003FE000000001FFFC0000000FE01E0000001F80078000007E0001C00000FC0007C +00001F8000FE00003F0001FE00007F0001FE00007E0001FE0000FE0001FE0000FC0000FC +0000FC0000780000FC0000000000FC0000000000FC0000000000FC0000000000FC000000 +0000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC000000 +0000FC00007E00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE0000FC0001FE0000FC0000FE +0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E +0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E +0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E +0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E +0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E +0001FE0000FF007FFFF83FFFFC7FFFF83FFFFC7FFFF83FFFFC2E407FBF32>I<000003FF +000000001FFFEE000000FE00FE000001F800FE000007E001FE00000FC001FE00001F8001 +FE00003F0001FE00007F0001FE00007E0000FE0000FE00007E0000FC00007E0000FC0000 +7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 +7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 +7E00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE0000FC00007E0000FC00007E0000FC0000 +7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 +7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 +7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 +7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 +7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0001FE0000 +FF007FFFF83FFFFC7FFFF83FFFFC7FFFF83FFFFC2E407FBF32>I<3E001F007F003F807F +003F80FF807FC07F003F807F003F807F003F807F003F807F003F807F003F807F003F807F +003F807F003F807E001F803E001F003E001F003E001F003E001F003E001F003E001F003E +001F003E001F003E001F001C000E001C000E001C000E001C000E001C000E001C000E001C +000E001C000E001C000E00180006001A2177BF2D>34 D<1C007F00FF80FF80FFC0FFC0FF +C07FC01CC000C000C000C000C000C001C00180018003800300070006000E000C001C0038 +00700060000A1B78BE19>39 D<0000300000700000E00001C0000380000700000F00001E +00003C00003C0000780000F00000F00001E00001E00003C00003C00007C0000780000F80 +000F80000F00001F00001F00001E00003E00003E00003E00003C00007C00007C00007C00 +007C00007C00007C0000780000F80000F80000F80000F80000F80000F80000F80000F800 +00F80000F80000F80000F80000F80000F80000F80000F80000F80000F800007800007C00 +007C00007C00007C00007C00007C00003C00003E00003E00003E00001E00001F00001F00 +000F00000F80000F800007800007C00003C00003C00001E00001E00000F00000F0000078 +00003C00003C00001E00000F000007000003800001C00000E0000070000030145A77C323 +>II<000000060000000000 +000006000000000000000600000000000000060000000000000006000000000000000600 +000000000000060000000000000006000000000000000600000000000000060000000000 +000006000000000000000600000000000000060000000000000006000000000000000600 +000000000000060000000000000006000000000000000600000000000000060000000000 +000006000000000000000600000000000000060000000000000006000000000000000600 +000000000000060000000000000006000000000000000600000000000000060000000000 +00000600000000FFFFFFFFFFFFFFE0FFFFFFFFFFFFFFE000000006000000000000000600 +000000000000060000000000000006000000000000000600000000000000060000000000 +000006000000000000000600000000000000060000000000000006000000000000000600 +000000000000060000000000000006000000000000000600000000000000060000000000 +000006000000000000000600000000000000060000000000000006000000000000000600 +000000000000060000000000000006000000000000000600000000000000060000000000 +000006000000000000000600000000000000060000000000000006000000000000000600 +0000003B3C7BB446>43 D<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000C000 +C000C001C00180018003800300070006000E000C001C003800700060000A1B788819>I< +FFFFFEFFFFFEFFFFFEFFFFFEFFFFFE17057F951E>I<1C007F00FF80FF80FF80FF80FF80 +7F001C000909788819>I<00000000C000000000C000000001C000000001800000000180 +000000038000000003000000000700000000060000000006000000000E000000000C0000 +00000C000000001C00000000180000000018000000003800000000300000000030000000 +0070000000006000000000E000000000C000000000C000000001C0000000018000000001 +80000000038000000003000000000300000000070000000006000000000E000000000C00 +0000000C000000001C000000001800000000180000000038000000003000000000300000 +0000700000000060000000006000000000E000000000C000000001C00000000180000000 +01800000000380000000030000000003000000000700000000060000000006000000000E +000000000C000000000C000000001C000000001800000000380000000030000000003000 +000000700000000060000000006000000000E000000000C000000000C000000001C00000 +000180000000038000000003000000000300000000070000000006000000000600000000 +0E000000000C000000000C000000001C0000000018000000001800000000380000000030 +00000000700000000060000000006000000000E000000000C000000000C000000000225B +7BC32D>I<0003FC0000001FFF8000003E07C00000F801F00001F000F80003E0007C0003 +C0003C0007C0003E000F80001F000F80001F001F00000F801F00000F803F00000FC03F00 +000FC03F00000FC03F00000FC07E000007E07E000007E07E000007E07E000007E07E0000 +07E0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007 +F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0 +FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F07E +000007E07E000007E07E000007E07E000007E07F00000FE03F00000FC03F00000FC03F00 +000FC03F00000FC01F00000F801F80001F800F80001F000F80001F0007C0003E0007C000 +3E0003E0007C0001F000F80000F801F000003E07C000001FFF80000003FC0000243F7CBC +2D>I<0000C0000003C0000007C000001FC000007FC00007FFC000FFFFC000FF9FC000F8 +1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 +1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 +1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 +1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 +1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 +1FC000001FC000001FC000001FC000007FF000FFFFFFF8FFFFFFF8FFFFFFF81D3D78BC2D +>I<0007FC0000003FFF800000FFFFE00001F00FF800078003FC000F0001FE000E0000FF +001C00007F803800003FC03000003FC07000001FE06000001FE06000001FE0FE00000FF0 +FF00000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FF07F00000FF01C +00000FF00000000FE00000001FE00000001FE00000001FC00000003FC00000003F800000 +007F800000007F00000000FE00000001FC00000001FC00000003F800000007F00000000F +E00000000FC00000001F800000003E000000007C00000000F800000001F000000003E000 +000003C000000007800000000F000030001E000030003C000030007800003000F0000060 +01E000006003C0000060078000006007000000E00FFFFFFFE01FFFFFFFE03FFFFFFFE07F +FFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0243D7CBC2D>I<0007FC0000003FFF8000 +00FFFFE00001F807F80007C003FC000F0001FE000E0000FF001C00007F801F80007F803F +C0003FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC01FC0003FC00700 +003FC00000003F800000007F800000007F800000007F00000000FF00000000FE00000001 +FC00000003F800000003F00000000FC00000003F0000001FFC0000001FFF800000000FE0 +00000003F800000001FC00000000FE000000007F000000007F800000003FC00000003FC0 +0000003FE00000003FE00000001FE00000001FF00000001FF00C00001FF03F00001FF07F +80001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0003FE0FF80003FE07F00 +003FC07000003FC07000007F803800007F801C0000FF000F0001FE0007C003FC0003F80F +F00000FFFFE000003FFF80000007FC0000243F7CBC2D>I<0000000E000000000E000000 +001E000000003E000000003E000000007E00000000FE00000000FE00000001FE00000003 +FE00000003FE00000006FE0000000EFE0000000CFE00000018FE00000038FE00000030FE +00000060FE000000E0FE000000C0FE00000180FE00000380FE00000300FE00000600FE00 +000E00FE00000C00FE00001800FE00003800FE00003000FE00006000FE0000E000FE0000 +C000FE00018000FE00038000FE00030000FE00060000FE000E0000FE000C0000FE001800 +00FE00380000FE00300000FE00600000FE00E00000FE00FFFFFFFFFFFFFFFFFFFFFFFFFF +FFFF000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE +00000000FE00000000FE00000000FE00000000FE00000000FE00000001FF000001FFFFFF +0001FFFFFF0001FFFFFF283E7EBD2D>I<060000030007C0000F0007F800FE0007FFFFFC +0007FFFFFC0007FFFFF00007FFFFE00007FFFFC00007FFFF0000063FF800000600000000 +060000000006000000000600000000060000000006000000000600000000060000000006 +0000000006000000000600000000060000000006000000000601FE0000060FFF8000063E +03E000067001F80006E000FC0007C0007E000780003F000700003F800600001F80000000 +1FC00000001FC00000001FE00000000FE00000000FE00000000FE00000000FF00000000F +F00000000FF00000000FF03E00000FF07F00000FF0FF80000FF0FF80000FF0FF80000FF0 +FF80000FF0FF00000FE0FE00001FE0E000001FE06000001FC07000001FC03000003F8038 +00003F801C00007F001E0000FE000F0001FC0007C003F80003F00FE00000FFFFC000003F +FF00000007F80000243F7CBC2D>I<00001FE0000000FFF8000003FFFE00000FF01F0000 +1F800780003F000380007E000FC000FC001FC001F8003FC003F0003FC003F0003FC007E0 +003FC00FE0001F800FC0000F001FC00000001FC00000001F800000003F800000003F8000 +00003F800000007F800000007F000000007F01FE00007F07FF8000FF0E03E000FF1C01F0 +00FF3800FC00FF70007E00FF60003E00FFE0003F00FFC0001F80FFC0001FC0FF80001FC0 +FF80001FE0FF80000FE0FF80000FE0FF00000FF0FF00000FF0FF00000FF0FF00000FF0FF +00000FF0FF00000FF07F00000FF07F00000FF07F00000FF07F00000FF07F00000FF03F80 +000FF03F80000FE03F80000FE01F80000FE01F80001FC01FC0001FC00FC0001F800FC000 +3F8007E0003F0003F0007E0001F800FC0000FC01F800007E07F000003FFFE000000FFF80 +000003FC0000243F7CBC2D>I<300000000038000000003E000000003FFFFFFFFC3FFFFF +FFFC3FFFFFFFFC3FFFFFFFF87FFFFFFFF87FFFFFFFF07FFFFFFFE070000000E060000001 +C0600000038060000003006000000700C000000E00C000000C00C000001C00C000003800 +00000030000000007000000000E000000001C00000000180000000038000000007000000 +0007000000000E000000000E000000001C000000001C000000003C000000003800000000 +78000000007800000000F800000000F000000001F000000001F000000001F000000003F0 +00000003F000000003F000000007F000000007E000000007E000000007E00000000FE000 +00000FE00000000FE00000000FE00000000FE00000001FE00000001FE00000001FE00000 +001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000000 +0FC00000000780000026407BBD2D>I<0003FC0000001FFF8000007FFFE00000FC03F800 +01E000FC0003C0003E000780001F000F00000F000E00000F801E000007801C000007C03C +000003C03C000003C03C000003C03E000003C03E000003C03F000003C03F000007C03F80 +0007801FE0000F801FF0000F001FFC001E000FFE003C000FFF80780007FFC0F00003FFF1 +E00001FFFF800000FFFF0000003FFF0000001FFFC000000FFFE000001FFFF8000078FFFC +0001F07FFE0003C01FFF0007800FFF800F0003FFC01F0001FFC01E00007FE03C00003FE0 +7C00000FE078000007F078000003F0F8000003F0F0000001F0F0000001F0F0000000F0F0 +000000F0F0000000F0F0000000F0F8000000E078000001E078000001E07C000001C03E00 +0003C01E000007801F00000F000FC0001E0007E0007C0001FC03F80000FFFFE000001FFF +80000003FC0000243F7CBC2D>I<0003FC0000001FFF0000003FFFC00000FE07F00001F8 +01F80003F000FC0007E0007C000FE0007E001FC0003F001F80003F003F80001F803F8000 +1F807F80001F807F00001FC07F00001FC0FF00001FC0FF00000FE0FF00000FE0FF00000F +E0FF00000FE0FF00000FE0FF00000FF0FF00000FF0FF00000FF0FF00000FF0FF00000FF0 +FF00000FF07F00001FF07F00001FF07F80001FF03F80001FF03F80003FF01F80003FF00F +C0007FF007C0006FF007E000EFF003F001CFF000F8038FF0007C070FF0001FFE0FE00007 +F80FE00000000FE00000001FE00000001FE00000001FC00000001FC00000001FC0000000 +3F800000003F800F00003F001F80007F003FC0007E003FC0007E003FC000FC003FC001F8 +003F8001F8003F0003F0001C0007E0001E001FC0000FC07F000003FFFE000001FFF80000 +003FC00000243F7CBC2D>I<1C007F00FF80FF80FF80FF80FF807F001C00000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +1C007F00FF80FF80FF80FF80FF807F001C00092778A619>I<1C007F00FF80FF80FF80FF +80FF807F001C000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000001C007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000 +C000C000C001C00180018003800300070006000E000C001C003800700060000A3978A619 +>I<000000FFE0000000000007FFFC00000000003F001F8000000000F80003E000000001 +C0000070000000078000003C0000000E0000000E0000001C000000070000003800000003 +8000007000000001C00000E000000000E00001C000000000700003800000000038000700 +003F80001C00060001FFE0000C000E0007E078000E000C000F801C0006001C003F000F00 +070018007E00070003003800FC00038003803000F80001FC01803001F80000FE01807003 +F00000FE01C06003F000007E00C06007E000007E00C06007E000007E00C0E007E000007E +00E0C00FE000007E0060C00FC000007E0060C00FC000007E0060C00FC000007E0060C00F +C000007E0060C00FC000007E0060C00FC000007E0060C00FC000007E0060C00FC000007E +0060C00FC000007E0060C00FE000007E0060E007E000007E00606007E000007E00606007 +E000007E00606003F000007E00E07003F00000FE00C03001F80000FE00C03000F80001FE +00C03800FC0003FE01C018007E00077E01801C003F000F7F03800C000F801C3F03000E00 +07E0781F8700060001FFE007FE000700003F8001F800038000000000000001C000000000 +000000E000000000000000700000000000000038000000000000001C0000000003E0000E +000000000FE00007800000007F800001C0000003FC000000F800001FE00000003F0007FF +0000000007FFFFF00000000000FFFC0000003B417BBF46>64 D<00000007000000000000 +00070000000000000007000000000000000F800000000000000F800000000000001FC000 +00000000001FC00000000000001FC00000000000003FE00000000000003FE00000000000 +003FE00000000000007FF00000000000006FF00000000000006FF0000000000000CFF800 +0000000000C7F8000000000000C7F800000000000187FC00000000000183FC0000000000 +0183FC00000000000301FE00000000000301FE00000000000301FE00000000000600FF00 +000000000600FF00000000000E00FF80000000000C007F80000000000C007F8000000000 +1C007FC00000000018003FC00000000018003FC00000000030003FE00000000030001FE0 +0000000030001FE00000000060001FF00000000060000FF00000000060000FF000000000 +C00007F800000000C00007F800000000C00007F800000001800003FC00000001FFFFFFFC +00000003FFFFFFFE00000003FFFFFFFE00000003000001FE00000007000001FF00000006 +000000FF00000006000000FF0000000C000000FF8000000C0000007F8000000C0000007F +800000180000007FC00000180000003FC00000180000003FC00000300000001FE0000030 +0000001FE00000700000001FE00000700000000FF00000F00000000FF00001F00000000F +F80003F80000000FF8000FFE0000003FFE00FFFFC00007FFFFF8FFFFC00007FFFFF8FFFF +C00007FFFFF83D417DC044>II<0000003FF0000C000003FFFE001C +00001FFFFF801C00007FE00FC03C0000FF0001F07C0003FC0000787C0007F000003CFC00 +1FE000000FFC003FC0000007FC007F80000003FC00FF00000003FC01FE00000001FC01FC +00000000FC03FC00000000FC07F8000000007C07F8000000007C0FF0000000003C0FF000 +0000003C1FE0000000001C1FE0000000001C3FE0000000001C3FC0000000001C3FC00000 +00000C7FC0000000000C7FC0000000000C7FC0000000000C7F800000000000FF80000000 +0000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000000 +00FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000 +FF8000000000007F8000000000007FC000000000007FC0000000000C7FC0000000000C3F +C0000000000C3FC0000000000C3FE0000000000C1FE0000000001C1FE000000000180FF0 +00000000180FF0000000001807F8000000003807F8000000003003FC000000007001FC00 +0000006001FE00000000E000FF00000001C0007F8000000380003FC000000780001FE000 +000F000007F000001E000003FC00003C000000FF0000F00000007FE007E00000001FFFFF +8000000003FFFE00000000003FF0000036427BBF41>IIII<0000003FF0000C00000003FFFE001C0000001FFFFF801C0000007FE00FC03C00 +0000FF0001F07C000003FC0000787C000007F000003CFC00001FE000000FFC00003FC000 +0007FC00007F80000003FC0000FF00000003FC0001FE00000001FC0001FC00000000FC00 +03FC00000000FC0007F8000000007C0007F8000000007C000FF0000000003C000FF00000 +00003C001FE0000000001C001FE0000000001C003FE0000000001C003FC0000000001C00 +3FC0000000000C007FC0000000000C007FC0000000000C007FC0000000000C007F800000 +00000000FF80000000000000FF80000000000000FF80000000000000FF80000000000000 +FF80000000000000FF80000000000000FF80000000000000FF80000000000000FF800000 +00000000FF80000000000000FF80000000000000FF8000001FFFFFF07F8000001FFFFFF0 +7FC000001FFFFFF07FC00000000FFE007FC000000003FC003FC000000003FC003FC00000 +0003FC003FE000000003FC001FE000000003FC001FE000000003FC000FF000000003FC00 +0FF000000003FC0007F800000003FC0007F800000003FC0003FC00000003FC0001FE0000 +0003FC0001FE00000003FC0000FF00000003FC00007F80000007FC00003FC0000007FC00 +001FE000000FFC000007F800001CFC000003FC0000387C000000FF0000F03C0000007FF0 +07E01C0000001FFFFF800C00000003FFFE0000000000003FF00000003C427BBF47>II +I76 DI< +FFFF8000007FFFF8FFFFC000007FFFF8FFFFE000007FFFF8007FE0000003FF00007FF000 +0000FC00006FF80000007800006FFC00000030000067FC00000030000063FE0000003000 +0063FF00000030000061FF00000030000060FF800000300000607FC00000300000607FC0 +0000300000603FE00000300000601FF00000300000601FF00000300000600FF800003000 +006007FC00003000006007FC00003000006003FE00003000006001FF00003000006001FF +00003000006000FF800030000060007FC00030000060007FE00030000060003FE0003000 +0060001FF00030000060001FF80030000060000FF800300000600007FC00300000600007 +FE00300000600003FE00300000600001FF00300000600000FF80300000600000FF803000 +006000007FC03000006000003FE03000006000003FE03000006000001FF0300000600000 +0FF83000006000000FF830000060000007FC30000060000003FE30000060000003FE3000 +0060000001FF30000060000000FFB0000060000000FFF00000600000007FF00000600000 +003FF00000600000003FF00000600000001FF00000600000000FF000006000000007F000 +006000000007F000006000000003F00000F000000001F00001F800000001F00007FE0000 +0000F000FFFFF00000007000FFFFF00000007000FFFFF000000030003D3E7DBD44>I<00 +0000FFE0000000000007FFFC00000000003FC07F8000000000FE000FE000000001F80003 +F000000007E00000FC0000000FC000007E0000001F8000003F0000003F0000001F800000 +7E0000000FC00000FE0000000FE00001FC00000007F00003F800000003F80003F8000000 +03F80007F000000001FC0007F000000001FC000FE000000000FE001FE000000000FF001F +E000000000FF001FC0000000007F003FC0000000007F803FC0000000007F803FC0000000 +007F807FC0000000007FC07F80000000003FC07F80000000003FC07F80000000003FC0FF +80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000 +003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF +80000000003FE0FF80000000003FE0FF80000000003FE07F80000000003FC07FC0000000 +007FC07FC0000000007FC07FC0000000007FC07FC0000000007FC03FC0000000007F803F +E000000000FF801FE000000000FF001FE000000000FF001FE000000000FF000FF0000000 +01FE000FF000000001FE0007F800000003FC0003F800000003F80003FC00000007F80001 +FC00000007F00000FE0000000FE000007F0000001FC000003F8000003F8000001F800000 +3F0000000FE00000FE00000007F00001FC00000001F80003F000000000FE000FE0000000 +003FC07F800000000007FFFC000000000000FFE00000003B427BBF46>II82 D<0007FC0018003FFF803800FFFFE03801FC +03F87803F0007C7807C0001EF80F80000FF81F000007F83F000003F83E000001F87E0000 +00F87E000000F87C00000078FC00000078FC00000078FC00000038FC00000038FC000000 +38FE00000018FE00000018FF00000018FF000000187F800000007FC00000007FE0000000 +3FF80000003FFF0000001FFFF000000FFFFF00000FFFFFF00007FFFFFC0001FFFFFE0000 +FFFFFF80003FFFFFC00007FFFFE000007FFFE0000007FFF00000007FF80000001FF80000 +000FFC00000007FC00000003FC00000001FE00000001FEC0000000FEC0000000FEC00000 +00FEC00000007EC00000007EE00000007EE00000007EE00000007EE00000007CF0000000 +7CF0000000FCF8000000F8FC000001F8FE000001F0FF000003F0FF800007E0FBE0000FC0 +F1F8001F80F07F007F00E01FFFFC00E007FFF000C0007FC00027427BBF32>I<3FFFFFFF +FFFFFF003FFFFFFFFFFFFF003FFFFFFFFFFFFF003FE000FFC001FF003F00007F80003F00 +7E00007F80001F807C00007F80000F807800007F800007807000007F800003807000007F +800003807000007F800003806000007F800001806000007F800001806000007F80000180 +6000007F800001806000007F80000180C000007F800000C0C000007F800000C0C000007F +800000C0C000007F800000C0C000007F800000C00000007F800000000000007F80000000 +0000007F800000000000007F800000000000007F800000000000007F800000000000007F +800000000000007F800000000000007F800000000000007F800000000000007F80000000 +0000007F800000000000007F800000000000007F800000000000007F800000000000007F +800000000000007F800000000000007F800000000000007F800000000000007F80000000 +0000007F800000000000007F800000000000007F800000000000007F800000000000007F +800000000000007F800000000000007F800000000000007F800000000000007F80000000 +0000007F800000000000007F800000000000007F800000000000007F800000000000007F +800000000000007F800000000000007F80000000000000FFC0000000000001FFE0000000 +0007FFFFFFF800000007FFFFFFF800000007FFFFFFF800003A3E7DBD41>III<7FFFFF8001FFFFE07FFFFF +8001FFFFE07FFFFF8001FFFFE000FFFC00003FFC00003FF800001FE000001FF000000F80 +00001FF000000F0000000FF800000E00000007FC00000C00000007FC00001C00000003FE +00003800000001FF00003000000001FF00006000000000FF8000E0000000007FC000C000 +0000007FC00180000000003FE00380000000001FF00300000000001FF00600000000000F +F80E000000000007FC0C000000000007FC18000000000003FE38000000000001FF300000 +00000001FF60000000000000FFE00000000000007FC00000000000007FC0000000000000 +3FE00000000000001FF00000000000001FF00000000000000FF80000000000001FFC0000 +000000001FFC00000000000033FE00000000000071FF00000000000061FF000000000000 +C0FF800000000001C07FC00000000001807FC00000000003003FE00000000007001FF000 +00000006001FF0000000000C000FF8000000001C0007FC00000000380007FC0000000030 +0003FE00000000700001FF00000000E00001FF00000000C00000FF800000018000007FC0 +0000038000007FC00000030000003FE00000070000001FF000000E0000001FF000001E00 +00000FF800003E0000000FFC0000FF0000000FFE0007FFC000003FFF00FFFFF00001FFFF +FEFFFFF00001FFFFFEFFFFF00001FFFFFE3F3E7EBD44>88 DI<3FFFFFFFFFF03FFFFFFFFFF03FFFFFFFFFF03FFE0000 +3FE03FF000003FE03FC000007FC03F0000007FC03E000000FF803C000001FF003C000001 +FF0038000003FE0078000003FC0070000007FC007000000FF8007000000FF8007000001F +F0006000003FE0006000003FE0006000007FC0006000007FC000600000FF8000000001FF +0000000001FF0000000003FE0000000003FC0000000007FC000000000FF8000000000FF8 +000000001FF0000000003FE0000000003FE0000000007FC0000000007FC000000000FF80 +00000001FF0000000001FF0000000003FE0000000003FC0000000007FC000018000FF800 +0018000FF8000018001FF0000018003FE0000018003FE0000018007FC0000018007FC000 +003800FF8000003801FF0000003801FF0000003803FE0000003803FC0000007007FC0000 +00700FF8000000F00FF8000000F01FF0000001F03FE0000003F03FE000000FF07FC00000 +3FF07FC00001FFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF02D3E7BBD37>II93 D<001FF0000000FFFC000003E03F00000F000FC000 +1C0007E0001F0003F0003F8001F8003FC000FC003FC000FC003FC000FC003FC0007E001F +80007E000F00007E000000007E000000007E000000007E000000007E0000001FFE000003 +FFFE00001FF87E00007F807E0001FC007E0007F0007E000FE0007E001FC0007E003F8000 +7E007F80007E007F00007E007F00007E03FE00007E03FE00007E03FE00007E03FE0000FE +03FE0000FE03FE0001FE037F0001BE037F0003BE033F80071F061FC00E1F8E0FF03C0FFC +03FFF007F8003FC003E0282A7CA82D>97 D<01F800000000FFF800000000FFF800000000 +FFF80000000007F80000000003F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F807F8000001F81FFF000001F8780FC00001F9E003F000 +01FB8001F80001FF0000FC0001FE00007E0001FC00003F0001FC00001F8001F800001F80 +01F800001FC001F800000FC001F800000FE001F800000FE001F8000007E001F8000007F0 +01F8000007F001F8000007F001F8000007F001F8000007F001F8000007F001F8000007F0 +01F8000007F001F8000007F001F8000007F001F8000007E001F800000FE001F800000FE0 +01F800000FE001F800000FC001F800001FC001F800001F8001FC00003F0001FE00003F00 +01F600007E0001F70000FC0001E38001F80001C1C003E00001C0F81F800001803FFE0000 +000007F000002C407EBE32>I<0001FF0000000FFFE000003F00F800007C001E0001F800 +070003F0001F0007E0003F800FC0007F800FC0007F801F80007F801F80007F803F00003F +003F00001E007F000000007F000000007E00000000FE00000000FE00000000FE00000000 +FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE +000000007F000000007F000000007F000000003F000000C03F800000C01F800001C01FC0 +0001800FC000038007E000070003F000060001F8001E0000FC003800003F01F000000FFF +C0000001FE0000222A7DA828>I<00000001F800000000FFF800000000FFF800000000FF +F80000000007F80000000003F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F8000000FF01F8000007FFC1F800001F80F1F800007C0039F80001F8001D +F80003F0000FF80007E00007F8000FC00003F8000FC00003F8001F800001F8003F800001 +F8003F000001F8007F000001F8007F000001F8007F000001F8007E000001F800FE000001 +F800FE000001F800FE000001F800FE000001F800FE000001F800FE000001F800FE000001 +F800FE000001F800FE000001F800FE000001F8007E000001F8007F000001F8007F000001 +F8003F000001F8003F800001F8001F800003F8001F800003F8000FC00007F80007E0000F +F80003F0000DFC0001F8003DFE0000FC0071FFF0003F01E1FFF0000FFF81FFF00001FE01 +F8002C407DBE32>I<0003FC0000001FFF8000007E07E00000F801F00001F000F80003E0 +007C0007C0003E000FC0003F001F80001F001F80001F803F00001F803F00000F807F0000 +0F807F00000FC07E00000FC07E00000FC0FE00000FC0FE00000FC0FFFFFFFFC0FFFFFFFF +C0FE00000000FE00000000FE00000000FE00000000FE00000000FE000000007E00000000 +7F000000007F000000007F000000003F000000C03F800000C01F800001C00FC00001800F +C000038007E000070003F0000E0001F8001C0000FC003800003F01F000000FFFC0000001 +FE0000222A7DA828>I<00001FC00000FFF00003F0380007C0FC000F81FE001F81FE003F +01FE003E01FE007E01FE007E00FC00FC000000FC000000FC000000FC000000FC000000FC +000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC +0000FFFFFF00FFFFFF00FFFFFF0000FC000000FC000000FC000000FC000000FC000000FC +000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC +000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC +000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000001FE +00007FFFFE007FFFFE007FFFFE001F407FBF1C>I<000000007E000003FC01FF00000FFF +078780003E07CE0F8000FC03FC0F8001F801F80F8003F000FC070003E0007C000007E000 +7E000007E0007E00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC000 +3F00000FC0003F00000FC0003F00000FC0003F000007E0007E000007E0007E000003E000 +7C000003F000FC000001F801F8000001FC03F0000001BE07C00000038FFF0000000303FC +000000070000000000070000000000070000000000070000000000078000000000078000 +00000007C00000000003E00000000003FFFFF0000001FFFFFE000001FFFFFF8000007FFF +FFE00001FFFFFFF80007C0001FF8001F800003FC003F000000FE003E0000007E007C0000 +003E007C0000003F00F80000001F00F80000001F00F80000001F00F80000001F00F80000 +001F00FC0000003F007C0000003E007E0000007E003F000000FC001F800001F8000FC000 +03F00003F0000FC00000FE007F0000003FFFFC00000003FFC00000293D7EA82D>I<01F8 +00000000FFF800000000FFF800000000FFF80000000007F80000000003F80000000001F8 +0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 +0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 +0000000001F80000000001F80000000001F80000000001F80000000001F803FC000001F8 +0FFF800001F83C0FC00001F8F003E00001F9C003F00001FB8001F80001FB0001F80001FF +0000FC0001FE0000FC0001FE0000FC0001FC0000FC0001FC0000FC0001F80000FC0001F8 +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0003FC0001FE00FFFF +F07FFFF8FFFFF07FFFF8FFFFF07FFFF82D3F7EBE32>I<01C00007F0000FF8000FF8000F +F8000FF8000FF80007F00001C00000000000000000000000000000000000000000000000 +000000000000000000000000000001F8007FF8007FF8007FF80007F80003F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80003FC00FFFFE0FFFFE0FFFFE0133D7EBC19>I<000070 +0001FC0003FE0003FE0003FE0003FE0003FE0001FC000070000000000000000000000000 +0000000000000000000000000000000000000000000000000000FE003FFE003FFE003FFE +0001FE0000FE00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E +00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E +00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E +00007E00007E00007E00007E00007E00007E00007E00007E3C007E7E007CFF00FCFF00FC +FF00F8FF01F8FE01F07803E03E07C00FFF0001FC00175084BC1C>I<01F800000000FFF8 +00000000FFF800000000FFF80000000007F80000000003F80000000001F80000000001F8 +0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 +0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 +0000000001F80000000001F80000000001F80000000001F80000000001F8007FFF8001F8 +007FFF8001F8007FFF8001F8001FFC0001F8000FE00001F8000F800001F8001F000001F8 +001C000001F80038000001F80070000001F800E0000001F803C0000001F80700000001F8 +0E00000001F81E00000001F83E00000001F87F00000001F9FF80000001FB9FC0000001FF +0FC0000001FE07E0000001FC07F0000001F803F0000001F801F8000001F801FC000001F8 +00FE000001F8007E000001F8003F000001F8003F800001F8001F800001F8000FC00001F8 +000FE00001F80007F00001F80007F00001F80007F80003FC0007FE00FFFFF03FFFE0FFFF +F03FFFE0FFFFF03FFFE02B3F7EBE30>I<01F800FFF800FFF800FFF80007F80003F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80003FC00FFFFF0FFFFF0FFFFF0143F7EBE19>I<01F803 +FC0001FE0000FFF80FFF8007FFC000FFF83C0FC01E07E000FFF8F003E07801F00007F9C0 +03F0E001F80003FB8001F9C000FC0001FB0001F98000FC0001FF0000FF80007E0001FE00 +00FF00007E0001FE0000FF00007E0001FC0000FE00007E0001FC0000FE00007E0001F800 +00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800 +00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800 +00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800 +00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800 +00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800 +00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0003FC00 +01FE0000FF00FFFFF07FFFF83FFFFCFFFFF07FFFF83FFFFCFFFFF07FFFF83FFFFC46287E +A74B>I<01F803FC0000FFF80FFF8000FFF83C0FC000FFF8F003E00007F9C003F00003FB +8001F80001FB0001F80001FF0000FC0001FE0000FC0001FE0000FC0001FC0000FC0001FC +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 +0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 +0000FC0003FC0001FE00FFFFF07FFFF8FFFFF07FFFF8FFFFF07FFFF82D287EA732>I<00 +01FE0000000FFFC000003F03F000007C00F80001F0003E0003E0001F0007C0000F8007C0 +000F800F800007C01F800007E01F000003E03F000003F03F000003F07E000001F87E0000 +01F87E000001F87E000001F8FE000001FCFE000001FCFE000001FCFE000001FCFE000001 +FCFE000001FCFE000001FCFE000001FCFE000001FC7E000001F87E000001F87E000001F8 +7F000003F83F000003F03F000003F01F800007E00F800007C00FC0000FC007C0000F8003 +E0001F0001F0003E0000FC00FC00003F03F000000FFFC0000001FE0000262A7DA82D>I< +01F807F80000FFF81FFF0000FFF8780FC000FFF9E003F00003FB8001F80001FF0000FC00 +01FE00007E0001FC00007F0001FC00003F8001F800001F8001F800001FC001F800001FC0 +01F800000FE001F800000FE001F800000FE001F800000FF001F8000007F001F8000007F0 +01F8000007F001F8000007F001F8000007F001F8000007F001F8000007F001F8000007F0 +01F8000007F001F800000FE001F800000FE001F800000FE001F800000FE001F800001FC0 +01F800001FC001F800003F8001FC00003F0001FE00007F0001FE0000FE0001FF0001FC00 +01FB8003F80001F9C007E00001F8F81F800001F83FFE000001F807F0000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +03FC00000000FFFFF0000000FFFFF0000000FFFFF00000002C3A7EA732>I<0000FF000C +000007FFC01C00001F80F01C00007E00381C0000FC001C3C0003F8000E3C0007F000077C +0007E000037C000FC00003FC001FC00001FC003F800001FC003F800000FC007F000000FC +007F000000FC007F000000FC007F000000FC00FE000000FC00FE000000FC00FE000000FC +00FE000000FC00FE000000FC00FE000000FC00FE000000FC00FE000000FC00FE000000FC +00FF000000FC007F000000FC007F000000FC007F000000FC003F800000FC003F800001FC +001FC00001FC000FC00003FC000FE00003FC0007E00007FC0003F0000EFC0001F8001CFC +00007E0078FC00003F01E0FC00000FFFC0FC000001FE00FC0000000000FC0000000000FC +0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC +0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000001FE +000000007FFFF80000007FFFF80000007FFFF82D3A7DA730>I<03F00FC0FFF03FF0FFF0 +F0F8FFF1C3FC07F183FC03F383FC01F703FC01F603FC01F601F801FE006001FC000001FC +000001FC000001FC000001F8000001F8000001F8000001F8000001F8000001F8000001F8 +000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8 +000001F8000001F8000001F8000001F8000001F8000001F8000003FC0000FFFFF800FFFF +F800FFFFF8001E287EA723>I<007FC06003FFF8E007C03DE01E000FE03C0003E0780001 +E0780001E0700000E0F00000E0F0000060F0000060F8000060F8000060FC000060FF0000 +007FC000007FFE00003FFFE0001FFFFC0007FFFE0003FFFF80007FFFC00007FFE000003F +E000000FF0C00003F0C00001F8C00000F8E00000F8E0000078E0000078F0000078F00000 +78F8000078F80000F0FC0000F0FC0001E0FE0001C0F7800780F1E01F00E0FFFC00C01FE0 +001D2A7DA824>I<00180000001800000018000000180000001800000018000000380000 +003800000038000000380000007800000078000000F8000000F8000001F8000003F80000 +07F800001FFFFFC0FFFFFFC0FFFFFFC001F8000001F8000001F8000001F8000001F80000 +01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 +01F8000001F8000001F8000001F8000001F8000001F8000001F8006001F8006001F80060 +01F8006001F8006001F8006001F8006001F8006001F8006000FC00E000FC00C000FC00C0 +007E01C0003F0380001F87000007FE000001F8001B397EB723>I<01F80000FC00FFF800 +7FFC00FFF8007FFC00FFF8007FFC0007F80003FC0003F80001FC0001F80000FC0001F800 +00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800 +00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800 +00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800 +00FC0001F80000FC0001F80000FC0001F80000FC0001F80001FC0001F80001FC0001F800 +01FC0001F80003FC0000F80003FC0000FC0007FC0000FC000EFE00007C001CFF00003E00 +38FFF8001F80F0FFF80007FFE0FFF80000FF00FC002D297EA732>III<7FFFC00FFFE07FFFC00F +FFE07FFFC00FFFE003FF0007FE0000FF0003F800007F0003E000003F0003C000003F8003 +8000001FC0070000000FC00E00000007E00C00000007F01800000003F83800000001F870 +00000000FCE000000000FEC0000000007F80000000003F80000000001F80000000000FC0 +000000000FE0000000001FE0000000003BF00000000071F800000000E1FC00000000C0FE +00000001807E00000003803F00000007003F8000000E001FC000000C000FC000001C0007 +E00000380007F00000F80003F80001F80003FC000FFC0007FE00FFFF001FFFF8FFFF001F +FFF8FFFF001FFFF82D277FA630>II<1FFFFFFF801FFFFFFF801FE0007F801F00007F001E0000FE001C +0001FC001C0003FC00180003F800380007F00038000FE00030001FE00030001FC0003000 +3F800030007F000030007F00000000FE00000001FC00000003FC00000003F800000007F0 +0000000FE00000001FE00000001FC00180003F800180007F000180007F00018000FE0001 +8001FC00018003FC00038003F800038007F00003000FE00003001FE00007001FC0000F00 +3F80000F007F00003F00FF0001FF00FFFFFFFF00FFFFFFFF0021277EA628>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fg ectt1095 10.95 73 +/Fg 73 125 df<1F003F807FC0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FF +E0FFE0FFE0FFE0FFE0FFE0FFE07FC07FC07FC07FC07FC07FC07FC07FC07FC07FC07FC07F +C07FC07FC07FC07FC03F80000000000000000000000000000000001F003F807FC0FFE0FF +E0FFE0FFE0FFE07FC03F801F000B396EB82F>33 D<3C000F007E001F80FF003FC0FF003F +C0FF003FC0FF003FC0FF003FC0FF003FC0FF003FC0FF003FC0FF003FC07F003F807F003F +807F003F807F003F807F003F807F003F807F003F807E001F807E001F807E001F807E001F +807E001F807E001F807E001F807E001F803C000F001A1B76B82F>I<0007800780000FC0 +0FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00F +C0000FC00FC0001FC01FC0001F801F80001F801F80001F801F80001F801F803FFFFFFFFC +7FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE003F003F00003F003F0000 +7F007F00007E007E00007E007E00007E007E00007E007E00007E007E00007E007E00007E +007E00007E007E00007E007E0000FE00FE0000FC00FC0000FC00FC007FFFFFFFFEFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE3FFFFFFFFC01F801F80001F801F80001F801F8 +0003F803F80003F003F00003F003F00003F003F00003F003F00003F003F00003F003F000 +03F003F00003F003F00003F003F00001E001E00028387DB72F>I<07C00FF01FF83FFC3F +FC3FFE3FFE3FFF1FFF0FFF07FF003F003F003F003F007F007E007E00FE00FC01FC03F803 +F80FF01FF03FE0FFC0FF80FF007C003800101F70B72F>39 D<00003C00007E0001FE0003 +FE0007FC000FF8001FE0003FC0007F8000FF0000FE0001FC0003F80003F80007F00007E0 +000FE0000FC0001FC0001F80001F80003F80003F00003F00007F00007E00007E00007E00 +00FE0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00 +00FC0000FC0000FE00007E00007E00007E00007F00003F00003F00003F80001F80001F80 +001FC0000FC0000FE00007E00007F00003F80003F80001FC0000FE0000FF00007F80003F +C0001FE0000FF80007FC0003FE0001FE00007E00003C174771BE2F>I<780000FC0000FF +0000FF80007FC0003FE0000FF00007F80003FC0001FE0000FE00007F00003F80003F8000 +1FC0000FC0000FE00007E00007F00003F00003F00003F80001F80001F80001FC0000FC00 +00FC0000FC0000FE00007E00007E00007E00007E00007E00007E00007E00007E00007E00 +007E00007E00007E00007E0000FE0000FC0000FC0000FC0001FC0001F80001F80003F800 +03F00003F00007F00007E0000FE0000FC0001FC0003F80003F80007F0000FE0001FE0003 +FC0007F8000FF0003FE0007FC000FF8000FF0000FC0000780000174778BE2F>I<0001E0 +00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 +003003F003007C03F00F80FE03F01FC0FF83F07FC0FFE3F1FFC07FF3F3FF801FFFFFFE00 +0FFFFFFC0003FFFFF00000FFFFC000003FFF0000000FFC0000003FFF000000FFFFC00003 +FFFFF0000FFFFFFC001FFFFFFE007FF3F3FF80FFE3F1FFC0FF83F07FC0FE03F01FC07C03 +F00F803003F003000003F000000003F000000003F000000003F000000003F000000003F0 +00000003F000000001E0000022277AAE2F>I<07C00FF01FF83FF83FFC3FFC3FFE3FFE1F +FE0FFE07FE007E00FE00FC01FC01FC03F80FF03FF0FFE0FFC0FF807E0038000F18708A2F +>44 D<7FFFFFF8FFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC7FFFFFF81E0678962F>I<1F00 +3F807FC0FFE0FFE0FFE0FFE0FFE07FC03F801F000B0B6E8A2F>I<00000000E000000001 +F000000003F000000003F000000007F000000007E00000000FE00000000FC00000001FC0 +0000001F800000003F800000003F000000007F000000007E00000000FE00000000FC0000 +0000FC00000001FC00000001F800000003F800000003F000000007F000000007E0000000 +0FE00000000FC00000001FC00000001F800000003F800000003F000000003F000000007F +000000007E00000000FE00000000FC00000001FC00000001F800000003F800000003F000 +000007F000000007E00000000FE00000000FC00000000FC00000001FC00000001F800000 +003F800000003F000000007F000000007E00000000FE00000000FC00000001FC00000001 +F800000003F800000003F000000003F000000007F000000007E00000000FE00000000FC0 +0000001FC00000001F800000003F800000003F000000007F000000007E00000000FE0000 +0000FC00000000FC00000000F800000000780000000024477BBE2F>I<0001FE00000007 +FF8000001FFFE000003FFFF000007FFFF80000FFFFFC0001FF03FE0003FC00FF0003F800 +7F0007F0003F800FE0001FC00FC0000FC01FC0000FE01F800007E01F800007E03F000003 +F03F000003F03F000003F07E000001F87E000001F87E000001F87E000001F8FC000000FC +FC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC +000000FCFC000000FCFC000000FCFC000000FCFC000000FCFE000001FC7E000001F87E00 +0001F87E000001F87F000003F83F000003F03F000003F03F800007F01F800007E01FC000 +0FE01FC0000FE00FE0001FC00FE0001FC007F0003F8003F8007F0003FC00FF0001FF03FE +0000FFFFFC00007FFFF800003FFFF000001FFFE0000007FF80000001FE0000263A7CB82F +>I<000380000007C0000007C000000FC000000FC000001FC000003FC000003FC000007F +C00001FFC00003FFC0007FFFC000FFFFC000FFFFC000FFCFC000FF8FC0007E0FC000000F +C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F +C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F +C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F +C000000FC000000FC000000FC000000FC000000FC000000FC0003FFFFFF87FFFFFF87FFF +FFFC7FFFFFFC7FFFFFF87FFFFFF81E3977B82F>I<000FFC0000003FFF800000FFFFE000 +03FFFFF80007FFFFFC000FFFFFFE001FF80FFF003FE001FF803F80007F807F00003FC07E +00001FC07E00000FE0FE000007E0FE000007F0FF000007F0FF000003F0FF000003F0FF00 +0003F07E000003F018000003F000000003F000000003F000000007F000000007E0000000 +0FE00000000FC00000001FC00000001FC00000003F800000007F00000000FF00000001FE +00000003FC00000007F80000000FF00000001FE00000003FC00000007F80000000FF0000 +0001FE00000007FC0000000FF80000001FF00000003FE00000007F80000000FF00000001 +FE00000003FC0001E00FF80003F01FF00003F03FE00003F07FFFFFFFF0FFFFFFFFF0FFFF +FFFFF0FFFFFFFFF0FFFFFFFFF07FFFFFFFE024397BB82F>I<0007FF0000003FFFE00001 +FFFFF80003FFFFFE0007FFFFFF000FFFFFFF801FFC01FFC01FE0003FC03F80001FE03FC0 +0007E03FC00007F03FC00003F03FC00003F01F800003F00F000003F000000003F0000000 +07F000000007E00000000FE00000000FE00000001FC00000007FC0000000FF8000000FFF +00000FFFFE00001FFFFC00001FFFF800001FFFF800001FFFFE00000FFFFF00000001FF80 +0000003FC00000001FE000000007F000000003F000000003F800000001F800000001FC00 +000000FC00000000FC18000000FC7E000000FCFF000000FCFF000000FCFF000001FCFF00 +0001F8FE000003F8FE000003F87F000007F07F80001FE03FE0003FE01FFE01FFC00FFFFF +FF8007FFFFFF0003FFFFFE0000FFFFF800003FFFE0000003FF0000263A7CB82F>I<0000 +07F80000000FFC0000000FFC0000001FFC0000003FFC0000003F7C0000007F7C0000007E +7C000000FE7C000001FC7C000001F87C000003F87C000003F07C000007F07C00000FE07C +00000FC07C00001FC07C00001F807C00003F807C00007F007C00007E007C0000FE007C00 +00FC007C0001F8007C0003F8007C0003F0007C0007F0007C0007E0007C000FC0007C001F +C0007C001F80007C003F80007C003F00007C007E00007C00FE00007C00FFFFFFFFFEFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE0000007C000000007C00000000 +7C000000007C000000007C000000007C000000007C000000007C000000007C000000007C +0000007FFFFC0000FFFFFE0000FFFFFE0000FFFFFE0000FFFFFE00007FFFFC28397DB82F +>I<00001FE0000000FFFC000003FFFF00000FFFFF80001FFFFF80003FFFFFC0007FF03F +C000FF800FE001FE001FE003FC001FE007F8001FE007F0001FE00FE0000FC00FC0000780 +1FC00000001F800000003F800000003F000000007F000000007F000000007E001000007E +07FF80007E1FFFE000FE7FFFF800FCFFFFFC00FDFFFFFE00FFFFFFFF00FFFC01FF00FFF0 +007F80FFC0003FC0FF80001FC0FF00000FE0FF00000FE0FE000007E0FE000007F0FE0000 +03F0FE000003F0FE000003F07E000003F07E000003F07E000003F07E000003F07F000003 +F03F000007F03F000007E03F800007E01F80000FE01FC0001FC00FE0003FC00FF0007F80 +07F800FF0003FE03FF0003FFFFFE0001FFFFFC0000FFFFF800003FFFE000000FFF800000 +03FE0000243A7BB82F>54 D<7800000000FFFFFFFFF8FFFFFFFFFCFFFFFFFFFCFFFFFFFF +FCFFFFFFFFFCFFFFFFFFF8FC000007F0FC00000FE0FC00001FC07800003F800000003F80 +0000007F00000000FE00000001FC00000001F800000003F800000007F000000007E00000 +000FE00000000FC00000001FC00000001F800000003F800000003F000000007F00000000 +7E00000000FE00000000FC00000000FC00000001FC00000001F800000001F800000003F0 +00000003F000000003F000000007F000000007E000000007E000000007E00000000FE000 +00000FC00000000FC00000000FC00000000FC00000000FC00000001FC00000001F800000 +001F800000001F800000001F800000001F800000001F800000001F800000001F80000000 +1F800000001F800000000F000000263A7CB82F>I<0003FF0000001FFFE000007FFFF800 +01FFFFFE0003FFFFFF0007FFFFFF800FFE01FFC01FF0003FE01FE0001FE03F800007F03F +800007F07F000003F87E000001F87E000001F87E000001F87E000001F87E000001F87F00 +0003F83F000003F03F800007F01FC0000FE00FE0001FC00FF8007FC003FF03FF0001FFFF +FE00007FFFF800001FFFE000003FFFF00000FFFFFC0003FFFFFF0007FC00FF800FF0003F +C01FC0000FE03F800007F03F000003F07F000003F87E000001F8FE000001FCFC000000FC +FC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFE000001FC7E000001F87F +000003F87F800007F83FC0000FF01FE0001FE01FF0003FE00FFE01FFC007FFFFFF8003FF +FFFF0001FFFFFE00007FFFF800001FFFE0000003FF0000263A7CB82F>I<1F003F807FC0 +FFE0FFE0FFE0FFE0FFE07FC03F801F000000000000000000000000000000000000000000 +00000000000000000000000000001F003F807FC0FFE0FFE0FFE0FFE0FFE07FC03F801F00 +0B276EA62F>58 D<07C00FE01FF03FF83FF83FF83FF83FF81FF00FE007C0000000000000 +0000000000000000000000000000000000000000000000000000000007C00FF01FF83FF8 +3FFC3FFC3FFE3FFE1FFE0FFE07FE007E00FE00FC01FC01FC03F80FF03FF0FFE0FFC0FF80 +7E0038000F3470A62F>I<000000004000000001E000000007F00000000FF00000003FF0 +0000007FE0000001FFC0000003FF0000000FFE0000001FF80000007FF0000000FFC00000 +03FF80000007FE0000001FFC0000003FF0000000FFE0000001FF80000007FF0000000FFC +0000003FF80000007FE0000000FFC0000000FF00000000FFC00000007FE00000003FF800 +00000FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC00000007FE00 +000003FF80000000FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC0 +0000007FE00000003FF00000000FF000000007F000000001E00000000040242F7BB22F> +I<3FFFFFFFFC7FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE0000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000007FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE3FFFFFFFFC2815 +7DA52F>I<30000000007800000000FE00000000FF00000000FFC00000007FE00000003F +F80000000FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC00000007 +FE00000003FF80000000FFC00000007FF00000001FF80000000FFE00000003FF00000001 +FFC00000007FE00000003FF00000000FF00000003FF00000007FE0000001FFC0000003FF +0000000FFE0000001FF80000007FF0000000FFC0000003FF80000007FE0000001FFC0000 +003FF0000000FFE0000001FF80000007FF0000000FFC0000003FF80000007FE0000000FF +C0000000FF00000000FE0000000078000000003000000000242F7BB22F>I<001FFF0000 +00FFFFF00003FFFFFC000FFFFFFF001FFFFFFF803FFFFFFFC07FF001FFC07F80003FE0FE +00000FE0FE000007F0FF000003F0FF000003F0FF000003F07E000007F07E00000FE00000 +001FE00000007FC0000001FFC0000003FF8000000FFF0000001FFC0000003FF00000007F +E00000007F80000000FF00000001FE00000001FE00000003FC00000003F800000003F800 +000007F800000007F000000007F000000007F000000007F000000007F000000007F00000 +0007F000000003F000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000001C000000007F000000007F00000000F +F80000000FF80000000FF800000007F000000007F000000001C0000024397BB82F>I<00 +003F00000000007F80000000007F8000000000FFC000000000FFC000000000FFC0000000 +00FFC000000001F3E000000001F3E000000001F3E000000001F3E000000001F3E0000000 +03F3F000000003F3F000000003F3F000000003E1F000000007E1F800000007E1F8000000 +07E1F800000007E1F800000007C0F80000000FC0FC0000000FC0FC0000000FC0FC000000 +0FC0FC0000001F807E0000001F807E0000001F807E0000001F807E0000003F807F000000 +3F003F0000003F003F0000003F003F0000003F003F0000007E001F8000007E001F800000 +7FFFFF8000007FFFFF800000FFFFFFC00000FFFFFFC00000FFFFFFC00000FFFFFFC00000 +FC000FC00001F80007E00001F80007E00001F80007E00001F80007E00003F80007F00003 +F00003F00003F00003F00003F00003F0007FFF003FFF807FFF003FFF80FFFF807FFFC0FF +FF807FFFC07FFF003FFF807FFF003FFF802A397EB82F>65 D<7FFFFFE000FFFFFFFC00FF +FFFFFF00FFFFFFFF80FFFFFFFFC07FFFFFFFE003F0001FF003F0000FF003F00003F803F0 +0003F803F00001F803F00001FC03F00000FC03F00000FC03F00000FC03F00000FC03F000 +00FC03F00001FC03F00001F803F00003F803F00003F003F00007F003F0001FE003F0007F +C003FFFFFF8003FFFFFF0003FFFFFC0003FFFFFF0003FFFFFFC003FFFFFFE003F0000FF0 +03F00003F803F00001FC03F00000FC03F00000FE03F000007E03F000007E03F000003F03 +F000003F03F000003F03F000003F03F000003F03F000003F03F000007F03F000007E03F0 +0000FE03F00000FE03F00001FC03F00007FC03F0001FF87FFFFFFFF8FFFFFFFFF0FFFFFF +FFE0FFFFFFFF80FFFFFFFF007FFFFFF80028387EB72F>I<00007F80380003FFE07C000F +FFF8FC001FFFFCFC003FFFFFFC007FFFFFFC00FFC0FFFC01FF003FFC03FE000FFC07F800 +0FFC07F00007FC0FE00003FC0FE00003FC1FC00001FC1F800001FC3F800001FC3F000000 +FC3F000000FC7F000000FC7E000000FC7E000000787E00000000FE00000000FC00000000 +FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC +00000000FC00000000FC00000000FC00000000FE000000007E000000007E000000007E00 +0000787F000000FC3F000000FC3F000000FC3F800000FC1F800000FC1FC00001FC0FE000 +01F80FF00003F807F00003F807F80007F003FE000FF001FF001FE000FFC07FC0007FFFFF +80003FFFFF00001FFFFE00000FFFFC000003FFF00000007F8000263A7CB82F>I<7FFFFF +800000FFFFFFF00000FFFFFFFC0000FFFFFFFE0000FFFFFFFF00007FFFFFFF800007E001 +FFC00007E0003FE00007E0001FE00007E0000FF00007E00007F80007E00003F80007E000 +01FC0007E00001FC0007E00000FE0007E00000FE0007E000007E0007E000007F0007E000 +003F0007E000003F0007E000003F0007E000003F0007E000003F8007E000001F8007E000 +001F8007E000001F8007E000001F8007E000001F8007E000001F8007E000001F8007E000 +001F8007E000001F8007E000001F8007E000001F8007E000003F8007E000003F0007E000 +003F0007E000003F0007E000007F0007E000007E0007E000007E0007E00000FE0007E000 +01FC0007E00001FC0007E00003F80007E00007F80007E0000FF00007E0001FF00007E000 +3FE00007E001FFC0007FFFFFFF8000FFFFFFFF0000FFFFFFFE0000FFFFFFFC0000FFFFFF +F000007FFFFF80000029387EB72F>I<7FFFFFFFFC00FFFFFFFFFE00FFFFFFFFFE00FFFF +FFFFFE00FFFFFFFFFE007FFFFFFFFE0003F000007E0003F000007E0003F000007E0003F0 +00007E0003F000007E0003F000007E0003F000007E0003F000003C0003F00000000003F0 +0000000003F00000000003F00000000003F00000000003F000F0000003F001F8000003F0 +01F8000003F001F8000003F001F8000003FFFFF8000003FFFFF8000003FFFFF8000003FF +FFF8000003FFFFF8000003FFFFF8000003F001F8000003F001F8000003F001F8000003F0 +01F8000003F000F0000003F00000000003F00000000003F00000000003F00000000003F0 +0000000003F000000F0003F000001F8003F000001F8003F000001F8003F000001F8003F0 +00001F8003F000001F8003F000001F8003F000001F8003F000001F807FFFFFFFFF80FFFF +FFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF0029387DB72F>I<7F +FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF03F000003F03F0 +00003F03F000003F03F000003F03F000003F03F000003F03F000003F03F000001E03F000 +000003F000000003F000000003F000000003F000000003F000000003F000780003F000FC +0003F000FC0003F000FC0003F000FC0003FFFFFC0003FFFFFC0003FFFFFC0003FFFFFC00 +03FFFFFC0003FFFFFC0003F000FC0003F000FC0003F000FC0003F000FC0003F000780003 +F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 +00000003F000000003F000000003F000000003F000000003F000000003F00000007FFFE0 +0000FFFFF00000FFFFF00000FFFFF00000FFFFF000007FFFE0000028387DB72F>I<7FFF +807FFF807FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC07FFF807FFF807FFF807FFF8003F0 +0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 +0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 +0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003FF +FFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003F0 +0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 +0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 +0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 +0003F00003F00003F0007FFF807FFF807FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC07FFF +807FFF807FFF807FFF802A387EB72F>72 D<7FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFF7FFFFFFE0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 +E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 +E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 +E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 +E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 +E0007FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFE203879B72F>I<7FFFF0 +00007FFFF80000FFFFF80000FFFFF800007FFFF800007FFFF0000001F800000001F80000 +0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000 +01F800000001F800000001F800000001F800000001F800000001F800000001F800000001 +F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8 +00000001F800000001F800000001F800000001F800000001F800000001F800000001F800 +000001F800000001F800000001F800000001F800001E01F800003F01F800003F01F80000 +3F01F800003F01F800003F01F800003F01F800003F01F800003F01F800003F7FFFFFFFFF +7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF7FFFFFFFFE28387DB72F>76 +D<7FF00000FFE07FF80001FFE0FFF80001FFF0FFFC0003FFF07FFC0003FFE07FFC0003FF +E007DE0007BE0007DE0007BE0007DE0007BE0007DF000FBE0007CF000F3E0007CF000F3E +0007CF801F3E0007CF801F3E0007C7801E3E0007C7801E3E0007C7C03E3E0007C7C03E3E +0007C3C03C3E0007C3E07C3E0007C3E07C3E0007C1E0783E0007C1F0F83E0007C1F0F83E +0007C1F0F83E0007C0F0F03E0007C0F9F03E0007C0F9F03E0007C079E03E0007C079E03E +0007C079E03E0007C03FC03E0007C03FC03E0007C03FC03E0007C01F803E0007C01F803E +0007C00F003E0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E +0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E +0007C000003E0007C000003E007FFC0003FFE07FFC0003FFE0FFFE0007FFF0FFFE0007FF +F07FFC0003FFE07FFC0003FFE02C387FB72F>I<7FF8003FFF807FFC003FFF80FFFC007F +FFC0FFFE007FFFC07FFE003FFF807FFE003FFF8003EF0001F00003EF0001F00003EF8001 +F00003E78001F00003E78001F00003E7C001F00003E3C001F00003E3C001F00003E3E001 +F00003E3E001F00003E1E001F00003E1F001F00003E1F001F00003E0F001F00003E0F801 +F00003E0F801F00003E07801F00003E07C01F00003E07C01F00003E03E01F00003E03E01 +F00003E03E01F00003E01F01F00003E01F01F00003E01F01F00003E00F81F00003E00F81 +F00003E00781F00003E007C1F00003E007C1F00003E003C1F00003E003E1F00003E003E1 +F00003E001E1F00003E001F1F00003E001F1F00003E000F1F00003E000F1F00003E000F9 +F00003E00079F00003E00079F00003E0007DF00003E0003DF00003E0003DF0007FFF001F +F0007FFF001FF000FFFF801FF000FFFF800FF0007FFF000FF0007FFF0007E0002A387EB7 +2F>I<7FFFFFE000FFFFFFF800FFFFFFFE00FFFFFFFF80FFFFFFFFC07FFFFFFFE003F000 +7FF003F0001FF003F00007F803F00003F803F00001FC03F00001FC03F00000FC03F00000 +FE03F000007E03F000007E03F000007E03F000007E03F000007E03F000007E03F00000FE +03F00000FC03F00001FC03F00001FC03F00003F803F00007F803F0001FF003F0007FF003 +FFFFFFE003FFFFFFC003FFFFFF8003FFFFFE0003FFFFF80003FFFFE00003F000000003F0 +00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 +000003F000000003F000000003F000000003F000000003F000000003F000000003F00000 +007FFF800000FFFFC00000FFFFC00000FFFFC00000FFFFC000007FFF80000027387DB72F +>80 D<7FFFFE0000007FFFFFC00000FFFFFFF00000FFFFFFFC00007FFFFFFE00007FFFFF +FF000003F003FF800003F0007FC00003F0003FC00003F0001FE00003F0000FE00003F000 +07E00003F00007F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 +03F00003F00007F00003F00007E00003F0000FE00003F0001FE00003F0003FC00003F000 +7FC00003F003FF800003FFFFFF000003FFFFFE000003FFFFFC000003FFFFF8000003FFFF +FC000003FFFFFE000003F003FF000003F0007F800003F0003F800003F0001F800003F000 +1FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC00003F000 +0FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC1E003F0000FC3F003F000 +0FC3F003F0000FC3F003F0000FE3F07FFF8007E7F07FFF8007FFE0FFFFC007FFE0FFFFC0 +03FFC07FFF8001FFC07FFF8000FF80000000003E002C397EB72F>82 +D<001FF80380007FFF07C001FFFFC7C003FFFFEFC007FFFFFFC00FFFFFFFC01FF80FFFC0 +3FC003FFC03F8000FFC07F00007FC07E00003FC0FE00003FC0FC00001FC0FC00001FC0FC +00000FC0FC00000FC0FC00000FC0FC00000FC0FE000007807E000000007F000000003F80 +0000003FC00000001FF80000000FFF80000007FFF8000003FFFF800001FFFFE000007FFF +F800000FFFFC000000FFFE0000000FFF00000000FF800000003FC00000001FC00000000F +E000000007E000000007E000000007F078000003F0FC000003F0FC000003F0FC000003F0 +FC000003F0FC000003F0FE000007F0FE000007E0FF00000FE0FF80000FE0FFC0001FC0FF +F0007FC0FFFE01FF80FFFFFFFF00FFFFFFFE00FDFFFFFC00F87FFFF800F81FFFE0007003 +FF0000243A7BB82F>I<7FFFFFFFFF80FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFF +FFFFFFC0FFFFFFFFFFC0FC003F000FC0FC003F000FC0FC003F000FC0FC003F000FC0FC00 +3F000FC0FC003F000FC0FC003F000FC078003F00078000003F00000000003F0000000000 +3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000 +3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000 +3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000 +3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000 +3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000 +3F00000000003F00000000003F00000000003F000000001FFFFE0000003FFFFF0000003F +FFFF0000003FFFFF0000003FFFFF0000001FFFFE00002A387EB72F>I<7FFF801FFFE0FF +FFC03FFFF0FFFFC03FFFF0FFFFC03FFFF0FFFFC03FFFF07FFF801FFFE003F00000FC0003 +F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003 +F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003 +F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003 +F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003 +F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003 +F00000FC0003F00000FC0003F00000FC0003F00000FC0003F80001FC0003F80001FC0001 +F80001F80001F80001F80001FC0003F80000FE0007F00000FE0007F000007F000FE00000 +7F801FE000003FE07FC000001FFFFF8000000FFFFF00000007FFFE00000003FFFC000000 +00FFF0000000003FC000002C397FB72F>I<3FFF00FFFC003FFF81FFFE007FFF81FFFE00 +7FFF81FFFE003FFF81FFFE003FFF00FFFC0001FC001F800000FE003F800000FE003F0000 +007F007F0000007F007E0000003F80FE0000003F80FC0000001FC1FC0000000FC1F80000 +000FE3F800000007E3F000000007F7F000000003F7E000000003FFE000000001FFC00000 +0001FFC000000000FF8000000000FF80000000007F00000000007F00000000007F000000 +00007F0000000000FF8000000000FF8000000001FFC000000001FFC000000003FFE00000 +0003F7E000000003F3F000000007E3F000000007E1F80000000FC1F80000000FC1FC0000 +001F80FC0000001F80FE0000003F007E0000003F007F0000007E003F0000007E003F8000 +00FE001F800000FC001FC00001FC000FC00001F8000FE00003F80007F0007FFE001FFF80 +7FFF003FFF80FFFF003FFFC0FFFF003FFFC07FFF003FFF807FFE001FFF802A387EB72F> +88 D<7FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFC0000FC0000FC0000FC0000FC0000 +FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000 +FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000 +FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000 +FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000 +FC0000FC0000FC0000FC0000FC0000FC0000FFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7FFFFE +18476DBE2F>91 D<7FFFFEFFFFFFFFFFFFFFFFFFFFFFFF7FFFFF00003F00003F00003F00 +003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00 +003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00 +003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00 +003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00 +003F00003F00003F00003F00003F00003F00003F00003F7FFFFFFFFFFFFFFFFFFFFFFFFF +FFFF7FFFFE18477DBE2F>93 D<7FFFFFFFE07FFFFFFFE0FFFFFFFFF0FFFFFFFFF0FFFFFF +FFF07FFFFFFFE07FFFFFFFE024077B7D2F>95 D<001C003E00FF01FF03FF07FC0FF80FF0 +1FC01FC03F803F007F007E007E00FE00FC00FC00FC00FC00FFE0FFF0FFF8FFFC7FFC7FFC +3FFC3FFC1FF80FF003E0101F71BE2F>I<007FF000000003FFFE00000007FFFF8000000F +FFFFC000001FFFFFE000003FFFFFF000003FC01FF800003FC003FC00003FC001FC00003F +C000FE00001F80007E00000F00007F00000000003F00000000003F00000000003F000000 +00003F000000007FFF00000007FFFF0000003FFFFF000001FFFFFF000007FFFFFF00000F +FFF83F00001FFE003F00003FF0003F00007FC0003F00007F00003F0000FE00003F0000FC +00003F0000FC00003F0000FC00003F0000FC00003F0000FC00007F0000FE00007F00007F +0000FF00007F8003FF80003FE01FFFFF003FFFFFFFFF801FFFFFFFFF800FFFFFDFFF8007 +FFFF0FFF8001FFFC01FF00007FE0000000292A7BA82F>I<7FF000000000FFF800000000 +FFF800000000FFF800000000FFF8000000007FF80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80FF0000001F83FFC000001F8FFFF000001FBFFFFC000 +01FFFFFFE00001FFFFFFF00001FFF03FF00001FFC00FF80001FF8003FC0001FF0001FC00 +01FE0000FE0001FC0000FE0001FC00007F0001F800003F0001F800003F0001F800003F80 +01F800001F8001F800001F8001F800001F8001F800001F8001F800001F8001F800001F80 +01F800001F8001F800001F8001F800003F8001F800003F8001FC00003F0001FC00007F00 +01FC00007F0001FE0000FE0001FE0000FE0001FF0001FC0001FF8007FC0001FFC00FF800 +01FFF03FF00001FFFFFFE00001FFFFFFC00001FBFFFF800001F9FFFF000000F07FFC0000 +00001FE0000029397EB72F>I<0003FFC000000FFFF800003FFFFC0000FFFFFE0001FFFF +FF0003FFFFFF8007FF007F800FF8007F800FF0007F801FE0007F801FC0003F003F80001E +003F000000007F000000007E000000007E00000000FE00000000FC00000000FC00000000 +FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FE000000007E +000000007E000000007F000000007F000007803F80000FC03FC0000FC01FE0001FC01FF0 +001F800FFC007F8007FF81FF0003FFFFFF0001FFFFFE0000FFFFFC00003FFFF000000FFF +C0000003FE0000222A79A82F>I<000003FF8000000007FFC000000007FFC000000007FF +C000000007FFC000000003FFC0000000000FC0000000000FC0000000000FC0000000000F +C0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000F +C0000003FC0FC000001FFF0FC000007FFFCFC00000FFFFEFC00001FFFFFFC00003FFFFFF +C00007FE07FFC0000FF801FFC0001FF0007FC0001FC0003FC0003F80003FC0003F80001F +C0007F00001FC0007F00000FC0007E00000FC000FE00000FC000FE00000FC000FC00000F +C000FC00000FC000FC00000FC000FC00000FC000FC00000FC000FC00000FC000FC00000F +C000FC00000FC000FE00000FC0007E00001FC0007E00001FC0007F00001FC0003F80003F +C0003F80007FC0001FC0007FC0001FE000FFC0000FF801FFC00007FE07FFFF0007FFFFFF +FF8003FFFFEFFF8001FFFFCFFF80007FFF8FFF80001FFE07FF000007F800000029397DB7 +2F>I<0003FE0000000FFF8000003FFFE00000FFFFF00001FFFFF80003FFFFFC0007FE07 +FE000FF800FF000FF0007F001FC0003F803FC0001F803F80001FC03F00000FC07F00000F +C07E00000FC07E00000FE0FE000007E0FC000007E0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0 +FFFFFFFFE0FFFFFFFFE0FFFFFFFFC0FC00000000FE000000007E000000007E000000007F +000000003F800003C03F800007E01FC00007E01FE0000FE00FF8001FC007FE003FC007FF +80FF8003FFFFFF8001FFFFFF00007FFFFC00003FFFF800000FFFE0000001FF0000232A7B +A82F>I<000001FF00000007FFC000001FFFE000007FFFE00000FFFFF00000FFFFF00001 +FF0FF00003FC0FF00003F807E00007F001800007E000000007E000000007E000000007E0 +00000007E000000007E000000007E000000007E000007FFFFFFF80FFFFFFFFC0FFFFFFFF +C0FFFFFFFFC0FFFFFFFFC07FFFFFFF800007E000000007E000000007E000000007E00000 +0007E000000007E000000007E000000007E000000007E000000007E000000007E0000000 +07E000000007E000000007E000000007E000000007E000000007E000000007E000000007 +E000000007E000000007E000000007E000000007E000000007E000000007E000000007E0 +00000007E000003FFFFFFC007FFFFFFE007FFFFFFE007FFFFFFE007FFFFFFE003FFFFFFC +0024397DB82F>I<0003F801FE00001FFF07FF80007FFFDFFF8000FFFFFFFFC001FFFFFF +FFC003FFFFFFFFC003FE0FFF0F8007F803FC07000FF001FE00000FE000FE00000FC0007E +00001FC0007F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F +00001F80003F00001FC0007F00000FC0007E00000FE000FE00000FF001FE000007F803FC +000003FE0FF8000003FFFFF8000007FFFFF0000007FFFFE000000FFFFFC000000F9FFF00 +00000F83F80000000F80000000000F80000000000F80000000000FC00000000007E40000 +000007FFFFF0000003FFFFFF000007FFFFFFC0000FFFFFFFE0001FFFFFFFF0003FC0001F +F8003F000001FC007E000000FE007C0000007E00FC0000003E00F80000003F00F8000000 +1F00F80000001F00F80000001F00F80000001F00FC0000003F007C0000003E007F000000 +FE003F800001FC003FE00007FC001FFE007FF8000FFFFFFFF00007FFFFFFE00001FFFFFF +800000FFFFFF0000001FFFF800000003FFC000002A3E7DA72F>I<7FF000000000FFF800 +000000FFF800000000FFF800000000FFF8000000007FF80000000001F80000000001F800 +00000001F80000000001F80000000001F80000000001F80000000001F80000000001F800 +00000001F80000000001F80000000001F80FF0000001F83FFC000001F8FFFE000001FBFF +FF000001FFFFFF800001FFFFFF800001FFF03FC00001FFC01FC00001FF800FE00001FF00 +0FE00001FE0007E00001FC0007E00001FC0007E00001FC0007E00001F80007E00001F800 +07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800 +07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800 +07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800 +07E0007FFFE07FFF80FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC07FFFE0 +7FFF802A387EB72F>I<0003800000000FE00000000FE00000001FF00000001FF0000000 +1FF00000000FE00000000FE0000000038000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000003FFFE000007FFFF0 +00007FFFF000007FFFF000007FFFF000003FFFF000000003F000000003F000000003F000 +000003F000000003F000000003F000000003F000000003F000000003F000000003F00000 +0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 +03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 +F000000003F000000003F000007FFFFFFF00FFFFFFFF00FFFFFFFF80FFFFFFFF80FFFFFF +FF007FFFFFFF00213979B82F>I<0000038000000FE000000FE000001FF000001FF00000 +1FF000000FE000000FE00000038000000000000000000000000000000000000000000000 +000000000000000000000000000000FFFFE000FFFFF001FFFFF001FFFFF000FFFFF000FF +FFF0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000 +03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000 +03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000 +03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000 +03F0000003F0000003F0000003F0000003F0000003F0000007F0000007E07E000FE07E00 +0FC0FF001FC0FF003F80FF00FF80FFFFFF007FFFFE007FFFFC003FFFF8000FFFE00001FF +80001C4E7CB82F>I<7FF000000000FFF800000000FFF800000000FFF800000000FFF800 +0000007FF80000000000F80000000000F80000000000F80000000000F80000000000F800 +00000000F80000000000F80000000000F80000000000F80000000000F80000000000F800 +00000000F807FFFF0000F80FFFFF0000F80FFFFF8000F80FFFFF8000F80FFFFF0000F807 +FFFF0000F8003F800000F8007F000000F800FE000000F801FC000000F803F8000000F807 +F0000000F80FE0000000F81FC0000000F83F80000000F87F00000000F8FF00000000F9FF +80000000FBFF80000000FFFFC0000000FFE7E0000000FFC7F0000000FF83F0000000FF01 +F8000000FE00FC000000FC00FE000000F8007E000000F8003F000000F8001F800000F800 +1F800000F8000FC00000F80007E00000F80007F0007FFFF03FFFC0FFFFF87FFFC0FFFFF8 +7FFFE0FFFFF87FFFE0FFFFF87FFFC07FFFF03FFFC02B387EB72F>I<7FFFF000007FFFF8 +0000FFFFF80000FFFFF800007FFFF800007FFFF800000001F800000001F800000001F800 +000001F800000001F800000001F800000001F800000001F800000001F800000001F80000 +0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000 +01F800000001F800000001F800000001F800000001F800000001F800000001F800000001 +F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8 +00000001F800000001F800000001F800000001F800000001F800000001F800000001F800 +000001F800000001F800000001F800000001F800000001F800007FFFFFFFE07FFFFFFFE0 +FFFFFFFFF0FFFFFFFFF07FFFFFFFE07FFFFFFFE024387BB72F>I<0001F801F8007F8FFC +0FFC00FFDFFE1FFE00FFFFFF3FFF00FFFFFFFFFF80FFFFFFFFFF807FFE1FFE1F8007FC0F +FC0FC007F80FF80FC007F007F007C007E007E007C007E007E007C007E007E007C007C007 +C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C007C007C007C007C007C007C007C07FFC3FFC3FFCFFFE3FFE3FFEFFFE7FFE7FFEFFFE7F +FE7FFEFFFE3FFE3FFE7FFC3FFC3FFC2F2880A72F>I<00000FF000007FF03FFC0000FFF8 +FFFE0000FFFBFFFF0000FFFFFFFF8000FFFFFFFF80007FFFF03FC00001FFC01FC00001FF +800FE00001FF000FE00001FE0007E00001FC0007E00001FC0007E00001FC0007E00001F8 +0007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F8 +0007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F8 +0007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F8 +0007E00001F80007E0007FFFE07FFF80FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC0FFFF +F0FFFFC07FFFE07FFF802A287EA72F>I<0003FC0000001FFF8000003FFFC00000FFFFF0 +0001FFFFF80003FFFFFC0007FE07FE000FF801FF000FE0007F001FC0003F801F80001F80 +3F80001FC03F00000FC07F00000FE07E000007E07E000007E0FC000003F0FC000003F0FC +000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FE00 +0007F07E000007E07E000007E07F00000FE07F00000FE03F80001FC03F80001FC01FC000 +3F801FE0007F800FF801FF0007FE07FE0003FFFFFC0001FFFFF80000FFFFF000007FFFE0 +00001FFF80000003FC0000242A7BA82F>I<00000FF000007FF03FFC0000FFF8FFFF0000 +FFFBFFFFC000FFFFFFFFE000FFFFFFFFF0007FFFF03FF00001FFC00FF80001FF8003FC00 +01FF0001FC0001FE0000FE0001FC0000FE0001FC00007F0001F800003F0001F800003F00 +01F800003F8001F800001F8001F800001F8001F800001F8001F800001F8001F800001F80 +01F800001F8001F800001F8001F800001F8001F800003F8001F800003F8001FC00003F00 +01FC00007F0001FC00007F0001FE0000FE0001FE0000FE0001FF0001FC0001FF8007FC00 +01FFC00FF80001FFF03FF00001FFFFFFE00001FFFFFFC00001FBFFFF800001F9FFFF0000 +01F87FFC000001F81FE0000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F8000000007FFFE0000000FFFFF0000000FFFFF0000000 +FFFFF0000000FFFFF00000007FFFE0000000293C7EA72F>I<0003FE01E000000FFF83F0 +00003FFFE3F00000FFFFF3F00001FFFFFBF00003FFFFFFF00007FF03FFF0000FFC00FFF0 +000FF0003FF0001FE0001FF0003FC0001FF0003F80000FF0007F000007F0007F000007F0 +007E000007F0007E000003F000FE000003F000FC000003F000FC000003F000FC000003F0 +00FC000003F000FC000003F000FC000003F000FC000003F000FE000003F000FE000007F0 +007E000007F0007F000007F0007F00000FF0003F80000FF0003F80001FF0001FC0003FF0 +001FF0007FF0000FF800FFF00007FE03FFF00003FFFFFFF00001FFFFFBF00000FFFFF3F0 +00007FFFC3F000001FFF03F0000003FC03F00000000003F00000000003F00000000003F0 +0000000003F00000000003F00000000003F00000000003F00000000003F00000000003F0 +0000000003F00000000003F00000000003F00000000003F000000001FFFFE0000001FFFF +E0000003FFFFF0000003FFFFF0000001FFFFE0000001FFFFE02C3C7DA72F>I<0000000F +F0007FFF007FFE007FFF81FFFF00FFFF87FFFF00FFFF8FFFFF807FFF9FFFFF807FFFBFF8 +7F80001FFFC07F80001FFF003F00001FFE001E00001FFC000000001FF8000000001FF000 +0000001FF0000000001FE0000000001FC0000000001FC0000000001FC0000000001FC000 +0000001F80000000001F80000000001F80000000001F80000000001F80000000001F8000 +0000001F80000000001F80000000001F80000000001F80000000001F80000000001F8000 +0000001F80000000001F80000000001F800000007FFFFFF800007FFFFFFC0000FFFFFFFC +0000FFFFFFFC00007FFFFFFC00007FFFFFF8000029287EA72F>I<001FFC0E0001FFFF9F +0007FFFFFF000FFFFFFF001FFFFFFF003FFFFFFF007FF007FF007F8000FF00FE00007F00 +FE00007F00FC00003F00FC00003F00FC00003F00FE00003F007F00001E007FC00000003F +FC0000001FFFF000000FFFFF800003FFFFE00000FFFFF800001FFFFE0000007FFF000000 +01FF800000007F807800001FC0FC00000FC0FC000007E0FC000007E0FE000007E0FE0000 +07E0FF000007E0FF80000FE0FFC0001FC0FFE0003FC0FFFC01FF80FFFFFFFF80FFFFFFFF +00FFFFFFFE00F8FFFFF800F83FFFE0007007FF0000232A7AA82F>I<000F000000001F80 +0000001F800000001F800000001F800000001F800000001F800000001F800000001F8000 +00001F800000001F8000007FFFFFFFC0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0 +7FFFFFFFC0001F800000001F800000001F800000001F800000001F800000001F80000000 +1F800000001F800000001F800000001F800000001F800000001F800000001F800000001F +800000001F800000001F800000001F800000001F800000001F8000F0001F8001F8001F80 +01F8001F8001F8001F8001F8001F8001F8001FC003F8001FC007F0000FE00FF0000FF81F +E00007FFFFC00007FFFFC00003FFFF800001FFFE0000007FF80000001FE00025337EB12F +>I<7FF001FFC000FFF803FFE000FFF803FFE000FFF803FFE000FFF803FFE0007FF801FF +E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007 +E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007 +E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007 +E00001F80007E00001F80007E00001F80007E00001F80007E00001F8000FE00001F8000F +E00001F8001FE00001F8003FE00001FC007FE00000FF01FFFF8000FFFFFFFFC0007FFFFF +FFC0007FFFFFFFC0003FFFE7FFC0000FFF83FF800003FE0000002A287EA62F>I<7FFF00 +3FFF80FFFF807FFFC0FFFF807FFFC0FFFF807FFFC0FFFF807FFFC07FFF003FFF8001F000 +03E00001F00003E00001F80007E00000F80007C00000F80007C00000FC000FC000007C00 +0F8000007C000F8000007C000F8000003E001F0000003E001F0000003E001F0000001F00 +3E0000001F003E0000001F003E0000000F807C0000000F807C0000000F807C00000007C0 +F800000007C0F800000007C0F800000003E1F000000003E1F000000003E1F000000001F3 +E000000001F3E000000001F3E000000000FFC000000000FFC000000000FFC0000000007F +80000000007F80000000003F0000002A277EA62F>I<7FFF801FFFE07FFFC03FFFE0FFFF +C03FFFF0FFFFC03FFFF07FFFC03FFFE07FFF801FFFE007C000003E0007C000003E0007C0 +00003E0007E000007E0003E000007C0003E000007C0003E000007C0003E000007C0003E0 +00007C0001F00000F80001F00F80F80001F01FC0F80001F03FE0F80001F03FE0F80001F0 +3FE0F80000F87FF0F00000F87DF1F00000F87DF1F00000F8FDF1F00000F8FDF9F00000F8 +F9F9F0000078F8F9E0000079F8F9E000007DF8F9E000007DF8F9E000007DF079E000007D +F07BE000003FF07FC000003FE07FC000003FE03FC000003FE03FC000003FC01FC000001F +800F80002C277FA62F>I<3FFF80FFFE007FFFC1FFFF007FFFC1FFFF007FFFC1FFFF007F +FFC1FFFF003FFF80FFFE00007E001F0000003F003F0000003F007E0000001F80FC000000 +0FC0FC00000007C1F800000007E3F000000003F3E000000001FFE000000000FFC0000000 +00FF80000000007F00000000003F00000000003F00000000007F0000000000FF80000000 +00FFC000000001F3E000000003E3F000000007E1F000000007C0F80000000F80FC000000 +1F807E0000003F003E0000003E001F0000007E001F800000FC000FC0007FFF807FFF807F +FFC0FFFF80FFFFC0FFFFC0FFFFC0FFFFC07FFFC0FFFF807FFF807FFF802A277EA62F>I< +7FFF803FFF80FFFF807FFFC0FFFFC07FFFC0FFFFC07FFFC0FFFF807FFFC07FFF803FFF80 +01F00003E00001F80003E00000F80003E00000F80007C00000FC0007C000007C0007C000 +007E000F8000003E000F8000003E000F8000003F001F0000001F001F0000001F001F0000 +000F803E0000000F803E0000000FC03E00000007C07C00000007C07C00000007E07C0000 +0003E0F800000003E0F800000001F0F800000001F0F000000001F1F000000000F9F00000 +0000F9E000000000F9E0000000007BE0000000007FC0000000003FC0000000003FC00000 +00003F80000000001F80000000001F80000000001F00000000001F00000000001F000000 +00003E00000000003E00000000003E00000000007C00000000007C0000000000FC000000 +0F00F80000001F81F80000003FC1F80000003FC3F00000003F07E00000003F1FE0000000 +3FFFC00000001FFF800000001FFF800000000FFE0000000007FC0000000003F000000000 +2A3C7EA62F>I<3FFFFFFFF87FFFFFFFFC7FFFFFFFFC7FFFFFFFFC7FFFFFFFFC7FFFFFFF +F87E00000FF07E00001FE07E00003FC07E00007F807E0000FF003C0001FE00000003FC00 +000007F80000000FF00000001FE00000003FC00000007F80000000FF00000001FE000000 +03FC00000007F80000000FF00000001FE00000003FC00000007F80000000FF00003C01FE +00007E03FC00007E07F800007E0FF000007E1FE000007E3FC000007E7FFFFFFFFEFFFFFF +FFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE7FFFFFFFFC27277DA62F>I<7C7CFEFEFEFEFE +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE7C7C07476CBE2F>124 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fh ecbx1095 10.95 32 +/Fh 32 122 df<07801FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE007800E +0E798D1D>46 D<0000000006000000000E000000001E000000001C000000001C00000000 +3C000000003800000000780000000070000000007000000000F000000000E000000001E0 +00000001C000000003C000000003800000000380000000078000000007000000000F0000 +00000E000000000E000000001E000000001C000000003C00000000380000000038000000 +0078000000007000000000F000000000E000000000E000000001E000000001C000000003 +C000000003800000000780000000070000000007000000000F000000000E000000001E00 +0000001C000000001C000000003C00000000380000000078000000007000000000700000 +0000F000000000E000000001E000000001C000000001C000000003C00000000380000000 +078000000007000000000F000000000E000000000E000000001E000000001C000000003C +000000003800000000380000000078000000007000000000F000000000E000000000E000 +000001E000000001C000000003C000000003800000000380000000078000000007000000 +000F000000000E000000001E000000001C000000001C000000003C000000003800000000 +780000000070000000007000000000F000000000E000000000E000000000275B7AC334> +I<00000F000000001F000000007F00000001FF0000000FFF000001FFFF0000FFFFFF0000 +FFFFFF0000FFF7FF0000FE07FF00000007FF00000007FF00000007FF00000007FF000000 +07FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007 +FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF +00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00 +000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF0000 +0007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF000000 +07FF00000007FF00000007FF00000007FF00000007FF00000007FF00003FFFFFFFF83FFF +FFFFF83FFFFFFFF83FFFFFFFF8253C79BB34>49 D<0003FF800000003FFFF8000000FFFF +FE000003FFFFFF800007F80FFFC0000FC001FFF0001F8000FFF8003F00007FFC007FC000 +3FFE007FE0003FFE00FFF0001FFF00FFF8001FFF00FFF8001FFF00FFF8000FFF80FFF800 +0FFF80FFF8000FFF80FFF8000FFF807FF0000FFF807FF0000FFF801FC0000FFF80070000 +0FFF800000000FFF000000001FFF000000001FFF000000001FFE000000003FFE00000000 +3FFC000000007FF8000000007FF000000000FFE000000001FFC000000001FF8000000003 +FF0000000007FE000000000FF8000000001FF0000000001FE0000000003F80000000007F +0000000000FE0000000001F80007800003F00007800007E0000780000FC0000F00001F80 +000F00003E00000F00007C00000F0000F800001F0001F000001F0001FFFFFFFF0003FFFF +FFFE0007FFFFFFFE000FFFFFFFFE001FFFFFFFFE003FFFFFFFFE007FFFFFFFFE00FFFFFF +FFFE00FFFFFFFFFC00FFFFFFFFFC00FFFFFFFFFC00293C7BBB34>I<0000FFE00000000F +FFFC0000003FFFFF800000FF01FFE00001F8007FF00003E0003FF80007C0003FFC000FF0 +001FFE000FFC001FFE001FFE001FFF001FFE001FFF001FFE001FFF001FFE001FFF001FFF +001FFF001FFE001FFF001FFE001FFF000FFE001FFF0007FC001FFE0003F0003FFE000000 +003FFC000000003FFC000000007FF8000000007FF000000000FFE000000001FFC0000000 +03FF000000000FFC00000007FFF000000007FFE000000007FFFE0000000001FF80000000 +007FE0000000003FF8000000001FFC000000001FFE000000000FFF000000000FFF800000 +0007FFC000000007FFC000000007FFC007800007FFE01FE00007FFE07FF80007FFE07FF8 +0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFC0FFFC +0007FFC0FFF8000FFFC07FF8000FFF807FF0000FFF003FC0001FFF001FC0003FFE000FF0 +007FFC0007FE01FFF00003FFFFFFE00000FFFFFF8000001FFFFC00000001FFC000002B3D +7CBB34>I<00000001F00000000001F00000000003F00000000007F0000000000FF00000 +00001FF0000000001FF0000000003FF0000000007FF000000000FFF000000000FFF00000 +0001FFF000000003FFF000000007FFF00000000FBFF00000000F3FF00000001E3FF00000 +003C3FF00000007C3FF0000000783FF0000000F03FF0000001E03FF0000003E03FF00000 +03C03FF0000007803FF000000F003FF000001F003FF000003E003FF000003C003FF00000 +78003FF00000F0003FF00001F0003FF00001E0003FF00003C0003FF0000780003FF0000F +80003FF0001F00003FF0001E00003FF0003C00003FF0007800003FF000F800003FF000FF +FFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF80000007FF0000000007FF00000 +00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000 +00007FF0000000007FF0000000007FF0000001FFFFFFF80001FFFFFFF80001FFFFFFF800 +01FFFFFFF82D3C7DBB34>I<000003FE000000003FFFC0000000FFFFF0000003FE01F800 +000FF8007C00003FE0003E00007FC001FE0000FF8003FF0001FF8007FF0003FF0007FF00 +03FE0007FF0007FE0007FF000FFE0007FF000FFC0007FF001FFC0003FE001FFC0001FC00 +3FFC000000003FFC000000003FF8000000007FF8000000007FF8000000007FF800000000 +7FF83FFC0000FFF87FFF8000FFF9FFFFC000FFFBC03FF000FFFB800FF800FFFF000FFC00 +FFFF0007FE00FFFE0007FF00FFFE0003FF80FFFC0003FF80FFFC0003FFC0FFFC0003FFC0 +FFFC0003FFC0FFF80003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE0 +7FF80003FFE07FF80003FFE07FF80003FFE07FF80003FFE07FF80003FFE03FF80003FFE0 +3FF80003FFE03FF80003FFC01FF80003FFC01FFC0003FFC00FFC0003FF800FFC0007FF80 +07FE0007FF0003FE0007FE0003FF000FFC0001FF801FF80000FFE07FF000003FFFFFE000 +000FFFFF80000003FFFE000000007FE000002B3D7CBB34>54 D<0000FFE000000007FFFE +0000001FFFFF8000007F803FE00000FC000FF00001F00007F80003E00003FC0007E00001 +FE0007C00000FE000FC00000FF000FC000007F000FC000007F001FE000007F001FE00000 +7F001FF000007F001FF800007F001FFC00007F001FFF0000FE001FFFC000FE001FFFE001 +FE000FFFF803FC000FFFFE03F8000FFFFF87F00007FFFFDFE00007FFFFFF800003FFFFFE +000001FFFFFF000000FFFFFF8000007FFFFFE000001FFFFFF000001FFFFFFC00007FFFFF +FE0001FEFFFFFE0003F83FFFFF0007F00FFFFF800FE007FFFF801FC001FFFFC03FC0007F +FFC07F80001FFFE07F00000FFFE07F000003FFE0FF000000FFE0FE0000007FE0FE000000 +3FE0FE0000001FE0FE0000001FE0FE0000000FE0FE0000000FE0FE0000000FC0FF000000 +0FC07F0000000FC07F8000001F803FC000001F003FC000003F001FF000007E000FF80001 +FC0007FF801FF80001FFFFFFE000007FFFFF8000001FFFFE00000001FFE000002B3D7CBB +34>56 D<07801FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE0078000000000 +000000000000000000000000000000000000000007801FE03FF07FF8FFFCFFFCFFFCFFFC +FFFCFFFC7FF83FF01FE007800E2879A71D>58 D66 D68 D76 DI82 D<7FFFFFFF007FFFFFE07FFFFFFF007FFFFFE07FFFFFFF007FFFFFE07FFFFFFF +007FFFFFE0003FFF800001FFC000001FFFC000007E0000001FFFC00000FE0000000FFFE0 +0000FC00000007FFF00001F800000003FFF00003F000000003FFF80007F000000001FFFC +0007E000000000FFFE000FC000000000FFFE001F80000000007FFF001F80000000003FFF +803F00000000001FFF807E00000000001FFFC0FE00000000000FFFE0FC000000000007FF +E1F8000000000007FFF3F0000000000003FFFFF0000000000001FFFFE0000000000001FF +FFC0000000000000FFFF800000000000007FFF800000000000003FFF000000000000003F +FF800000000000001FFFC00000000000000FFFE00000000000000FFFE000000000000007 +FFF000000000000007FFF80000000000000FFFF80000000000000FFFFC0000000000001F +FFFE0000000000003F7FFE0000000000007F7FFF0000000000007E3FFF800000000000FC +1FFFC00000000001F80FFFC00000000003F80FFFE00000000003F007FFF00000000007E0 +03FFF0000000000FC003FFF8000000000FC001FFFC000000001F8000FFFE000000003F00 +00FFFE000000007F00007FFF000000007E00003FFF80000000FC00001FFF80000001F800 +001FFFC0000003F800000FFFE0000003F0000007FFF0000007E0000007FFF000000FC000 +0003FFF800001FC0000001FFFC00007FE0000000FFFC00FFFFFF80007FFFFFFEFFFFFF80 +007FFFFFFEFFFFFF80007FFFFFFEFFFFFF80007FFFFFFE473E7DBD4E>88 +D<0007FF800000003FFFF0000001FFFFFC000003FC03FF000007E000FFC0000FF8007FE0 +001FF8003FF0001FFC003FF0001FFC001FF8001FFC001FF8001FFC000FFC001FFC000FFC +000FF8000FFC0007F0000FFC0001C0000FFC000000000FFC000000000FFC000000000FFC +00000003FFFC000001FFFFFC00000FFFFFFC00007FFF8FFC0001FFF00FFC0007FF800FFC +000FFF000FFC001FFC000FFC003FF8000FFC007FF8000FFC007FF0000FFC00FFF0000FFC +00FFE0000FFC00FFE0000FFC00FFE0000FFC00FFE0001FFC00FFE0001FFC00FFF0003FFC +007FF0003FFC007FF8007FFF003FFC01F7FFFC1FFE07E3FFFC07FFFF81FFFC01FFFE007F +FC001FF80000002E2B7DA932>97 D<00007FF0000003FFFF00001FFFFFC0007FE01FE000 +FF8003F001FF000FF803FE000FFC07FE001FFC0FFC001FFC1FFC001FFC1FF8001FFC3FF8 +001FFC3FF8000FF87FF80007F07FF00001C07FF0000000FFF0000000FFF0000000FFF000 +0000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF00000 +00FFF00000007FF00000007FF00000007FF80000007FF80000003FF800001E3FFC00001E +1FFC00003E0FFC00003C0FFE00007C07FF0000F803FF8001F000FFC003E0007FF00FC000 +1FFFFF000007FFFC0000007FE000272B7DA92E>99 D<0000000007F80000000007FFF800 +00000007FFF80000000007FFF80000000007FFF800000000003FF800000000001FF80000 +0000001FF800000000001FF800000000001FF800000000001FF800000000001FF8000000 +00001FF800000000001FF800000000001FF800000000001FF800000000001FF800000000 +001FF800000000001FF800000000001FF800000000001FF800000000001FF80000007FE0 +1FF8000003FFFC1FF800001FFFFF1FF800007FF00FDFF80000FFC003FFF80003FF0000FF +F80007FE00007FF8000FFE00003FF8000FFC00001FF8001FFC00001FF8003FF800001FF8 +003FF800001FF8007FF800001FF8007FF000001FF8007FF000001FF8007FF000001FF800 +FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FF +F000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF8007FF0 +00001FF8007FF000001FF8007FF000001FF8007FF800001FF8003FF800001FF8003FF800 +001FF8001FF800001FF8001FFC00003FF8000FFC00007FF80007FE0000FFF80003FF0001 +FFFC0001FF8007FFFFE0007FE01F9FFFE0001FFFFE1FFFE00007FFF81FFFE000007FC01F +E00033407DBE3A>I<0000FFE0000007FFFC00003FFFFF00007FE0FF8001FF803FC003FF +001FE007FE000FF00FFC000FF80FFC0007FC1FF80007FC3FF80003FE3FF80003FE3FF800 +03FE7FF00003FE7FF00003FF7FF00003FFFFF00001FFFFF00001FFFFF00001FFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFF0000000FFF0000000FFF0000000FFF0000000 +7FF00000007FF00000007FF00000003FF80000003FF800000F1FF800000F1FFC00001F0F +FC00001E07FE00003E03FE00007C01FF0000F800FFC003F0007FF01FE0001FFFFFC00007 +FFFE0000007FF000282B7DA92F>I<0003FF8003F0003FFFF81FFC00FFFFFE7FFE03FF01 +FFFCFE07FC007FE1FE0FFC007FE0FE1FF8003FF0FE3FF8003FF87C3FF0001FF8003FF000 +1FF8007FF0001FFC007FF0001FFC007FF0001FFC007FF0001FFC007FF0001FFC007FF000 +1FFC007FF0001FFC003FF0001FF8003FF0001FF8003FF8003FF8001FF8003FF0000FFC00 +7FE00007FC007FC00007FF01FF800007FFFFFE00000F3FFFF800000F03FF8000001E0000 +0000001E00000000001F00000000001F00000000001F00000000001F80000000001FC000 +0000001FFFFFFF00000FFFFFFFF0000FFFFFFFFC0007FFFFFFFF0007FFFFFFFF8003FFFF +FFFFC003FFFFFFFFE00FFFFFFFFFE01FC00001FFF03F8000001FF07F0000000FF87F0000 +0007F8FE00000007F8FE00000003F8FE00000003F8FE00000003F8FE00000003F8FF0000 +0007F87F00000007F07F8000000FF03FC000001FE01FE000003FC00FF80000FF8003FF80 +0FFE0000FFFFFFF800001FFFFFC0000001FFFC00002F3D7DA834>103 +D<00FF0000000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF0000000000 +07FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003 +FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF +000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF00 +0000000003FF000000000003FF003FF0000003FF00FFFE000003FF03FFFF800003FF0FC0 +FFC00003FF1E007FE00003FF3C003FF00003FF78003FF00003FFF0003FF00003FFE0001F +F80003FFC0001FF80003FFC0001FF80003FF80001FF80003FF80001FF80003FF80001FF8 +0003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF800 +03FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003 +FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF +00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00 +001FF80003FF00001FF80003FF00001FF800FFFFFC07FFFFE0FFFFFC07FFFFE0FFFFFC07 +FFFFE0FFFFFC07FFFFE0333F7CBE3A>I<01F80003FC0007FE000FFF001FFF801FFF801F +FF801FFF801FFF801FFF800FFF0007FE0003FC0001F80000000000000000000000000000 +000000000000000000000000000000FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003 +FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 +FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 +FF0003FF0003FF0003FF0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF815407CBF1D>I< +00FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00FFFFFC +FFFFFCFFFFFCFFFFFC163F7CBE1D>108 D<01FE003FF00001FF8000FFFE00FFFE0007FF +F000FFFE03FFFF801FFFFC00FFFE0FC0FFC07E07FE00FFFE1E007FE0F003FF0007FE3C00 +3FF1E001FF8003FE78003FF3C001FF8003FEF0003FF78001FF8003FFE0001FFF0000FFC0 +03FFC0001FFE0000FFC003FFC0001FFE0000FFC003FF80001FFC0000FFC003FF80001FFC +0000FFC003FF80001FFC0000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF +00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000 +FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF0000 +1FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC0 +03FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF8 +0000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF +00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC0FFFFFC07FFFFE03F +FFFFFFFFFC07FFFFE03FFFFFFFFFFC07FFFFE03FFFFFFFFFFC07FFFFE03FFFFF50297CA8 +57>I<00007FF000000003FFFE0000001FFFFFC000007FE03FF00000FF800FF80001FF00 +07FC0003FE0003FE0007FC0001FF000FF80000FF801FF80000FFC01FF80000FFC03FF800 +00FFE03FF000007FE07FF000007FF07FF000007FF07FF000007FF07FF000007FF0FFF000 +007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000 +007FF8FFF000007FF8FFF000007FF8FFF000007FF87FF000007FF07FF000007FF07FF000 +007FF07FF000007FF03FF80000FFE03FF80000FFE01FF80000FFC00FF80000FF800FFC00 +01FF8007FE0003FF0003FF0007FE0001FF800FFC00007FE03FF000001FFFFFC0000007FF +FF000000007FF000002D2B7DA934>111 D<00FF007FE00000FFFF07FFFC0000FFFF1FFF +FF0000FFFF7F01FFC000FFFFF8007FF00007FFF0003FF80003FFE0001FFC0003FF80000F +FE0003FF80000FFF0003FF000007FF0003FF000007FF8003FF000003FF8003FF000003FF +C003FF000003FFC003FF000003FFC003FF000001FFC003FF000001FFE003FF000001FFE0 +03FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003 +FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFC003FF000003FFC003FF +000003FFC003FF000003FFC003FF000007FF8003FF000007FF8003FF000007FF0003FF80 +000FFE0003FFC0001FFE0003FFE0001FFC0003FFF0003FF80003FFF800FFE00003FF7F03 +FFC00003FF1FFFFF000003FF07FFF8000003FF00FFC0000003FF000000000003FF000000 +000003FF000000000003FF000000000003FF000000000003FF000000000003FF00000000 +0003FF000000000003FF000000000003FF000000000003FF000000000003FF0000000000 +03FF0000000000FFFFFC00000000FFFFFC00000000FFFFFC00000000FFFFFC0000000033 +3B7DA83A>I<01FE01FC00FFFE07FF80FFFE0FFFE0FFFE3F1FF0FFFE3C1FF007FE783FF8 +03FEF03FF803FEE03FF803FFE03FF803FFC03FF803FFC01FF003FF800FE003FF80038003 +FF80000003FF80000003FF00000003FF00000003FF00000003FF00000003FF00000003FF +00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00 +000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 +0003FF00000003FF000000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF000025297DA82B +>114 D<001FF80E0001FFFF3E0007FFFFFE000FE007FE001F8001FE003F0000FE007E00 +007E007C00003E00FC00003E00FC00001E00FC00001E00FE00001E00FF00001E00FF8000 +0000FFE0000000FFFF0000007FFFFC00007FFFFF80003FFFFFE0001FFFFFF8000FFFFFFC +0003FFFFFE0000FFFFFF00003FFFFF000003FFFF8000000FFF80000001FFC0F000007FC0 +F000003FC0F800001FC0F800001FC0F800000FC0FC00000FC0FC00000FC0FE00000F80FE +00001F80FF00001F00FF80003F00FFE0007E00FFF803FC00FCFFFFF000F03FFFC000E007 +FE0000222B7DA929>I<0007800000078000000780000007800000078000000F8000000F +8000000F8000000F8000001F8000001F8000001F8000003F8000007F8000007F800000FF +800001FF800007FF80001FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC01FF800001FF800001FF +800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF +800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF +801E01FF801E01FF801E01FF801E01FF801E01FF801E01FF801E01FF801E01FF801E00FF +803C00FFC03C00FFC03C007FE078003FF0F0001FFFE00007FFC00000FF001F3B7EB928> +I<00FF000007F800FFFF0007FFF800FFFF0007FFF800FFFF0007FFF800FFFF0007FFF800 +07FF00003FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003 +FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF +00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00 +001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF0000 +1FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00003F +F80003FF00003FF80003FF00003FF80003FF00007FF80001FF0000FFF80001FF0000FFF8 +0001FF8001FFFC0000FF8007DFFFE0007FE01F9FFFE0001FFFFE1FFFE00007FFF81FFFE0 +0000FFE01FE000332A7CA83A>II +121 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fi ecbx1440 14.4 33 +/Fi 33 122 df<07E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1F +F807E01010768F25>46 D<000000000000C0000000000001E0000000000003E000000000 +0003E0000000000003C0000000000007C0000000000007C000000000000F800000000000 +0F8000000000000F0000000000001F0000000000001F0000000000003E0000000000003E +0000000000003C0000000000007C0000000000007C000000000000F8000000000000F800 +0000000000F0000000000001F0000000000001F0000000000003E0000000000003E00000 +00000007C0000000000007C00000000000078000000000000F8000000000000F80000000 +00001F0000000000001F0000000000001E0000000000003E0000000000003E0000000000 +007C0000000000007C00000000000078000000000000F8000000000000F8000000000001 +F0000000000001F0000000000001E0000000000003E0000000000003E0000000000007C0 +000000000007C00000000000078000000000000F8000000000000F8000000000001F0000 +000000001F0000000000001E0000000000003E0000000000003E0000000000007C000000 +0000007C00000000000078000000000000F8000000000000F8000000000001F000000000 +0001F0000000000003E0000000000003E0000000000003C0000000000007C00000000000 +07C000000000000F8000000000000F8000000000000F0000000000001F0000000000001F +0000000000003E0000000000003E0000000000003C0000000000007C0000000000007C00 +0000000000F8000000000000F8000000000000F0000000000001F0000000000001F00000 +00000003E0000000000003E0000000000003C0000000000007C0000000000007C0000000 +00000F8000000000000F8000000000000F0000000000001F0000000000001F0000000000 +003E0000000000003E0000000000003C0000000000007C0000000000007C000000000000 +F8000000000000F8000000000001F0000000000001F0000000000001E0000000000003E0 +000000000003E0000000000007C0000000000007C00000000000078000000000000F8000 +000000000F8000000000001F0000000000001F0000000000001E0000000000003E000000 +0000003E0000000000007C0000000000007C00000000000078000000000000F800000000 +0000F8000000000000F000000000000060000000000000337879D942>I<0000001E0000 +0000003E0000000000FE0000000003FE000000000FFE000000007FFE00000007FFFE0000 +03FFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFF87FFE0000FC007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 +7FFFFFFFFFFC7FFFFFFFFFFC7FFFFFFFFFFC7FFFFFFFFFFC7FFFFFFFFFFC2E4E76CD42> +49 D<00001FFE0000000001FFFFF00000000FFFFFFC0000003FFFFFFF8000007FFFFFFF +E00001FF803FFFF00003FC0007FFFC0007F00001FFFE000FE00000FFFF001F8000007FFF +803F0000003FFF803F0000001FFFC07FE000001FFFE07FF800000FFFE07FFC00000FFFF0 +FFFC000007FFF0FFFE000007FFF0FFFE000003FFF8FFFE000003FFF8FFFE000003FFF8FF +FE000003FFF8FFFE000003FFF87FFC000003FFF87FFC000003FFF83FF8000003FFF81FF0 +000003FFF80380000003FFF80000000003FFF00000000007FFF00000000007FFF0000000 +0007FFE0000000000FFFE0000000000FFFC0000000001FFFC0000000001FFF8000000000 +3FFF00000000003FFE00000000007FFC0000000000FFF80000000000FFF00000000001FF +E00000000003FFC00000000007FF800000000007FF00000000000FFC00000000001FF800 +000000003FF000000000007FC00000000000FF800000000001FF000000000003FC000000 +000007F800000000000FF00000F800001FE00000F800003FC00000F800007F000000F800 +00FE000001F00001FC000001F00003F8000001F00007F0000001F00007E0000001F0000F +80000003F0001F00000003F0003E00000007F0007FFFFFFFFFF000FFFFFFFFFFE001FFFF +FFFFFFE003FFFFFFFFFFE007FFFFFFFFFFE00FFFFFFFFFFFE01FFFFFFFFFFFE03FFFFFFF +FFFFE07FFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFF +FFC0FFFFFFFFFFFFC0354E7ACD42>I<000007FFC0000000007FFFFC00000003FFFFFF80 +00000FFFFFFFE000001FF803FFF800007FC000FFFC0000FE00003FFE0001FC00003FFF00 +03F800001FFF8003FE00001FFF8007FF80000FFFC007FFC0000FFFC00FFFC0000FFFE00F +FFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE00FFF +E0000FFFE007FFC0000FFFE007FFC0000FFFC003FF80000FFFC001FF00001FFFC0003800 +001FFF80000000001FFF80000000003FFF00000000003FFF00000000007FFE0000000000 +7FFC0000000000FFF80000000001FFF00000000003FFC0000000000FFF80000000007FFE +000000007FFFF8000000007FFFC0000000007FFFFC000000007FFFFF800000000003FFE0 +00000000007FF800000000003FFE00000000001FFF00000000000FFF80000000000FFFC0 +0000000007FFE00000000007FFF00000000003FFF80000000003FFF80000000003FFFC00 +00000001FFFC0000000001FFFC0000000001FFFE0000000001FFFE0000000001FFFE03C0 +000001FFFE0FF0000001FFFE3FFC000001FFFE7FFE000001FFFE7FFE000001FFFEFFFF00 +0001FFFEFFFF000001FFFEFFFF000001FFFCFFFF000001FFFCFFFF000003FFFCFFFF0000 +03FFF8FFFF000003FFF87FFE000003FFF07FFC000007FFF07FF8000007FFE03FE000000F +FFC01FC000001FFFC00FF000003FFF8007FE00007FFE0003FFE003FFFC0001FFFFFFFFF8 +00007FFFFFFFE000000FFFFFFF00000001FFFFFC000000001FFF800000374F7BCD42>I< +0000000000FC00000000000001FC00000000000001FC00000000000003FC000000000000 +07FC0000000000000FFC0000000000000FFC0000000000001FFC0000000000003FFC0000 +000000007FFC0000000000007FFC000000000000FFFC000000000001FFFC000000000003 +FFFC000000000003FFFC000000000007FFFC00000000000FFFFC00000000001FFFFC0000 +0000001F7FFC00000000003E7FFC00000000007E7FFC0000000000FC7FFC0000000000F8 +7FFC0000000001F07FFC0000000003F07FFC0000000007E07FFC0000000007C07FFC0000 +00000F807FFC000000001F807FFC000000003F007FFC000000003E007FFC000000007C00 +7FFC00000000FC007FFC00000001F8007FFC00000001F0007FFC00000003E0007FFC0000 +0007E0007FFC0000000FC0007FFC0000000F80007FFC0000001F00007FFC0000003F0000 +7FFC0000007E00007FFC0000007C00007FFC000000F800007FFC000001F800007FFC0000 +03F000007FFC000003E000007FFC000007C000007FFC00000FC000007FFC00001F800000 +7FFC00001F0000007FFC00003E0000007FFC00007E0000007FFC0000FC0000007FFC0000 +FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFF +FFFFFF8000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC0000 +00000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000 +FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC0000 +00000000FFFC000000000000FFFC000000001FFFFFFFFF8000001FFFFFFFFF8000001FFF +FFFFFF8000001FFFFFFFFF8000001FFFFFFFFF80394F7CCE42>I<00000007FE00000000 +00FFFFC000000003FFFFF00000001FFFFFFC0000007FFC01FE000000FFE0007F000003FF +80003F800007FF00001F80000FFE00007FC0001FFC0000FFC0003FF80003FFE0007FF000 +03FFE000FFE00007FFE001FFE00007FFE003FFC00007FFE003FFC00007FFE007FF800007 +FFE007FF800007FFE00FFF800003FFC00FFF000003FFC01FFF000000FF001FFF0000007E +001FFF00000000003FFF00000000003FFF00000000003FFE00000000007FFE0000000000 +7FFE00000000007FFE003FF000007FFE01FFFF00007FFE07FFFFC000FFFE0FFFFFF000FF +FE1F807FF800FFFE3E001FFE00FFFE78000FFF00FFFEF00007FF80FFFEF00003FFC0FFFF +E00003FFC0FFFFC00001FFE0FFFFC00001FFF0FFFF800001FFF0FFFF800000FFF8FFFF80 +0000FFF8FFFF000000FFFCFFFF000000FFFCFFFF000000FFFCFFFF000000FFFCFFFE0000 +00FFFEFFFE000000FFFEFFFE000000FFFE7FFE000000FFFE7FFE000000FFFE7FFE000000 +FFFE7FFE000000FFFE7FFE000000FFFE7FFE000000FFFE3FFE000000FFFE3FFE000000FF +FE3FFE000000FFFE3FFF000000FFFE1FFF000000FFFC1FFF000000FFFC1FFF000000FFFC +0FFF000000FFF80FFF000001FFF807FF000001FFF807FF800001FFF003FF800001FFE001 +FFC00003FFE001FFE00003FFC000FFE00007FF80007FF0000FFF00003FFC001FFE00001F +FF00FFFC000007FFFFFFF0000003FFFFFFE0000000FFFFFF800000001FFFFC0000000003 +FFC00000374F7BCD42>54 D<07E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE +7FFE3FFC1FF807E000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000007E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF +7FFE7FFE3FFC1FF807E0103576B425>58 D66 D<0000000003FFF0000007000000007FFFFF00 +000F00000007FFFFFFE0001F0000003FFFFFFFF8003F000000FFFFFFFFFE007F000003FF +FFC003FF00FF00000FFFF800003FC1FF00003FFFC000000FE3FF0000FFFF00000003FFFF +0001FFFC00000001FFFF0003FFF800000000FFFF0007FFE0000000007FFF001FFFC00000 +00003FFF003FFF80000000001FFF003FFF00000000000FFF007FFE000000000007FF00FF +FC000000000003FF01FFFC000000000003FF01FFF8000000000001FF03FFF00000000000 +01FF07FFF0000000000000FF07FFF0000000000000FF0FFFE00000000000007F0FFFE000 +00000000007F1FFFC00000000000007F1FFFC00000000000003F1FFFC00000000000003F +3FFF800000000000003F3FFF800000000000001F3FFF800000000000001F7FFF80000000 +0000001F7FFF800000000000001F7FFF80000000000000007FFF00000000000000007FFF +0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF000000000000 +0000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000 +000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000 +FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF00000000 +000000007FFF00000000000000007FFF00000000000000007FFF80000000000000007FFF +80000000000000007FFF80000000000000003FFF800000000000001F3FFF800000000000 +001F3FFF800000000000001F1FFFC00000000000001F1FFFC00000000000001F1FFFC000 +00000000003F0FFFE00000000000003F0FFFE00000000000003E07FFF00000000000003E +07FFF00000000000007E03FFF80000000000007C01FFF8000000000000FC01FFFC000000 +000000F800FFFC000000000001F8007FFE000000000003F0003FFF000000000003F0003F +FF800000000007E0001FFFC0000000000FC00007FFE0000000001F800003FFF800000000 +3F000001FFFC00000000FE000000FFFF00000001FC0000003FFFC0000007F80000000FFF +FC00003FF000000003FFFFC001FFC000000000FFFFFFFFFF00000000003FFFFFFFFC0000 +00000007FFFFFFF00000000000007FFFFF8000000000000003FFF0000000505479D25F> +II76 DI82 D<3FFFFFFFFF0001FFFFFFFC003FFFFFFFFF +0001FFFFFFFC003FFFFFFFFF0001FFFFFFFC003FFFFFFFFF0001FFFFFFFC003FFFFFFFFF +0001FFFFFFFC000003FFFE00000003FFE000000003FFFF000000007E0000000001FFFF00 +0000007E0000000000FFFF80000000FC00000000007FFFC0000001F800000000007FFFC0 +000003F800000000003FFFE0000003F000000000001FFFF0000007E000000000001FFFF0 +00000FC000000000000FFFF800001FC0000000000007FFFC00001F80000000000007FFFC +00003F00000000000003FFFE00007E00000000000001FFFF00007E00000000000001FFFF +8000FC00000000000000FFFF8001F8000000000000007FFFC003F8000000000000003FFF +E003F0000000000000003FFFE007E0000000000000001FFFF00FC0000000000000000FFF +F81FC0000000000000000FFFF81F800000000000000007FFFC3F000000000000000003FF +FE7E000000000000000003FFFE7E000000000000000001FFFFFC000000000000000000FF +FFF8000000000000000000FFFFF80000000000000000007FFFF00000000000000000003F +FFE00000000000000000001FFFF00000000000000000001FFFF00000000000000000000F +FFF800000000000000000007FFFC00000000000000000007FFFC00000000000000000003 +FFFE00000000000000000001FFFF00000000000000000001FFFF00000000000000000003 +FFFF80000000000000000003FFFFC0000000000000000007FFFFE000000000000000000F +FFFFE000000000000000001FDFFFF000000000000000001F8FFFF800000000000000003F +0FFFF800000000000000007E07FFFC00000000000000007E03FFFE0000000000000000FC +03FFFE0000000000000001F801FFFF0000000000000003F800FFFF8000000000000003F0 +00FFFF8000000000000007E0007FFFC00000000000000FC0003FFFE00000000000001FC0 +003FFFF00000000000001F80001FFFF00000000000003F00000FFFF80000000000007E00 +0007FFFC0000000000007E000007FFFC000000000000FC000003FFFE000000000001F800 +0001FFFF000000000003F8000001FFFF000000000003F0000000FFFF800000000007E000 +00007FFFC0000000000FC00000007FFFC0000000001FC00000003FFFE0000000001F8000 +00001FFFF0000000003F000000001FFFF8000000007E000000000FFFF8000000007E0000 +000007FFFC00000000FC0000000003FFFE00000001F80000000003FFFE0000000FFF0000 +000001FFFF0000FFFFFFFF000003FFFFFFFFF0FFFFFFFF000003FFFFFFFFF0FFFFFFFF00 +0003FFFFFFFFF0FFFFFFFF000003FFFFFFFFF0FFFFFFFF000003FFFFFFFFF05C527DD163 +>88 D<00003FFE000000000007FFFFE0000000001FFFFFFC000000007FFFFFFF00000001 +FFC00FFFC0000003FE0003FFE0000007FF0000FFF0000007FF80007FF800000FFFC0007F +FC00000FFFC0003FFE00000FFFC0003FFE00000FFFC0001FFF00000FFFC0001FFF00000F +FFC0001FFF00000FFFC0000FFF800007FF80000FFF800003FF00000FFF800001FE00000F +FF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000 +0000000FFF8000000000000FFF800000000007FFFF8000000003FFFFFF800000007FFFFF +FF80000003FFFFFFFF8000001FFFF00FFF8000007FFF000FFF800000FFFC000FFF800003 +FFF0000FFF800007FFC0000FFF80000FFF80000FFF80001FFF00000FFF80003FFF00000F +FF80003FFE00000FFF80007FFC00000FFF80007FFC00000FFF81F0FFFC00000FFF81F0FF +F800000FFF81F0FFF800000FFF81F0FFF800000FFF81F0FFF800001FFF81F0FFF800001F +FF81F0FFFC00003FFF81F07FFC00003FFF81F07FFE00007FFF81F03FFE0000F7FFC3F03F +FF0001E3FFC3E01FFFC007E3FFFFE007FFF01F81FFFFC003FFFFFF00FFFF8000FFFFFC00 +7FFF00001FFFF0003FFC000001FF800007F0003C387CB642>97 D<000003FFE000000000 +3FFFFE00000000FFFFFF80000003FFFFFFE000000FFF003FF800003FFC0007FC00007FF8 +000FFE0000FFF0001FFE0001FFE0003FFF0003FFC0003FFF0007FF80003FFF0007FF8000 +3FFF000FFF00003FFF001FFF00003FFF001FFE00003FFF003FFE00001FFE003FFE00000F +FC003FFE000007F8007FFE00000000007FFC00000000007FFC00000000007FFC00000000 +00FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000 +FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FF +FC0000000000FFFC0000000000FFFC00000000007FFC00000000007FFE00000000007FFE +00000000007FFE00000000003FFE00000000003FFF00000000001FFF0000000F801FFF00 +00000F800FFF8000001F800FFF8000001F0007FFC000003F0003FFE000003E0001FFF000 +007E0000FFF80000FC00007FFC0001F800003FFF0007F000000FFFC01FE0000007FFFFFF +80000001FFFFFE000000003FFFF80000000003FF80000031387CB63A>99 +D<000000000003FF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF80 +00000000000FFFFF8000000000000FFFFF800000000000003FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80 +0000000000000FFF8000000003FF800FFF800000003FFFF80FFF80000001FFFFFE0FFF80 +000007FFFFFF8FFF8000001FFFC03FEFFF8000003FFE0007FFFF8000007FF80001FFFF80 +0000FFF00000FFFF800001FFE000007FFF800003FFC000003FFF800007FF8000001FFF80 +000FFF8000000FFF80000FFF0000000FFF80001FFF0000000FFF80001FFE0000000FFF80 +003FFE0000000FFF80003FFE0000000FFF80007FFE0000000FFF80007FFC0000000FFF80 +007FFC0000000FFF80007FFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80 +00FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80 +00FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80 +00FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80007FFC0000000FFF80 +007FFC0000000FFF80007FFC0000000FFF80007FFE0000000FFF80003FFE0000000FFF80 +003FFE0000000FFF80003FFE0000000FFF80001FFE0000000FFF80001FFF0000000FFF80 +000FFF0000001FFF800007FF8000003FFF800007FF8000007FFF800003FFC00000FFFF80 +0001FFE00001FFFF800000FFF00003FFFFE000007FFC000FEFFFFF80001FFF007F8FFFFF +800007FFFFFF0FFFFF800001FFFFFC0FFFFF8000007FFFE00FFFFF80000007FF000FFE00 +0041547CD249>I<000007FF80000000007FFFF800000001FFFFFE00000007FFFFFF8000 +001FFF03FFE000003FFC007FF000007FF0003FF80000FFE0001FFC0001FFC0000FFC0003 +FF800007FE0007FF800007FF000FFF000003FF000FFF000003FF801FFE000003FF801FFE +000001FF803FFE000001FFC03FFE000001FFC03FFE000001FFC07FFC000001FFC07FFC00 +0001FFE07FFC000000FFE07FFC000000FFE0FFFC000000FFE0FFFC000000FFE0FFFFFFFF +FFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFC0000000000FFFC000000 +0000FFFC0000000000FFFC0000000000FFFC0000000000FFFC00000000007FFC00000000 +007FFC00000000007FFC00000000007FFE00000000003FFE00000000003FFE0000000000 +3FFE00000003E01FFF00000003E01FFF00000007E00FFF00000007C007FF8000000FC007 +FF8000000F8003FFC000001F8001FFE000003F0000FFF000007E00007FFC0001FC00001F +FF0007F800000FFFE03FF0000003FFFFFFC0000000FFFFFF800000003FFFFC0000000001 +FFE0000033387CB63C>I<00001FFE0000FE000001FFFFE007FF80000FFFFFFC1FFFC000 +3FFFFFFF7FFFE0007FF807FFFF07E001FFE001FFF07FE003FFC000FFF07FE007FF80007F +F83FE007FF00003FF83FC00FFF00003FFC1FC01FFF00003FFE07001FFE00001FFE00001F +FE00001FFE00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001F +FF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003F +FE00001FFF00001FFE00001FFE00001FFE00001FFE00001FFF00003FFE00000FFF00003F +FC000007FF00003FF8000007FF80007FF8000003FFC000FFF0000001FFE001FFE0000000 +FFF807FF80000001FFFFFFFF00000003EFFFFFFC00000003C1FFFFE000000007C01FFE00 +000000078000000000000007800000000000000FC00000000000000FC00000000000000F +C00000000000000FE00000000000000FE00000000000000FF00000000000000FFC000000 +0000000FFFFFFFFE00000007FFFFFFFFF0000007FFFFFFFFFC000007FFFFFFFFFF800003 +FFFFFFFFFFC00003FFFFFFFFFFF00001FFFFFFFFFFF80000FFFFFFFFFFFC00007FFFFFFF +FFFC0001FFFFFFFFFFFE0007FFFFFFFFFFFE000FFC000003FFFF001FF80000003FFF003F +F00000000FFF007FE000000007FF807FE000000003FF80FFC000000003FF80FFC0000000 +01FF80FFC000000001FF80FFC000000001FF80FFC000000001FF80FFC000000001FF80FF +E000000003FF807FE000000003FF007FF000000007FF003FF000000007FE001FF8000000 +0FFC001FFE0000003FFC0007FF0000007FF00003FFC00001FFE00000FFFC001FFF800000 +3FFFFFFFFE0000000FFFFFFFF800000001FFFFFFC0000000000FFFF80000003B4F7CB542 +>103 D<003FF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF80000 +00000000FFFFF8000000000000FFFFF800000000000003FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF8001FFC00000000FFF800FFFF80000000FFF803FF +FFE0000000FFF80FFFFFF8000000FFF81FC07FFC000000FFF87E003FFE000000FFF8F800 +1FFF000000FFF9F0001FFF000000FFF9E0000FFF800000FFFBC0000FFF800000FFFF8000 +0FFF800000FFFF000007FFC00000FFFF000007FFC00000FFFE000007FFC00000FFFE0000 +07FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC0000 +07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000 +07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000 +07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000 +07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000 +07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000 +07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000 +07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000 +07FFC00000FFF8000007FFC00000FFF8000007FFC000FFFFFFF807FFFFFFC0FFFFFFF807 +FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC042537CD249 +>I<003F000000FFC00001FFE00003FFF00003FFF00007FFF80007FFF80007FFF80007FF +F80007FFF80007FFF80003FFF00003FFF00001FFE00000FFC000003F0000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000001FF800FFFFF800FFFFF800FFFFF800FFFFF800FFFF +F80001FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF +F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF +F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF +F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF +F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF800FFFFFFF0FFFF +FFF0FFFFFFF0FFFFFFF0FFFFFFF01C547CD324>I<003FF800FFFFF800FFFFF800FFFFF8 +00FFFFF800FFFFF80003FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 +0000FFF80000FFF800FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF81D537CD224> +108 D<003FF0001FF8000001FF800000FFFFF000FFFF80000FFFF80000FFFFF003FFFFE0 +003FFFFE0000FFFFF00FFFFFF000FFFFFF0000FFFFF03F80FFF803F80FFF8000FFFFF07E +007FFC07E007FFC00003FFF0F8003FFE0F8003FFE00000FFF1F0001FFE1F0001FFE00000 +FFF3E0001FFF3E0001FFF00000FFF3C0001FFF3C0001FFF00000FFF780001FFF780001FF +F00000FFF700000FFFF00000FFF80000FFFF00000FFFF00000FFF80000FFFE00000FFFE0 +0000FFF80000FFFE00000FFFE00000FFF80000FFFC00000FFFC00000FFF80000FFFC0000 +0FFFC00000FFF80000FFFC00000FFFC00000FFF80000FFF800000FFF800000FFF80000FF +F800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF8 +0000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF8000 +00FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000F +FF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF8 +00000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF800 +00FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000 +FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF +800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800 +000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000 +FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FF +F80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF800FFFFFFF80FFFFFFF +80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF8FFFFFFF80F +FFFFFF80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF865367BB56E>I<003FF0001FFC0000 +00FFFFF000FFFF800000FFFFF003FFFFE00000FFFFF00FFFFFF80000FFFFF01FC07FFC00 +00FFFFF07E003FFE000003FFF0F8001FFF000000FFF1F0001FFF000000FFF1E0000FFF80 +0000FFF3C0000FFF800000FFF780000FFF800000FFF7000007FFC00000FFFF000007FFC0 +0000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC000007FFC0 +0000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 +00FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFF +C0FFFFFFF807FFFFFFC042367CB549>I<000001FFC000000000003FFFFE0000000000FF +FFFF8000000003FFFFFFE00000000FFF80FFF80000003FFC001FFE0000007FF00007FF00 +0000FFE00003FF800001FFC00001FFC00003FF800000FFE00003FF0000007FE00007FF00 +00007FF0000FFF0000007FF8000FFE0000003FF8001FFE0000003FFC001FFE0000003FFC +003FFE0000003FFE003FFC0000001FFE003FFC0000001FFE007FFC0000001FFF007FFC00 +00001FFF007FFC0000001FFF007FFC0000001FFF00FFFC0000001FFF80FFFC0000001FFF +80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC00 +00001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF +80FFFC0000001FFF807FFC0000001FFF007FFC0000001FFF007FFC0000001FFF003FFC00 +00001FFE003FFE0000003FFE003FFE0000003FFE001FFE0000003FFC001FFE0000003FFC +000FFF0000007FF8000FFF0000007FF80007FF800000FFF00003FF800000FFE00001FFC0 +0001FFC00000FFE00003FF8000007FF00007FF0000003FFC001FFE0000001FFF80FFFC00 +000007FFFFFFF000000001FFFFFFC0000000003FFFFE000000000003FFE000000039387C +B642>I<003FF8007FF0000000FFFFF807FFFF000000FFFFF81FFFFFC00000FFFFF87FFF +FFF00000FFFFF9FF00FFFC0000FFFFFFF8003FFF000003FFFFE0000FFF800000FFFF8000 +07FFC00000FFFF000003FFE00000FFFE000003FFF00000FFFC000001FFF00000FFF80000 +00FFF80000FFF8000000FFFC0000FFF80000007FFC0000FFF80000007FFE0000FFF80000 +007FFE0000FFF80000003FFE0000FFF80000003FFF0000FFF80000003FFF0000FFF80000 +003FFF0000FFF80000003FFF0000FFF80000001FFF8000FFF80000001FFF8000FFF80000 +001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000 +001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000 +001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000003FFF0000FFF80000 +003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000007FFE0000FFF80000 +007FFE0000FFF80000007FFC0000FFF8000000FFFC0000FFF8000000FFF80000FFFC0000 +01FFF80000FFFC000001FFF00000FFFE000003FFE00000FFFF000007FFC00000FFFF8000 +0FFF800000FFFFE0001FFF000000FFFFF0007FFE000000FFF9FE01FFF8000000FFF8FFFF +FFF0000000FFF83FFFFFC0000000FFF807FFFE00000000FFF800FFE000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 +00000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF800 +00000000FFFFFFF80000000000414D7DB549>I<003FF001FC00FFFFF00FFF80FFFFF01F +FFE0FFFFF07FFFF0FFFFF0FE1FF8FFFFF1F83FF801FFF1F07FFC00FFF3E07FFC00FFF3C0 +7FFC00FFF7807FFC00FFF7807FFC00FFFF007FFC00FFFF003FF800FFFE001FF000FFFE00 +0FE000FFFE00000000FFFC00000000FFFC00000000FFFC00000000FFFC00000000FFF800 +000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800 +000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800 +000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800 +000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800 +000000FFF800000000FFF800000000FFF800000000FFF8000000FFFFFFFE0000FFFFFFFE +0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE00002E367DB535>114 +D<0003FFC00E00001FFFFC1E0000FFFFFF7E0003FFFFFFFE0007FE003FFE000FF0000FFE +001FE00003FE003FC00001FE003F800000FE007F800000FE007F0000007E007F0000007E +00FF0000003E00FF0000003E00FF8000003E00FF8000003E00FFC000003E00FFF0000000 +00FFFC00000000FFFF800000007FFFFE0000007FFFFFF000003FFFFFFE00003FFFFFFF80 +001FFFFFFFE0000FFFFFFFF00007FFFFFFFC0003FFFFFFFE0000FFFFFFFF00003FFFFFFF +00000FFFFFFF800001FFFFFF8000000FFFFFC00000003FFFC000000007FFE000000001FF +E0F8000000FFE0F80000007FE0FC0000003FE0FC0000003FE0FC0000001FE0FE0000001F +E0FE0000001FE0FE0000001FC0FF0000001FC0FF8000003FC0FF8000003F80FFC000003F +80FFE000007F00FFF80000FF00FFFC0003FE00FFFF801FFC00FE7FFFFFF000F81FFFFFC0 +00F007FFFF0000E0007FF000002B387CB634>I<00007C00000000007C00000000007C00 +000000007C00000000007C00000000007C0000000000FC0000000000FC0000000000FC00 +00000000FC0000000001FC0000000001FC0000000001FC0000000003FC0000000003FC00 +00000007FC0000000007FC000000000FFC000000001FFC000000003FFC000000007FFC00 +000000FFFC00000003FFFC0000000FFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFF +FE00FFFFFFFFFE00007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 +0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 +0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 +0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 +0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000F80007FFC00 +0F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC00 +0F80007FFC000F80007FFC000F80007FFC000F80007FFC001F00003FFE001F00003FFE00 +1F00001FFE003E00001FFF003E00000FFF807C000007FFC1F8000003FFFFF0000000FFFF +E00000003FFF8000000003FE0000294D7ECB33>I<003FF8000001FFC000FFFFF80007FF +FFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FF +FFC00003FFF800001FFFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 +FFC00000FFF8000007FFC00000FFF800000FFFC00000FFF800000FFFC00000FFF800000F +FFC00000FFF800001FFFC00000FFF800001FFFC00000FFF800003FFFC000007FF800003F +FFC000007FF800007FFFC000003FFC0000F7FFC000003FFC0001E7FFF000001FFE0007C7 +FFFFC0000FFF801F87FFFFC00007FFFFFF07FFFFC00001FFFFFC07FFFFC000007FFFF007 +FFFFC0000007FFC007FF000042377CB549>II +121 D E +%EndDVIPSBitmapFont +end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: a4 +/setpagedevice where +{ pop << /PageSize [595 842] >> setpagedevice } +{ /a4 where { pop a4 } if } +ifelse +%%EndPaperSize + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 0 91 a Fi(Con)l(ten)l(ts)0 295 +y Fh(1)84 b(Mo)s(dule)34 b Fg(XmlRpc)h Fh(:)46 b(XmlRp)s(c)33 +b(Ligh)m(t.)2262 b(1)136 408 y Ff(1.1)92 b(High-lev)m(el)32 +b(in)m(terface)49 b(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f +(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) +h(.)f(.)h(.)g(.)f(.)h(.)137 b(1)136 520 y(1.2)92 b(Utilit)m(y)31 +b(functions)90 b(.)46 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h +(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) +f(.)h(.)f(.)h(.)g(.)f(.)h(.)137 b(6)136 633 y(1.3)92 +b(Lo)m(w-lev)m(el)33 b(in)m(terface)73 b(.)46 b(.)f(.)h(.)f(.)h(.)f(.)h +(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) +f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)137 b(6)136 +746 y(1.4)92 b(Serv)m(er)32 b(to)s(ols)61 b(.)45 b(.)h(.)f(.)h(.)g(.)f +(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) +f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)137 +b(7)0 950 y Fh(2)84 b(Mo)s(dule)34 b Fg(XmlRpcServer)h +Fh(:)46 b(XmlRp)s(c)33 b(Ligh)m(t)i(serv)m(er.)1672 b(8)136 +1062 y Ff(2.1)92 b(Base)31 b(classes)53 b(.)45 b(.)h(.)f(.)h(.)g(.)f(.) +h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f +(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)137 +b(8)136 1175 y(2.2)92 b(Serv)m(er)32 b(implemen)m(tations)96 +b(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) +f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 +b(10)136 1288 y(2.3)g(Utilit)m(y)31 b(functions)90 b(.)46 +b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) +f(.)h(.)92 b(10)0 1492 y Fh(3)84 b(Mo)s(dule)34 b Fg(XmlRpcDateTime)h +Fh(:)46 b(Date/time)35 b(t)m(yp)s(e.)1777 b(11)136 1605 +y Ff(3.1)92 b(T)m(yp)s(es)76 b(.)45 b(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f +(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) +f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 +b(11)136 1717 y(3.2)g(Comparison)56 b(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h(.) +f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h +(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 +b(11)136 1830 y(3.3)g(Curren)m(t)32 b(date)f(and)g(time)59 +b(.)46 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) +h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h +(.)92 b(11)136 1943 y(3.4)g(Time)32 b(zone)e(adjustmen)m(ts)h(.)46 +b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f +(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 +b(11)136 2056 y(3.5)g(Con)m(v)m(ersion)i(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) +h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 +b(12)136 2169 y(3.6)g(ISO-8601)32 b(parsing)f(and)f(generation)77 +b(.)45 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) +f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(12)0 +2372 y Fh(4)84 b(Mo)s(dule)34 b Fg(XmlRpcBase64)h Fh(:)46 +b(Base64)35 b(co)s(dec.)1975 b(12)0 2659 y Fi(1)131 b(Mo)t(dule)44 +b Fe(XmlRpc)d Fi(:)58 b(XmlRp)t(c)44 b(Ligh)l(t.)0 2862 +y Ff(XmlRp)s(c)30 b(Ligh)m(t)i(is)d(a)i(minimal)g(XmlRp)s(c)f(library)h +(based)g(on)f(Xml)g(Ligh)m(t)i(and)f(Ocamlnet.)141 2975 +y(It)k(pro)m(vides)i(a)e(t)m(yp)s(e)h(for)f(v)-5 b(alues,)37 +b(a)f(clien)m(t)h(class)e(with)h(a)g(simple)g(calling)g(in)m(terface,)j +(and)d(lo)m(w-lev)m(el)h(to)s(ols)0 3088 y(that)31 b(can)g(b)s(e)f +(used)g(to)h(implemen)m(t)h(a)e(serv)m(er.)141 3200 y +Fd(\(c\))j(2007-2009)g(Dave)g(Benjamin)0 3456 y Fg(val)47 +b(version)g(:)g(string)227 3594 y Ff(V)-8 b(ersion)31 +b(of)f(XmlRp)s(c-Ligh)m(t)i(as)e(a)g(string.)0 3912 y +Fc(1.1)112 b(High-lev)m(el)35 b(in)m(terface)0 4084 y +Ff(Example:)188 4335 y Fg(let)47 b(rpc)g(=)g(new)g(XmlRpc.client)f +("http://localhost:8000")h(in)188 4448 y(let)g(result)g(=)g(rpc#call)f +("echo")h([`String)g("hello!"])g(in)188 4560 y(print_endline)g +(\(XmlRpc.dump)f(result\))0 4698 y(exception)h(Error)g(of)g(\(int)f(*)h +(string\))227 4836 y Ff(Raised)30 b(for)g(all)h(errors)g(including)g +(XmlRp)s(c)f(faults)g(\(co)s(de,)h(string\).)1927 5400 +y(1)p eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 0 91 a Fg(type)47 b(value)g(=)g([)g(`Array)f(of)h +(value)g(list)94 204 y(|)g(`Binary)g(of)g(string)94 317 +y(|)g(`Boolean)g(of)g(bool)94 430 y(|)g(`DateTime)g(of)g +(XmlRpcDateTime.t)94 543 y(|)g(`Double)g(of)g(float)94 +656 y(|)g(`Int)g(of)g(int)94 769 y(|)g(`Int32)g(of)g(int32)94 +882 y(|)g(`Nil)94 995 y(|)g(`String)g(of)g(string)94 +1108 y(|)g(`Struct)g(of)g(\(string)f(*)h(value\))g(list)g(])227 +1245 y Ff(P)m(olymorphic)33 b(v)-5 b(arian)m(t)31 b(t)m(yp)s(e)g(for)f +(XmlRp)s(c)f(v)-5 b(alues:)336 1433 y Fb(\017)46 b Fg(`Array)p +Ff(:)40 b(An)31 b(ordered)g(list)f(of)g(v)-5 b(alues)336 +1579 y Fb(\017)46 b Fg(`Binary)p Ff(:)40 b(A)30 b(string)h(con)m +(taining)h(binary)f(data)336 1725 y Fb(\017)46 b Fg(`Boolean)p +Ff(:)40 b(A)30 b(b)s(o)s(olean)336 1871 y Fb(\017)46 +b Fg(`DateTime)p Ff(:)40 b(A)30 b(date/time)i(v)-5 b(alue)336 +2017 y Fb(\017)46 b Fg(`Double)p Ff(:)40 b(A)30 b(\035oating-p)s(oin)m +(t)j(v)-5 b(alue)336 2164 y Fb(\017)46 b Fg(`Int)p Ff(:)40 +b(An)31 b(in)m(teger)336 2310 y Fb(\017)46 b Fg(`Int32)p +Ff(:)40 b(A)30 b(32-bit)i(in)m(teger)336 2456 y Fb(\017)46 +b Fg(`Nil)p Ff(:)40 b(A)30 b(n)m(ull)i(v)-5 b(alue)336 +2602 y Fb(\017)46 b Fg(`String)p Ff(:)40 b(A)30 b(string)336 +2748 y Fb(\017)46 b Fg(`Struct)p Ff(:)40 b(An)31 b(asso)s(ciation)f +(list)g(of)g(\(name,)i(v)-5 b(alue\))30 b(pairs)227 2936 +y(Note)h(that)g(base64-enco)s(ding)h(of)e Fg(`Binary)f +Ff(v)-5 b(alues)31 b(is)f(done)h(automatically)-8 b(.)42 +b(Y)-8 b(ou)31 b(do)g(not)f(need)h(to)g(do)227 3049 y(the)g(enco)s +(ding)g(y)m(ourself.)0 3261 y Fg(class)47 b(client)g(:)g(?debug:bool)f +(->)h(?headers:\(string)g(*)g(string\))g(list)g(->)g +(?insecure_ssl:bool)f(->)h(?timeout:float)g(->)g(?useragent:string)f +(->)h(string)g(->)90 3374 y(object)227 3549 y(val)g(url)g(:)g(string) +427 3724 y Ff(Url)30 b(of)g(the)h(remote)g(XmlRp)s(c)f(serv)m(er.)227 +3937 y Fg(val)47 b(mutable)g(debug)g(:)g(bool)427 4112 +y Ff(If)30 b(true,)h(Xml)f(messages)g(will)h(b)s(e)f(prin)m(ted)i(to)e +(standard)i(error.)227 4325 y Fg(val)47 b(mutable)g(headers)g(:)g +(\(string)g(*)g(string\))f(list)427 4500 y Ff(List)31 +b(of)f(custom)h(HTTP)g(headers)g(to)f(send)g(with)h(eac)m(h)h(request.) +227 4712 y Fg(val)47 b(mutable)g(insecure_ssl)g(:)g(bool)427 +4888 y Ff(If)30 b(true,)h(SSL)g(will)f(b)s(e)h(allo)m(w)m(ed)h(ev)m(en) +f(if)f(the)g(certi\034cate)i(is)e(self-signed.)227 5100 +y Fg(val)47 b(mutable)g(timeout)g(:)g(float)1927 5400 +y Ff(2)p eop end +%%Page: 3 3 +TeXDict begin 3 2 bop 427 91 a Ff(Maxim)m(um)32 b(time)e(to)h(w)m(ait)g +(for)f(a)h(request)f(to)h(complete,)h(in)e(seconds.)227 +304 y Fg(val)47 b(mutable)g(useragent)g(:)g(string)427 +479 y Ff(User-agen)m(t)32 b(to)e(send)h(in)f(request)h(headers.)227 +692 y Fg(method)47 b(url)g(:)g(string)427 867 y Ff(Gets)30 +b Fg(url)p Ff(.)227 1079 y Fg(method)47 b(debug)g(:)g(bool)427 +1254 y Ff(Gets)30 b Fg(debug)p Ff(.)227 1467 y Fg(method)47 +b(set_debug)g(:)g(bool)g(->)g(unit)427 1642 y Ff(Sets)31 +b Fg(debug)p Ff(.)227 1855 y Fg(method)47 b(headers)g(:)g(\(string)g(*) +g(string\))f(list)427 2030 y Ff(Gets)30 b Fg(headers)p +Ff(.)227 2242 y Fg(method)47 b(set_headers)g(:)g(\(string)g(*)g +(string\))f(list)h(->)g(unit)427 2418 y Ff(Sets)31 b +Fg(headers)p Ff(.)227 2630 y Fg(method)47 b(insecure_ssl)g(:)g(bool)427 +2805 y Ff(Gets)30 b Fg(insecure_ssl)p Ff(.)227 3018 y +Fg(method)47 b(set_insecure_ssl)g(:)g(bool)g(->)f(unit)427 +3193 y Ff(Sets)31 b Fg(insecure_ssl)p Ff(.)227 3406 y +Fg(method)47 b(timeout)g(:)g(float)427 3581 y Ff(Gets)30 +b Fg(timeout)p Ff(.)227 3793 y Fg(method)47 b(set_timeout)g(:)g(float)g +(->)g(unit)427 3968 y Ff(Sets)31 b Fg(timeout)p Ff(.)227 +4181 y Fg(method)47 b(useragent)g(:)g(string)427 4356 +y Ff(Gets)30 b Fg(useragent)p Ff(.)227 4569 y Fg(method)47 +b(set_useragent)g(:)g(string)g(->)g(unit)427 4744 y Ff(Sets)31 +b Fg(useragent)p Ff(.)227 4956 y Fg(method)47 b(set_base64_encoder)g(:) +g(\(string)f(->)h(string\))g(->)g(unit)427 5132 y Ff(Sets)31 +b(an)f(alternate)i(Base-64)f(binary)f(enco)s(ding)i(function.)1927 +5400 y(3)p eop end +%%Page: 4 4 +TeXDict begin 4 3 bop 227 91 a Fg(method)47 b(set_base64_decoder)g(:)g +(\(string)f(->)h(string\))g(->)g(unit)427 262 y Ff(Sets)31 +b(an)f(alternate)i(Base-64)f(binary)f(deco)s(ding)i(function.)227 +467 y Fg(method)47 b(set_datetime_encoder)g(:)g(\(XmlRpcDateTime.t)f +(->)h(string\))g(->)g(unit)427 638 y Ff(Sets)31 b(an)f(alternate)i +(ISO-8601)f(date/time)h(enco)s(ding)f(function.)227 842 +y Fg(method)47 b(set_datetime_decoder)g(:)g(\(string)f(->)h +(XmlRpcDateTime.t\))g(->)g(unit)427 1013 y Ff(Sets)31 +b(an)f(alternate)i(ISO-8601)f(date/time)h(deco)s(ding)f(function.)227 +1217 y Fg(method)47 b(call)g(:)g(string)g(->)g(XmlRpc.value)f(list)h +(->)g(XmlRpc.value)427 1389 y(call)g(name)g(params)30 +b Ff(in)m(v)m(ok)m(es)h(an)g(XmlRp)s(c)f(metho)s(d)h(and)f(returns)h +(the)g(result,)g(or)f(raises)427 1501 y Fg(XmlRpc.Error)p +Ff([1.1])h(on)f(error.)90 1718 y Fg(end)227 1900 y Ff(Class)g(for)g +(XmlRp)s(c)g(clien)m(ts.)42 b(T)-8 b(ak)m(es)31 b(a)f(single)h +(mandatory)g(argumen)m(t,)i Fg(url)p Ff(.)227 2048 y(If)d +Fg(url)g Ff(is)g(of)g(the)g(form)h("h)m(ttp://username:passw)m(ord@)p +Fa(:)15 b(:)g(:)5 b Ff(",)31 b(basic)f(authen)m(tication)k(will)c(b)s +(e)g(used.)227 2196 y(If)g Fg(url)g Ff(starts)g(with)h("h)m(ttps",)g +(Curl)g(will)g(b)s(e)f(used)h(instead)f(of)g(Ocamlnet.)42 +b(The)31 b("curl")g(command-line)227 2309 y(program)h(m)m(ust)f(b)s(e)f +(in)g(y)m(our)h(path)g(for)f(this)h(to)f(w)m(ork.)41 +b(Y)-8 b(ou)31 b(can)g(use)f(the)h Fg(insecure_ssl)f +Ff(setting)g(to)227 2422 y(allo)m(w)i(connections)f(to)g(serv)m(ers)f +(with)h(self-signed)g(certi\034cates;)g(b)m(y)g(default)g(this)f(is)g +(false)g(and)227 2535 y(certi\034cates)i(m)m(ust)f(b)s(e)f(v)-5 +b(alid.)227 2683 y Fg(timeout)30 b Ff(can)h(b)s(e)f(used)g(to)h(sp)s +(ecify)e(the)i(maxim)m(um)h(amoun)m(t)g(of)e(time)h(elapsed)f(b)s +(efore)h(a)f(connection)i(is)227 2796 y(cancelled.)42 +b(It)30 b(defaults)h(to)f(300.0)h(seconds.)227 2944 y +Fg(headers)f Ff(ma)m(y)g(con)m(tain)h(an)f(arra)m(y)g(of)g(\(name,)g(v) +-5 b(alue\))30 b(pairs)g(of)f(additional)j(headers)e(to)g(send)g(with)g +(eac)m(h)227 3057 y(request.)227 3205 y(The)h Fg(useragent)f +Ff(setting)h(pro)m(vides)g(a)f(con)m(v)m(enien)m(t)j(w)m(a)m(y)f(to)e +(c)m(hange)i(the)f(User-Agen)m(t)g(header,)g(whic)m(h)227 +3318 y(defaults)g(to)f("XmlRp)s(c-Ligh)m(t/)p Fa(<)p +Ff(v)m(ersion)p Fa(>)p Ff(".)227 3466 y(The)h Fg(debug)f +Ff(setting,)h(if)f(true,)h(will)g(enable)g(v)m(erb)s(ose)f(debugging)i +(output)g(to)e(the)h(standard)g(error)227 3579 y(stream.)0 +3784 y Fg(class)47 b(multicall)g(:)g(client)f(->)90 3897 +y(object)227 4061 y(method)h(call)g(:)g(string)g(->)g(XmlRpc.value)f +(list)h(->)g(XmlRpc.value)g(Lazy.t)427 4233 y Ff(A)m(dds)31 +b(a)f(call)h(to)f(this)h Fg(multicall)f Ff(instance.)41 +b(If)29 b(the)i(call)g(has)f(already)h(executed,)g(the)g(follo)m(wing) +427 4345 y(exception)h(will)e(b)s(e)g(raised:)41 b(F)-8 +b(ailure)32 b("m)m(ulticall)p Fg(#)p Ff(call:)43 b(already)31 +b(executed".)227 4550 y Fg(method)47 b(execute)g(:)g(unit)g(->)g(unit) +427 4721 y Ff(F)-8 b(orces)31 b(the)g(call)g(to)f(execute)h +(immediately)-8 b(.)43 b(If)29 b(the)i(call)f(has)h(already)g(executed) +g(and)f(completed)427 4834 y(successfully)-8 b(,)31 b(the)f(follo)m +(wing)i(exception)f(will)g(b)s(e)f(raised:)41 b(F)-8 +b(ailure)31 b("m)m(ulticall)p Fg(#)p Ff(execute:)44 b(already)427 +4947 y(completed".)227 5151 y Fg(method)j(result)g(:)g(int)g(->)g +(XmlRpc.value)1927 5400 y Ff(4)p eop end +%%Page: 5 5 +TeXDict begin 5 4 bop 427 91 a Ff(Returns)31 b(a)f Fg(multicall)g +Ff(result,)h(executing)g(the)g(call)f(if)g(necessary)-8 +b(.)41 b(The)31 b(results)f(are)h(n)m(um)m(b)s(ered)427 +204 y(starting)g(with)g(zero.)227 409 y Fg(method)47 +b(executed)g(:)g(bool)427 581 y Ff(T)-8 b(rue)32 b(if)e(the)g(call)h +(has)f(executed,)i(whether)f(or)g(not)f(it)h(succeeded.)227 +786 y Fg(method)47 b(completed)g(:)g(bool)427 958 y Ff(T)-8 +b(rue)32 b(of)e(the)g(call)h(has)f(executed)i(and)e(completed)i +(successfully)-8 b(.)90 1175 y Fg(end)227 1358 y Ff(Con)m(v)m(enience) +33 b(class)d(for)g Fg(system.multicall)g Ff(calls.)455 +1506 y(Instances)g(tak)m(e)h(an)f Fg(XmlRpc.client)p +Ff([1.1])h(as)f(an)g(argumen)m(t:)603 1755 y Fg(#)47 +b(let)g(mc)g(=)g(new)g(XmlRpc.multicall)f(client;;)603 +1868 y(val)h(mc)g(:)g(XmlRpc.multicall)f(=)h()455 +2129 y Ff(The)30 b("call")i(metho)s(d)e(w)m(orks)h(lik)m(e)g +Fg(client#call)p Ff(,)f(but)h(it)f(returns)h(a)f(lazy)h(v)-5 +b(alue:)603 2378 y Fg(#)47 b(let)g(a)g(=)g(mc#call)g +("demo.addTwoNumbers")f([`Int)h(3;)g(`Int)g(4];;)603 +2491 y(val)g(a)g(:)g(XmlRpc.value)g(Lazy.t)f(=)h()603 +2604 y(#)g(let)g(b)g(=)g(mc#call)g("demo.addTwoNumbers")f([`Int)h(42;)g +(`String)g("oh)g(noes!"];;)603 2717 y(val)g(b)g(:)g(XmlRpc.value)g +(Lazy.t)f(=)h()603 2830 y(#)g(let)g(c)g(=)g(mc#call)g +("demo.addTwoNumbers")f([`Double)h(3.0;)g(`Double)g(4.0];;)603 +2943 y(val)g(c)g(:)g(XmlRpc.value)g(Lazy.t)f(=)h()455 +3204 y Ff(A)m(t)30 b(this)g(p)s(oin)m(t,)i(the)e(call)h(has)f(not)h(b)s +(een)f(executed)i(y)m(et:)603 3453 y Fg(#)47 b(mc#executed;;)603 +3566 y(--)g(:)g(bool)g(=)g(false)455 3827 y Ff(As)29 +b(so)s(on)h(as)g(one)h(of)f(the)g(return)i(v)-5 b(alues)30 +b(is)g(forced,)h(the)f(call)h(is)f(executed:)603 4076 +y Fg(#)47 b(Lazy.force)g(a;;)603 4189 y(--)g(:)g(XmlRpc.value)g(=)g +(`Int)g(7)603 4302 y(#)g(mc#executed;;)603 4415 y(--)g(:)g(bool)g(=)g +(true)455 4676 y Ff(Once)32 b(a)h(call)f(has)g(b)s(een)g(executed,)i +(this)e(instance)h(cannot)g(b)s(e)f(used)g(to)h(mak)m(e)f(an)m(y)h +(further)g(calls;)455 4789 y(instead,)e(a)f(new)h Fg(multicall)f +Ff(instance)h(m)m(ust)g(b)s(e)f(created:)603 5038 y Fg(#)47 +b(mc#call)g("demo.addTwoNumbers")f([`Int)h(2;)g(`Int)g(2];;)603 +5151 y(Exception:)g(Failure)g("multicall#call:)f(already)h(executed".) +1927 5400 y Ff(5)p eop end +%%Page: 6 6 +TeXDict begin 6 5 bop 455 242 a Ff(If)24 b(an)i(XmlRp)s(c)g(fault)g(o)s +(ccurred,)h(the)f(exception)h(will)g(b)s(e)e(thro)m(wn)i(when)g(the)f +(lazy)g(v)-5 b(alue)26 b(is)f(forced:)603 492 y Fg(#)47 +b(Lazy.force)g(b;;)603 605 y(Exception:)g(XmlRpc.Error)g(\(-32602,)f +("server)h(error.)g(invalid)g(method)g(parameters"\).)455 +868 y Ff(This)30 b(will)h(not)f(prev)m(en)m(t)i(further)f(metho)s(ds)g +(from)f(executing)i(successfully:)603 1119 y Fg(#)47 +b(Lazy.force)g(c;;)603 1232 y(--)g(:)g(XmlRpc.value)g(=)g(`Double)f(7.) +455 1495 y Ff(It)28 b(is)g(p)s(ossible)h(for)g(a)g Fg(multicall)f +Ff(to)h(b)s(e)g(executed)g(but)h(not)f(completed,)i(for)e(example)g(if) +g(a)f(trans-)455 1608 y(p)s(ort)g(error)h(o)s(ccurs.)40 +b(Aside)28 b(from)g(catc)m(hing)i(the)f(exception,)h(the)f +Fg(completed)f Ff(prop)s(ert)m(y)h(indicates)455 1721 +y(if)g(the)i(call)g(actually)g(w)m(en)m(t)h(through)f(or)g(not:)603 +1972 y Fg(#)47 b(mc#completed;;)603 2085 y(--)g(:)g(bool)g(=)g(true)455 +2348 y Ff(It)32 b(is)h(not)h(necessary)f(to)h(use)f(lazy)g(v)-5 +b(alues.)50 b(Instead,)34 b(the)g(call)f(can)h(b)s(e)f(executed)h +(explicitly)-8 b(,)35 b(and)455 2461 y(the)30 b(results)h(can)f(b)s(e)g +(retriev)m(ed)i(b)m(y)f(n)m(um)m(b)s(er:)603 2711 y Fg(#)47 +b(let)g(mc)g(=)g(new)g(XmlRpc.multicall)f(client;;)603 +2824 y(val)h(mc)g(:)g(XmlRpc.multicall)f(=)h()603 +2937 y(#)g(ignore)g(\(mc#call)g("demo.addTwoNumbers")f([`Int)h(2;)g +(`Int)g(2]\);;)603 3050 y(--)g(:)g(unit)g(=)g(\(\))603 +3163 y(#)g(ignore)g(\(mc#call)g("demo.addTwoNumbers")f([`Int)h(3;)g +(`Int)g(3]\);;)603 3276 y(--)g(:)g(unit)g(=)g(\(\))603 +3389 y(#)g(mc#result)g(1;;)603 3502 y(--)g(:)g(XmlRpc.value)g(=)g(`Int) +g(6)0 3933 y Fc(1.2)112 b(Utilit)m(y)34 b(functions)0 +4129 y Fg(val)47 b(dump)g(:)g(value)g(->)g(string)227 +4267 y Ff(Con)m(v)m(erts)32 b(an)e(XmlRp)s(c)g(v)-5 b(alue)31 +b(to)f(a)h(h)m(uman-readable)i(string.)0 4585 y Fc(1.3)112 +b(Lo)m(w-lev)m(el)37 b(in)m(terface)0 4782 y Fg(type)47 +b(message)g(=)94 4895 y(|)g(MethodCall)g(of)g(\(string)f(*)h(value)g +(list\))94 5008 y(|)g(MethodResponse)g(of)f(value)94 +5121 y(|)h(Fault)g(of)g(\(int)g(*)g(string\))1927 5400 +y Ff(6)p eop end +%%Page: 7 7 +TeXDict begin 7 6 bop 227 91 a Ff(T)m(yp)s(e)31 b(for)f(XmlRp)s(c)g +(messages.)0 298 y Fg(val)47 b(message_of_xml_element)f(:)94 +411 y(?base64_decoder:\(string)g(->)h(string\))g(->)94 +524 y(?datetime_decoder:\(string)f(->)h(XmlRpcDateTime.t\))g(->)g +(Xml.xml)g(->)g(message)227 660 y Ff(Con)m(v)m(erts)32 +b(an)e(Xml)h(Ligh)m(t)h(elemen)m(t)g(to)e(an)h(XmlRp)s(c)e(message.)0 +867 y Fg(val)47 b(xml_element_of_message)f(:)94 980 y +(?base64_encoder:\(string)g(->)h(string\))g(->)94 1093 +y(?datetime_encoder:\(XmlRpcDateTime.t)f(->)h(string\))g(->)g(message)g +(->)g(Xml.xml)227 1229 y Ff(Con)m(v)m(erts)32 b(an)e(XmlRp)s(c)g +(message)h(to)f(an)h(Xml)f(Ligh)m(t)i(elemen)m(t.)0 1436 +y Fg(val)47 b(value_of_xml_element)f(:)94 1549 y +(?base64_decoder:\(string)g(->)h(string\))g(->)94 1662 +y(?datetime_decoder:\(string)f(->)h(XmlRpcDateTime.t\))g(->)g(Xml.xml)g +(->)g(value)227 1798 y Ff(Con)m(v)m(erts)32 b(an)e(Xml)h(Ligh)m(t)h +(elemen)m(t)g(to)e(an)h(XmlRp)s(c)e(v)-5 b(alue.)0 2005 +y Fg(val)47 b(xml_element_of_value)f(:)94 2118 y +(?base64_encoder:\(string)g(->)h(string\))g(->)94 2231 +y(?datetime_encoder:\(XmlRpcDateTime.t)f(->)h(string\))g(->)g(value)g +(->)g(Xml.xml)227 2367 y Ff(Con)m(v)m(erts)32 b(an)e(XmlRp)s(c)g(v)-5 +b(alue)31 b(to)f(an)h(Xml)f(Ligh)m(t)i(elemen)m(t.)0 +2679 y Fc(1.4)112 b(Serv)m(er)38 b(to)s(ols)0 2874 y +Fg(val)47 b(serve)g(:)94 2987 y(?base64_encoder:\(string)f(->)h +(string\))g(->)94 3100 y(?base64_decoder:\(string)f(->)h(string\))g(->) +94 3213 y(?datetime_encoder:\(XmlRpcDateTime.t)f(->)h(string\))g(->)94 +3326 y(?datetime_decoder:\(string)f(->)h(XmlRpcDateTime.t\))g(->)94 +3439 y(?error_handler:\(exn)f(->)h(message\))g(->)94 +3552 y(\(string)g(->)g(value)g(list)f(->)h(value\))g(->)g(string)g(->)g +(string)227 3688 y Ff(Creates)31 b(a)g(function)g(from)f(string)h +(\(Xml)f(represen)m(ting)i(a)f Fg(MethodCall)p Ff(\))f(to)g(string)h +(\(Xml)g(represen)m(ting)227 3801 y(a)g Fg(MethodResult)e +Ff(or)i Fg(Fault)p Ff(\))f(giv)m(en)h(a)g(function)g(of)f(the)g(form:) +41 b(\()p Fg(name)30 b Fb(!)g Fg(params)g Fb(!)g Fg(result)p +Ff(\),)g(where)227 3914 y Fg(name)g Ff(is)g(the)h(name)g(of)f(the)h +(metho)s(d,)g Fg(params)f Ff(is)g(a)g(list)g(of)g(parameter)i(v)-5 +b(alues,)30 b(and)h Fg(result)f Ff(is)g(the)227 4027 +y(result)h(v)-5 b(alue.)227 4176 y(This)30 b(function)h(can)g(b)s(e)f +(used)g(to)g(build)h(man)m(y)g(di\033eren)m(t)g(kinds)f(of)g(XmlRp)s(c) +f(serv)m(ers)i(since)f(it)g(mak)m(es)h(no)227 4289 y(assumptions)g(ab)s +(out)g(the)f(net)m(w)m(ork)i(library)f(or)g(other)g(comm)m(unications)i +(metho)s(d)e(used.)227 4438 y(If)f(an)g(exception)i(other)f(than)f +Fg(XmlRpc.Error)p Ff([1.1])h(o)s(ccurs,)f(the)h(exception)g(is)f +(passed)h(to)227 4550 y Fg(error_handler)p Ff(.)40 b(If)28 +b Fg(error_handler)h Ff(returns)h(a)g(message,)g(the)f(message)h(will)g +(b)s(e)f(used)h(as)f(the)g(result.)227 4663 y(If)h(an)g +Fg(XmlRpc.Error)p Ff([1.1])h(is)f(raised)g(b)m(y)h(either)g(the)g(main) +g(function)g(or)f Fg(error_handler)p Ff(,)g(it)h(will)g(b)s(e)227 +4776 y(con)m(v)m(erted)i(to)d(an)h(XmlRp)s(c)e Fg(Fault)p +Ff(.)41 b(An)m(y)30 b(other)h(exception)g(raised)g(b)m(y)f +Fg(error_handler)g Ff(is)g(allo)m(w)m(ed)j(to)227 4889 +y(escap)s(e.)227 5038 y(F)-8 b(or)31 b(a)g(full-featured,)g +(easy-to-use,)g(net)m(w)m(ork-capable)i(serv)m(er)e(implemen)m(tation,) +i(see)d(the)227 5151 y Fg(XmlRpcServer)p Ff([2])h(mo)s(dule.)1927 +5400 y(7)p eop end +%%Page: 8 8 +TeXDict begin 8 7 bop 0 91 a Fg(val)47 b(serve_message)g(:)94 +204 y(?error_handler:\(exn)f(->)h(message\))g(->)94 317 +y(\(string)g(->)g(value)g(list)f(->)h(value\))g(->)94 +430 y(message)g(->)g(message)227 568 y Ff(P)m(erforms)32 +b(the)e(same)h(function)g(as)f Fg(serve)p Ff(,)g(but)h(op)s(erates)f +(on)h(t)m(yp)s(ed)g(messages)f(instead)h(of)f(strings.)0 +780 y Fg(val)47 b(default_error_handler)f(:)h(exn)g(->)g(message)227 +918 y Ff(The)31 b(default)g(error)g(handler)g(for)g Fg(serve)p +Ff(.)227 1068 y(This)g(error)g(handler)g(catc)m(hes)h(all)e(exceptions) +h(and)g(con)m(v)m(erts)g(them)g(in)m(to)h(faults)e(b)m(y)g(wrapping)i +(them)f(in)227 1181 y Fg(XmlRpc.Error)p Ff(.)0 1394 y +Fg(val)47 b(quiet_error_handler)f(:)h(exn)g(->)g(message)227 +1532 y Ff(A)30 b("quiet")h(error)g(handler)h(for)e Fg(serve)p +Ff(.)227 1682 y(This)h(error)g(handler)g(simply)f(re-raises)h(the)g +(exception.)41 b(Use)30 b(this)g(if)g(y)m(ou)h(w)m(an)m(t)h(exceptions) +f(to)f(remain)227 1795 y(unhandled)i(so)e(that)h(they)f(will)h(escap)s +(e)g(to)f(the)h(error)g(log.)41 b(The)30 b(clien)m(t)i(will)f(receiv)m +(e)g(a)f(generic)227 1908 y("transp)s(ort)h(error",)h(whic)m(h)f(is)f +(more)h(secure)g(since)f(it)h(do)s(es)f(not)g(rev)m(eal)i(an)m(y)e +(information)i(ab)s(out)f(the)227 2021 y(sp)s(eci\034c)g(exception)g +(that)g(o)s(ccurred.)0 2382 y Fi(2)131 b(Mo)t(dule)44 +b Fe(XmlRpcServer)39 b Fi(:)58 b(XmlRp)t(c)44 b(Ligh)l(t)h(serv)l(er.)0 +2703 y Ff(Example:)188 2954 y Fg(let)i(server)g(=)g(new)g +(XmlRpcServer.cgi)f(\(\))h(in)188 3067 y(server#register)g +("demo.sayHello")282 3179 y(\(fun)g(_)g(->)g(`String)f("Hello!"\);)188 +3292 y(server#run)h(\(\))141 3405 y Ff(By)25 b(inheriting)h(from)g +Fg(XmlRpcServer.base)p Ff([2.1],)g(all)g(serv)m(ers)f(pro)m(vide)h(the) +f(follo)m(wing)i(in)m(trosp)s(ection)g(func-)0 3518 y(tions)49 +b(b)m(y)g(default:)79 b Fg(system.listMethods)p Ff(,)53 +b Fg(system.getCapabilities)p Ff(.)96 b(T)-8 b(o)50 b(prev)m(en)m(t)h +(their)e(use,)54 b(use)0 3631 y Fg(server#unregister)p +Ff(.)141 3744 y(A)m(dditionally)-8 b(,)52 b(the)46 b(metho)s(ds)g +Fg(system.methodHelp)g Ff(and)g Fg(system.methodSignature)f +Ff(will)i(b)s(e)e(made)0 3857 y(a)m(v)-5 b(ailable)32 +b(if)e(at)g(least)h(one)f(metho)s(d)h(help)g(or)g(metho)s(d)f +(signature)i(is)e(pro)m(vided.)0 3995 y Fg(type)47 b(param_type)g(=)g +([)g(`Array)94 4108 y(|)g(`Binary)94 4221 y(|)g(`Boolean)94 +4333 y(|)g(`DateTime)94 4446 y(|)g(`Double)94 4559 y(|)g(`Int)94 +4672 y(|)g(`String)94 4785 y(|)g(`Struct)94 4898 y(|)g(`Undefined)g(]) +227 5036 y Ff(T)m(yp)s(e)31 b(of)f(parameters)h(used)g(in)f(metho)s(d)h +(signatures.)1927 5400 y(8)p eop end +%%Page: 9 9 +TeXDict begin 9 8 bop 0 91 a Fc(2.1)112 b(Base)38 b(classes)0 +287 y Fg(class)47 b(virtual)g(base)g(:)90 400 y(object)227 +574 y(val)g(methods)g(:)g(\(string,)g(XmlRpc.value)f(list)h(->)g +(XmlRpc.value\))g(Hashtbl.t)427 748 y Ff(Hash)m(table)32 +b(mapping)f(metho)s(d)g(names)g(to)f(implemen)m(tation)k(functions.)227 +959 y Fg(val)47 b(mutable)g(base64_encoder)g(:)g(string)f(->)h(string) +427 1133 y Ff(Base-64)31 b(binary)g(enco)s(ding)g(function.)227 +1344 y Fg(val)47 b(mutable)g(base64_decoder)g(:)g(string)f(->)h(string) +427 1519 y Ff(Base-64)31 b(binary)g(deco)s(ding)g(function.)227 +1730 y Fg(val)47 b(mutable)g(datetime_encoder)g(:)g(XmlRpcDateTime.t)f +(->)h(string)427 1904 y Ff(ISO-8601)31 b(date/time)h(enco)s(ding)f +(function.)227 2115 y Fg(val)47 b(mutable)g(datetime_decoder)g(:)g +(string)f(->)h(XmlRpcDateTime.t)427 2289 y Ff(ISO-8601)31 +b(date/time)h(deco)s(ding)f(function.)227 2500 y Fg(val)47 +b(mutable)g(error_handler)g(:)g(exn)g(->)f(XmlRpc.message)427 +2675 y Ff(Handler)31 b(for)f(unhandled)i(exceptions.)227 +2886 y Fg(method)47 b(set_base64_encoder)g(:)g(\(string)f(->)h +(string\))g(->)g(unit)427 3060 y Ff(Sets)31 b(an)f(alternate)i(Base-64) +f(binary)f(enco)s(ding)i(function.)227 3271 y Fg(method)47 +b(set_base64_decoder)g(:)g(\(string)f(->)h(string\))g(->)g(unit)427 +3445 y Ff(Sets)31 b(an)f(alternate)i(Base-64)f(binary)f(deco)s(ding)i +(function.)227 3656 y Fg(method)47 b(set_datetime_encoder)g(:)g +(\(XmlRpcDateTime.t)f(->)h(string\))g(->)g(unit)427 3831 +y Ff(Sets)31 b(an)f(alternate)i(ISO-8601)f(date/time)h(enco)s(ding)f +(function.)227 4042 y Fg(method)47 b(set_datetime_decoder)g(:)g +(\(string)f(->)h(XmlRpcDateTime.t\))g(->)g(unit)427 4216 +y Ff(Sets)31 b(an)f(alternate)i(ISO-8601)f(date/time)h(deco)s(ding)f +(function.)227 4427 y Fg(method)47 b(set_error_handler)g(:)g(\(exn)g +(->)f(XmlRpc.message\))h(->)g(unit)427 4601 y Ff(Sets)31 +b(an)f(alternate)i(handler)f(for)f(unhandled)i(exceptions.)42 +b(See)427 4714 y Fg(XmlRpc.default_error_handler)p Ff([1.4])31 +b(and)f Fg(XmlRpc.quiet_error_handler)p Ff([1.4])h(for)427 +4827 y(examples.)227 5038 y Fg(method)47 b(serve)g(:)321 +5151 y(\(string)g(->)g(XmlRpc.value)g(list)g(->)f(XmlRpc.value\))h(->)g +(string)g(->)g(string)1927 5400 y Ff(9)p eop end +%%Page: 10 10 +TeXDict begin 10 9 bop 427 91 a Ff(F)-8 b(or)31 b(use)f(in)h(sub)s +(classes;)e(calls)i Fg(XmlRpc.serve)p Ff([1.4])f(with)h(the)g(curren)m +(t)h(enco)s(ders,)f(deco)s(ders,)g(and)427 204 y(error)g(handler.)227 +401 y Fg(method)47 b(serve_message)g(:)321 514 y(\(string)g(->)g +(XmlRpc.value)g(list)g(->)f(XmlRpc.value\))h(->)321 627 +y(XmlRpc.message)g(->)g(XmlRpc.message)427 795 y Ff(Lik)m(e)31 +b Fg(serve)p Ff(,)g(but)f(op)s(erates)h(on)f(messages)h(instead)f(of)g +(strings.)227 992 y Fg(method)47 b(register)g(:)321 1104 +y(string)g(->)321 1217 y(?help:string)g(->)321 1330 y +(?signature:XmlRpcServer.param_type)f(list)h(->)321 1443 +y(?signatures:XmlRpcServer.param_type)f(list)h(list)g(->)321 +1556 y(\(XmlRpc.value)g(list)g(->)g(XmlRpc.value\))f(->)h(unit)427 +1724 y Ff(Registers)30 b(a)h(metho)s(d)g(with)f(the)h(serv)m(er.)427 +1849 y(If)f(a)g Fg(help)g Ff(string)h(is)f(sp)s(eci\034ed,)g(its)h(con) +m(ten)m(ts)h(will)e(b)s(e)g(returned)i(for)e(calls)h(to)427 +1962 y Fg(system.methodHelp)f Ff(for)g(this)g(metho)s(d.)427 +2088 y(If)g Fg(signature)g Ff(is)g(sp)s(eci\034ed,)g(this)h(metho)s +(d's)f(signature)i(will)e(b)s(e)g(published)i(b)m(y)427 +2201 y Fg(system.methodSignature)e Ff(and)h(\(shallo)m(w\))g(t)m(yp)s +(e-c)m(hec)m(king)i(will)e(b)s(e)f(enabled)h(for)f(parameters)427 +2314 y(passed)h(in)m(to)g(this)f(metho)s(d.)427 2439 +y(Multiple)h(signatures)g(can)g(b)s(e)f(supplied)h(via)f +Fg(signatures)g Ff(if)g(desired)h(to)f(pro)m(vide)i(for)e(o)m(v)m +(erloaded)427 2552 y(metho)s(ds.)427 2678 y(Signatures)i(are)e(of)g +(the)h(form)g Fg(return-type;)46 b(param1-type;)h(param2-type;)g(...)40 +b Ff(where)427 2791 y(eac)m(h)32 b(t)m(yp)s(e)e(is)g(an)h(instance)g +(of)f(the)g Fg(XmlRpcServer.param_type)p Ff([2])g(v)-5 +b(arian)m(t.)227 2988 y Fg(method)47 b(unregister)g(:)g(string)g(->)g +(unit)427 3155 y Ff(Remo)m(v)m(es)31 b(a)f(metho)s(d)h(from)g(the)g +(serv)m(er.)227 3352 y Fg(method)47 b(virtual)g(run)g(:)g(unit)g(->)g +(unit)427 3520 y Ff(Starts)31 b(the)g(main)g(serv)m(er)f(pro)s(cess.)90 +3729 y Fg(end)227 3905 y Ff(Abstract)h(base)f(class)g(for)g(XmlRp)s(c)g +(serv)m(ers.)0 4102 y Fg(class)47 b(type)g(server)g(=)90 +4215 y(object)227 4383 y(inherit)g(XmlRpcServer.base)30 +b Ff([2.1])227 4517 y Fg(method)47 b(run)g(:)g(unit)g(->)g(unit)427 +4685 y Ff(Starts)31 b(the)g(main)g(serv)m(er)f(pro)s(cess.)90 +4894 y Fg(end)227 5070 y Ff(T)m(yp)s(e)h(of)f(concrete)h(XmlRp)s(c)f +(serv)m(er)h(classes.)1905 5400 y(10)p eop end +%%Page: 11 11 +TeXDict begin 11 10 bop 0 91 a Fc(2.2)112 b(Serv)m(er)38 +b(implemen)m(tations)0 288 y Fg(class)47 b(cgi)g(:)g(unit)g(->)g +(server)227 426 y Ff(CGI)30 b(XmlRp)s(c)g(serv)m(er)h(based)f(on)h +(Netcgi2.)0 638 y Fg(class)47 b(netplex)g(:)g +(?parallelizer:Netplex_types.parallelizer)f(->)h(?handler:string)f(->)h +(unit)g(->)g(server)227 776 y Ff(Stand-alone)32 b(XmlRp)s(c)e(serv)m +(er)h(based)f(on)h(Netplex.)0 1094 y Fc(2.3)112 b(Utilit)m(y)34 +b(functions)0 1291 y Fg(val)47 b(invalid_method)g(:)g(string)f(->)h('a) +227 1428 y Ff(Raise)30 b(an)h Fg(XmlRpc.Error)p Ff([1.1])f(indicating)i +(a)e(metho)s(d)h(name)g(not)g(found.)0 1641 y Fg(val)47 +b(invalid_params)g(:)g(unit)f(->)h('a)227 1779 y Ff(Raise)30 +b(an)h Fg(XmlRpc.Error)p Ff([1.1])f(indicating)i(in)m(v)-5 +b(alid)31 b(metho)s(d)g(parameters.)0 2140 y Fi(3)131 +b(Mo)t(dule)44 b Fe(XmlRpcDateTime)39 b Fi(:)58 b(Date/time)43 +b(t)l(yp)t(e.)0 2464 y Fc(3.1)112 b(T)m(yp)s(es)0 2661 +y Fg(exception)47 b(Parse_error)f(of)h(string)227 2799 +y Ff(Raised)30 b(b)m(y)h Fg(XmlRpcDateTime.of_string)p +Ff([3.6])f(if)g(a)g(string)h(could)g(not)g(b)s(e)f(parsed.)41 +b(The)31 b(exception)227 2912 y(con)m(tains)h(the)f(input)g(string.)0 +3124 y Fg(type)47 b(t)g(=)g(int)g(*)g(int)g(*)g(int)f(*)h(int)g(*)g +(int)g(*)g(int)g(*)g(int)227 3262 y Ff(T)m(yp)s(e)31 +b(of)f(XmlRp)s(c-compatible)i(date/time)f(v)-5 b(alues.)41 +b(\(y)m(ear,)31 b(mon)m(th,)h(da)m(y)-8 b(,)31 b(hour,)g(min)m(ute,)h +(second,)227 3375 y(time)f(zone)g(o\033set)f(in)h(min)m(utes\))0 +3693 y Fc(3.2)112 b(Comparison)0 3889 y Fg(val)47 b(compare)g(:)g(t)g +(->)g(t)g(->)f(int)227 4027 y Ff(Standard)32 b(comparator)g(for)e +(date/time)i(v)-5 b(alues.)40 b(Con)m(v)m(erts)32 b(all)f(v)-5 +b(alues)30 b(to)g(UTC)h(b)s(efore)f(comparing)i(to)227 +4140 y(ensure)f(correct)g(b)s(eha)m(vior)h(with)e(v)-5 +b(alues)31 b(of)f(di\033ering)h(time)g(zones.)0 4353 +y Fg(val)47 b(equal)g(:)g(t)g(->)g(t)g(->)f(bool)227 +4491 y Ff(Standard)32 b(equalit)m(y)f(function)g(for)f(date/time)i(v)-5 +b(alues.)40 b(Con)m(v)m(erts)32 b(all)f(v)-5 b(alues)30 +b(to)g(UTC)h(b)s(efore)227 4603 y(comparing.)0 4816 y +Fg(val)47 b(hash)g(:)g(t)g(->)g(int)227 4954 y Ff(Standard)32 +b(hash)e(function)h(for)g(date/time)g(v)-5 b(alues.)41 +b(Con)m(v)m(erts)32 b(v)-5 b(alues)30 b(to)g(UTC)h(b)s(efore)f +(hashing.)1905 5400 y(11)p eop end +%%Page: 12 12 +TeXDict begin 12 11 bop 0 91 a Fc(3.3)112 b(Curren)m(t)37 +b(date)h(and)g(time)0 287 y Fg(val)47 b(now)g(:)g(unit)g(->)g(t)227 +424 y Ff(Returns)31 b(the)f(curren)m(t)i(date)f(and)g(time)g(in)f(the)h +(lo)s(cal)f(time)h(zone.)0 633 y Fg(val)47 b(now_utc)g(:)g(unit)g(->)f +(t)227 770 y Ff(Returns)31 b(the)f(curren)m(t)i(date)f(and)g(time)g(in) +f(UTC.)0 1084 y Fc(3.4)112 b(Time)36 b(zone)i(adjustmen)m(ts)0 +1280 y Fg(val)47 b(set_tz_offset)g(:)g(int)f(->)h(t)g(->)g(t)227 +1417 y Ff(A)m(djusts)30 b(the)h(time)g(zone)g(o\033set,)f(preserving)h +(equalit)m(y)-8 b(.)0 1626 y Fg(val)47 b(fix_tz_offset)g(:)g(int)f(->)h +(t)g(->)g(t)227 1763 y Ff(F)-8 b(orces)31 b(the)g(time)g(zone)g +(o\033set)f(to)g(a)h(di\033eren)m(t)g(v)-5 b(alue,)31 +b(ignoring)h(all)e(other)h(\034elds.)41 b(Use)30 b(this)g(to)g(correct) +227 1875 y(the)h(time)g(zone)g(of)f(a)g(date/time)i(v)-5 +b(alue)30 b(that)h(w)m(as)g(receiv)m(ed)h(without)f(a)f(time)h(zone)g +(o\033set)f(and)h(is)227 1988 y(kno)m(wn)h(not)e(to)h(b)s(e)f(UTC.)0 +2303 y Fc(3.5)112 b(Con)m(v)m(ersion)0 2499 y Fg(val)47 +b(from_unixfloat)g(:)g(float)f(->)h(t)227 2635 y Ff(Builds)31 +b(a)f(date/time)i(v)-5 b(alue)30 b(from)h(ep)s(o)s(c)m(h)g(seconds)f +(in)g(the)h(lo)s(cal)g(time)g(zone.)0 2844 y Fg(val)47 +b(from_unixfloat_utc)f(:)h(float)g(->)g(t)227 2981 y +Ff(Builds)31 b(a)f(date/time)i(v)-5 b(alue)30 b(from)h(ep)s(o)s(c)m(h)g +(seconds)f(in)g(UTC.)0 3190 y Fg(val)47 b(to_unixfloat)g(:)g(t)g(->)f +(float)227 3327 y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5 +b(alue)31 b(to)f(ep)s(o)s(c)m(h)h(seconds)f(in)h(the)f(lo)s(cal)h(time) +g(zone.)0 3536 y Fg(val)47 b(to_unixfloat_utc)g(:)f(t)h(->)g(float)227 +3673 y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5 b(alue)31 +b(to)f(ep)s(o)s(c)m(h)h(seconds)f(in)h(UTC.)0 3882 y +Fg(val)47 b(from_unixtm)g(:)g(Unix.tm)f(->)h(t)227 4019 +y Ff(Builds)31 b(a)f(date/time)i(v)-5 b(alue)30 b(from)h(a)f(Unix.tm)h +(v)-5 b(alue)30 b(in)h(the)g(lo)s(cal)f(time)h(zone.)0 +4228 y Fg(val)47 b(from_unixtm_utc)g(:)f(Unix.tm)h(->)g(t)227 +4365 y Ff(Builds)31 b(a)f(date/time)i(v)-5 b(alue)30 +b(from)h(a)f(Unix.tm)h(v)-5 b(alue)30 b(in)h(UTC.)0 4573 +y Fg(val)47 b(to_unixtm)g(:)g(t)g(->)g(Unix.tm)227 4710 +y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5 b(alue)31 +b(to)f(a)h(Unix.tm)f(v)-5 b(alue)31 b(in)f(the)h(lo)s(cal)f(time)h +(zone.)0 4919 y Fg(val)47 b(to_unixtm_utc)g(:)g(t)f(->)h(Unix.tm)227 +5056 y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5 b(alue)31 +b(to)f(a)h(Unix.tm)f(v)-5 b(alue)31 b(in)f(UTC.)1905 +5400 y(12)p eop end +%%Page: 13 13 +TeXDict begin 13 12 bop 0 91 a Fc(3.6)112 b(ISO-8601)38 +b(parsing)g(and)g(generation)0 288 y Fg(val)47 b(of_string)g(:)g +(string)f(->)h(t)227 426 y Ff(P)m(arses)31 b(an)g(\(XmlRp)s(c-\035a)m +(v)m(or\))g(ISO-8601)h(date/time)g(v)-5 b(alue)30 b(from)h(a)f(string.) +0 638 y Fg(val)47 b(to_string)g(:)g(t)g(->)g(string)227 +776 y Ff(Generates)31 b(an)g(ISO-8601)g(string)g(from)f(a)g(date/time)i +(v)-5 b(alue.)0 1137 y Fi(4)131 b(Mo)t(dule)44 b Fe(XmlRpcBase64)39 +b Fi(:)58 b(Base64)44 b(co)t(dec.)0 1340 y Ff(8-bit)33 +b(c)m(haracters)h(are)f(enco)s(ded)h(in)m(to)f(6-bit)g(ones)g(using)g +(ASCI)s(I)e(lo)s(okup)i(tables.)48 b(Default)32 b(tables)h(maps)g +(0..63)0 1453 y(v)-5 b(alues)30 b(on)h(c)m(haracters)h(A-Z,)e(a-z,)h +(0-9,)g('+')f(and)h('/')g(\(in)f(that)h(order\).)0 1709 +y Fg(exception)47 b(Invalid_char)227 1847 y Ff(This)31 +b(exception)g(is)f(raised)h(when)g(reading)g(an)g(in)m(v)-5 +b(alid)31 b(c)m(haracter)h(from)f(a)f(base64)h(input.)0 +2059 y Fg(exception)47 b(Invalid_table)227 2197 y Ff(This)31 +b(exception)g(is)f(raised)h(if)e(the)i(enco)s(ding)g(or)g(deco)s(ding)g +(table)g(size)f(is)g(not)h(correct.)0 2410 y Fg(type)47 +b(encoding_table)g(=)f(char)h(array)227 2547 y Ff(An)30 +b(enco)s(ding)i(table)f(maps)f(in)m(tegers)i(0..63)f(to)f(the)h +(corresp)s(onding)g(c)m(har.)0 2760 y Fg(type)47 b(decoding_table)g(=)f +(int)h(array)227 2898 y Ff(A)30 b(deco)s(ding)h(table)g(maps)g(c)m +(hars)g(0..255)g(to)g(the)f(corresp)s(onding)i(0..63)f(v)-5 +b(alue)30 b(or)h(-1)f(if)g(the)h(c)m(har)g(is)f(not)227 +3011 y(accepted.)0 3223 y Fg(val)47 b(str_encode)g(:)g +(?tbl:encoding_table)f(->)h(string)g(->)g(string)227 +3361 y Ff(Enco)s(de)31 b(a)g(string)f(in)m(to)i(Base64.)0 +3574 y Fg(val)47 b(str_decode)g(:)g(?tbl:decoding_table)f(->)h(string)g +(->)g(string)227 3711 y Ff(Deco)s(de)30 b(a)f(string)g(enco)s(ded)h(in) +m(to)g(Base64,)g(raise)f Fg(Invalid_char)g Ff(if)g(a)g(c)m(haracter)i +(in)e(the)h(input)g(string)f(is)227 3824 y(not)i(a)f(v)-5 +b(alid)31 b(one.)0 4037 y Fg(val)47 b(encode)g(:)g(?tbl:encoding_table) +f(->)h(char)g(Stream.t)g(->)g(char)g(Stream.t)227 4175 +y Ff(Generic)31 b(base64)g(enco)s(ding)g(o)m(v)m(er)h(a)e(c)m(haracter) +i(stream.)0 4387 y Fg(val)47 b(decode)g(:)g(?tbl:decoding_table)f(->)h +(char)g(Stream.t)g(->)g(char)g(Stream.t)227 4525 y Ff(Generic)31 +b(base64)g(deco)s(ding)g(o)m(v)m(er)h(a)e(c)m(haracter)i(stream.)0 +4738 y Fg(val)47 b(make_decoding_table)f(:)h(encoding_table)g(->)g +(decoding_table)227 4875 y Ff(Create)32 b(a)e(v)-5 b(alid)30 +b(deco)s(ding)i(table)f(from)f(an)h(enco)s(ding)g(one.)1905 +5400 y(13)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/doc/xmlrpc-light/latex/doc.tex b/doc/xmlrpc-light/latex/doc.tex new file mode 100644 index 0000000..f9bde20 --- /dev/null +++ b/doc/xmlrpc-light/latex/doc.tex @@ -0,0 +1,1551 @@ +\documentclass[11pt]{article} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{fullpage} +\usepackage{url} +\usepackage{ocamldoc} +\begin{document} +\tableofcontents +\section{Module {\tt{XmlRpc}} : XmlRpc Light.} +\label{module:XmlRpc}\index{XmlRpc@\verb`XmlRpc`} + + + + XmlRpc Light is a minimal XmlRpc library based on Xml Light and Ocamlnet. + + + It provides a type for values, a client class with a simple calling + interface, and low-level tools that can be used to implement a server. + + + {\it (c) 2007-2009 Dave Benjamin} + + + +\ocamldocvspace{0.5cm} + + + +\label{val:XmlRpc.version}\begin{ocamldoccode} +val version : string +\end{ocamldoccode} +\index{version@\verb`version`} +\begin{ocamldocdescription} +Version of XmlRpc-Light as a string. + + +\end{ocamldocdescription} + + + + +\subsection{High-level interface} + + + + +Example: \begin{ocamldoccode} + + let rpc = new XmlRpc.client "http://localhost:8000" in + let result = rpc#call "echo" [`String "hello!"] in + print_endline (XmlRpc.dump result) +\end{ocamldoccode} + + + + +\label{exception:XmlRpc.Error}\begin{ocamldoccode} +exception Error of (int * string) +\end{ocamldoccode} +\index{Error@\verb`Error`} +\begin{ocamldocdescription} +Raised for all errors including XmlRpc faults (code, string). + + +\end{ocamldocdescription} + + + + +\label{type:XmlRpc.value}\begin{ocamldoccode} +type value = [ `Array of value list + | `Binary of string + | `Boolean of bool + | `DateTime of XmlRpcDateTime.t + | `Double of float + | `Int of int + | `Int32 of int32 + | `Nil + | `String of string + | `Struct of (string * value) list ] +\end{ocamldoccode} +\index{value@\verb`value`} +\begin{ocamldocdescription} +Polymorphic variant type for XmlRpc values:\begin{itemize} +\item {\tt{`Array}}: An ordered list of values +\item {\tt{`Binary}}: A string containing binary data +\item {\tt{`Boolean}}: A boolean +\item {\tt{`DateTime}}: A date/time value +\item {\tt{`Double}}: A floating-point value +\item {\tt{`Int}}: An integer +\item {\tt{`Int32}}: A 32-bit integer +\item {\tt{`Nil}}: A null value +\item {\tt{`String}}: A string +\item {\tt{`Struct}}: An association list of (name, value) pairs +\end{itemize} + + Note that base64-encoding of {\tt{`Binary}} values is done automatically. + You do not need to do the encoding yourself. + + +\end{ocamldocdescription} + + + + +\begin{ocamldoccode} +{\tt{class client : }}{\tt{?debug:bool -> ?headers:(string * string) list -> ?insecure\_ssl:bool -> ?timeout:float -> ?useragent:string -> string -> }}\end{ocamldoccode} +\label{class:XmlRpc.client}\index{client@\verb`client`} + +\begin{ocamldocobjectend} + + +\label{val:XmlRpc.client.url}\begin{ocamldoccode} +val url : string +\end{ocamldoccode} +\index{url@\verb`url`} +\begin{ocamldocdescription} +Url of the remote XmlRpc server. + + +\end{ocamldocdescription} + + +\label{val:XmlRpc.client.debug}\begin{ocamldoccode} +val mutable debug : bool +\end{ocamldoccode} +\index{debug@\verb`debug`} +\begin{ocamldocdescription} +If true, Xml messages will be printed to standard error. + + +\end{ocamldocdescription} + + +\label{val:XmlRpc.client.headers}\begin{ocamldoccode} +val mutable headers : (string * string) list +\end{ocamldoccode} +\index{headers@\verb`headers`} +\begin{ocamldocdescription} +List of custom HTTP headers to send with each request. + + +\end{ocamldocdescription} + + +\label{val:XmlRpc.client.insecure-underscoressl}\begin{ocamldoccode} +val mutable insecure_ssl : bool +\end{ocamldoccode} +\index{insecure-underscoressl@\verb`insecure_ssl`} +\begin{ocamldocdescription} +If true, SSL will be allowed even if the certificate is self-signed. + + +\end{ocamldocdescription} + + +\label{val:XmlRpc.client.timeout}\begin{ocamldoccode} +val mutable timeout : float +\end{ocamldoccode} +\index{timeout@\verb`timeout`} +\begin{ocamldocdescription} +Maximum time to wait for a request to complete, in seconds. + + +\end{ocamldocdescription} + + +\label{val:XmlRpc.client.useragent}\begin{ocamldoccode} +val mutable useragent : string +\end{ocamldoccode} +\index{useragent@\verb`useragent`} +\begin{ocamldocdescription} +User-agent to send in request headers. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.url}\begin{ocamldoccode} +method url : string +\end{ocamldoccode} +\index{url@\verb`url`} +\begin{ocamldocdescription} +Gets {\tt{url}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.debug}\begin{ocamldoccode} +method debug : bool +\end{ocamldoccode} +\index{debug@\verb`debug`} +\begin{ocamldocdescription} +Gets {\tt{debug}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscoredebug}\begin{ocamldoccode} +method set_debug : bool -> unit +\end{ocamldoccode} +\index{set-underscoredebug@\verb`set_debug`} +\begin{ocamldocdescription} +Sets {\tt{debug}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.headers}\begin{ocamldoccode} +method headers : (string * string) list +\end{ocamldoccode} +\index{headers@\verb`headers`} +\begin{ocamldocdescription} +Gets {\tt{headers}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscoreheaders}\begin{ocamldoccode} +method set_headers : (string * string) list -> unit +\end{ocamldoccode} +\index{set-underscoreheaders@\verb`set_headers`} +\begin{ocamldocdescription} +Sets {\tt{headers}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.insecure-underscoressl}\begin{ocamldoccode} +method insecure_ssl : bool +\end{ocamldoccode} +\index{insecure-underscoressl@\verb`insecure_ssl`} +\begin{ocamldocdescription} +Gets {\tt{insecure\_ssl}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscoreinsecure-underscoressl}\begin{ocamldoccode} +method set_insecure_ssl : bool -> unit +\end{ocamldoccode} +\index{set-underscoreinsecure-underscoressl@\verb`set_insecure_ssl`} +\begin{ocamldocdescription} +Sets {\tt{insecure\_ssl}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.timeout}\begin{ocamldoccode} +method timeout : float +\end{ocamldoccode} +\index{timeout@\verb`timeout`} +\begin{ocamldocdescription} +Gets {\tt{timeout}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscoretimeout}\begin{ocamldoccode} +method set_timeout : float -> unit +\end{ocamldoccode} +\index{set-underscoretimeout@\verb`set_timeout`} +\begin{ocamldocdescription} +Sets {\tt{timeout}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.useragent}\begin{ocamldoccode} +method useragent : string +\end{ocamldoccode} +\index{useragent@\verb`useragent`} +\begin{ocamldocdescription} +Gets {\tt{useragent}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscoreuseragent}\begin{ocamldoccode} +method set_useragent : string -> unit +\end{ocamldoccode} +\index{set-underscoreuseragent@\verb`set_useragent`} +\begin{ocamldocdescription} +Sets {\tt{useragent}}. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscorebase64-underscoreencoder}\begin{ocamldoccode} +method set_base64_encoder : (string -> string) -> unit +\end{ocamldoccode} +\index{set-underscorebase64-underscoreencoder@\verb`set_base64_encoder`} +\begin{ocamldocdescription} +Sets an alternate Base-64 binary encoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscorebase64-underscoredecoder}\begin{ocamldoccode} +method set_base64_decoder : (string -> string) -> unit +\end{ocamldoccode} +\index{set-underscorebase64-underscoredecoder@\verb`set_base64_decoder`} +\begin{ocamldocdescription} +Sets an alternate Base-64 binary decoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscoredatetime-underscoreencoder}\begin{ocamldoccode} +method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit +\end{ocamldoccode} +\index{set-underscoredatetime-underscoreencoder@\verb`set_datetime_encoder`} +\begin{ocamldocdescription} +Sets an alternate ISO-8601 date/time encoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.set-underscoredatetime-underscoredecoder}\begin{ocamldoccode} +method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit +\end{ocamldoccode} +\index{set-underscoredatetime-underscoredecoder@\verb`set_datetime_decoder`} +\begin{ocamldocdescription} +Sets an alternate ISO-8601 date/time decoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.client.call}\begin{ocamldoccode} +method call : string -> XmlRpc.value list -> XmlRpc.value +\end{ocamldoccode} +\index{call@\verb`call`} +\begin{ocamldocdescription} +{\tt{call name params}} invokes an XmlRpc method and returns the result, + or raises {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] on error. + + +\end{ocamldocdescription} +\end{ocamldocobjectend} + + +\begin{ocamldocdescription} +Class for XmlRpc clients. Takes a single mandatory argument, {\tt{url}}. + + + If {\tt{url}} is of the form "http://username:password@$\ldots$", basic + authentication will be used. + + + If {\tt{url}} starts with "https", Curl will be used instead of Ocamlnet. + The "curl" command-line program must be in your path for this to work. + You can use the {\tt{insecure\_ssl}} setting to allow connections to servers + with self-signed certificates; by default this is false and certificates + must be valid. + + + {\tt{timeout}} can be used to specify the maximum amount of time + elapsed before a connection is cancelled. It defaults to 300.0 seconds. + + + {\tt{headers}} may contain an array of (name, value) pairs of additional + headers to send with each request. + + + The {\tt{useragent}} setting provides a convenient way to change the + User-Agent header, which defaults to "XmlRpc-Light/$<$version$>$". + + + The {\tt{debug}} setting, if true, will enable verbose debugging output to + the standard error stream. + + +\end{ocamldocdescription} + + + + +\begin{ocamldoccode} +{\tt{class multicall : }}{\tt{client -> }}\end{ocamldoccode} +\label{class:XmlRpc.multicall}\index{multicall@\verb`multicall`} + +\begin{ocamldocobjectend} + + +\label{method:XmlRpc.multicall.call}\begin{ocamldoccode} +method call : string -> XmlRpc.value list -> XmlRpc.value Lazy.t +\end{ocamldoccode} +\index{call@\verb`call`} +\begin{ocamldocdescription} +Adds a call to this {\tt{multicall}} instance. + If the call has already executed, the following exception will + be raised: + Failure "multicall\verb`#`call: already executed". + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.multicall.execute}\begin{ocamldoccode} +method execute : unit -> unit +\end{ocamldoccode} +\index{execute@\verb`execute`} +\begin{ocamldocdescription} +Forces the call to execute immediately. + If the call has already executed and completed successfully, the + following exception will be raised: + Failure "multicall\verb`#`execute: already completed". + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.multicall.result}\begin{ocamldoccode} +method result : int -> XmlRpc.value +\end{ocamldoccode} +\index{result@\verb`result`} +\begin{ocamldocdescription} +Returns a {\tt{multicall}} result, executing the call if necessary. + The results are numbered starting with zero. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.multicall.executed}\begin{ocamldoccode} +method executed : bool +\end{ocamldoccode} +\index{executed@\verb`executed`} +\begin{ocamldocdescription} +True if the call has executed, whether or not it succeeded. + + +\end{ocamldocdescription} + + +\label{method:XmlRpc.multicall.completed}\begin{ocamldoccode} +method completed : bool +\end{ocamldoccode} +\index{completed@\verb`completed`} +\begin{ocamldocdescription} +True of the call has executed and completed successfully. + + +\end{ocamldocdescription} +\end{ocamldocobjectend} + + +\begin{ocamldocdescription} +Convenience class for {\tt{system.multicall}} calls. + + + Instances take an {\tt{XmlRpc.client}}[\ref{class:XmlRpc.client}] as an argument: \begin{ocamldoccode} + + # let mc = new XmlRpc.multicall client;; + val mc : XmlRpc.multicall = + +\end{ocamldoccode} + + The "call" method works like {\tt{client\verb`#`call}}, but it returns a lazy + value: \begin{ocamldoccode} + + # let a = mc#call "demo.addTwoNumbers" [`Int 3; `Int 4];; + val a : XmlRpc.value Lazy.t = + # let b = mc#call "demo.addTwoNumbers" [`Int 42; `String "oh noes!"];; + val b : XmlRpc.value Lazy.t = + # let c = mc#call "demo.addTwoNumbers" [`Double 3.0; `Double 4.0];; + val c : XmlRpc.value Lazy.t = + +\end{ocamldoccode} + + At this point, the call has not been executed yet: \begin{ocamldoccode} + + # mc#executed;; + -- : bool = false + +\end{ocamldoccode} + + As soon as one of the return values is forced, the call is executed: \begin{ocamldoccode} + + # Lazy.force a;; + -- : XmlRpc.value = `Int 7 + # mc#executed;; + -- : bool = true + +\end{ocamldoccode} + + Once a call has been executed, this instance cannot be used to make any + further calls; instead, a new {\tt{multicall}} instance must be created: \begin{ocamldoccode} + + # mc#call "demo.addTwoNumbers" [`Int 2; `Int 2];; + Exception: Failure "multicall#call: already executed". + +\end{ocamldoccode} + + If an XmlRpc fault occurred, the exception will be thrown when the lazy + value is forced: \begin{ocamldoccode} + + # Lazy.force b;; + Exception: XmlRpc.Error (-32602, "server error. invalid method parameters"). + +\end{ocamldoccode} + + This will not prevent further methods from executing successfully: \begin{ocamldoccode} + + # Lazy.force c;; + -- : XmlRpc.value = `Double 7. + +\end{ocamldoccode} + + It is possible for a {\tt{multicall}} to be executed but not completed, for + example if a transport error occurs. Aside from catching the exception, + the {\tt{completed}} property indicates if the call actually went through + or not: \begin{ocamldoccode} + + # mc#completed;; + -- : bool = true + +\end{ocamldoccode} + + It is not necessary to use lazy values. Instead, the call can be + executed explicitly, and the results can be retrieved by number: \begin{ocamldoccode} + + # let mc = new XmlRpc.multicall client;; + val mc : XmlRpc.multicall = + # ignore (mc#call "demo.addTwoNumbers" [`Int 2; `Int 2]);; + -- : unit = () + # ignore (mc#call "demo.addTwoNumbers" [`Int 3; `Int 3]);; + -- : unit = () + # mc#result 1;; + -- : XmlRpc.value = `Int 6 + +\end{ocamldoccode} + + + +\end{ocamldocdescription} + + + + +\subsection{Utility functions} + + + + +\label{val:XmlRpc.dump}\begin{ocamldoccode} +val dump : value -> string +\end{ocamldoccode} +\index{dump@\verb`dump`} +\begin{ocamldocdescription} +Converts an XmlRpc value to a human-readable string. + + +\end{ocamldocdescription} + + + + +\subsection{Low-level interface} + + + + +\label{type:XmlRpc.message}\begin{ocamldoccode} +type message = + | MethodCall of (string * value list) + | MethodResponse of value + | Fault of (int * string) +\end{ocamldoccode} +\index{message@\verb`message`} +\begin{ocamldocdescription} +Type for XmlRpc messages. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpc.message-underscoreof-underscorexml-underscoreelement}\begin{ocamldoccode} +val message_of_xml_element : + ?base64_decoder:(string -> string) -> + ?datetime_decoder:(string -> XmlRpcDateTime.t) -> Xml.xml -> message +\end{ocamldoccode} +\index{message-underscoreof-underscorexml-underscoreelement@\verb`message_of_xml_element`} +\begin{ocamldocdescription} +Converts an Xml Light element to an XmlRpc message. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpc.xml-underscoreelement-underscoreof-underscoremessage}\begin{ocamldoccode} +val xml_element_of_message : + ?base64_encoder:(string -> string) -> + ?datetime_encoder:(XmlRpcDateTime.t -> string) -> message -> Xml.xml +\end{ocamldoccode} +\index{xml-underscoreelement-underscoreof-underscoremessage@\verb`xml_element_of_message`} +\begin{ocamldocdescription} +Converts an XmlRpc message to an Xml Light element. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpc.value-underscoreof-underscorexml-underscoreelement}\begin{ocamldoccode} +val value_of_xml_element : + ?base64_decoder:(string -> string) -> + ?datetime_decoder:(string -> XmlRpcDateTime.t) -> Xml.xml -> value +\end{ocamldoccode} +\index{value-underscoreof-underscorexml-underscoreelement@\verb`value_of_xml_element`} +\begin{ocamldocdescription} +Converts an Xml Light element to an XmlRpc value. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpc.xml-underscoreelement-underscoreof-underscorevalue}\begin{ocamldoccode} +val xml_element_of_value : + ?base64_encoder:(string -> string) -> + ?datetime_encoder:(XmlRpcDateTime.t -> string) -> value -> Xml.xml +\end{ocamldoccode} +\index{xml-underscoreelement-underscoreof-underscorevalue@\verb`xml_element_of_value`} +\begin{ocamldocdescription} +Converts an XmlRpc value to an Xml Light element. + + +\end{ocamldocdescription} + + + + +\subsection{Server tools} + + + + +\label{val:XmlRpc.serve}\begin{ocamldoccode} +val serve : + ?base64_encoder:(string -> string) -> + ?base64_decoder:(string -> string) -> + ?datetime_encoder:(XmlRpcDateTime.t -> string) -> + ?datetime_decoder:(string -> XmlRpcDateTime.t) -> + ?error_handler:(exn -> message) -> + (string -> value list -> value) -> string -> string +\end{ocamldoccode} +\index{serve@\verb`serve`} +\begin{ocamldocdescription} +Creates a function from string (Xml representing a {\tt{MethodCall}}) to + string (Xml representing a {\tt{MethodResult}} or {\tt{Fault}}) given a function + of the form: ({\tt{name}} $\rightarrow$ {\tt{params}} $\rightarrow$ {\tt{result}}), where {\tt{name}} is the + name of the method, {\tt{params}} is a list of parameter values, and + {\tt{result}} is the result value. + + + This function can be used to build many different kinds of XmlRpc + servers since it makes no assumptions about the network library + or other communications method used. + + + If an exception other than {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] occurs, the exception is + passed to {\tt{error\_handler}}. If {\tt{error\_handler}} returns a message, + the message will be used as the result. If an {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] is + raised by either the main function or {\tt{error\_handler}}, it will be + converted to an XmlRpc {\tt{Fault}}. Any other exception raised by + {\tt{error\_handler}} is allowed to escape. + + + For a full-featured, easy-to-use, network-capable server implementation, + see the {\tt{XmlRpcServer}}[\ref{module:XmlRpcServer}] module. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpc.serve-underscoremessage}\begin{ocamldoccode} +val serve_message : + ?error_handler:(exn -> message) -> + (string -> value list -> value) -> + message -> message +\end{ocamldoccode} +\index{serve-underscoremessage@\verb`serve_message`} +\begin{ocamldocdescription} +Performs the same function as {\tt{serve}}, but operates on typed messages + instead of strings. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpc.default-underscoreerror-underscorehandler}\begin{ocamldoccode} +val default_error_handler : exn -> message +\end{ocamldoccode} +\index{default-underscoreerror-underscorehandler@\verb`default_error_handler`} +\begin{ocamldocdescription} +The default error handler for {\tt{serve}}. + + + This error handler catches all exceptions and converts them into + faults by wrapping them in {\tt{XmlRpc.Error}}. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpc.quiet-underscoreerror-underscorehandler}\begin{ocamldoccode} +val quiet_error_handler : exn -> message +\end{ocamldoccode} +\index{quiet-underscoreerror-underscorehandler@\verb`quiet_error_handler`} +\begin{ocamldocdescription} +A "quiet" error handler for {\tt{serve}}. + + + This error handler simply re-raises the exception. Use this if you + want exceptions to remain unhandled so that they will escape to the + error log. The client will receive a generic "transport error", + which is more secure since it does not reveal any information about + the specific exception that occurred. + + +\end{ocamldocdescription} + + +\section{Module {\tt{XmlRpcServer}} : XmlRpc Light server.} +\label{module:XmlRpcServer}\index{XmlRpcServer@\verb`XmlRpcServer`} + + + + +\ocamldocvspace{0.5cm} + + + +Example: \begin{ocamldoccode} + + let server = new XmlRpcServer.cgi () in + server#register "demo.sayHello" + (fun _ -> `String "Hello!"); + server#run () +\end{ocamldoccode} + + + + By inheriting from {\tt{XmlRpcServer.base}}[\ref{class:XmlRpcServer.base}], all servers provide + the following introspection functions by default: {\tt{system.listMethods}}, + {\tt{system.getCapabilities}}. To prevent their use, use {\tt{server\verb`#`unregister}}. + + + Additionally, the methods {\tt{system.methodHelp}} and {\tt{system.methodSignature}} + will be made available if at least one method help or method signature is + provided. + + + +\label{type:XmlRpcServer.param-underscoretype}\begin{ocamldoccode} +type param_type = [ `Array + | `Binary + | `Boolean + | `DateTime + | `Double + | `Int + | `String + | `Struct + | `Undefined ] +\end{ocamldoccode} +\index{param-underscoretype@\verb`param_type`} +\begin{ocamldocdescription} +Type of parameters used in method signatures. + + +\end{ocamldocdescription} + + + + +\subsection{Base classes} + + + + +\begin{ocamldoccode} +{\tt{class virtual base : }}\end{ocamldoccode} +\label{class:XmlRpcServer.base}\index{base@\verb`base`} + +\begin{ocamldocobjectend} + + +\label{val:XmlRpcServer.base.methods}\begin{ocamldoccode} +val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t +\end{ocamldoccode} +\index{methods@\verb`methods`} +\begin{ocamldocdescription} +Hashtable mapping method names to implementation functions. + + +\end{ocamldocdescription} + + +\label{val:XmlRpcServer.base.base64-underscoreencoder}\begin{ocamldoccode} +val mutable base64_encoder : string -> string +\end{ocamldoccode} +\index{base64-underscoreencoder@\verb`base64_encoder`} +\begin{ocamldocdescription} +Base-64 binary encoding function. + + +\end{ocamldocdescription} + + +\label{val:XmlRpcServer.base.base64-underscoredecoder}\begin{ocamldoccode} +val mutable base64_decoder : string -> string +\end{ocamldoccode} +\index{base64-underscoredecoder@\verb`base64_decoder`} +\begin{ocamldocdescription} +Base-64 binary decoding function. + + +\end{ocamldocdescription} + + +\label{val:XmlRpcServer.base.datetime-underscoreencoder}\begin{ocamldoccode} +val mutable datetime_encoder : XmlRpcDateTime.t -> string +\end{ocamldoccode} +\index{datetime-underscoreencoder@\verb`datetime_encoder`} +\begin{ocamldocdescription} +ISO-8601 date/time encoding function. + + +\end{ocamldocdescription} + + +\label{val:XmlRpcServer.base.datetime-underscoredecoder}\begin{ocamldoccode} +val mutable datetime_decoder : string -> XmlRpcDateTime.t +\end{ocamldoccode} +\index{datetime-underscoredecoder@\verb`datetime_decoder`} +\begin{ocamldocdescription} +ISO-8601 date/time decoding function. + + +\end{ocamldocdescription} + + +\label{val:XmlRpcServer.base.error-underscorehandler}\begin{ocamldoccode} +val mutable error_handler : exn -> XmlRpc.message +\end{ocamldoccode} +\index{error-underscorehandler@\verb`error_handler`} +\begin{ocamldocdescription} +Handler for unhandled exceptions. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.set-underscorebase64-underscoreencoder}\begin{ocamldoccode} +method set_base64_encoder : (string -> string) -> unit +\end{ocamldoccode} +\index{set-underscorebase64-underscoreencoder@\verb`set_base64_encoder`} +\begin{ocamldocdescription} +Sets an alternate Base-64 binary encoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.set-underscorebase64-underscoredecoder}\begin{ocamldoccode} +method set_base64_decoder : (string -> string) -> unit +\end{ocamldoccode} +\index{set-underscorebase64-underscoredecoder@\verb`set_base64_decoder`} +\begin{ocamldocdescription} +Sets an alternate Base-64 binary decoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.set-underscoredatetime-underscoreencoder}\begin{ocamldoccode} +method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit +\end{ocamldoccode} +\index{set-underscoredatetime-underscoreencoder@\verb`set_datetime_encoder`} +\begin{ocamldocdescription} +Sets an alternate ISO-8601 date/time encoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.set-underscoredatetime-underscoredecoder}\begin{ocamldoccode} +method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit +\end{ocamldoccode} +\index{set-underscoredatetime-underscoredecoder@\verb`set_datetime_decoder`} +\begin{ocamldocdescription} +Sets an alternate ISO-8601 date/time decoding function. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.set-underscoreerror-underscorehandler}\begin{ocamldoccode} +method set_error_handler : (exn -> XmlRpc.message) -> unit +\end{ocamldoccode} +\index{set-underscoreerror-underscorehandler@\verb`set_error_handler`} +\begin{ocamldocdescription} +Sets an alternate handler for unhandled exceptions. + See {\tt{XmlRpc.default\_error\_handler}}[\ref{val:XmlRpc.default-underscoreerror-underscorehandler}] and + {\tt{XmlRpc.quiet\_error\_handler}}[\ref{val:XmlRpc.quiet-underscoreerror-underscorehandler}] for examples. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.serve}\begin{ocamldoccode} +method serve : + (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string +\end{ocamldoccode} +\index{serve@\verb`serve`} +\begin{ocamldocdescription} +For use in subclasses; calls {\tt{XmlRpc.serve}}[\ref{val:XmlRpc.serve}] with the current + encoders, decoders, and error handler. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.serve-underscoremessage}\begin{ocamldoccode} +method serve_message : + (string -> XmlRpc.value list -> XmlRpc.value) -> + XmlRpc.message -> XmlRpc.message +\end{ocamldoccode} +\index{serve-underscoremessage@\verb`serve_message`} +\begin{ocamldocdescription} +Like {\tt{serve}}, but operates on messages instead of strings. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.register}\begin{ocamldoccode} +method register : + string -> + ?help:string -> + ?signature:XmlRpcServer.param_type list -> + ?signatures:XmlRpcServer.param_type list list -> + (XmlRpc.value list -> XmlRpc.value) -> unit +\end{ocamldoccode} +\index{register@\verb`register`} +\begin{ocamldocdescription} +Registers a method with the server. + + + If a {\tt{help}} string is specified, its contents will be returned for + calls to {\tt{system.methodHelp}} for this method. + + + If {\tt{signature}} is specified, this method's signature will be published + by {\tt{system.methodSignature}} and (shallow) type-checking will be enabled + for parameters passed into this method. + + + Multiple signatures can be supplied via {\tt{signatures}} if desired to + provide for overloaded methods. + + + Signatures are of the form {\tt{return-type; param1-type; param2-type; ...}} + where each type is an instance of the {\tt{XmlRpcServer.param\_type}}[\ref{type:XmlRpcServer.param-underscoretype}] variant. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.unregister}\begin{ocamldoccode} +method unregister : string -> unit +\end{ocamldoccode} +\index{unregister@\verb`unregister`} +\begin{ocamldocdescription} +Removes a method from the server. + + +\end{ocamldocdescription} + + +\label{method:XmlRpcServer.base.run}\begin{ocamldoccode} +method virtual run : unit -> unit +\end{ocamldoccode} +\index{run@\verb`run`} +\begin{ocamldocdescription} +Starts the main server process. + + +\end{ocamldocdescription} +\end{ocamldocobjectend} + + +\begin{ocamldocdescription} +Abstract base class for XmlRpc servers. + + +\end{ocamldocdescription} + + + + +\begin{ocamldoccode} +{\tt{class type server = }}\end{ocamldoccode} +\label{classtype:XmlRpcServer.server}\index{server@\verb`server`} + +\begin{ocamldocobjectend} + + +{\tt{inherit XmlRpcServer.base}} [\ref{class:XmlRpcServer.base}] + +\label{method:XmlRpcServer.server.run}\begin{ocamldoccode} +method run : unit -> unit +\end{ocamldoccode} +\index{run@\verb`run`} +\begin{ocamldocdescription} +Starts the main server process. + + +\end{ocamldocdescription} +\end{ocamldocobjectend} + + +\begin{ocamldocdescription} +Type of concrete XmlRpc server classes. + + +\end{ocamldocdescription} + + + + +\subsection{Server implementations} + + + + +\begin{ocamldoccode} +{\tt{class cgi : }}{\tt{unit -> }}{\tt{server}}\end{ocamldoccode} +\label{class:XmlRpcServer.cgi}\index{cgi@\verb`cgi`} + + + +\begin{ocamldocdescription} +CGI XmlRpc server based on Netcgi2. + + +\end{ocamldocdescription} + + + + +\begin{ocamldoccode} +{\tt{class netplex : }}{\tt{?parallelizer:Netplex\_types.parallelizer -> ?handler:string -> unit -> }}{\tt{server}}\end{ocamldoccode} +\label{class:XmlRpcServer.netplex}\index{netplex@\verb`netplex`} + + + +\begin{ocamldocdescription} +Stand-alone XmlRpc server based on Netplex. + + +\end{ocamldocdescription} + + + + +\subsection{Utility functions} + + + + +\label{val:XmlRpcServer.invalid-underscoremethod}\begin{ocamldoccode} +val invalid_method : string -> 'a +\end{ocamldoccode} +\index{invalid-underscoremethod@\verb`invalid_method`} +\begin{ocamldocdescription} +Raise an {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] indicating a method name not found. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcServer.invalid-underscoreparams}\begin{ocamldoccode} +val invalid_params : unit -> 'a +\end{ocamldoccode} +\index{invalid-underscoreparams@\verb`invalid_params`} +\begin{ocamldocdescription} +Raise an {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] indicating invalid method parameters. + + +\end{ocamldocdescription} + + +\section{Module {\tt{XmlRpcDateTime}} : Date/time type.} +\label{module:XmlRpcDateTime}\index{XmlRpcDateTime@\verb`XmlRpcDateTime`} + + + + +\ocamldocvspace{0.5cm} + + + +\subsection{Types} + + + + +\label{exception:XmlRpcDateTime.Parse-underscoreerror}\begin{ocamldoccode} +exception Parse_error of string +\end{ocamldoccode} +\index{Parse-underscoreerror@\verb`Parse_error`} +\begin{ocamldocdescription} +Raised by {\tt{XmlRpcDateTime.of\_string}}[\ref{val:XmlRpcDateTime.of-underscorestring}] if a string could not be parsed. The exception + contains the input string. + + +\end{ocamldocdescription} + + + + +\label{type:XmlRpcDateTime.t}\begin{ocamldoccode} +type t = int * int * int * int * int * int * int +\end{ocamldoccode} +\index{t@\verb`t`} +\begin{ocamldocdescription} +Type of XmlRpc-compatible date/time values. + (year, month, day, hour, minute, second, time zone offset in minutes) + + +\end{ocamldocdescription} + + + + +\subsection{Comparison} + + + + +\label{val:XmlRpcDateTime.compare}\begin{ocamldoccode} +val compare : t -> t -> int +\end{ocamldoccode} +\index{compare@\verb`compare`} +\begin{ocamldocdescription} +Standard comparator for date/time values. Converts all values to UTC + before comparing to ensure correct behavior with values of differing + time zones. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.equal}\begin{ocamldoccode} +val equal : t -> t -> bool +\end{ocamldoccode} +\index{equal@\verb`equal`} +\begin{ocamldocdescription} +Standard equality function for date/time values. Converts all values + to UTC before comparing. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.hash}\begin{ocamldoccode} +val hash : t -> int +\end{ocamldoccode} +\index{hash@\verb`hash`} +\begin{ocamldocdescription} +Standard hash function for date/time values. Converts values to UTC + before hashing. + + +\end{ocamldocdescription} + + + + +\subsection{Current date and time} + + + + +\label{val:XmlRpcDateTime.now}\begin{ocamldoccode} +val now : unit -> t +\end{ocamldoccode} +\index{now@\verb`now`} +\begin{ocamldocdescription} +Returns the current date and time in the local time zone. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.now-underscoreutc}\begin{ocamldoccode} +val now_utc : unit -> t +\end{ocamldoccode} +\index{now-underscoreutc@\verb`now_utc`} +\begin{ocamldocdescription} +Returns the current date and time in UTC. + + +\end{ocamldocdescription} + + + + +\subsection{Time zone adjustments} + + + + +\label{val:XmlRpcDateTime.set-underscoretz-underscoreoffset}\begin{ocamldoccode} +val set_tz_offset : int -> t -> t +\end{ocamldoccode} +\index{set-underscoretz-underscoreoffset@\verb`set_tz_offset`} +\begin{ocamldocdescription} +Adjusts the time zone offset, preserving equality. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.fix-underscoretz-underscoreoffset}\begin{ocamldoccode} +val fix_tz_offset : int -> t -> t +\end{ocamldoccode} +\index{fix-underscoretz-underscoreoffset@\verb`fix_tz_offset`} +\begin{ocamldocdescription} +Forces the time zone offset to a different value, ignoring all other + fields. Use this to correct the time zone of a date/time value that + was received without a time zone offset and is known not to be UTC. + + +\end{ocamldocdescription} + + + + +\subsection{Conversion} + + + + +\label{val:XmlRpcDateTime.from-underscoreunixfloat}\begin{ocamldoccode} +val from_unixfloat : float -> t +\end{ocamldoccode} +\index{from-underscoreunixfloat@\verb`from_unixfloat`} +\begin{ocamldocdescription} +Builds a date/time value from epoch seconds in the local time zone. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.from-underscoreunixfloat-underscoreutc}\begin{ocamldoccode} +val from_unixfloat_utc : float -> t +\end{ocamldoccode} +\index{from-underscoreunixfloat-underscoreutc@\verb`from_unixfloat_utc`} +\begin{ocamldocdescription} +Builds a date/time value from epoch seconds in UTC. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.to-underscoreunixfloat}\begin{ocamldoccode} +val to_unixfloat : t -> float +\end{ocamldoccode} +\index{to-underscoreunixfloat@\verb`to_unixfloat`} +\begin{ocamldocdescription} +Converts a date/time value to epoch seconds in the local time zone. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.to-underscoreunixfloat-underscoreutc}\begin{ocamldoccode} +val to_unixfloat_utc : t -> float +\end{ocamldoccode} +\index{to-underscoreunixfloat-underscoreutc@\verb`to_unixfloat_utc`} +\begin{ocamldocdescription} +Converts a date/time value to epoch seconds in UTC. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.from-underscoreunixtm}\begin{ocamldoccode} +val from_unixtm : Unix.tm -> t +\end{ocamldoccode} +\index{from-underscoreunixtm@\verb`from_unixtm`} +\begin{ocamldocdescription} +Builds a date/time value from a Unix.tm value in the local time zone. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.from-underscoreunixtm-underscoreutc}\begin{ocamldoccode} +val from_unixtm_utc : Unix.tm -> t +\end{ocamldoccode} +\index{from-underscoreunixtm-underscoreutc@\verb`from_unixtm_utc`} +\begin{ocamldocdescription} +Builds a date/time value from a Unix.tm value in UTC. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.to-underscoreunixtm}\begin{ocamldoccode} +val to_unixtm : t -> Unix.tm +\end{ocamldoccode} +\index{to-underscoreunixtm@\verb`to_unixtm`} +\begin{ocamldocdescription} +Converts a date/time value to a Unix.tm value in the local time zone. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.to-underscoreunixtm-underscoreutc}\begin{ocamldoccode} +val to_unixtm_utc : t -> Unix.tm +\end{ocamldoccode} +\index{to-underscoreunixtm-underscoreutc@\verb`to_unixtm_utc`} +\begin{ocamldocdescription} +Converts a date/time value to a Unix.tm value in UTC. + + +\end{ocamldocdescription} + + + + +\subsection{ISO-8601 parsing and generation} + + + + +\label{val:XmlRpcDateTime.of-underscorestring}\begin{ocamldoccode} +val of_string : string -> t +\end{ocamldoccode} +\index{of-underscorestring@\verb`of_string`} +\begin{ocamldocdescription} +Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcDateTime.to-underscorestring}\begin{ocamldoccode} +val to_string : t -> string +\end{ocamldoccode} +\index{to-underscorestring@\verb`to_string`} +\begin{ocamldocdescription} +Generates an ISO-8601 string from a date/time value. + + +\end{ocamldocdescription} + + +\section{Module {\tt{XmlRpcBase64}} : Base64 codec.} +\label{module:XmlRpcBase64}\index{XmlRpcBase64@\verb`XmlRpcBase64`} + + + + 8-bit characters are encoded into 6-bit ones using ASCII lookup tables. + Default tables maps 0..63 values on characters A-Z, a-z, 0-9, '+' and '/' + (in that order). + + + +\ocamldocvspace{0.5cm} + + + +\label{exception:XmlRpcBase64.Invalid-underscorechar}\begin{ocamldoccode} +exception Invalid_char +\end{ocamldoccode} +\index{Invalid-underscorechar@\verb`Invalid_char`} +\begin{ocamldocdescription} +This exception is raised when reading an invalid character + from a base64 input. + + +\end{ocamldocdescription} + + + + +\label{exception:XmlRpcBase64.Invalid-underscoretable}\begin{ocamldoccode} +exception Invalid_table +\end{ocamldoccode} +\index{Invalid-underscoretable@\verb`Invalid_table`} +\begin{ocamldocdescription} +This exception is raised if the encoding or decoding table + size is not correct. + + +\end{ocamldocdescription} + + + + +\label{type:XmlRpcBase64.encoding-underscoretable}\begin{ocamldoccode} +type encoding_table = char array +\end{ocamldoccode} +\index{encoding-underscoretable@\verb`encoding_table`} +\begin{ocamldocdescription} +An encoding table maps integers 0..63 to the corresponding char. + + +\end{ocamldocdescription} + + + + +\label{type:XmlRpcBase64.decoding-underscoretable}\begin{ocamldoccode} +type decoding_table = int array +\end{ocamldoccode} +\index{decoding-underscoretable@\verb`decoding_table`} +\begin{ocamldocdescription} +A decoding table maps chars 0..255 to the corresponding 0..63 value + or -1 if the char is not accepted. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcBase64.str-underscoreencode}\begin{ocamldoccode} +val str_encode : ?tbl:encoding_table -> string -> string +\end{ocamldoccode} +\index{str-underscoreencode@\verb`str_encode`} +\begin{ocamldocdescription} +Encode a string into Base64. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcBase64.str-underscoredecode}\begin{ocamldoccode} +val str_decode : ?tbl:decoding_table -> string -> string +\end{ocamldoccode} +\index{str-underscoredecode@\verb`str_decode`} +\begin{ocamldocdescription} +Decode a string encoded into Base64, raise {\tt{Invalid\_char}} if a + character in the input string is not a valid one. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcBase64.encode}\begin{ocamldoccode} +val encode : ?tbl:encoding_table -> char Stream.t -> char Stream.t +\end{ocamldoccode} +\index{encode@\verb`encode`} +\begin{ocamldocdescription} +Generic base64 encoding over a character stream. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcBase64.decode}\begin{ocamldoccode} +val decode : ?tbl:decoding_table -> char Stream.t -> char Stream.t +\end{ocamldoccode} +\index{decode@\verb`decode`} +\begin{ocamldocdescription} +Generic base64 decoding over a character stream. + + +\end{ocamldocdescription} + + + + +\label{val:XmlRpcBase64.make-underscoredecoding-underscoretable}\begin{ocamldoccode} +val make_decoding_table : encoding_table -> decoding_table +\end{ocamldoccode} +\index{make-underscoredecoding-underscoretable@\verb`make_decoding_table`} +\begin{ocamldocdescription} +Create a valid decoding table from an encoding one. + + +\end{ocamldocdescription} + + +\end{document} \ No newline at end of file diff --git a/doc/xmlrpc-light/latex/doc.toc b/doc/xmlrpc-light/latex/doc.toc new file mode 100644 index 0000000..e36b64e --- /dev/null +++ b/doc/xmlrpc-light/latex/doc.toc @@ -0,0 +1,17 @@ +\contentsline {section}{\numberline {1}Module {\tt {XmlRpc}} : XmlRpc Light.}{1} +\contentsline {subsection}{\numberline {1.1}High-level interface}{1} +\contentsline {subsection}{\numberline {1.2}Utility functions}{6} +\contentsline {subsection}{\numberline {1.3}Low-level interface}{6} +\contentsline {subsection}{\numberline {1.4}Server tools}{7} +\contentsline {section}{\numberline {2}Module {\tt {XmlRpcServer}} : XmlRpc Light server.}{8} +\contentsline {subsection}{\numberline {2.1}Base classes}{9} +\contentsline {subsection}{\numberline {2.2}Server implementations}{11} +\contentsline {subsection}{\numberline {2.3}Utility functions}{11} +\contentsline {section}{\numberline {3}Module {\tt {XmlRpcDateTime}} : Date/time type.}{11} +\contentsline {subsection}{\numberline {3.1}Types}{11} +\contentsline {subsection}{\numberline {3.2}Comparison}{11} +\contentsline {subsection}{\numberline {3.3}Current date and time}{12} +\contentsline {subsection}{\numberline {3.4}Time zone adjustments}{12} +\contentsline {subsection}{\numberline {3.5}Conversion}{12} +\contentsline {subsection}{\numberline {3.6}ISO-8601 parsing and generation}{13} +\contentsline {section}{\numberline {4}Module {\tt {XmlRpcBase64}} : Base64 codec.}{13} diff --git a/doc/xmlrpc-light/latex/ocamldoc.sty b/doc/xmlrpc-light/latex/ocamldoc.sty new file mode 100644 index 0000000..b176c9b --- /dev/null +++ b/doc/xmlrpc-light/latex/ocamldoc.sty @@ -0,0 +1,75 @@ + +%% Support macros for LaTeX documentation generated by ocamldoc. +%% This file is in the public domain; do what you want with it. + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ocamldoc} + [2001/12/04 v1.0 ocamldoc support] + +\newenvironment{ocamldoccode}{% + \bgroup + \leftskip\@totalleftmargin + \rightskip\z@skip + \parindent\z@ + \parfillskip\@flushglue + \parskip\z@skip + %\noindent + \@@par\smallskip + \@tempswafalse + \def\par{% + \if@tempswa + \leavevmode\null\@@par\penalty\interlinepenalty + \else + \@tempswatrue + \ifhmode\@@par\penalty\interlinepenalty\fi + \fi} + \obeylines + \verbatim@font + \let\org@prime~% + \@noligs + \let\org@dospecials\dospecials + \g@remfrom@specials{\\} + \g@remfrom@specials{\{} + \g@remfrom@specials{\}} + \let\do\@makeother + \dospecials + \let\dospecials\org@dospecials + \frenchspacing\@vobeyspaces + \everypar \expandafter{\the\everypar \unpenalty}} +{\egroup\par} + +\def\g@remfrom@specials#1{% + \def\@new@specials{} + \def\@remove##1{% + \ifx##1#1\else + \g@addto@macro\@new@specials{\do ##1}\fi} + \let\do\@remove\dospecials + \let\dospecials\@new@specials + } + +\newenvironment{ocamldocdescription} +{\list{}{\rightmargin0pt \topsep0pt}\raggedright\item\noindent\relax\ignorespaces} +{\endlist\medskip} + +\newenvironment{ocamldoccomment} +{\list{}{\leftmargin 2\leftmargini \rightmargin0pt \topsep0pt}\raggedright\item\noindent\relax} +{\endlist} + +\let \ocamldocparagraph \paragraph +\def \paragraph #1{\ocamldocparagraph {#1}\noindent} +\let \ocamldocsubparagraph \subparagraph +\def \subparagraph #1{\ocamldocsubparagraph {#1}\noindent} + +\let\ocamldocvspace\vspace + +\newenvironment{ocamldocindent}{\list{}{}\item\relax}{\endlist} +\newenvironment{ocamldocsigend} + {\noindent\quad\texttt{sig}\ocamldocindent} + {\endocamldocindent\vskip -\lastskip + \noindent\quad\texttt{end}\medskip} +\newenvironment{ocamldocobjectend} + {\noindent\quad\texttt{object}\ocamldocindent} + {\endocamldocindent\vskip -\lastskip + \noindent\quad\texttt{end}\medskip} + +\endinput diff --git a/examples/README.txt b/examples/README.txt new file mode 100644 index 0000000..9ef0b22 --- /dev/null +++ b/examples/README.txt @@ -0,0 +1,9 @@ +XmlRpc Light, a small XmlRpc client based on Xml Light and Ocamlnet +=================================================================== + +Source code examples: + + - adder: simple XmlRpcServer example, adds two numbers + - genclient: code generation tool using introspection methods + - ubigraph: bindings to Ubigraph visualization tool + - wordpress: client interface for WordPress blog API diff --git a/examples/adder/Makefile b/examples/adder/Makefile new file mode 100644 index 0000000..0504c93 --- /dev/null +++ b/examples/adder/Makefile @@ -0,0 +1,9 @@ +OCAMLMAKEFILE = OCamlMakefile + +RESULT = adder +SOURCES = adder.ml +PACKS = xmlrpc-light,nethttpd-for-netcgi2 + +all: native-code + +include $(OCAMLMAKEFILE) diff --git a/examples/adder/OCamlMakefile b/examples/adder/OCamlMakefile new file mode 100644 index 0000000..6f62c91 --- /dev/null +++ b/examples/adder/OCamlMakefile @@ -0,0 +1,1154 @@ +########################################################################### +# OCamlMakefile +# Copyright (C) 1999-2004 Markus Mottl +# +# For updates see: +# http://www.ocaml.info/home/ocaml_sources.html +# +# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $ +# +########################################################################### + +# Modified by damien for .glade.ml compilation + +# Set these variables to the names of the sources to be processed and +# the result variable. Order matters during linkage! + +ifndef SOURCES + SOURCES := foo.ml +endif +export SOURCES + +ifndef RES_CLIB_SUF + RES_CLIB_SUF := _stubs +endif +export RES_CLIB_SUF + +ifndef RESULT + RESULT := foo +endif +export RESULT + +export LIB_PACK_NAME + +ifndef DOC_FILES + DOC_FILES := $(filter %.mli, $(SOURCES)) +endif +export DOC_FILES + +export BCSUFFIX +export NCSUFFIX + +ifndef TOPSUFFIX + TOPSUFFIX := .top +endif +export TOPSUFFIX + +# Eventually set include- and library-paths, libraries to link, +# additional compilation-, link- and ocamlyacc-flags +# Path- and library information needs not be written with "-I" and such... +# Define THREADS if you need it, otherwise leave it unset (same for +# USE_CAMLP4)! + +export THREADS +export VMTHREADS +export ANNOTATE +export USE_CAMLP4 + +export INCDIRS +export LIBDIRS +export EXTLIBDIRS +export RESULTDEPS +export OCAML_DEFAULT_DIRS + +export LIBS +export CLIBS + +export OCAMLFLAGS +export OCAMLNCFLAGS +export OCAMLBCFLAGS + +export OCAMLLDFLAGS +export OCAMLNLDFLAGS +export OCAMLBLDFLAGS + +ifndef OCAMLCPFLAGS + OCAMLCPFLAGS := a +endif + +export OCAMLCPFLAGS + +export PPFLAGS + +export YFLAGS +export IDLFLAGS + +export OCAMLDOCFLAGS + +export OCAMLFIND_INSTFLAGS + +export DVIPSFLAGS + +export STATIC + +# Add a list of optional trash files that should be deleted by "make clean" +export TRASH + +#################### variables depending on your OCaml-installation + +ifdef MINGW + export MINGW + WIN32 := 1 + CFLAGS_WIN32 := -mno-cygwin +endif +ifdef MSVC + export MSVC + WIN32 := 1 + ifndef STATIC + CPPFLAGS_WIN32 := -DCAML_DLL + endif + CFLAGS_WIN32 += -nologo + EXT_OBJ := obj + EXT_LIB := lib + ifeq ($(CC),gcc) + # work around GNU Make default value + ifdef THREADS + CC := cl -MT + else + CC := cl + endif + endif + ifeq ($(CXX),g++) + # work around GNU Make default value + CXX := $(CC) + endif + CFLAG_O := -Fo +endif +ifdef WIN32 + EXT_CXX := cpp + EXE := .exe +endif + +ifndef EXT_OBJ + EXT_OBJ := o +endif +ifndef EXT_LIB + EXT_LIB := a +endif +ifndef EXT_CXX + EXT_CXX := cc +endif +ifndef EXE + EXE := # empty +endif +ifndef CFLAG_O + CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! +endif + +export CC +export CXX +export CFLAGS +export CXXFLAGS +export LDFLAGS +export CPPFLAGS + +ifndef RPATH_FLAG + RPATH_FLAG := -R +endif +export RPATH_FLAG + +ifndef MSVC +ifndef PIC_CFLAGS + PIC_CFLAGS := -fPIC +endif +ifndef PIC_CPPFLAGS + PIC_CPPFLAGS := -DPIC +endif +endif + +export PIC_CFLAGS +export PIC_CPPFLAGS + +BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) +NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) +TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) + +ifndef OCAMLFIND + OCAMLFIND := ocamlfind +endif +export OCAMLFIND + +ifndef OCAMLC + OCAMLC := ocamlc +endif +export OCAMLC + +ifndef OCAMLOPT + OCAMLOPT := ocamlopt +endif +export OCAMLOPT + +ifndef OCAMLMKTOP + OCAMLMKTOP := ocamlmktop +endif +export OCAMLMKTOP + +ifndef OCAMLCP + OCAMLCP := ocamlcp +endif +export OCAMLCP + +ifndef OCAMLDEP + OCAMLDEP := ocamldep +endif +export OCAMLDEP + +ifndef OCAMLLEX + OCAMLLEX := ocamllex +endif +export OCAMLLEX + +ifndef OCAMLYACC + OCAMLYACC := ocamlyacc +endif +export OCAMLYACC + +ifndef OCAMLMKLIB + OCAMLMKLIB := ocamlmklib +endif +export OCAMLMKLIB + +ifndef OCAML_GLADECC + OCAML_GLADECC := lablgladecc2 +endif +export OCAML_GLADECC + +ifndef OCAML_GLADECC_FLAGS + OCAML_GLADECC_FLAGS := +endif +export OCAML_GLADECC_FLAGS + +ifndef CAMELEON_REPORT + CAMELEON_REPORT := report +endif +export CAMELEON_REPORT + +ifndef CAMELEON_REPORT_FLAGS + CAMELEON_REPORT_FLAGS := +endif +export CAMELEON_REPORT_FLAGS + +ifndef CAMELEON_ZOGGY + CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo +endif +export CAMELEON_ZOGGY + +ifndef CAMELEON_ZOGGY_FLAGS + CAMELEON_ZOGGY_FLAGS := +endif +export CAMELEON_ZOGGY_FLAGS + +ifndef OXRIDL + OXRIDL := oxridl +endif +export OXRIDL + +ifndef CAMLIDL + CAMLIDL := camlidl +endif +export CAMLIDL + +ifndef CAMLIDLDLL + CAMLIDLDLL := camlidldll +endif +export CAMLIDLDLL + +ifndef NOIDLHEADER + MAYBE_IDL_HEADER := -header +endif +export NOIDLHEADER + +export NO_CUSTOM + +ifndef CAMLP4 + CAMLP4 := camlp4 +endif +export CAMLP4 + +ifndef REAL_OCAMLFIND + ifdef PACKS + ifndef CREATE_LIB + ifdef THREADS + PACKS += threads + endif + endif + empty := + space := $(empty) $(empty) + comma := , + ifdef PREDS + PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) + PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) + OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) + # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) + OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + else + OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) + OCAML_DEP_PACKAGES := + endif + OCAML_FIND_LINKPKG := -linkpkg + REAL_OCAMLFIND := $(OCAMLFIND) + endif +endif + +export OCAML_FIND_PACKAGES +export OCAML_DEP_PACKAGES +export OCAML_FIND_LINKPKG +export REAL_OCAMLFIND + +ifndef OCAMLDOC + OCAMLDOC := ocamldoc +endif +export OCAMLDOC + +ifndef LATEX + LATEX := latex +endif +export LATEX + +ifndef DVIPS + DVIPS := dvips +endif +export DVIPS + +ifndef PS2PDF + PS2PDF := ps2pdf +endif +export PS2PDF + +ifndef OCAMLMAKEFILE + OCAMLMAKEFILE := OCamlMakefile +endif +export OCAMLMAKEFILE + +ifndef OCAMLLIBPATH + OCAMLLIBPATH := \ + $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) +endif +export OCAMLLIBPATH + +ifndef OCAML_LIB_INSTALL + OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib +endif +export OCAML_LIB_INSTALL + +########################################################################### + +#################### change following sections only if +#################### you know what you are doing! + +# delete target files when a build command fails +.PHONY: .DELETE_ON_ERROR +.DELETE_ON_ERROR: + +# for pedants using "--warn-undefined-variables" +export MAYBE_IDL +export REAL_RESULT +export CAMLIDLFLAGS +export THREAD_FLAG +export RES_CLIB +export MAKEDLL +export ANNOT_FLAG +export C_OXRIDL +export SUBPROJS +export CFLAGS_WIN32 +export CPPFLAGS_WIN32 + +INCFLAGS := + +SHELL := /bin/sh + +MLDEPDIR := ._d +BCDIDIR := ._bcdi +NCDIDIR := ._ncdi + +FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade + +FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) +SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) + +FILTERED_REP := $(filter %.rep, $(FILTERED)) +DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) +AUTO_REP := $(FILTERED_REP:.rep=.ml) + +FILTERED_ZOG := $(filter %.zog, $(FILTERED)) +DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) +AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) + +FILTERED_GLADE := $(filter %.glade, $(FILTERED)) +DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) +AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) + +FILTERED_ML := $(filter %.ml, $(FILTERED)) +DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) + +FILTERED_MLI := $(filter %.mli, $(FILTERED)) +DEP_MLI := $(FILTERED_MLI:.mli=.di) + +FILTERED_MLL := $(filter %.mll, $(FILTERED)) +DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) +AUTO_MLL := $(FILTERED_MLL:.mll=.ml) + +FILTERED_MLY := $(filter %.mly, $(FILTERED)) +DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) +AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) + +FILTERED_IDL := $(filter %.idl, $(FILTERED)) +DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) +C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) +ifndef NOIDLHEADER + C_IDL += $(FILTERED_IDL:.idl=.h) +endif +OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) +AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) + +FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) +DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) +AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) + +FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED)) +OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) +OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) + +PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) + +ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) + +MLDEPS := $(filter %.d, $(ALL_DEPS)) +MLIDEPS := $(filter %.di, $(ALL_DEPS)) +BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) +NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) + +ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) + +IMPLO_INTF := $(ALLML:%.mli=%.mli.__) +IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ + $(basename $(file)).cmi $(basename $(file)).cmo) +IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) +IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) + +IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) + +INTF := $(filter %.cmi, $(IMPLO_INTF)) +IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) +IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) +IMPL_ASM := $(IMPL_CMO:.cmo=.asm) +IMPL_S := $(IMPL_CMO:.cmo=.s) + +OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) +OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) + +EXECS := $(addsuffix $(EXE), \ + $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) +ifdef WIN32 + EXECS += $(BCRESULT).dll $(NCRESULT).dll +endif + +CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) +ifneq ($(strip $(OBJ_LINK)),) + RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) +endif + +ifdef WIN32 +DLLSONAME := $(CLIB_BASE).dll +else +DLLSONAME := dll$(CLIB_BASE).so +endif + +NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ + $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ + $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ + $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ + $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ + $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o + +ifndef STATIC + NONEXECS += $(DLLSONAME) +endif + +ifndef LIBINSTALL_FILES + LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ + $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + LIBINSTALL_FILES += $(DLLSONAME) + endif + endif +endif + +export LIBINSTALL_FILES + +ifdef WIN32 + # some extra stuff is created while linking DLLs + NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib +endif + +TARGETS := $(EXECS) $(NONEXECS) + +# If there are IDL-files +ifneq ($(strip $(FILTERED_IDL)),) + MAYBE_IDL := -cclib -lcamlidl +endif + +ifdef USE_CAMLP4 + CAMLP4PATH := \ + $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) + INCFLAGS := -I $(CAMLP4PATH) + CINCFLAGS := -I$(CAMLP4PATH) +endif + +DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) +INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) +CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) + +ifndef MSVC +CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ + $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-L%) +endif + +ifndef PROFILING + INTF_OCAMLC := $(OCAMLC) +else + ifndef THREADS + INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) + else + # OCaml does not support profiling byte code + # with threads (yet), therefore we force an error. + ifndef REAL_OCAMLC + $(error Profiling of multithreaded byte code not yet supported by OCaml) + endif + INTF_OCAMLC := $(OCAMLC) + endif +endif + +ifndef MSVC +COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ + $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ + $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-ccopt -L%) +else +COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ + $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ + $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " +endif + +CLIBS_OPTS := $(CLIBS:%=-cclib -l%) +ifdef MSVC + ifndef STATIC + # MSVC libraries do not have 'lib' prefix + CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) + endif +endif + +ifneq ($(strip $(OBJ_LINK)),) + ifdef CREATE_LIB + OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) + else + OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) + endif +else + OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) +endif + +# If we have to make byte-code +ifndef REAL_OCAMLC + BYTE_OCAML := y + + # EXTRADEPS is added dependencies we have to insert for all + # executable files we generate. Ideally it should be all of the + # libraries we use, but it's hard to find the ones that get searched on + # the path since I don't know the paths built into the compiler, so + # just include the ones with slashes in their names. + EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) + + REAL_OCAMLC := $(INTF_OCAMLC) + + REAL_IMPL := $(IMPL_CMO) + REAL_IMPL_INTF := $(IMPLO_INTF) + IMPL_SUF := .cmo + + DEPFLAGS := + MAKE_DEPS := $(MLDEPS) $(BCDEPIS) + + ifdef CREATE_LIB + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + MAKEDLL := $(DLLSONAME) + ALL_LDFLAGS := -dllib $(DLLSONAME) + endif + endif + endif + + ifndef NO_CUSTOM + ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" "" + ALL_LDFLAGS += -custom + endif + endif + + ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ + $(COMMON_LDFLAGS) $(LIBS:%=%.cma) + CAMLIDLDLLFLAGS := + + ifdef THREADS + ifdef VMTHREADS + THREAD_FLAG := -vmthread + else + THREAD_FLAG := -thread + endif + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) + endif + endif + endif + +# we have to make native-code +else + EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + ifndef PROFILING + SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) + PLDFLAGS := + else + SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) + PLDFLAGS := -p + endif + + REAL_IMPL := $(IMPL_CMX) + REAL_IMPL_INTF := $(IMPLX_INTF) + IMPL_SUF := .cmx + + override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) + + DEPFLAGS := -native + MAKE_DEPS := $(MLDEPS) $(NCDEPIS) + + ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ + $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) + CAMLIDLDLLFLAGS := -opt + + ifndef CREATE_LIB + ALL_LDFLAGS += $(LIBS:%=%.cmxa) + else + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + endif + + ifdef THREADS + THREAD_FLAG := -thread + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) + endif + endif + endif +endif + +export MAKE_DEPS + +ifdef ANNOTATE + ANNOT_FLAG := -dtypes +else +endif + +ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ + $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) + +ifdef make_deps + -include $(MAKE_DEPS) + PRE_TARGETS := +endif + +########################################################################### +# USER RULES + +# Call "OCamlMakefile QUIET=" to get rid of all of the @'s. +QUIET=@ + +# generates byte-code (default) +byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bc: byte-code + +byte-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bcnl: byte-code-nolink + +top: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes + +# generates native-code + +native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +nc: native-code + +native-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncnl: native-code-nolink + +# generates byte-code libraries +byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" \ + CREATE_LIB=yes \ + make_deps=yes +bcl: byte-code-library + +# generates native-code libraries +native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +ncl: native-code-library + +ifdef WIN32 +# generates byte-code dll +byte-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).dll \ + REAL_RESULT="$(BCRESULT)" \ + make_deps=yes +bcd: byte-code-dll + +# generates native-code dll +native-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).dll \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncd: native-code-dll +endif + +# generates byte-code with debugging information +debug-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dc: debug-code + +debug-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcnl: debug-code-nolink + +# generates byte-code libraries with debugging information +debug-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + CREATE_LIB=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcl: debug-code-library + +# generates byte-code for profiling +profiling-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + make_deps=yes +pbc: profiling-byte-code + +# generates native-code + +profiling-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PROFILING="y" \ + make_deps=yes +pnc: profiling-native-code + +# generates byte-code libraries +profiling-byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + CREATE_LIB=yes \ + make_deps=yes +pbcl: profiling-byte-code-library + +# generates native-code libraries +profiling-native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" PROFILING="y" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +pncl: profiling-native-code-library + +# packs byte-code objects +pack-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ + REAL_RESULT="$(BCRESULT)" \ + PACK_LIB=yes make_deps=yes +pabc: pack-byte-code + +# packs native-code objects +pack-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(NCRESULT).cmx $(NCRESULT).o \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PACK_LIB=yes make_deps=yes +panc: pack-native-code + +# generates HTML-documentation +htdoc: doc/$(RESULT)/html + +# generates Latex-documentation +ladoc: doc/$(RESULT)/latex + +# generates PostScript-documentation +psdoc: doc/$(RESULT)/latex/doc.ps + +# generates PDF-documentation +pdfdoc: doc/$(RESULT)/latex/doc.pdf + +# generates all supported forms of documentation +doc: htdoc ladoc psdoc pdfdoc + +########################################################################### +# LOW LEVEL RULES + +$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) + +ifdef WIN32 +$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) + $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ + -o $@ $(REAL_IMPL) +endif + +%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ + .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \ + .rep .zog .glade + +ifndef STATIC +ifdef MINGW +$(DLLSONAME): $(OBJ_LINK) + $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ + -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ + $(OCAMLLIBPATH)/ocamlrun.a \ + -Wl,--export-all-symbols \ + -Wl,--no-whole-archive +else +ifdef MSVC +$(DLLSONAME): $(OBJ_LINK) + link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ + $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ + $(OCAMLLIBPATH)/ocamlrun.lib + +else +$(DLLSONAME): $(OBJ_LINK) + $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ + -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \ + $(OCAMLMKLIB_FLAGS) +endif +endif +endif + +ifndef LIB_PACK_NAME +$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL) + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL) +else +ifdef BYTE_OCAML +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL) +else +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL) +endif + +$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx +endif + +$(RES_CLIB): $(OBJ_LINK) +ifndef MSVC + ifneq ($(strip $(OBJ_LINK)),) + $(AR) rcs $@ $(OBJ_LINK) + endif +else + ifneq ($(strip $(OBJ_LINK)),) + lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) + endif +endif + +.mli.cmi: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + fi + +.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ + fi + +ifdef PACK_LIB +$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(REAL_IMPL) +endif + +.PRECIOUS: %.ml +%.ml: %.mll + $(OCAMLLEX) $< + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.mly + $(OCAMLYACC) $(YFLAGS) $< + $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ + if [ ! -z "$$pp" ]; then \ + mv $*.ml $*.ml.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ + cat $*.ml.temporary >> $*.ml; \ + rm $*.ml.temporary; \ + mv $*.mli $*.mli.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ + cat $*.mli.temporary >> $*.mli; \ + rm $*.mli.temporary; \ + fi + + +.PRECIOUS: %.ml +%.ml: %.rep + $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< + +.PRECIOUS: %.ml +%.ml: %.zog + $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ + +.PRECIOUS: %.ml +%.ml: %.glade + $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.oxridl + $(OXRIDL) $< + +.PRECIOUS: %.ml %.mli %_stubs.c %.h +%.ml %.mli %_stubs.c %.h: %.idl + $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ + $(CAMLIDLFLAGS) $< + $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi + +.c.$(EXT_OBJ): + $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ + $(CPPFLAGS) $(CPPFLAGS_WIN32) \ + $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< + +.$(EXT_CXX).$(EXT_OBJ): + $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ + -I'$(OCAMLLIBPATH)' \ + $< $(CFLAG_O)$@ + +$(MLDEPDIR)/%.d: %.ml + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +doc/$(RESULT)/html: $(DOC_FILES) + rm -rf $@ + mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + fi + +doc/$(RESULT)/latex: $(DOC_FILES) + rm -rf $@ + mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ + $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ + -o $@/doc.tex; \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + fi + +doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex + cd doc/$(RESULT)/latex && \ + $(LATEX) doc.tex && \ + $(LATEX) doc.tex && \ + $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) + +doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps + cd doc/$(RESULT)/latex && $(PS2PDF) $( `Int (x + y) + | [`Int x; `Double y] -> `Double (float_of_int x +. y) + | [`Double x; `Int y] -> `Double (x +. float_of_int y) + | [`Double x; `Double y] -> `Double (x +. y) + | [`String x; `String y] -> `Double (float_of_string x + +. float_of_string y) + | _ -> XmlRpcServer.invalid_params ()); + server#run () diff --git a/examples/adder/run.sh b/examples/adder/run.sh new file mode 100755 index 0000000..c7aff26 --- /dev/null +++ b/examples/adder/run.sh @@ -0,0 +1,2 @@ +#!/bin/sh +./adder -conf adder.conf diff --git a/examples/genclient/Makefile b/examples/genclient/Makefile new file mode 100644 index 0000000..2eb0e03 --- /dev/null +++ b/examples/genclient/Makefile @@ -0,0 +1,7 @@ +OCAMLMAKEFILE = OCamlMakefile + +RESULT = genclient +SOURCES = genclient.ml +PACKS = xmlrpc-light + +include $(OCAMLMAKEFILE) diff --git a/examples/genclient/OCamlMakefile b/examples/genclient/OCamlMakefile new file mode 100644 index 0000000..9adb295 --- /dev/null +++ b/examples/genclient/OCamlMakefile @@ -0,0 +1,1154 @@ +########################################################################### +# OCamlMakefile +# Copyright (C) 1999-2004 Markus Mottl +# +# For updates see: +# http://www.ocaml.info/home/ocaml_sources.html +# +# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $ +# +########################################################################### + +# Modified by damien for .glade.ml compilation + +# Set these variables to the names of the sources to be processed and +# the result variable. Order matters during linkage! + +ifndef SOURCES + SOURCES := foo.ml +endif +export SOURCES + +ifndef RES_CLIB_SUF + RES_CLIB_SUF := _stubs +endif +export RES_CLIB_SUF + +ifndef RESULT + RESULT := foo +endif +export RESULT + +export LIB_PACK_NAME + +ifndef DOC_FILES + DOC_FILES := $(filter %.mli, $(SOURCES)) +endif +export DOC_FILES + +export BCSUFFIX +export NCSUFFIX + +ifndef TOPSUFFIX + TOPSUFFIX := .top +endif +export TOPSUFFIX + +# Eventually set include- and library-paths, libraries to link, +# additional compilation-, link- and ocamlyacc-flags +# Path- and library information needs not be written with "-I" and such... +# Define THREADS if you need it, otherwise leave it unset (same for +# USE_CAMLP4)! + +export THREADS +export VMTHREADS +export ANNOTATE +export USE_CAMLP4 + +export INCDIRS +export LIBDIRS +export EXTLIBDIRS +export RESULTDEPS +export OCAML_DEFAULT_DIRS + +export LIBS +export CLIBS + +export OCAMLFLAGS +export OCAMLNCFLAGS +export OCAMLBCFLAGS + +export OCAMLLDFLAGS +export OCAMLNLDFLAGS +export OCAMLBLDFLAGS + +ifndef OCAMLCPFLAGS + OCAMLCPFLAGS := a +endif + +export OCAMLCPFLAGS + +export PPFLAGS + +export YFLAGS +export IDLFLAGS + +export OCAMLDOCFLAGS + +export OCAMLFIND_INSTFLAGS + +export DVIPSFLAGS + +export STATIC + +# Add a list of optional trash files that should be deleted by "make clean" +export TRASH + +#################### variables depending on your OCaml-installation + +ifdef MINGW + export MINGW + WIN32 := 1 + CFLAGS_WIN32 := -mno-cygwin +endif +ifdef MSVC + export MSVC + WIN32 := 1 + ifndef STATIC + CPPFLAGS_WIN32 := -DCAML_DLL + endif + CFLAGS_WIN32 += -nologo + EXT_OBJ := obj + EXT_LIB := lib + ifeq ($(CC),gcc) + # work around GNU Make default value + ifdef THREADS + CC := cl -MT + else + CC := cl + endif + endif + ifeq ($(CXX),g++) + # work around GNU Make default value + CXX := $(CC) + endif + CFLAG_O := -Fo +endif +ifdef WIN32 + EXT_CXX := cpp + EXE := .exe +endif + +ifndef EXT_OBJ + EXT_OBJ := o +endif +ifndef EXT_LIB + EXT_LIB := a +endif +ifndef EXT_CXX + EXT_CXX := cc +endif +ifndef EXE + EXE := # empty +endif +ifndef CFLAG_O + CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! +endif + +export CC +export CXX +export CFLAGS +export CXXFLAGS +export LDFLAGS +export CPPFLAGS + +ifndef RPATH_FLAG + RPATH_FLAG := -R +endif +export RPATH_FLAG + +ifndef MSVC +ifndef PIC_CFLAGS + PIC_CFLAGS := -fPIC +endif +ifndef PIC_CPPFLAGS + PIC_CPPFLAGS := -DPIC +endif +endif + +export PIC_CFLAGS +export PIC_CPPFLAGS + +BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) +NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) +TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) + +ifndef OCAMLFIND + OCAMLFIND := ocamlfind +endif +export OCAMLFIND + +ifndef OCAMLC + OCAMLC := ocamlc +endif +export OCAMLC + +ifndef OCAMLOPT + OCAMLOPT := ocamlopt +endif +export OCAMLOPT + +ifndef OCAMLMKTOP + OCAMLMKTOP := ocamlmktop +endif +export OCAMLMKTOP + +ifndef OCAMLCP + OCAMLCP := ocamlcp +endif +export OCAMLCP + +ifndef OCAMLDEP + OCAMLDEP := ocamldep +endif +export OCAMLDEP + +ifndef OCAMLLEX + OCAMLLEX := ocamllex +endif +export OCAMLLEX + +ifndef OCAMLYACC + OCAMLYACC := ocamlyacc +endif +export OCAMLYACC + +ifndef OCAMLMKLIB + OCAMLMKLIB := ocamlmklib +endif +export OCAMLMKLIB + +ifndef OCAML_GLADECC + OCAML_GLADECC := lablgladecc2 +endif +export OCAML_GLADECC + +ifndef OCAML_GLADECC_FLAGS + OCAML_GLADECC_FLAGS := +endif +export OCAML_GLADECC_FLAGS + +ifndef CAMELEON_REPORT + CAMELEON_REPORT := report +endif +export CAMELEON_REPORT + +ifndef CAMELEON_REPORT_FLAGS + CAMELEON_REPORT_FLAGS := +endif +export CAMELEON_REPORT_FLAGS + +ifndef CAMELEON_ZOGGY + CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo +endif +export CAMELEON_ZOGGY + +ifndef CAMELEON_ZOGGY_FLAGS + CAMELEON_ZOGGY_FLAGS := +endif +export CAMELEON_ZOGGY_FLAGS + +ifndef OXRIDL + OXRIDL := oxridl +endif +export OXRIDL + +ifndef CAMLIDL + CAMLIDL := camlidl +endif +export CAMLIDL + +ifndef CAMLIDLDLL + CAMLIDLDLL := camlidldll +endif +export CAMLIDLDLL + +ifndef NOIDLHEADER + MAYBE_IDL_HEADER := -header +endif +export NOIDLHEADER + +export NO_CUSTOM + +ifndef CAMLP4 + CAMLP4 := camlp4 +endif +export CAMLP4 + +ifndef REAL_OCAMLFIND + ifdef PACKS + ifndef CREATE_LIB + ifdef THREADS + PACKS += threads + endif + endif + empty := + space := $(empty) $(empty) + comma := , + ifdef PREDS + PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) + PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) + OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) + # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) + OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + else + OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) + OCAML_DEP_PACKAGES := + endif + OCAML_FIND_LINKPKG := -linkpkg + REAL_OCAMLFIND := $(OCAMLFIND) + endif +endif + +export OCAML_FIND_PACKAGES +export OCAML_DEP_PACKAGES +export OCAML_FIND_LINKPKG +export REAL_OCAMLFIND + +ifndef OCAMLDOC + OCAMLDOC := ocamldoc +endif +export OCAMLDOC + +ifndef LATEX + LATEX := latex +endif +export LATEX + +ifndef DVIPS + DVIPS := dvips +endif +export DVIPS + +ifndef PS2PDF + PS2PDF := ps2pdf +endif +export PS2PDF + +ifndef OCAMLMAKEFILE + OCAMLMAKEFILE := OCamlMakefile +endif +export OCAMLMAKEFILE + +ifndef OCAMLLIBPATH + OCAMLLIBPATH := \ + $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) +endif +export OCAMLLIBPATH + +ifndef OCAML_LIB_INSTALL + OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib +endif +export OCAML_LIB_INSTALL + +########################################################################### + +#################### change following sections only if +#################### you know what you are doing! + +# delete target files when a build command fails +.PHONY: .DELETE_ON_ERROR +.DELETE_ON_ERROR: + +# for pedants using "--warn-undefined-variables" +export MAYBE_IDL +export REAL_RESULT +export CAMLIDLFLAGS +export THREAD_FLAG +export RES_CLIB +export MAKEDLL +export ANNOT_FLAG +export C_OXRIDL +export SUBPROJS +export CFLAGS_WIN32 +export CPPFLAGS_WIN32 + +INCFLAGS := + +SHELL := /bin/sh + +MLDEPDIR := ._d +BCDIDIR := ._bcdi +NCDIDIR := ._ncdi + +FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade + +FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) +SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) + +FILTERED_REP := $(filter %.rep, $(FILTERED)) +DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) +AUTO_REP := $(FILTERED_REP:.rep=.ml) + +FILTERED_ZOG := $(filter %.zog, $(FILTERED)) +DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) +AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) + +FILTERED_GLADE := $(filter %.glade, $(FILTERED)) +DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) +AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) + +FILTERED_ML := $(filter %.ml, $(FILTERED)) +DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) + +FILTERED_MLI := $(filter %.mli, $(FILTERED)) +DEP_MLI := $(FILTERED_MLI:.mli=.di) + +FILTERED_MLL := $(filter %.mll, $(FILTERED)) +DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) +AUTO_MLL := $(FILTERED_MLL:.mll=.ml) + +FILTERED_MLY := $(filter %.mly, $(FILTERED)) +DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) +AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) + +FILTERED_IDL := $(filter %.idl, $(FILTERED)) +DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) +C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) +ifndef NOIDLHEADER + C_IDL += $(FILTERED_IDL:.idl=.h) +endif +OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) +AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) + +FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) +DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) +AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) + +FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED)) +OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) +OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) + +PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) + +ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) + +MLDEPS := $(filter %.d, $(ALL_DEPS)) +MLIDEPS := $(filter %.di, $(ALL_DEPS)) +BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) +NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) + +ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) + +IMPLO_INTF := $(ALLML:%.mli=%.mli.__) +IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ + $(basename $(file)).cmi $(basename $(file)).cmo) +IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) +IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) + +IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) + +INTF := $(filter %.cmi, $(IMPLO_INTF)) +IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) +IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) +IMPL_ASM := $(IMPL_CMO:.cmo=.asm) +IMPL_S := $(IMPL_CMO:.cmo=.s) + +OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) +OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) + +EXECS := $(addsuffix $(EXE), \ + $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) +ifdef WIN32 + EXECS += $(BCRESULT).dll $(NCRESULT).dll +endif + +CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) +ifneq ($(strip $(OBJ_LINK)),) + RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) +endif + +ifdef WIN32 +DLLSONAME := $(CLIB_BASE).dll +else +DLLSONAME := dll$(CLIB_BASE).so +endif + +NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ + $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ + $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ + $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ + $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ + $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o + +ifndef STATIC + NONEXECS += $(DLLSONAME) +endif + +ifndef LIBINSTALL_FILES + LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ + $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + LIBINSTALL_FILES += $(DLLSONAME) + endif + endif +endif + +export LIBINSTALL_FILES + +ifdef WIN32 + # some extra stuff is created while linking DLLs + NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib +endif + +TARGETS := $(EXECS) $(NONEXECS) + +# If there are IDL-files +ifneq ($(strip $(FILTERED_IDL)),) + MAYBE_IDL := -cclib -lcamlidl +endif + +ifdef USE_CAMLP4 + CAMLP4PATH := \ + $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) + INCFLAGS := -I $(CAMLP4PATH) + CINCFLAGS := -I$(CAMLP4PATH) +endif + +DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) +INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) +CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) + +ifndef MSVC +CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ + $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-L%) +endif + +ifndef PROFILING + INTF_OCAMLC := $(OCAMLC) +else + ifndef THREADS + INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) + else + # OCaml does not support profiling byte code + # with threads (yet), therefore we force an error. + ifndef REAL_OCAMLC + $(error Profiling of multithreaded byte code not yet supported by OCaml) + endif + INTF_OCAMLC := $(OCAMLC) + endif +endif + +ifndef MSVC +COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ + $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ + $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-ccopt -L%) +else +COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ + $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ + $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " +endif + +CLIBS_OPTS := $(CLIBS:%=-cclib -l%) +ifdef MSVC + ifndef STATIC + # MSVC libraries do not have 'lib' prefix + CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) + endif +endif + +ifneq ($(strip $(OBJ_LINK)),) + ifdef CREATE_LIB + OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) + else + OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) + endif +else + OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) +endif + +# If we have to make byte-code +ifndef REAL_OCAMLC + BYTE_OCAML := y + + # EXTRADEPS is added dependencies we have to insert for all + # executable files we generate. Ideally it should be all of the + # libraries we use, but it's hard to find the ones that get searched on + # the path since I don't know the paths built into the compiler, so + # just include the ones with slashes in their names. + EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) + + REAL_OCAMLC := $(INTF_OCAMLC) + + REAL_IMPL := $(IMPL_CMO) + REAL_IMPL_INTF := $(IMPLO_INTF) + IMPL_SUF := .cmo + + DEPFLAGS := + MAKE_DEPS := $(MLDEPS) $(BCDEPIS) + + ifdef CREATE_LIB + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + MAKEDLL := $(DLLSONAME) + ALL_LDFLAGS := -dllib $(DLLSONAME) + endif + endif + endif + + ifndef NO_CUSTOM + ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" "" + ALL_LDFLAGS += -custom + endif + endif + + ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ + $(COMMON_LDFLAGS) $(LIBS:%=%.cma) + CAMLIDLDLLFLAGS := + + ifdef THREADS + ifdef VMTHREADS + THREAD_FLAG := -vmthread + else + THREAD_FLAG := -thread + endif + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) + endif + endif + endif + +# we have to make native-code +else + EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + ifndef PROFILING + SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) + PLDFLAGS := + else + SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) + PLDFLAGS := -p + endif + + REAL_IMPL := $(IMPL_CMX) + REAL_IMPL_INTF := $(IMPLX_INTF) + IMPL_SUF := .cmx + + override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) + + DEPFLAGS := -native + MAKE_DEPS := $(MLDEPS) $(NCDEPIS) + + ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ + $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) + CAMLIDLDLLFLAGS := -opt + + ifndef CREATE_LIB + ALL_LDFLAGS += $(LIBS:%=%.cmxa) + else + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + endif + + ifdef THREADS + THREAD_FLAG := -thread + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) + endif + endif + endif +endif + +export MAKE_DEPS + +ifdef ANNOTATE + ANNOT_FLAG := -dtypes +else +endif + +ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ + $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) + +ifdef make_deps + -include $(MAKE_DEPS) + PRE_TARGETS := +endif + +########################################################################### +# USER RULES + +# Call "OCamlMakefile QUIET=" to get rid of all of the @'s. +QUIET=@ + +# generates byte-code (default) +byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bc: byte-code + +byte-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bcnl: byte-code-nolink + +top: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes + +# generates native-code + +native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +nc: native-code + +native-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncnl: native-code-nolink + +# generates byte-code libraries +byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" \ + CREATE_LIB=yes \ + make_deps=yes +bcl: byte-code-library + +# generates native-code libraries +native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +ncl: native-code-library + +ifdef WIN32 +# generates byte-code dll +byte-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).dll \ + REAL_RESULT="$(BCRESULT)" \ + make_deps=yes +bcd: byte-code-dll + +# generates native-code dll +native-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).dll \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncd: native-code-dll +endif + +# generates byte-code with debugging information +debug-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dc: debug-code + +debug-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcnl: debug-code-nolink + +# generates byte-code libraries with debugging information +debug-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + CREATE_LIB=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcl: debug-code-library + +# generates byte-code for profiling +profiling-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + make_deps=yes +pbc: profiling-byte-code + +# generates native-code + +profiling-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PROFILING="y" \ + make_deps=yes +pnc: profiling-native-code + +# generates byte-code libraries +profiling-byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + CREATE_LIB=yes \ + make_deps=yes +pbcl: profiling-byte-code-library + +# generates native-code libraries +profiling-native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" PROFILING="y" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +pncl: profiling-native-code-library + +# packs byte-code objects +pack-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ + REAL_RESULT="$(BCRESULT)" \ + PACK_LIB=yes make_deps=yes +pabc: pack-byte-code + +# packs native-code objects +pack-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(NCRESULT).cmx $(NCRESULT).o \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PACK_LIB=yes make_deps=yes +panc: pack-native-code + +# generates HTML-documentation +htdoc: doc/$(RESULT)/html + +# generates Latex-documentation +ladoc: doc/$(RESULT)/latex + +# generates PostScript-documentation +psdoc: doc/$(RESULT)/latex/doc.ps + +# generates PDF-documentation +pdfdoc: doc/$(RESULT)/latex/doc.pdf + +# generates all supported forms of documentation +doc: htdoc ladoc psdoc pdfdoc + +########################################################################### +# LOW LEVEL RULES + +$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) + +ifdef WIN32 +$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) + $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ + -o $@ $(REAL_IMPL) +endif + +%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ + .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \ + .rep .zog .glade + +ifndef STATIC +ifdef MINGW +$(DLLSONAME): $(OBJ_LINK) + $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ + -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ + $(OCAMLLIBPATH)/ocamlrun.a \ + -Wl,--export-all-symbols \ + -Wl,--no-whole-archive +else +ifdef MSVC +$(DLLSONAME): $(OBJ_LINK) + link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ + $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ + $(OCAMLLIBPATH)/ocamlrun.lib + +else +$(DLLSONAME): $(OBJ_LINK) + $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ + -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \ + $(OCAMLMKLIB_FLAGS) +endif +endif +endif + +ifndef LIB_PACK_NAME +$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL) + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL) +else +ifdef BYTE_OCAML +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL) +else +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL) +endif + +$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx +endif + +$(RES_CLIB): $(OBJ_LINK) +ifndef MSVC + ifneq ($(strip $(OBJ_LINK)),) + $(AR) rcs $@ $(OBJ_LINK) + endif +else + ifneq ($(strip $(OBJ_LINK)),) + lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) + endif +endif + +.mli.cmi: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + fi + +.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ + fi + +ifdef PACK_LIB +$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(REAL_IMPL) +endif + +.PRECIOUS: %.ml +%.ml: %.mll + $(OCAMLLEX) $< + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.mly + $(OCAMLYACC) $(YFLAGS) $< + $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ + if [ ! -z "$$pp" ]; then \ + mv $*.ml $*.ml.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ + cat $*.ml.temporary >> $*.ml; \ + rm $*.ml.temporary; \ + mv $*.mli $*.mli.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ + cat $*.mli.temporary >> $*.mli; \ + rm $*.mli.temporary; \ + fi + + +.PRECIOUS: %.ml +%.ml: %.rep + $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< + +.PRECIOUS: %.ml +%.ml: %.zog + $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ + +.PRECIOUS: %.ml +%.ml: %.glade + $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.oxridl + $(OXRIDL) $< + +.PRECIOUS: %.ml %.mli %_stubs.c %.h +%.ml %.mli %_stubs.c %.h: %.idl + $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ + $(CAMLIDLFLAGS) $< + $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi + +.c.$(EXT_OBJ): + $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ + $(CPPFLAGS) $(CPPFLAGS_WIN32) \ + $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< + +.$(EXT_CXX).$(EXT_OBJ): + $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ + -I'$(OCAMLLIBPATH)' \ + $< $(CFLAG_O)$@ + +$(MLDEPDIR)/%.d: %.ml + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +doc/$(RESULT)/html: $(DOC_FILES) + #rm -rf $@ + #mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + fi + +doc/$(RESULT)/latex: $(DOC_FILES) + #rm -rf $@ + #mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ + $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ + -o $@/doc.tex; \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + fi + +doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex + cd doc/$(RESULT)/latex && \ + $(LATEX) doc.tex && \ + $(LATEX) doc.tex && \ + $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) + +doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps + cd doc/$(RESULT)/latex && $(PS2PDF) $( Some "`Array" + | `String "base64" -> Some "`Binary" + | `String "boolean" -> Some "`Boolean" + | `String "dateTime.iso8601" -> Some "`DateTime" + | `String "double" -> Some "`Double" + | `String "int" -> Some (if !use_int32 then "`Int32" else "`Int") + | `String "string" -> Some "`String" + | `String "struct" -> Some "`Struct" + | `String "undefined" -> None + | _ as it -> failwith (XmlRpc.dump it) + +let dot_to_underscore s = + let s = String.copy s in + let len = String.length s in + for i = 0 to len - 1 do + match s.[i] with + | '.' -> s.[i] <- '_' + | _ -> () + done; + s + +let () = + let specs = + ["-i", Arg.Set use_int32, "Use int32 for all integers"; + "-m", Arg.Set use_multicall, "Generate lazy interface using multicall"; + "-v", Arg.Set verbose, "Display verbose debugging output"] in + let usage = (sprintf "Usage: %s [-i] [-m] [-v] url" Sys.argv.(0)) in + Arg.parse specs (fun url' -> url := url') usage; + if !url = "" then (Arg.usage specs usage; exit 2) + +let rpc = new XmlRpc.client ~debug:!verbose !url + +let methods = rpc#call "system.listMethods" [] + +let mc = new XmlRpc.multicall rpc +let signatures = + match methods with + | `Array methods -> + List.map + (function + | `String meth -> + (meth, mc#call "system.methodSignature" [`String meth]) + | _ -> failwith "got non-string for method name") + methods + | _ -> failwith "got non-array from system.listMethods" + +let module_map = + List.fold_left + (fun acc (name, signature) -> + let dot_index = String.index name '.' in + let module_name = String.sub name 0 dot_index in + let meth_name = + String.sub name + (dot_index + 1) + (String.length name - dot_index - 1) in + let acc = + if StringMap.mem module_name acc + then acc + else StringMap.add module_name [] acc in + try + match Lazy.force signature with + | `Array param_lists -> + StringMap.add + module_name + ((meth_name, Some param_lists) :: StringMap.find module_name acc) + acc + | _ -> + StringMap.add + module_name + ((meth_name, None) :: StringMap.find module_name acc) + acc + with + | XmlRpc.Error _ -> + StringMap.add + module_name + ((meth_name, None) :: StringMap.find module_name acc) + acc + | Xml.Error (msg, pos) -> + prerr_endline (Xml.error_msg msg); + acc) + StringMap.empty + signatures + +let values map = + let result = ref [] in + StringMap.iter (fun _ v -> result := v :: !result) map; + List.rev !result + +let impl_with_signature module_name func_name name = + function + | `Array params -> + let result = List.hd params in + let params = Array.of_list (List.tl params) in + let param_names = + String.concat " " + (Array.to_list + (Array.mapi + (fun i _ -> + sprintf "_%d" i) + params)) in + let param_values = + String.concat "; " + (Array.to_list + (Array.mapi + (fun i param -> + match variant_name param with + | Some n -> + sprintf "%s _%d" n i + | None -> + sprintf "_%d" i) + params)) in + let mc_init = + if !use_multicall + then "if mc#executed then mc <- new XmlRpc.multicall rpc;\n " + else "" in + let rpc_call = if !use_multicall then "mc#call" else "rpc#call" in + let begin_lazy_force, lazy_force, end_lazy_force = + if !use_multicall + then "lazy (", "Lazy.force ", ")" + else "", "", "" in + (match variant_name result with + | Some result_type -> + sprintf " method %s %s = + %slet result = %s \"%s.%s\" [%s] in + %smatch %sresult with + | %s r -> r + | other -> raise (Type_error (XmlRpc.dump other))%s" + func_name + (if param_names = "" then "()" else param_names) + mc_init + rpc_call + module_name + name + param_values + begin_lazy_force + lazy_force + (if result_type = "`Int32" + then "`Int r -> Int32.of_int r | `Int32" + else result_type) + end_lazy_force + | None -> + sprintf " method %s %s = + %s%s \"%s.%s\" [%s]" + func_name + (if param_names = "" then "()" else param_names) + mc_init + rpc_call + module_name + name + param_values) + | _ -> failwith "method signature was not an array" + +let impl_without_signature module_name func_name name = + let mc_init = + if !use_multicall + then "if mc#executed then mc <- new XmlRpc.multicall rpc;\n " + else "" in + let rpc_call = if !use_multicall then "mc#call" else "rpc#call" in + sprintf " method %s params = + %s%s \"%s.%s\" params" + func_name + mc_init + rpc_call + module_name + name + +let impls module_name meths = + let seen_names = Hashtbl.create 0 in + let make_func_name name = + let base_name = dot_to_underscore name in + let func_name = ref base_name in + let counter = ref 1 in + while Hashtbl.mem seen_names !func_name do + incr counter; + func_name := base_name ^ (string_of_int !counter) + done; + Hashtbl.replace seen_names !func_name 0; + !func_name in + String.concat "\n\n" + (List.flatten + (List.map + (function + | (name, Some param_lists) -> + List.map + (fun signature -> + impl_with_signature + module_name + (make_func_name name) + name + signature) + param_lists + | (name, None) -> + [impl_without_signature + module_name + (make_func_name name) + name]) + meths)) + +let objects = + String.concat "\n" + (values + (StringMap.mapi + (fun module_name meths -> + sprintf " method %s = object +%s + end +" + module_name + (impls module_name meths)) + module_map)) + +let multicall = + if !use_multicall + then " + val mutable mc = new XmlRpc.multicall rpc + method mc = mc +" + else "" + +let () = + printf "(* Automatically generated from an XML-RPC server + by running the following command: + + %s +*) + +exception Type_error of string + +class client url = + let rpc = new XmlRpc.client url in +object (self) + method rpc = rpc +%s +%s +end +" (String.concat " " (Array.to_list Sys.argv)) multicall objects diff --git a/examples/ubigraph/Makefile b/examples/ubigraph/Makefile new file mode 100644 index 0000000..fd29771 --- /dev/null +++ b/examples/ubigraph/Makefile @@ -0,0 +1,7 @@ +OCAMLMAKEFILE = OCamlMakefile + +RESULT = test +SOURCES = Ubigraph.mli Ubigraph.ml test.ml +PACKS = xmlrpc-light + +include $(OCAMLMAKEFILE) diff --git a/examples/ubigraph/OCamlMakefile b/examples/ubigraph/OCamlMakefile new file mode 100644 index 0000000..9adb295 --- /dev/null +++ b/examples/ubigraph/OCamlMakefile @@ -0,0 +1,1154 @@ +########################################################################### +# OCamlMakefile +# Copyright (C) 1999-2004 Markus Mottl +# +# For updates see: +# http://www.ocaml.info/home/ocaml_sources.html +# +# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $ +# +########################################################################### + +# Modified by damien for .glade.ml compilation + +# Set these variables to the names of the sources to be processed and +# the result variable. Order matters during linkage! + +ifndef SOURCES + SOURCES := foo.ml +endif +export SOURCES + +ifndef RES_CLIB_SUF + RES_CLIB_SUF := _stubs +endif +export RES_CLIB_SUF + +ifndef RESULT + RESULT := foo +endif +export RESULT + +export LIB_PACK_NAME + +ifndef DOC_FILES + DOC_FILES := $(filter %.mli, $(SOURCES)) +endif +export DOC_FILES + +export BCSUFFIX +export NCSUFFIX + +ifndef TOPSUFFIX + TOPSUFFIX := .top +endif +export TOPSUFFIX + +# Eventually set include- and library-paths, libraries to link, +# additional compilation-, link- and ocamlyacc-flags +# Path- and library information needs not be written with "-I" and such... +# Define THREADS if you need it, otherwise leave it unset (same for +# USE_CAMLP4)! + +export THREADS +export VMTHREADS +export ANNOTATE +export USE_CAMLP4 + +export INCDIRS +export LIBDIRS +export EXTLIBDIRS +export RESULTDEPS +export OCAML_DEFAULT_DIRS + +export LIBS +export CLIBS + +export OCAMLFLAGS +export OCAMLNCFLAGS +export OCAMLBCFLAGS + +export OCAMLLDFLAGS +export OCAMLNLDFLAGS +export OCAMLBLDFLAGS + +ifndef OCAMLCPFLAGS + OCAMLCPFLAGS := a +endif + +export OCAMLCPFLAGS + +export PPFLAGS + +export YFLAGS +export IDLFLAGS + +export OCAMLDOCFLAGS + +export OCAMLFIND_INSTFLAGS + +export DVIPSFLAGS + +export STATIC + +# Add a list of optional trash files that should be deleted by "make clean" +export TRASH + +#################### variables depending on your OCaml-installation + +ifdef MINGW + export MINGW + WIN32 := 1 + CFLAGS_WIN32 := -mno-cygwin +endif +ifdef MSVC + export MSVC + WIN32 := 1 + ifndef STATIC + CPPFLAGS_WIN32 := -DCAML_DLL + endif + CFLAGS_WIN32 += -nologo + EXT_OBJ := obj + EXT_LIB := lib + ifeq ($(CC),gcc) + # work around GNU Make default value + ifdef THREADS + CC := cl -MT + else + CC := cl + endif + endif + ifeq ($(CXX),g++) + # work around GNU Make default value + CXX := $(CC) + endif + CFLAG_O := -Fo +endif +ifdef WIN32 + EXT_CXX := cpp + EXE := .exe +endif + +ifndef EXT_OBJ + EXT_OBJ := o +endif +ifndef EXT_LIB + EXT_LIB := a +endif +ifndef EXT_CXX + EXT_CXX := cc +endif +ifndef EXE + EXE := # empty +endif +ifndef CFLAG_O + CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! +endif + +export CC +export CXX +export CFLAGS +export CXXFLAGS +export LDFLAGS +export CPPFLAGS + +ifndef RPATH_FLAG + RPATH_FLAG := -R +endif +export RPATH_FLAG + +ifndef MSVC +ifndef PIC_CFLAGS + PIC_CFLAGS := -fPIC +endif +ifndef PIC_CPPFLAGS + PIC_CPPFLAGS := -DPIC +endif +endif + +export PIC_CFLAGS +export PIC_CPPFLAGS + +BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) +NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) +TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) + +ifndef OCAMLFIND + OCAMLFIND := ocamlfind +endif +export OCAMLFIND + +ifndef OCAMLC + OCAMLC := ocamlc +endif +export OCAMLC + +ifndef OCAMLOPT + OCAMLOPT := ocamlopt +endif +export OCAMLOPT + +ifndef OCAMLMKTOP + OCAMLMKTOP := ocamlmktop +endif +export OCAMLMKTOP + +ifndef OCAMLCP + OCAMLCP := ocamlcp +endif +export OCAMLCP + +ifndef OCAMLDEP + OCAMLDEP := ocamldep +endif +export OCAMLDEP + +ifndef OCAMLLEX + OCAMLLEX := ocamllex +endif +export OCAMLLEX + +ifndef OCAMLYACC + OCAMLYACC := ocamlyacc +endif +export OCAMLYACC + +ifndef OCAMLMKLIB + OCAMLMKLIB := ocamlmklib +endif +export OCAMLMKLIB + +ifndef OCAML_GLADECC + OCAML_GLADECC := lablgladecc2 +endif +export OCAML_GLADECC + +ifndef OCAML_GLADECC_FLAGS + OCAML_GLADECC_FLAGS := +endif +export OCAML_GLADECC_FLAGS + +ifndef CAMELEON_REPORT + CAMELEON_REPORT := report +endif +export CAMELEON_REPORT + +ifndef CAMELEON_REPORT_FLAGS + CAMELEON_REPORT_FLAGS := +endif +export CAMELEON_REPORT_FLAGS + +ifndef CAMELEON_ZOGGY + CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo +endif +export CAMELEON_ZOGGY + +ifndef CAMELEON_ZOGGY_FLAGS + CAMELEON_ZOGGY_FLAGS := +endif +export CAMELEON_ZOGGY_FLAGS + +ifndef OXRIDL + OXRIDL := oxridl +endif +export OXRIDL + +ifndef CAMLIDL + CAMLIDL := camlidl +endif +export CAMLIDL + +ifndef CAMLIDLDLL + CAMLIDLDLL := camlidldll +endif +export CAMLIDLDLL + +ifndef NOIDLHEADER + MAYBE_IDL_HEADER := -header +endif +export NOIDLHEADER + +export NO_CUSTOM + +ifndef CAMLP4 + CAMLP4 := camlp4 +endif +export CAMLP4 + +ifndef REAL_OCAMLFIND + ifdef PACKS + ifndef CREATE_LIB + ifdef THREADS + PACKS += threads + endif + endif + empty := + space := $(empty) $(empty) + comma := , + ifdef PREDS + PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) + PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) + OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) + # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) + OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + else + OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) + OCAML_DEP_PACKAGES := + endif + OCAML_FIND_LINKPKG := -linkpkg + REAL_OCAMLFIND := $(OCAMLFIND) + endif +endif + +export OCAML_FIND_PACKAGES +export OCAML_DEP_PACKAGES +export OCAML_FIND_LINKPKG +export REAL_OCAMLFIND + +ifndef OCAMLDOC + OCAMLDOC := ocamldoc +endif +export OCAMLDOC + +ifndef LATEX + LATEX := latex +endif +export LATEX + +ifndef DVIPS + DVIPS := dvips +endif +export DVIPS + +ifndef PS2PDF + PS2PDF := ps2pdf +endif +export PS2PDF + +ifndef OCAMLMAKEFILE + OCAMLMAKEFILE := OCamlMakefile +endif +export OCAMLMAKEFILE + +ifndef OCAMLLIBPATH + OCAMLLIBPATH := \ + $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) +endif +export OCAMLLIBPATH + +ifndef OCAML_LIB_INSTALL + OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib +endif +export OCAML_LIB_INSTALL + +########################################################################### + +#################### change following sections only if +#################### you know what you are doing! + +# delete target files when a build command fails +.PHONY: .DELETE_ON_ERROR +.DELETE_ON_ERROR: + +# for pedants using "--warn-undefined-variables" +export MAYBE_IDL +export REAL_RESULT +export CAMLIDLFLAGS +export THREAD_FLAG +export RES_CLIB +export MAKEDLL +export ANNOT_FLAG +export C_OXRIDL +export SUBPROJS +export CFLAGS_WIN32 +export CPPFLAGS_WIN32 + +INCFLAGS := + +SHELL := /bin/sh + +MLDEPDIR := ._d +BCDIDIR := ._bcdi +NCDIDIR := ._ncdi + +FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade + +FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) +SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) + +FILTERED_REP := $(filter %.rep, $(FILTERED)) +DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) +AUTO_REP := $(FILTERED_REP:.rep=.ml) + +FILTERED_ZOG := $(filter %.zog, $(FILTERED)) +DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) +AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) + +FILTERED_GLADE := $(filter %.glade, $(FILTERED)) +DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) +AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) + +FILTERED_ML := $(filter %.ml, $(FILTERED)) +DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) + +FILTERED_MLI := $(filter %.mli, $(FILTERED)) +DEP_MLI := $(FILTERED_MLI:.mli=.di) + +FILTERED_MLL := $(filter %.mll, $(FILTERED)) +DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) +AUTO_MLL := $(FILTERED_MLL:.mll=.ml) + +FILTERED_MLY := $(filter %.mly, $(FILTERED)) +DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) +AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) + +FILTERED_IDL := $(filter %.idl, $(FILTERED)) +DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) +C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) +ifndef NOIDLHEADER + C_IDL += $(FILTERED_IDL:.idl=.h) +endif +OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) +AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) + +FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) +DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) +AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) + +FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED)) +OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) +OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) + +PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) + +ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) + +MLDEPS := $(filter %.d, $(ALL_DEPS)) +MLIDEPS := $(filter %.di, $(ALL_DEPS)) +BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) +NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) + +ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) + +IMPLO_INTF := $(ALLML:%.mli=%.mli.__) +IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ + $(basename $(file)).cmi $(basename $(file)).cmo) +IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) +IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) + +IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) + +INTF := $(filter %.cmi, $(IMPLO_INTF)) +IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) +IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) +IMPL_ASM := $(IMPL_CMO:.cmo=.asm) +IMPL_S := $(IMPL_CMO:.cmo=.s) + +OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) +OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) + +EXECS := $(addsuffix $(EXE), \ + $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) +ifdef WIN32 + EXECS += $(BCRESULT).dll $(NCRESULT).dll +endif + +CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) +ifneq ($(strip $(OBJ_LINK)),) + RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) +endif + +ifdef WIN32 +DLLSONAME := $(CLIB_BASE).dll +else +DLLSONAME := dll$(CLIB_BASE).so +endif + +NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ + $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ + $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ + $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ + $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ + $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o + +ifndef STATIC + NONEXECS += $(DLLSONAME) +endif + +ifndef LIBINSTALL_FILES + LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ + $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + LIBINSTALL_FILES += $(DLLSONAME) + endif + endif +endif + +export LIBINSTALL_FILES + +ifdef WIN32 + # some extra stuff is created while linking DLLs + NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib +endif + +TARGETS := $(EXECS) $(NONEXECS) + +# If there are IDL-files +ifneq ($(strip $(FILTERED_IDL)),) + MAYBE_IDL := -cclib -lcamlidl +endif + +ifdef USE_CAMLP4 + CAMLP4PATH := \ + $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) + INCFLAGS := -I $(CAMLP4PATH) + CINCFLAGS := -I$(CAMLP4PATH) +endif + +DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) +INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) +CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) + +ifndef MSVC +CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ + $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-L%) +endif + +ifndef PROFILING + INTF_OCAMLC := $(OCAMLC) +else + ifndef THREADS + INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) + else + # OCaml does not support profiling byte code + # with threads (yet), therefore we force an error. + ifndef REAL_OCAMLC + $(error Profiling of multithreaded byte code not yet supported by OCaml) + endif + INTF_OCAMLC := $(OCAMLC) + endif +endif + +ifndef MSVC +COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ + $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ + $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-ccopt -L%) +else +COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ + $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ + $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " +endif + +CLIBS_OPTS := $(CLIBS:%=-cclib -l%) +ifdef MSVC + ifndef STATIC + # MSVC libraries do not have 'lib' prefix + CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) + endif +endif + +ifneq ($(strip $(OBJ_LINK)),) + ifdef CREATE_LIB + OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) + else + OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) + endif +else + OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) +endif + +# If we have to make byte-code +ifndef REAL_OCAMLC + BYTE_OCAML := y + + # EXTRADEPS is added dependencies we have to insert for all + # executable files we generate. Ideally it should be all of the + # libraries we use, but it's hard to find the ones that get searched on + # the path since I don't know the paths built into the compiler, so + # just include the ones with slashes in their names. + EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) + + REAL_OCAMLC := $(INTF_OCAMLC) + + REAL_IMPL := $(IMPL_CMO) + REAL_IMPL_INTF := $(IMPLO_INTF) + IMPL_SUF := .cmo + + DEPFLAGS := + MAKE_DEPS := $(MLDEPS) $(BCDEPIS) + + ifdef CREATE_LIB + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + MAKEDLL := $(DLLSONAME) + ALL_LDFLAGS := -dllib $(DLLSONAME) + endif + endif + endif + + ifndef NO_CUSTOM + ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" "" + ALL_LDFLAGS += -custom + endif + endif + + ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ + $(COMMON_LDFLAGS) $(LIBS:%=%.cma) + CAMLIDLDLLFLAGS := + + ifdef THREADS + ifdef VMTHREADS + THREAD_FLAG := -vmthread + else + THREAD_FLAG := -thread + endif + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) + endif + endif + endif + +# we have to make native-code +else + EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + ifndef PROFILING + SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) + PLDFLAGS := + else + SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) + PLDFLAGS := -p + endif + + REAL_IMPL := $(IMPL_CMX) + REAL_IMPL_INTF := $(IMPLX_INTF) + IMPL_SUF := .cmx + + override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) + + DEPFLAGS := -native + MAKE_DEPS := $(MLDEPS) $(NCDEPIS) + + ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ + $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) + CAMLIDLDLLFLAGS := -opt + + ifndef CREATE_LIB + ALL_LDFLAGS += $(LIBS:%=%.cmxa) + else + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + endif + + ifdef THREADS + THREAD_FLAG := -thread + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) + endif + endif + endif +endif + +export MAKE_DEPS + +ifdef ANNOTATE + ANNOT_FLAG := -dtypes +else +endif + +ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ + $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) + +ifdef make_deps + -include $(MAKE_DEPS) + PRE_TARGETS := +endif + +########################################################################### +# USER RULES + +# Call "OCamlMakefile QUIET=" to get rid of all of the @'s. +QUIET=@ + +# generates byte-code (default) +byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bc: byte-code + +byte-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bcnl: byte-code-nolink + +top: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes + +# generates native-code + +native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +nc: native-code + +native-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncnl: native-code-nolink + +# generates byte-code libraries +byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" \ + CREATE_LIB=yes \ + make_deps=yes +bcl: byte-code-library + +# generates native-code libraries +native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +ncl: native-code-library + +ifdef WIN32 +# generates byte-code dll +byte-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).dll \ + REAL_RESULT="$(BCRESULT)" \ + make_deps=yes +bcd: byte-code-dll + +# generates native-code dll +native-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).dll \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncd: native-code-dll +endif + +# generates byte-code with debugging information +debug-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dc: debug-code + +debug-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcnl: debug-code-nolink + +# generates byte-code libraries with debugging information +debug-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + CREATE_LIB=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcl: debug-code-library + +# generates byte-code for profiling +profiling-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + make_deps=yes +pbc: profiling-byte-code + +# generates native-code + +profiling-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PROFILING="y" \ + make_deps=yes +pnc: profiling-native-code + +# generates byte-code libraries +profiling-byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + CREATE_LIB=yes \ + make_deps=yes +pbcl: profiling-byte-code-library + +# generates native-code libraries +profiling-native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" PROFILING="y" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +pncl: profiling-native-code-library + +# packs byte-code objects +pack-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ + REAL_RESULT="$(BCRESULT)" \ + PACK_LIB=yes make_deps=yes +pabc: pack-byte-code + +# packs native-code objects +pack-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(NCRESULT).cmx $(NCRESULT).o \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PACK_LIB=yes make_deps=yes +panc: pack-native-code + +# generates HTML-documentation +htdoc: doc/$(RESULT)/html + +# generates Latex-documentation +ladoc: doc/$(RESULT)/latex + +# generates PostScript-documentation +psdoc: doc/$(RESULT)/latex/doc.ps + +# generates PDF-documentation +pdfdoc: doc/$(RESULT)/latex/doc.pdf + +# generates all supported forms of documentation +doc: htdoc ladoc psdoc pdfdoc + +########################################################################### +# LOW LEVEL RULES + +$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) + +ifdef WIN32 +$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) + $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ + -o $@ $(REAL_IMPL) +endif + +%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ + .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \ + .rep .zog .glade + +ifndef STATIC +ifdef MINGW +$(DLLSONAME): $(OBJ_LINK) + $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ + -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ + $(OCAMLLIBPATH)/ocamlrun.a \ + -Wl,--export-all-symbols \ + -Wl,--no-whole-archive +else +ifdef MSVC +$(DLLSONAME): $(OBJ_LINK) + link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ + $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ + $(OCAMLLIBPATH)/ocamlrun.lib + +else +$(DLLSONAME): $(OBJ_LINK) + $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ + -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \ + $(OCAMLMKLIB_FLAGS) +endif +endif +endif + +ifndef LIB_PACK_NAME +$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL) + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL) +else +ifdef BYTE_OCAML +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL) +else +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL) +endif + +$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx +endif + +$(RES_CLIB): $(OBJ_LINK) +ifndef MSVC + ifneq ($(strip $(OBJ_LINK)),) + $(AR) rcs $@ $(OBJ_LINK) + endif +else + ifneq ($(strip $(OBJ_LINK)),) + lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) + endif +endif + +.mli.cmi: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + fi + +.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ + fi + +ifdef PACK_LIB +$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(REAL_IMPL) +endif + +.PRECIOUS: %.ml +%.ml: %.mll + $(OCAMLLEX) $< + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.mly + $(OCAMLYACC) $(YFLAGS) $< + $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ + if [ ! -z "$$pp" ]; then \ + mv $*.ml $*.ml.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ + cat $*.ml.temporary >> $*.ml; \ + rm $*.ml.temporary; \ + mv $*.mli $*.mli.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ + cat $*.mli.temporary >> $*.mli; \ + rm $*.mli.temporary; \ + fi + + +.PRECIOUS: %.ml +%.ml: %.rep + $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< + +.PRECIOUS: %.ml +%.ml: %.zog + $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ + +.PRECIOUS: %.ml +%.ml: %.glade + $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.oxridl + $(OXRIDL) $< + +.PRECIOUS: %.ml %.mli %_stubs.c %.h +%.ml %.mli %_stubs.c %.h: %.idl + $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ + $(CAMLIDLFLAGS) $< + $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi + +.c.$(EXT_OBJ): + $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ + $(CPPFLAGS) $(CPPFLAGS_WIN32) \ + $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< + +.$(EXT_CXX).$(EXT_OBJ): + $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ + -I'$(OCAMLLIBPATH)' \ + $< $(CFLAG_O)$@ + +$(MLDEPDIR)/%.d: %.ml + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +doc/$(RESULT)/html: $(DOC_FILES) + #rm -rf $@ + #mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + fi + +doc/$(RESULT)/latex: $(DOC_FILES) + #rm -rf $@ + #mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ + $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ + -o $@/doc.tex; \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + fi + +doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex + cd doc/$(RESULT)/latex && \ + $(LATEX) doc.tex && \ + $(LATEX) doc.tex && \ + $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) + +doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps + cd doc/$(RESULT)/latex && $(PS2PDF) $( Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method multicall _0 = + let result = rpc#call "system.multicall" [`Array _0] in + match result with + | `Array r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method methodHelp _0 = + let result = rpc#call "system.methodHelp" [`String _0] in + match result with + | `String r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method methodSignature _0 = + let result = rpc#call "system.methodSignature" [`String _0] in + match result with + | `Array r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method listMethods () = + let result = rpc#call "system.listMethods" [] in + match result with + | `Array r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + end + + method ubigraph = object + method change_edge_style _0 _1 = + let result = rpc#call "ubigraph.change_edge_style" [`Int32 _0; `Int32 _1] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_edge_style_w_id _0 _1 = + let result = rpc#call "ubigraph.new_edge_style_w_id" [`Int32 _0; `Int32 _1] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_edge_style _0 = + let result = rpc#call "ubigraph.new_edge_style" [`Int32 _0] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method set_edge_style_attribute _0 _1 _2 = + let result = rpc#call "ubigraph.set_edge_style_attribute" [`Int32 _0; `String _1; `String _2] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method set_edge_attribute _0 _1 _2 = + let result = rpc#call "ubigraph.set_edge_attribute" [`Int32 _0; `String _1; `String _2] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method change_vertex_style _0 _1 = + let result = rpc#call "ubigraph.change_vertex_style" [`Int32 _0; `Int32 _1] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_vertex_style_w_id _0 _1 = + let result = rpc#call "ubigraph.new_vertex_style_w_id" [`Int32 _0; `Int32 _1] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_vertex_style _0 = + let result = rpc#call "ubigraph.new_vertex_style" [`Int32 _0] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method set_vertex_style_attribute _0 _1 _2 = + let result = rpc#call "ubigraph.set_vertex_style_attribute" [`Int32 _0; `String _1; `String _2] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method set_vertex_attribute _0 _1 _2 = + let result = rpc#call "ubigraph.set_vertex_attribute" [`Int32 _0; `String _1; `String _2] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method clear () = + let result = rpc#call "ubigraph.clear" [] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method remove_edge _0 = + let result = rpc#call "ubigraph.remove_edge" [`Int32 _0] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method remove_vertex _0 = + let result = rpc#call "ubigraph.remove_vertex" [`Int32 _0] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_edge _0 _1 = + let result = rpc#call "ubigraph.new_edge" [`Int32 _0; `Int32 _1] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_edge_w_id _0 _1 _2 = + let result = rpc#call "ubigraph.new_edge_w_id" [`Int32 _0; `Int32 _1; `Int32 _2] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_vertex () = + let result = rpc#call "ubigraph.new_vertex" [] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_vertex_w_id _0 = + let result = rpc#call "ubigraph.new_vertex_w_id" [`Int32 _0] in + match result with + | `Int r -> Int32.of_int r | `Int32 r -> r + | other -> raise (Type_error (XmlRpc.dump other)) + end + +end diff --git a/examples/ubigraph/Ubigraph.mli b/examples/ubigraph/Ubigraph.mli new file mode 100644 index 0000000..363354a --- /dev/null +++ b/examples/ubigraph/Ubigraph.mli @@ -0,0 +1,51 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2008 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +exception Type_error of string + +class client : string -> +object + method rpc : XmlRpc.client + + method ubigraph : + < change_edge_style : int32 -> int32 -> int32; + change_vertex_style : int32 -> int32 -> int32; + clear : unit -> int32; + new_edge : int32 -> int32 -> int32; + new_edge_style : int32 -> int32; + new_edge_style_w_id : int32 -> int32 -> int32; + new_edge_w_id : int32 -> int32 -> int32 -> int32; + new_vertex : unit -> int32; + new_vertex_style : int32 -> int32; + new_vertex_style_w_id : int32 -> int32 -> int32; + new_vertex_w_id : int32 -> int32; + remove_edge : int32 -> int32; + remove_vertex : int32 -> int32; + set_edge_attribute : int32 -> string -> string -> int32; + set_edge_style_attribute : int32 -> string -> string -> int32; + set_vertex_attribute : int32 -> string -> string -> int32; + set_vertex_style_attribute : int32 -> string -> string -> int32 > + + method system : + < listMethods : unit -> XmlRpc.value list; + methodHelp : string -> string; + methodSignature : string -> XmlRpc.value list; + multicall : XmlRpc.value list -> XmlRpc.value list; + shutdown : string -> int32 > +end diff --git a/examples/ubigraph/test.ml b/examples/ubigraph/test.ml new file mode 100644 index 0000000..892c564 --- /dev/null +++ b/examples/ubigraph/test.ml @@ -0,0 +1,54 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2008 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +(* Based on Python example, "examples/Python/ubigraph_example.py", + distributed with Ubigraph. For details, see the Ubigraph website: + http://ubietylab.net/ubigraph/ +*) + +let client = new Ubigraph.client "http://localhost:20738/RPC2" +let u = client#ubigraph +let _ = u#clear () + +let x = u#new_vertex () +let _ = u#set_vertex_attribute x "shape" "sphere" +let _ = u#set_vertex_attribute x "color" "#ffff00" + +let small_red = u#new_vertex_style 0l +let _ = u#set_vertex_style_attribute small_red "shape" "sphere" +let _ = u#set_vertex_style_attribute small_red "color" "#ff0000" +let _ = u#set_vertex_style_attribute small_red "size" "0.2" + +let previous_r = ref None +let () = + for i = 0 to 9 do + let r = u#new_vertex () in + let _ = u#change_vertex_style r small_red in + let _ = u#set_vertex_attribute r "label" (string_of_int i) in + let e = u#new_edge x r in + let _ = u#set_edge_attribute e "arrow" "true" in + match !previous_r with + | None -> + previous_r := Some r + | Some r' -> + let e = u#new_edge r r' in + let _ = u#set_edge_attribute e "spline" "true" in + let _ = u#set_edge_attribute e "stroke" "dashed" in + previous_r := Some r + done diff --git a/examples/wordpress/Makefile b/examples/wordpress/Makefile new file mode 100644 index 0000000..b9676d9 --- /dev/null +++ b/examples/wordpress/Makefile @@ -0,0 +1,7 @@ +OCAMLMAKEFILE = OCamlMakefile + +RESULT = test +SOURCES = WordPress.mli WordPress.ml test.ml +PACKS = xmlrpc-light + +include $(OCAMLMAKEFILE) diff --git a/examples/wordpress/OCamlMakefile b/examples/wordpress/OCamlMakefile new file mode 100644 index 0000000..9adb295 --- /dev/null +++ b/examples/wordpress/OCamlMakefile @@ -0,0 +1,1154 @@ +########################################################################### +# OCamlMakefile +# Copyright (C) 1999-2004 Markus Mottl +# +# For updates see: +# http://www.ocaml.info/home/ocaml_sources.html +# +# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $ +# +########################################################################### + +# Modified by damien for .glade.ml compilation + +# Set these variables to the names of the sources to be processed and +# the result variable. Order matters during linkage! + +ifndef SOURCES + SOURCES := foo.ml +endif +export SOURCES + +ifndef RES_CLIB_SUF + RES_CLIB_SUF := _stubs +endif +export RES_CLIB_SUF + +ifndef RESULT + RESULT := foo +endif +export RESULT + +export LIB_PACK_NAME + +ifndef DOC_FILES + DOC_FILES := $(filter %.mli, $(SOURCES)) +endif +export DOC_FILES + +export BCSUFFIX +export NCSUFFIX + +ifndef TOPSUFFIX + TOPSUFFIX := .top +endif +export TOPSUFFIX + +# Eventually set include- and library-paths, libraries to link, +# additional compilation-, link- and ocamlyacc-flags +# Path- and library information needs not be written with "-I" and such... +# Define THREADS if you need it, otherwise leave it unset (same for +# USE_CAMLP4)! + +export THREADS +export VMTHREADS +export ANNOTATE +export USE_CAMLP4 + +export INCDIRS +export LIBDIRS +export EXTLIBDIRS +export RESULTDEPS +export OCAML_DEFAULT_DIRS + +export LIBS +export CLIBS + +export OCAMLFLAGS +export OCAMLNCFLAGS +export OCAMLBCFLAGS + +export OCAMLLDFLAGS +export OCAMLNLDFLAGS +export OCAMLBLDFLAGS + +ifndef OCAMLCPFLAGS + OCAMLCPFLAGS := a +endif + +export OCAMLCPFLAGS + +export PPFLAGS + +export YFLAGS +export IDLFLAGS + +export OCAMLDOCFLAGS + +export OCAMLFIND_INSTFLAGS + +export DVIPSFLAGS + +export STATIC + +# Add a list of optional trash files that should be deleted by "make clean" +export TRASH + +#################### variables depending on your OCaml-installation + +ifdef MINGW + export MINGW + WIN32 := 1 + CFLAGS_WIN32 := -mno-cygwin +endif +ifdef MSVC + export MSVC + WIN32 := 1 + ifndef STATIC + CPPFLAGS_WIN32 := -DCAML_DLL + endif + CFLAGS_WIN32 += -nologo + EXT_OBJ := obj + EXT_LIB := lib + ifeq ($(CC),gcc) + # work around GNU Make default value + ifdef THREADS + CC := cl -MT + else + CC := cl + endif + endif + ifeq ($(CXX),g++) + # work around GNU Make default value + CXX := $(CC) + endif + CFLAG_O := -Fo +endif +ifdef WIN32 + EXT_CXX := cpp + EXE := .exe +endif + +ifndef EXT_OBJ + EXT_OBJ := o +endif +ifndef EXT_LIB + EXT_LIB := a +endif +ifndef EXT_CXX + EXT_CXX := cc +endif +ifndef EXE + EXE := # empty +endif +ifndef CFLAG_O + CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! +endif + +export CC +export CXX +export CFLAGS +export CXXFLAGS +export LDFLAGS +export CPPFLAGS + +ifndef RPATH_FLAG + RPATH_FLAG := -R +endif +export RPATH_FLAG + +ifndef MSVC +ifndef PIC_CFLAGS + PIC_CFLAGS := -fPIC +endif +ifndef PIC_CPPFLAGS + PIC_CPPFLAGS := -DPIC +endif +endif + +export PIC_CFLAGS +export PIC_CPPFLAGS + +BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) +NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) +TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) + +ifndef OCAMLFIND + OCAMLFIND := ocamlfind +endif +export OCAMLFIND + +ifndef OCAMLC + OCAMLC := ocamlc +endif +export OCAMLC + +ifndef OCAMLOPT + OCAMLOPT := ocamlopt +endif +export OCAMLOPT + +ifndef OCAMLMKTOP + OCAMLMKTOP := ocamlmktop +endif +export OCAMLMKTOP + +ifndef OCAMLCP + OCAMLCP := ocamlcp +endif +export OCAMLCP + +ifndef OCAMLDEP + OCAMLDEP := ocamldep +endif +export OCAMLDEP + +ifndef OCAMLLEX + OCAMLLEX := ocamllex +endif +export OCAMLLEX + +ifndef OCAMLYACC + OCAMLYACC := ocamlyacc +endif +export OCAMLYACC + +ifndef OCAMLMKLIB + OCAMLMKLIB := ocamlmklib +endif +export OCAMLMKLIB + +ifndef OCAML_GLADECC + OCAML_GLADECC := lablgladecc2 +endif +export OCAML_GLADECC + +ifndef OCAML_GLADECC_FLAGS + OCAML_GLADECC_FLAGS := +endif +export OCAML_GLADECC_FLAGS + +ifndef CAMELEON_REPORT + CAMELEON_REPORT := report +endif +export CAMELEON_REPORT + +ifndef CAMELEON_REPORT_FLAGS + CAMELEON_REPORT_FLAGS := +endif +export CAMELEON_REPORT_FLAGS + +ifndef CAMELEON_ZOGGY + CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo +endif +export CAMELEON_ZOGGY + +ifndef CAMELEON_ZOGGY_FLAGS + CAMELEON_ZOGGY_FLAGS := +endif +export CAMELEON_ZOGGY_FLAGS + +ifndef OXRIDL + OXRIDL := oxridl +endif +export OXRIDL + +ifndef CAMLIDL + CAMLIDL := camlidl +endif +export CAMLIDL + +ifndef CAMLIDLDLL + CAMLIDLDLL := camlidldll +endif +export CAMLIDLDLL + +ifndef NOIDLHEADER + MAYBE_IDL_HEADER := -header +endif +export NOIDLHEADER + +export NO_CUSTOM + +ifndef CAMLP4 + CAMLP4 := camlp4 +endif +export CAMLP4 + +ifndef REAL_OCAMLFIND + ifdef PACKS + ifndef CREATE_LIB + ifdef THREADS + PACKS += threads + endif + endif + empty := + space := $(empty) $(empty) + comma := , + ifdef PREDS + PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) + PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) + OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) + # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) + OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + else + OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) + OCAML_DEP_PACKAGES := + endif + OCAML_FIND_LINKPKG := -linkpkg + REAL_OCAMLFIND := $(OCAMLFIND) + endif +endif + +export OCAML_FIND_PACKAGES +export OCAML_DEP_PACKAGES +export OCAML_FIND_LINKPKG +export REAL_OCAMLFIND + +ifndef OCAMLDOC + OCAMLDOC := ocamldoc +endif +export OCAMLDOC + +ifndef LATEX + LATEX := latex +endif +export LATEX + +ifndef DVIPS + DVIPS := dvips +endif +export DVIPS + +ifndef PS2PDF + PS2PDF := ps2pdf +endif +export PS2PDF + +ifndef OCAMLMAKEFILE + OCAMLMAKEFILE := OCamlMakefile +endif +export OCAMLMAKEFILE + +ifndef OCAMLLIBPATH + OCAMLLIBPATH := \ + $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) +endif +export OCAMLLIBPATH + +ifndef OCAML_LIB_INSTALL + OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib +endif +export OCAML_LIB_INSTALL + +########################################################################### + +#################### change following sections only if +#################### you know what you are doing! + +# delete target files when a build command fails +.PHONY: .DELETE_ON_ERROR +.DELETE_ON_ERROR: + +# for pedants using "--warn-undefined-variables" +export MAYBE_IDL +export REAL_RESULT +export CAMLIDLFLAGS +export THREAD_FLAG +export RES_CLIB +export MAKEDLL +export ANNOT_FLAG +export C_OXRIDL +export SUBPROJS +export CFLAGS_WIN32 +export CPPFLAGS_WIN32 + +INCFLAGS := + +SHELL := /bin/sh + +MLDEPDIR := ._d +BCDIDIR := ._bcdi +NCDIDIR := ._ncdi + +FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade + +FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) +SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) + +FILTERED_REP := $(filter %.rep, $(FILTERED)) +DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) +AUTO_REP := $(FILTERED_REP:.rep=.ml) + +FILTERED_ZOG := $(filter %.zog, $(FILTERED)) +DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) +AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) + +FILTERED_GLADE := $(filter %.glade, $(FILTERED)) +DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) +AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) + +FILTERED_ML := $(filter %.ml, $(FILTERED)) +DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) + +FILTERED_MLI := $(filter %.mli, $(FILTERED)) +DEP_MLI := $(FILTERED_MLI:.mli=.di) + +FILTERED_MLL := $(filter %.mll, $(FILTERED)) +DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) +AUTO_MLL := $(FILTERED_MLL:.mll=.ml) + +FILTERED_MLY := $(filter %.mly, $(FILTERED)) +DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) +AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) + +FILTERED_IDL := $(filter %.idl, $(FILTERED)) +DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) +C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) +ifndef NOIDLHEADER + C_IDL += $(FILTERED_IDL:.idl=.h) +endif +OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) +AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) + +FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) +DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) +AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) + +FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED)) +OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) +OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) + +PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) + +ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) + +MLDEPS := $(filter %.d, $(ALL_DEPS)) +MLIDEPS := $(filter %.di, $(ALL_DEPS)) +BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) +NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) + +ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) + +IMPLO_INTF := $(ALLML:%.mli=%.mli.__) +IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ + $(basename $(file)).cmi $(basename $(file)).cmo) +IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) +IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) + +IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) + +INTF := $(filter %.cmi, $(IMPLO_INTF)) +IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) +IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) +IMPL_ASM := $(IMPL_CMO:.cmo=.asm) +IMPL_S := $(IMPL_CMO:.cmo=.s) + +OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) +OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) + +EXECS := $(addsuffix $(EXE), \ + $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) +ifdef WIN32 + EXECS += $(BCRESULT).dll $(NCRESULT).dll +endif + +CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) +ifneq ($(strip $(OBJ_LINK)),) + RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) +endif + +ifdef WIN32 +DLLSONAME := $(CLIB_BASE).dll +else +DLLSONAME := dll$(CLIB_BASE).so +endif + +NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ + $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ + $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ + $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ + $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ + $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o + +ifndef STATIC + NONEXECS += $(DLLSONAME) +endif + +ifndef LIBINSTALL_FILES + LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ + $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + LIBINSTALL_FILES += $(DLLSONAME) + endif + endif +endif + +export LIBINSTALL_FILES + +ifdef WIN32 + # some extra stuff is created while linking DLLs + NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib +endif + +TARGETS := $(EXECS) $(NONEXECS) + +# If there are IDL-files +ifneq ($(strip $(FILTERED_IDL)),) + MAYBE_IDL := -cclib -lcamlidl +endif + +ifdef USE_CAMLP4 + CAMLP4PATH := \ + $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) + INCFLAGS := -I $(CAMLP4PATH) + CINCFLAGS := -I$(CAMLP4PATH) +endif + +DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) +INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) +CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) + +ifndef MSVC +CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ + $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-L%) +endif + +ifndef PROFILING + INTF_OCAMLC := $(OCAMLC) +else + ifndef THREADS + INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) + else + # OCaml does not support profiling byte code + # with threads (yet), therefore we force an error. + ifndef REAL_OCAMLC + $(error Profiling of multithreaded byte code not yet supported by OCaml) + endif + INTF_OCAMLC := $(OCAMLC) + endif +endif + +ifndef MSVC +COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ + $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ + $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-ccopt -L%) +else +COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ + $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ + $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " +endif + +CLIBS_OPTS := $(CLIBS:%=-cclib -l%) +ifdef MSVC + ifndef STATIC + # MSVC libraries do not have 'lib' prefix + CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) + endif +endif + +ifneq ($(strip $(OBJ_LINK)),) + ifdef CREATE_LIB + OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) + else + OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) + endif +else + OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) +endif + +# If we have to make byte-code +ifndef REAL_OCAMLC + BYTE_OCAML := y + + # EXTRADEPS is added dependencies we have to insert for all + # executable files we generate. Ideally it should be all of the + # libraries we use, but it's hard to find the ones that get searched on + # the path since I don't know the paths built into the compiler, so + # just include the ones with slashes in their names. + EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) + + REAL_OCAMLC := $(INTF_OCAMLC) + + REAL_IMPL := $(IMPL_CMO) + REAL_IMPL_INTF := $(IMPLO_INTF) + IMPL_SUF := .cmo + + DEPFLAGS := + MAKE_DEPS := $(MLDEPS) $(BCDEPIS) + + ifdef CREATE_LIB + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + MAKEDLL := $(DLLSONAME) + ALL_LDFLAGS := -dllib $(DLLSONAME) + endif + endif + endif + + ifndef NO_CUSTOM + ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" "" + ALL_LDFLAGS += -custom + endif + endif + + ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ + $(COMMON_LDFLAGS) $(LIBS:%=%.cma) + CAMLIDLDLLFLAGS := + + ifdef THREADS + ifdef VMTHREADS + THREAD_FLAG := -vmthread + else + THREAD_FLAG := -thread + endif + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) + endif + endif + endif + +# we have to make native-code +else + EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + ifndef PROFILING + SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) + PLDFLAGS := + else + SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) + PLDFLAGS := -p + endif + + REAL_IMPL := $(IMPL_CMX) + REAL_IMPL_INTF := $(IMPLX_INTF) + IMPL_SUF := .cmx + + override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) + + DEPFLAGS := -native + MAKE_DEPS := $(MLDEPS) $(NCDEPIS) + + ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ + $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) + CAMLIDLDLLFLAGS := -opt + + ifndef CREATE_LIB + ALL_LDFLAGS += $(LIBS:%=%.cmxa) + else + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + endif + + ifdef THREADS + THREAD_FLAG := -thread + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) + endif + endif + endif +endif + +export MAKE_DEPS + +ifdef ANNOTATE + ANNOT_FLAG := -dtypes +else +endif + +ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ + $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) + +ifdef make_deps + -include $(MAKE_DEPS) + PRE_TARGETS := +endif + +########################################################################### +# USER RULES + +# Call "OCamlMakefile QUIET=" to get rid of all of the @'s. +QUIET=@ + +# generates byte-code (default) +byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bc: byte-code + +byte-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bcnl: byte-code-nolink + +top: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes + +# generates native-code + +native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +nc: native-code + +native-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncnl: native-code-nolink + +# generates byte-code libraries +byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" \ + CREATE_LIB=yes \ + make_deps=yes +bcl: byte-code-library + +# generates native-code libraries +native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +ncl: native-code-library + +ifdef WIN32 +# generates byte-code dll +byte-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).dll \ + REAL_RESULT="$(BCRESULT)" \ + make_deps=yes +bcd: byte-code-dll + +# generates native-code dll +native-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).dll \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncd: native-code-dll +endif + +# generates byte-code with debugging information +debug-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dc: debug-code + +debug-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcnl: debug-code-nolink + +# generates byte-code libraries with debugging information +debug-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + CREATE_LIB=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcl: debug-code-library + +# generates byte-code for profiling +profiling-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + make_deps=yes +pbc: profiling-byte-code + +# generates native-code + +profiling-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PROFILING="y" \ + make_deps=yes +pnc: profiling-native-code + +# generates byte-code libraries +profiling-byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + CREATE_LIB=yes \ + make_deps=yes +pbcl: profiling-byte-code-library + +# generates native-code libraries +profiling-native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" PROFILING="y" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +pncl: profiling-native-code-library + +# packs byte-code objects +pack-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ + REAL_RESULT="$(BCRESULT)" \ + PACK_LIB=yes make_deps=yes +pabc: pack-byte-code + +# packs native-code objects +pack-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(NCRESULT).cmx $(NCRESULT).o \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PACK_LIB=yes make_deps=yes +panc: pack-native-code + +# generates HTML-documentation +htdoc: doc/$(RESULT)/html + +# generates Latex-documentation +ladoc: doc/$(RESULT)/latex + +# generates PostScript-documentation +psdoc: doc/$(RESULT)/latex/doc.ps + +# generates PDF-documentation +pdfdoc: doc/$(RESULT)/latex/doc.pdf + +# generates all supported forms of documentation +doc: htdoc ladoc psdoc pdfdoc + +########################################################################### +# LOW LEVEL RULES + +$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) + +ifdef WIN32 +$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) + $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ + -o $@ $(REAL_IMPL) +endif + +%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ + .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \ + .rep .zog .glade + +ifndef STATIC +ifdef MINGW +$(DLLSONAME): $(OBJ_LINK) + $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ + -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ + $(OCAMLLIBPATH)/ocamlrun.a \ + -Wl,--export-all-symbols \ + -Wl,--no-whole-archive +else +ifdef MSVC +$(DLLSONAME): $(OBJ_LINK) + link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ + $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ + $(OCAMLLIBPATH)/ocamlrun.lib + +else +$(DLLSONAME): $(OBJ_LINK) + $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ + -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \ + $(OCAMLMKLIB_FLAGS) +endif +endif +endif + +ifndef LIB_PACK_NAME +$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL) + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL) +else +ifdef BYTE_OCAML +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL) +else +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL) +endif + +$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx +endif + +$(RES_CLIB): $(OBJ_LINK) +ifndef MSVC + ifneq ($(strip $(OBJ_LINK)),) + $(AR) rcs $@ $(OBJ_LINK) + endif +else + ifneq ($(strip $(OBJ_LINK)),) + lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) + endif +endif + +.mli.cmi: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + fi + +.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ + fi + +ifdef PACK_LIB +$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(REAL_IMPL) +endif + +.PRECIOUS: %.ml +%.ml: %.mll + $(OCAMLLEX) $< + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.mly + $(OCAMLYACC) $(YFLAGS) $< + $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ + if [ ! -z "$$pp" ]; then \ + mv $*.ml $*.ml.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ + cat $*.ml.temporary >> $*.ml; \ + rm $*.ml.temporary; \ + mv $*.mli $*.mli.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ + cat $*.mli.temporary >> $*.mli; \ + rm $*.mli.temporary; \ + fi + + +.PRECIOUS: %.ml +%.ml: %.rep + $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< + +.PRECIOUS: %.ml +%.ml: %.zog + $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ + +.PRECIOUS: %.ml +%.ml: %.glade + $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.oxridl + $(OXRIDL) $< + +.PRECIOUS: %.ml %.mli %_stubs.c %.h +%.ml %.mli %_stubs.c %.h: %.idl + $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ + $(CAMLIDLFLAGS) $< + $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi + +.c.$(EXT_OBJ): + $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ + $(CPPFLAGS) $(CPPFLAGS_WIN32) \ + $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< + +.$(EXT_CXX).$(EXT_OBJ): + $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ + -I'$(OCAMLLIBPATH)' \ + $< $(CFLAG_O)$@ + +$(MLDEPDIR)/%.d: %.ml + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +doc/$(RESULT)/html: $(DOC_FILES) + #rm -rf $@ + #mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + fi + +doc/$(RESULT)/latex: $(DOC_FILES) + #rm -rf $@ + #mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ + $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ + -o $@/doc.tex; \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + fi + +doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex + cd doc/$(RESULT)/latex && \ + $(LATEX) doc.tex && \ + $(LATEX) doc.tex && \ + $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) + +doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps + cd doc/$(RESULT)/latex && $(PS2PDF) $( List.map f items + | other -> raise (Type_error (XmlRpc.dump other)) + +let iter_struct f = function + | `Struct pairs -> List.iter f pairs + | other -> raise (Type_error (XmlRpc.dump other)) + +let int_value = function + | `Int n -> n + | `String s -> int_of_string s + | other -> raise (Type_error (XmlRpc.dump other)) + +module Blog = struct + type t = { mutable is_admin : bool; + mutable url : string; + mutable blog_id : int; + mutable blog_name : string; + mutable xmlrpc : string; } + + let make () = + {is_admin=false; + url=""; + blog_id=0; + blog_name=""; + xmlrpc=""} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("isAdmin", `Boolean v) -> result.is_admin <- v + | ("url", `String v) -> result.url <- v + | ("blogid", `String v) -> result.blog_id <- int_of_string v + | ("blogid", `Int v) -> result.blog_id <- v + | ("blogName", `String v) -> result.blog_name <- v + | ("xmlrpc", `String v) -> result.xmlrpc <- v + | (field, _) -> warn (Unknown_field field)) + value; + result +end + +module Category = struct + type t = { mutable category_id : int; + mutable parent_id : int; + mutable description : string; + mutable category_name : string; + mutable html_url : string; + mutable rss_url : string; } + + let make () = + {category_id=0; + parent_id=0; + description=""; + category_name=""; + html_url=""; + rss_url=""} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("categoryId", `String v) -> result.category_id <- int_of_string v + | ("categoryId", `Int v) -> result.category_id <- v + | ("parentId", `String v) -> result.parent_id <- int_of_string v + | ("parentId", `Int v) -> result.parent_id <- v + | ("description", `String v) -> result.description <- v + | ("categoryName", `String v) -> result.category_name <- v + | ("htmlUrl", `String v) -> result.html_url <- v + | ("rssUrl", `String v) -> result.rss_url <- v + | (field, _) -> warn (Unknown_field field)) + value; + result +end + +module CommentCount = struct + type t = { mutable approved : int; + mutable awaiting_moderation : int; + mutable spam : int; + mutable total_comments : int; } + + let make () = + {approved=0; + awaiting_moderation=0; + spam=0; + total_comments=0} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("approved", `String v) -> result.approved <- int_of_string v + | ("approved", `Int v) -> result.approved <- v + | ("awaiting_moderation", `Int v) -> result.awaiting_moderation <- v + | ("spam", `Int v) -> result.spam <- v + | ("total_comments", `Int v) -> result.total_comments <- v + | (field, _) -> warn (Unknown_field field)) + value; + result +end + +module Comment = struct + type t = { mutable date_created : XmlRpcDateTime.t; + mutable user_id : int; + mutable comment_id : int; + mutable parent : int; + mutable status : string; + mutable content : string; + mutable link : string; + mutable post_id : int; + mutable post_title : string; + mutable author : string; + mutable author_url : string; + mutable author_email : string; + mutable author_ip : string; + mutable typ : string } + + let make () = + {date_created=(0,0,0,0,0,0,0); + user_id=0; + comment_id=0; + parent=0; + status=""; + content=""; + link=""; + post_id=0; + post_title=""; + author=""; + author_url=""; + author_email=""; + author_ip=""; + typ=""} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("date_created_gmt", `DateTime v) -> result.date_created <- v + | ("user_id", `String v) -> result.user_id <- int_of_string v + | ("user_id", `Int v) -> result.user_id <- v + | ("comment_id", `String v) -> result.comment_id <- int_of_string v + | ("comment_id", `Int v) -> result.comment_id <- v + | ("parent", `String v) -> result.parent <- int_of_string v + | ("parent", `Int v) -> result.parent <- v + | ("status", `String v) -> result.status <- v + | ("content", `String v) -> result.content <- v + | ("link", `String v) -> result.link <- v + | ("post_id", `String v) -> result.post_id <- int_of_string v + | ("post_id", `Int v) -> result.post_id <- v + | ("post_title", `String v) -> result.post_title <- v + | ("author", `String v) -> result.author <- v + | ("author_url", `String v) -> result.author_url <- v + | ("author_email", `String v) -> result.author_email <- v + | ("author_ip", `String v) -> result.author_ip <- v + | ("type", `String v) -> result.typ <- v + | (field, _) -> warn (Unknown_field field)) + value; + result + + let to_xmlrpc comment = + `Struct ["date_created_gmt", `DateTime (XmlRpcDateTime.set_tz_offset 0 + comment.date_created); + "user_id", `Int comment.user_id; + "comment_id", `Int comment.comment_id; + "parent", `Int comment.parent; + "status", `String comment.status; + "content", `String comment.content; + "link", `String comment.link; + "post_id", `Int comment.post_id; + "post_title", `String comment.post_title; + "author", `String comment.author; + "author_url", `String comment.author_url; + "author_email", `String comment.author_email; + "author_ip", `String comment.author_ip; + "type", `String comment.typ] +end + +module CustomField = struct + type t = { mutable id : int option; + mutable key : string option; + mutable value : string } + + let make () = + {id=None; + key=None; + value=""} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("id", `String v) -> result.id <- Some (int_of_string v) + | ("id", `Int v) -> result.id <- Some v + | ("key", `String v) -> result.key <- Some v + | ("value", `String v) -> result.value <- v + | (field, _) -> warn (Unknown_field field)) + value; + result + + let to_xmlrpc field = + match field with + | {id=None; key=None; value=value} -> + `Struct ["value", `String value] + | {id=Some id; key=None; value=value} -> + `Struct ["id", `Int id; "value", `String value] + | {id=None; key=Some key; value=value} -> + `Struct ["key", `String key; "value", `String value] + | {id=Some id; key=Some key; value=value} -> + `Struct ["id", `Int id; "key", `String key; "value", `String value] +end + +module Option = struct + type t = { mutable desc : string; + mutable readonly : bool; + mutable value : string; } + + let make () = + {desc=""; + readonly=false; + value=""} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("desc", `String v) -> result.desc <- v + | ("readonly", `Boolean v) -> result.readonly <- v + | ("value", `String v) -> result.value <- v + | (field, _) -> warn (Unknown_field field)) + value; + result +end + +module User = struct + type t = { mutable user_id : int; + mutable user_login : string; + mutable display_name : string; + mutable user_email : string; + mutable meta_value : string; } + + let make () = + {user_id=0; + user_login=""; + display_name=""; + user_email=""; + meta_value=""} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("user_id", `String v) -> result.user_id <- int_of_string v + | ("user_id", `Int v) -> result.user_id <- v + | ("user_login", `String v) -> result.user_login <- v + | ("display_name", `String v) -> result.display_name <- v + | ("user_email", `String v) -> result.user_email <- v + | ("meta_value", `String v) -> result.meta_value <- v + | (field, _) -> warn (Unknown_field field)) + value; + result +end + +module PageListItem = struct + type t = { mutable page_id : int; + mutable page_title : string; + mutable page_parent_id : int; + mutable date_created : XmlRpcDateTime.t; + } + + let make () = + {page_id=0; + page_title=""; + page_parent_id=0; + date_created=(0,0,0,0,0,0,0)} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("page_id", `String v) -> result.page_id <- int_of_string v + | ("page_id", `Int v) -> result.page_id <- v + | ("page_title", `String v) -> result.page_title <- v + | ("page_parent_id", `String v) -> result.page_parent_id <- int_of_string v + | ("page_parent_id", `Int v) -> result.page_parent_id <- v + | ("dateCreated", `DateTime v) -> result.date_created <- v + | ("date_created_gmt", `DateTime v) -> result.date_created <- v + | (field, _) -> warn (Unknown_field field)) + value; + result +end + +module Page = struct + type t = { mutable date_created : XmlRpcDateTime.t; + mutable user_id : int; + mutable page_id : int; + mutable page_status : string; + mutable description : string; + mutable title : string; + mutable link : string; + mutable permalink : string; + mutable categories : string list; + mutable excerpt : string; + mutable text_more : string; + mutable mt_allow_comments : bool; + mutable mt_allow_pings : bool; + mutable wp_slug : string; + mutable wp_password : string; + mutable wp_author : string; + mutable wp_page_parent_id : int; + mutable wp_page_parent_title : string; + mutable wp_page_order : int; + mutable wp_author_id : int; + mutable wp_author_display_name : string; + mutable custom_fields : CustomField.t list; + mutable wp_page_template : string; } + + let make () = + {date_created=(0,0,0,0,0,0,0); + user_id=0; + page_id=0; + page_status=""; + description=""; + title=""; + link=""; + permalink=""; + categories=[]; + excerpt=""; + text_more=""; + mt_allow_comments=false; + mt_allow_pings=false; + wp_slug=""; + wp_password=""; + wp_author=""; + wp_page_parent_id=0; + wp_page_parent_title=""; + wp_page_order=0; + wp_author_id=0; + wp_author_display_name=""; + custom_fields=[]; + wp_page_template=""} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("dateCreated", `DateTime v) -> result.date_created <- v + | ("date_created_gmt", `DateTime v) -> result.date_created <- v + | ("userid", `String v) -> result.user_id <- int_of_string v + | ("userid", `Int v) -> result.user_id <- v + | ("page_id", `String v) -> result.page_id <- int_of_string v + | ("page_id", `Int v) -> result.page_id <- v + | ("page_status", `String v) -> result.page_status <- v + | ("description", `String v) -> result.description <- v + | ("title", `String v) -> result.title <- v + | ("link", `String v) -> result.link <- v + | ("permaLink", `String v) -> result.permalink <- v + | ("categories", `Array v) -> + result.categories <- List.map XmlRpc.dump v + | ("excerpt", `String v) -> result.excerpt <- v + | ("text_more", `String v) -> result.text_more <- v + | ("mt_excerpt", `String v) -> result.excerpt <- v + | ("mt_text_more", `String v) -> result.text_more <- v + | ("mt_allow_comments", `Int v) -> result.mt_allow_comments <- v<>0 + | ("mt_allow_comments", `Boolean v) -> result.mt_allow_comments <- v + | ("mt_allow_pings", `Int v) -> result.mt_allow_pings <- v<>0 + | ("mt_allow_pings", `Boolean v) -> result.mt_allow_pings <- v + | ("wp_slug", `String v) -> result.wp_slug <- v + | ("wp_password", `String v) -> result.wp_password <- v + | ("wp_author", `String v) -> result.wp_author <- v + | ("wp_author_display_name", `String v) -> + result.wp_author_display_name <- v + | ("wp_page_parent_id", `String v) -> + result.wp_page_parent_id <- int_of_string v + | ("wp_page_parent_id", `Int v) -> + result.wp_page_parent_id <- v + | ("wp_page_parent_title", `String v) -> + result.wp_page_parent_title <- v + | ("wp_page_order", `String v) -> + result.wp_page_order <- int_of_string v + | ("wp_page_order", `Int v) -> + result.wp_page_order <- v + | ("wp_author_id", `String v) -> + result.wp_author_id <- int_of_string v + | ("wp_author_id", `Int v) -> + result.wp_author_id <- v + | ("custom_fields", `Array v) -> + result.custom_fields <- List.map CustomField.of_xmlrpc v + | ("wp_page_template", `String v) -> + result.wp_page_template <- v + | (field, _) -> warn (Unknown_field field)) + value; + result + + let to_xmlrpc page = + `Struct ["userid", `Int page.user_id; + "page_id", `Int page.page_id; + "page_status", `String page.page_status; + "wp_slug", `String page.wp_slug; + "wp_password", `String page.wp_password; + "wp_author", `String page.wp_author; + "wp_author_display_name", `String page.wp_author_display_name; + "wp_page_parent_id", `Int page.wp_page_parent_id; + "wp_page_parent_title", `String page.wp_page_parent_title; + "wp_page_order", `Int page.wp_page_order; + "wp_author_id", `Int page.wp_author_id; + "title", `String page.title; + "description", `String page.description; + "link", `String page.link; + "permaLink", `String page.permalink; + "mt_excerpt", `String page.excerpt; + "mt_text_more", `String page.text_more; + "mt_allow_comments", `Boolean page.mt_allow_comments; + "mt_allow_pings", `Boolean page.mt_allow_pings; + "dateCreated", `DateTime page.date_created; + "date_created_gmt", `DateTime (XmlRpcDateTime.set_tz_offset 0 + page.date_created); + "categories", `Array (List.map + (fun s -> `String s) + page.categories); + "custom_fields", `Array (List.map + CustomField.to_xmlrpc + page.custom_fields); + "wp_page_template", `String page.wp_page_template] +end + +module Post = struct + type t = { mutable user_id : int; + mutable post_id : int; + mutable post_status : string; + mutable date_created : XmlRpcDateTime.t; + mutable description : string; + mutable title : string; + mutable link : string; + mutable permalink : string; + mutable categories : string list; + mutable excerpt : string; + mutable text_more : string; + mutable mt_allow_comments : bool; + mutable mt_allow_pings : bool; + mutable mt_keywords : string; + mutable wp_slug : string; + mutable wp_password : string; + mutable wp_author_id : int; + mutable wp_author_display_name : string; + mutable custom_fields : CustomField.t list; } + + let make () = + {date_created=(0,0,0,0,0,0,0); + user_id=0; + post_id=0; + post_status=""; + description=""; + title=""; + link=""; + permalink=""; + categories=[]; + excerpt=""; + text_more=""; + mt_allow_comments=false; + mt_allow_pings=false; + mt_keywords=""; + wp_slug=""; + wp_password=""; + wp_author_id=0; + wp_author_display_name=""; + custom_fields=[]} + + let of_xmlrpc value = + let result = make () in + iter_struct + (function + | ("dateCreated", `DateTime v) -> result.date_created <- v + | ("date_created_gmt", `DateTime v) -> result.date_created <- v + | ("userid", `String v) -> result.user_id <- int_of_string v + | ("userid", `Int v) -> result.user_id <- v + | ("postid", `String v) -> result.post_id <- int_of_string v + | ("postid", `Int v) -> result.post_id <- v + | ("post_status", `String v) -> result.post_status <- v + | ("description", `String v) -> result.description <- v + | ("title", `String v) -> result.title <- v + | ("link", `String v) -> result.link <- v + | ("permaLink", `String v) -> result.permalink <- v + | ("categories", `Array v) -> + result.categories <- List.map XmlRpc.dump v + | ("mt_excerpt", `String v) -> result.excerpt <- v + | ("mt_text_more", `String v) -> result.text_more <- v + | ("mt_allow_comments", `Int v) -> result.mt_allow_comments <- v<>0 + | ("mt_allow_comments", `Boolean v) -> result.mt_allow_comments <- v + | ("mt_allow_pings", `Int v) -> result.mt_allow_pings <- v<>0 + | ("mt_allow_pings", `Boolean v) -> result.mt_allow_pings <- v + | ("mt_keywords", `String v) -> result.mt_keywords <- v + | ("wp_slug", `String v) -> result.wp_slug <- v + | ("wp_password", `String v) -> result.wp_password <- v + | ("wp_author_id", `String v) -> result.wp_author_id <- int_of_string v + | ("wp_author_id", `Int v) -> result.wp_author_id <- v + | ("wp_author_display_name", `String v) -> + result.wp_author_display_name <- v + | ("custom_fields", `Array v) -> + result.custom_fields <- List.map CustomField.of_xmlrpc v + | (field, _) -> warn (Unknown_field field)) + value; + result + + let to_xmlrpc post = + `Struct ["dateCreated", `DateTime post.date_created; + "date_created_gmt", `DateTime (XmlRpcDateTime.set_tz_offset 0 + post.date_created); + "userid", `Int post.user_id; + "postid", `Int post.post_id; + "post_status", `String post.post_status; + "description", `String post.description; + "title", `String post.title; + "link", `String post.link; + "permaLink", `String post.permalink; + "categories", `Array (List.map + (fun s -> `String s) + post.categories); + "mt_excerpt", `String post.excerpt; + "mt_text_more", `String post.text_more; + "mt_allow_comments", `Boolean post.mt_allow_comments; + "mt_allow_pings", `Boolean post.mt_allow_pings; + "mt_keywords", `String post.mt_keywords; + "wp_slug", `String post.wp_slug; + "wp_password", `String post.wp_password; + "wp_author_id", `Int post.wp_author_id; + "wp_author_display_name", `String post.wp_author_display_name; + "custom_fields", `Array (List.map + CustomField.to_xmlrpc + post.custom_fields)]; +end + +class api ~url ~blog_id ~username ~password = +object (self) + val rpc = new XmlRpc.client url + val std_args = [`Int blog_id; `String username; `String password] + val blog_id = blog_id + val username = username + val password = password + + method rpc = rpc + + method get_page page_id = + Page.of_xmlrpc (rpc#call "wp.getPage" + [`Int blog_id; + `Int page_id; + `String username; + `String password]) + + method get_pages () = + map_array Page.of_xmlrpc (rpc#call "wp.getPages" std_args) + + method get_page_list () = + map_array PageListItem.of_xmlrpc (rpc#call "wp.getPageList" std_args) + + method get_page_status_list () = + match rpc#call "wp.getPageStatusList" std_args with + | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs + | other -> raise (Type_error (XmlRpc.dump other)) + + method get_page_templates () = + match rpc#call "wp.getPageTemplates" std_args with + | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_page content publish = + int_value + (rpc#call "wp.newPage" + (std_args @ [Page.to_xmlrpc content; `Boolean publish])) + + method edit_page page_id content publish = + ignore + (rpc#call "wp.editPage" [`Int blog_id; + `Int page_id; + `String username; + `String password; + Page.to_xmlrpc content; + `Boolean publish]) + + method delete_page page_id = + ignore + (rpc#call "wp.deletePage" (std_args @ [`Int page_id])) + + method get_post post_id = + Post.of_xmlrpc (rpc#call "metaWeblog.getPost" + [`Int post_id; + `String username; + `String password]) + + method get_recent_posts num_posts = + map_array Post.of_xmlrpc (rpc#call "metaWeblog.getRecentPosts" + (std_args @ [`Int num_posts])) + + method get_post_status_list () = + match rpc#call "wp.getPostStatusList" std_args with + | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs + | other -> raise (Type_error (XmlRpc.dump other)) + + method new_post content publish = + int_value + (rpc#call "metaWeblog.newPost" + (std_args @ [Post.to_xmlrpc content; `Boolean publish])) + + method edit_post post_id content publish = + ignore + (rpc#call "metaWeblog.editPost" [`Int post_id; + `String username; + `String password; + Post.to_xmlrpc content; + `Boolean publish]) + + method delete_post post_id = + ignore + (rpc#call "metaWeblog.deletePost" [`Int blog_id; + `Int post_id; + `String username; + `String password; + `Boolean false]) + + method get_authors () = + map_array User.of_xmlrpc (rpc#call "wp.getAuthors" std_args) + + method get_blogs () = + map_array Blog.of_xmlrpc (rpc#call "wp.getUsersBlogs" [`String username; + `String password]) + + method get_comment_count post_id = + CommentCount.of_xmlrpc + (rpc#call "wp.getCommentCount" (std_args @ [`Int post_id])) + + method get_comment_status_list () = + match rpc#call "wp.getCommentStatusList" std_args with + | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs + | other -> raise (Type_error (XmlRpc.dump other)) + + method get_comment comment_id = + Comment.of_xmlrpc + (rpc#call "wp.getComment" (std_args @ [`Int comment_id])) + + method get_comments ?(status="") ?(post_id=0) ?(offset=0) ?(number=10) () = + map_array Comment.of_xmlrpc + (rpc#call "wp.getComments" + (std_args @ [`Struct ["status", `String status; + "post_id", `Int post_id; + "offset", `Int offset; + "number", `Int number]])) + + method new_comment comment = + int_value + (rpc#call "wp.newComment" + (std_args @ [`Int comment.Comment.post_id; + Comment.to_xmlrpc comment])) + + method edit_comment comment_id comment = + ignore + (rpc#call "wp.editComment" + (std_args @ [`Int comment_id; + Comment.to_xmlrpc comment])) + + method delete_comment comment_id = + ignore + (rpc#call "wp.deleteComment" (std_args @ [`Int comment_id])) + + method get_categories () = + map_array Category.of_xmlrpc (rpc#call "wp.getCategories" std_args) + + method new_category ~name ~slug ~parent_id ~description = + int_value + (rpc#call "wp.newCategory" + (std_args @ [`Struct ["name", `String name; + "slug", `String slug; + "parent_id", `Int parent_id; + "description", `String description]])) + + method suggest_categories category max_results = + rpc#call "wp.suggestCategories" + (std_args @ [`String category; `Int max_results]) + + method get_options names = + let result = + rpc#call + "wp.getOptions" + (std_args @ [`Array (List.map (fun s -> `String s) names)]) in + match result with + | `Struct pairs -> + List.map (fun (name, opt) -> (name, Option.of_xmlrpc opt)) pairs + | `Array [] -> [] + | other -> raise (Type_error (XmlRpc.dump other)) + + method set_options options = + let result = + rpc#call + "wp.setOptions" + (std_args @ [`Struct (List.map (fun (name, value) -> + (name, `String value)) options)]) in + match result with + | `Struct pairs -> + List.map (fun (name, opt) -> (name, Option.of_xmlrpc opt)) pairs + | `Array [] -> [] + | other -> raise (Type_error (XmlRpc.dump other)) + + method upload_file ~name ~typ ~bits ~overwrite = + let value = + rpc#call "wp.uploadFile" + (std_args @ [`Struct ["name", `String name; + "type", `String typ; + "bits", `Binary bits; + "overwrite", `Boolean overwrite]]) in + let file, url, typ = ref "", ref "", ref "" in + iter_struct + (function + | ("file", `String v) -> file := v + | ("url", `String v) -> url := v + | ("type", `String v) -> typ := v + | (field, _) -> warn (Unknown_field field)) + value; + (!file, !url, !typ) +end diff --git a/examples/wordpress/WordPress.mli b/examples/wordpress/WordPress.mli new file mode 100644 index 0000000..47b5a18 --- /dev/null +++ b/examples/wordpress/WordPress.mli @@ -0,0 +1,242 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +exception Type_error of string +exception Unknown_field of string + +val strict : bool ref + +module Blog : +sig + type t = { + mutable is_admin : bool; + mutable url : string; + mutable blog_id : int; + mutable blog_name : string; + mutable xmlrpc : string; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t +end + +module Category : +sig + type t = { + mutable category_id : int; + mutable parent_id : int; + mutable description : string; + mutable category_name : string; + mutable html_url : string; + mutable rss_url : string; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t +end + +module CommentCount : +sig + type t = { + mutable approved : int; + mutable awaiting_moderation : int; + mutable spam : int; + mutable total_comments : int; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t +end + +module Comment : +sig + type t = { + mutable date_created : XmlRpcDateTime.t; + mutable user_id : int; + mutable comment_id : int; + mutable parent : int; + mutable status : string; + mutable content : string; + mutable link : string; + mutable post_id : int; + mutable post_title : string; + mutable author : string; + mutable author_url : string; + mutable author_email : string; + mutable author_ip : string; + mutable typ : string; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t + val to_xmlrpc : t -> XmlRpc.value +end + +module CustomField : +sig + type t = { + mutable id : int option; + mutable key : string option; + mutable value : string; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t + val to_xmlrpc : t -> XmlRpc.value +end + +module Option : +sig + type t = { + mutable desc : string; + mutable readonly : bool; + mutable value : string; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t +end + +module User : +sig + type t = { + mutable user_id : int; + mutable user_login : string; + mutable display_name : string; + mutable user_email : string; + mutable meta_value : string; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t +end + +module PageListItem : +sig + type t = { + mutable page_id : int; + mutable page_title : string; + mutable page_parent_id : int; + mutable date_created : XmlRpcDateTime.t; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t +end + +module Page : +sig + type t = { + mutable date_created : XmlRpcDateTime.t; + mutable user_id : int; + mutable page_id : int; + mutable page_status : string; + mutable description : string; + mutable title : string; + mutable link : string; + mutable permalink : string; + mutable categories : string list; + mutable excerpt : string; + mutable text_more : string; + mutable mt_allow_comments : bool; + mutable mt_allow_pings : bool; + mutable wp_slug : string; + mutable wp_password : string; + mutable wp_author : string; + mutable wp_page_parent_id : int; + mutable wp_page_parent_title : string; + mutable wp_page_order : int; + mutable wp_author_id : int; + mutable wp_author_display_name : string; + mutable custom_fields : CustomField.t list; + mutable wp_page_template : string; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t + val to_xmlrpc : t -> XmlRpc.value +end + +module Post : +sig + type t = { + mutable user_id : int; + mutable post_id : int; + mutable post_status : string; + mutable date_created : XmlRpcDateTime.t; + mutable description : string; + mutable title : string; + mutable link : string; + mutable permalink : string; + mutable categories : string list; + mutable excerpt : string; + mutable text_more : string; + mutable mt_allow_comments : bool; + mutable mt_allow_pings : bool; + mutable mt_keywords : string; + mutable wp_slug : string; + mutable wp_password : string; + mutable wp_author_id : int; + mutable wp_author_display_name : string; + mutable custom_fields : CustomField.t list; + } + val make : unit -> t + val of_xmlrpc : XmlRpc.value -> t + val to_xmlrpc : t -> XmlRpc.value +end + +class api : + url:string -> + blog_id:int -> + username:string -> + password:string -> +object + val blog_id : int + val password : string + val rpc : XmlRpc.client + val std_args : XmlRpc.value list + val username : string + method rpc : XmlRpc.client + method delete_comment : int -> unit + method delete_page : int -> unit + method delete_post : int -> unit + method edit_comment : int -> Comment.t -> unit + method edit_page : int -> Page.t -> bool -> unit + method edit_post : int -> Post.t -> bool -> unit + method get_authors : unit -> User.t list + method get_blogs : unit -> Blog.t list + method get_categories : unit -> Category.t list + method get_comment : int -> Comment.t + method get_comment_count : int -> CommentCount.t + method get_comment_status_list : unit -> (string * string) list + method get_comments : + ?status:string -> + ?post_id:int -> ?offset:int -> ?number:int -> unit -> Comment.t list + method get_options : string list -> (string * Option.t) list + method get_page : int -> Page.t + method get_page_list : unit -> PageListItem.t list + method get_page_status_list : unit -> (string * string) list + method get_page_templates : unit -> (string * string) list + method get_pages : unit -> Page.t list + method get_post : int -> Post.t + method get_post_status_list : unit -> (string * string) list + method get_recent_posts : int -> Post.t list + method new_category : + name:string -> + slug:string -> parent_id:int -> description:string -> int + method new_comment : Comment.t -> int + method new_page : Page.t -> bool -> int + method new_post : Post.t -> bool -> int + method set_options : (string * string) list -> (string * Option.t) list + method suggest_categories : string -> int -> XmlRpc.value + method upload_file : + name:string -> + typ:string -> bits:string -> overwrite:bool -> string * string * string +end diff --git a/examples/wordpress/test.ml b/examples/wordpress/test.ml new file mode 100644 index 0000000..5bede7b --- /dev/null +++ b/examples/wordpress/test.ml @@ -0,0 +1,34 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +let wp = + new WordPress.api + ~url:"http://localhost/wordpress/xmlrpc.php" + ~blog_id:1 + ~username:"admin" + ~password:"secret" + +let () = + List.iter + (fun {WordPress.Category.category_id=category_id; + category_name=name; + description=description} -> + Printf.printf "Category #%d\n Name: %s\n Description: %s\n\n" + category_id name description) + (wp#get_categories ()) diff --git a/test/test.ml b/test/test.ml new file mode 100644 index 0000000..f1c919d --- /dev/null +++ b/test/test.ml @@ -0,0 +1,40 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +#use "topfind";; + +#require "oUnit";; +#require "netclient";; +#require "nethttpd-for-netcgi2";; +#require "xml-light";; + +#load "xmlrpc-light.cma";; + +open OUnit;; +open Printf;; + +let tests = [];; + +#use "test/test_base64.ml";; +#use "test/test_datetime.ml";; +#use "test/test_value.ml";; +#use "test/test_message.ml";; +#use "test/test_serve.ml";; + +OUnit.run_test_tt_main (TestList tests);; diff --git a/test/test_base64.ml b/test/test_base64.ml new file mode 100644 index 0000000..e8e11e4 --- /dev/null +++ b/test/test_base64.ml @@ -0,0 +1,46 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +let test = "test_base64" >::: + [ + "encode" >:: + (fun () -> + assert_equal + ~printer:(fun s -> s) + "UnVsaW5nIHRoZSBjb3VudHJ5IGlzIGxpa2UgY29va2luZyBhIHNtYWxsIGZpc2guCkFwcHJvYWNoIHRoZSB1bml2ZXJzZSB3aXRoIFRhbywKQW5kIGV2aWwgaXMgbm90IHBvd2VyZnVsLApCdXQgaXRzIHBvd2VyIHdpbGwgbm90IGJlIHVzZWQgdG8gaGFybSBvdGhlcnMuCk5vdCBvbmx5IHdpbGwgaXQgZG8gbm8gaGFybSB0byBvdGhlcnMsCkJ1dCB0aGUgc2FnZSBoaW1zZWxmIHdpbGwgYWxzbyBiZSBwcm90ZWN0ZWQuClRoZXkgZG8gbm90IGh1cnQgZWFjaCBvdGhlciwKQW5kIHRoZSBWaXJ0dWUgaW4gZWFjaCBvbmUgcmVmcmVzaGVzIGJvdGguCg==" + (XmlRpcBase64.str_encode "\ +Ruling the country is like cooking a small fish. +Approach the universe with Tao, +And evil is not powerful, +But its power will not be used to harm others. +Not only will it do no harm to others, +But the sage himself will also be protected. +They do not hurt each other, +And the Virtue in each one refreshes both. +")); + + "decode" >:: + (fun () -> + assert_equal + ~printer:(fun s -> s) + "When someone says \"I want a programming language in which I need only\nsay what I wish done,\" give him a lollipop.\n" + (XmlRpcBase64.str_decode "V2hlbiBzb21lb25lIHNheXMgIkkgd2FudCBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGluIHdoaWNo\nIEkgbmVlZCBvbmx5CnNheSB3aGF0IEkgd2lzaCBkb25lLCIgZ2l2ZSBoaW0gYSBsb2xsaXBvcC4K\n")); + ] + +let tests = test :: tests diff --git a/test/test_datetime.ml b/test/test_datetime.ml new file mode 100644 index 0000000..4960126 --- /dev/null +++ b/test/test_datetime.ml @@ -0,0 +1,198 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +let string_of_unixtm + {Unix.tm_sec=tm_sec; tm_min=tm_min; tm_hour=tm_hour; + tm_mday=tm_mday; tm_mon=tm_mon; tm_year=tm_year; + tm_wday=tm_wday; tm_yday=tm_yday; tm_isdst=tm_isdst} = + sprintf "{Unix.tm_year=%d; tm_mon=%d; tm_mday=%d; tm_hour=%d; tm_min=%d; tm_sec=%d; tm_yday=%d; tm_wday=%d; tm_isdst=%b}" + tm_year tm_mon tm_mday + tm_hour tm_min tm_sec + tm_yday tm_wday tm_isdst + +let string_of_datetime (y, m, d, h, m', s, tz) = + sprintf "(%d, %d, %d, %d, %d, %d, %d)" + y m d h m' s tz + +let test = "test_datetime" >::: + [ + "unixfloat" >:: + (fun () -> + let unixfloat = Unix.time () in + assert_equal + ~printer:string_of_float + unixfloat + (XmlRpcDateTime.to_unixfloat (XmlRpcDateTime.from_unixfloat unixfloat))); + + "unixfloat_utc" >:: + (fun () -> + let unixfloat = Unix.time () in + assert_equal + ~printer:string_of_float + unixfloat + (XmlRpcDateTime.to_unixfloat_utc (XmlRpcDateTime.from_unixfloat_utc unixfloat))); + + "unix" >:: + (fun () -> + let time = Unix.localtime (Unix.time ()) in + assert_equal + ~printer:string_of_unixtm + time + (XmlRpcDateTime.to_unixtm (XmlRpcDateTime.from_unixtm time))); + + "unix_utc" >:: + (fun () -> + let time = Unix.gmtime (Unix.time ()) in + assert_equal + ~printer:string_of_unixtm + time + (XmlRpcDateTime.to_unixtm_utc (XmlRpcDateTime.from_unixtm_utc time))); + + "to_unixfloat" >:: + (fun () -> + let dt_local = (2007, 10, 14, 7, 16, 18, -420) in + let dt_utc = (2007, 10, 14, 14, 16, 18, 0) in + assert_equal + ~printer:string_of_float + (XmlRpcDateTime.to_unixfloat dt_local) + (XmlRpcDateTime.to_unixfloat dt_utc)); + + "to_unixfloat_utc" >:: + (fun () -> + let dt_local = (2007, 10, 14, 7, 16, 18, -420) in + let dt_utc = (2007, 10, 14, 14, 16, 18, 0) in + assert_equal + ~printer:string_of_float + (XmlRpcDateTime.to_unixfloat_utc dt_local) + (XmlRpcDateTime.to_unixfloat_utc dt_utc)); + + "to_unixtm" >:: + (fun () -> + let dt = (2007, 1, 1, 18, 34, 9, -420) in + assert_equal + ~printer:string_of_unixtm + (snd (Unix.mktime + {Unix.tm_year=107; + tm_mon=0; + tm_mday=1; + tm_hour=18; + tm_min=34; + tm_sec=9; + tm_yday=0; + tm_wday=0; + tm_isdst=false})) + (XmlRpcDateTime.to_unixtm dt)); + + "to_unixtm_utc" >:: + (fun () -> + let dt = (2007, 1, 1, 14, 34, 9, -420) in + assert_equal + ~printer:string_of_unixtm + (snd (Unix.mktime + {Unix.tm_year=107; + tm_mon=0; + tm_mday=1; + tm_hour=21; + tm_min=34; + tm_sec=9; + tm_yday=0; + tm_wday=0; + tm_isdst=false})) + (XmlRpcDateTime.to_unixtm_utc dt)); + + "to_string" >:: + (fun () -> + let dt = (2007, 1, 1, 14, 34, 9, 0) in + assert_equal + ~printer:(fun s -> s) + "20070101T14:34:09" + (XmlRpcDateTime.to_string dt)); + + "to_string_tz" >:: + (fun () -> + let dt = (2007, 1, 1, 14, 34, 9, -420) in + assert_equal + ~printer:(fun s -> s) + "20070101T14:34:09-07:00" + (XmlRpcDateTime.to_string dt)); + + "of_string" >:: + (fun () -> + let s = "20070101T14:34:09" in + assert_equal + ~printer:string_of_datetime + (2007, 1, 1, 14, 34, 9, 0) + (XmlRpcDateTime.of_string s)); + + "of_string_z" >:: + (fun () -> + let s = "20070101T14:34:09Z" in + assert_equal + ~printer:string_of_datetime + (2007, 1, 1, 14, 34, 9, 0) + (XmlRpcDateTime.of_string s)); + + "to_string_tz" >:: + (fun () -> + let s = "20070101T14:34:09-07:00" in + assert_equal + ~printer:string_of_datetime + (2007, 1, 1, 14, 34, 9, -420) + (XmlRpcDateTime.of_string s)); + + "optional_delimiters" >:: + (fun () -> + let s1 = "20071013T22:03:09-0700" in + let s2 = "2007-10-13 22:03:09-07:00" in + assert_equal + ~printer:string_of_datetime + (XmlRpcDateTime.of_string s1) + (XmlRpcDateTime.of_string s2)); + + "set_tz_offset" >:: + (fun () -> + let offset = 360 in + let dt1 = XmlRpcDateTime.now () in + let dt2 = XmlRpcDateTime.set_tz_offset offset dt1 in + assert_equal + ~printer:string_of_int + offset + (match dt2 with (_, _, _, _, _, _, tz) -> tz); + assert_equal + ~printer:string_of_datetime + ~cmp:XmlRpcDateTime.equal + dt1 dt2); + + "fix_tz_offset" >:: + (fun () -> + let offset = -420 in + let dt1 = XmlRpcDateTime.now_utc () in + let dt2 = XmlRpcDateTime.fix_tz_offset offset dt1 in + assert_equal + ~printer:string_of_int + offset + (match dt2 with (_, _, _, _, _, _, tz) -> tz); + assert_equal + ~printer:string_of_int + (int_of_float (XmlRpcDateTime.to_unixfloat dt1)) + (int_of_float (XmlRpcDateTime.to_unixfloat dt2) + + offset * 60)); + ] + +let tests = test :: tests diff --git a/test/test_message.ml b/test/test_message.ml new file mode 100644 index 0000000..ef67096 --- /dev/null +++ b/test/test_message.ml @@ -0,0 +1,236 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +let string_of_message = function + | XmlRpc.MethodCall (name, params) -> + sprintf "MethodCall (%s, [%s])" + name (String.concat "; " (List.map XmlRpc.dump params)) + | XmlRpc.MethodResponse value -> + sprintf "MethodResponse (%s)" (XmlRpc.dump value) + | XmlRpc.Fault (code, string) -> + sprintf "Fault (%d, %s)" code string + +let test = "test_message" >::: + [ + "of_method_call" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element + ("methodCall", [], + [Xml.Element ("methodName", [], + [Xml.PCData "demo.addTwoNumbers"]); + Xml.Element + ("params", [], + [Xml.Element + ("param", [], + [Xml.Element + ("value", [], + [Xml.Element ("int", [], [Xml.PCData "4"])])]); + Xml.Element + ("param", [], + [Xml.Element + ("value", [], + [Xml.Element ("int", [], [Xml.PCData "5"])])])])])) + (XmlRpc.xml_element_of_message + (XmlRpc.MethodCall ("demo.addTwoNumbers", [`Int 4; `Int 5])))); + + "to_method_call" >:: + (fun () -> + assert_equal + ~printer:string_of_message + (XmlRpc.MethodCall ("demo.addTwoNumbers", + [`String "4"; `String "5"])) + (XmlRpc.message_of_xml_element + (Xml.Element + ("methodCall", [], + [Xml.Element ("methodName", [], + [Xml.PCData "demo.addTwoNumbers"]); + Xml.Element + ("params", [], + [Xml.Element + ("param", [], + [Xml.Element + ("value", [], + [Xml.Element ("string", [], + [Xml.PCData "4"])])]); + (* test untyped value - should be treated as string *) + Xml.Element + ("param", [], + [Xml.Element + ("value", [], [Xml.PCData "5"])])])])))); + + "to_method_call_no_params" >:: + (fun () -> + assert_equal + ~printer:string_of_message + (XmlRpc.MethodCall ("demo.helloWorld", [])) + (XmlRpc.message_of_xml_element + (Xml.Element + ("methodCall", [], + [Xml.Element ("methodName", [], + [Xml.PCData "demo.helloWorld"])])))); + + "of_method_response" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element + ("methodResponse", [], + [Xml.Element + ("params", [], + [Xml.Element + ("param", [], + [Xml.Element + ("value", [], + [Xml.Element ("string", [], + [Xml.PCData "test"])])])])])) + (XmlRpc.xml_element_of_message + (XmlRpc.MethodResponse (`String "test")))); + + "to_method_response" >:: + (fun () -> + assert_equal + ~printer:string_of_message + (XmlRpc.MethodResponse (`String "test")) + (XmlRpc.message_of_xml_element + (Xml.Element + ("methodResponse", [], + [Xml.Element + ("params", [], + [Xml.Element + ("param", [], + [Xml.Element + ("value", [], + [Xml.Element ("string", [], + [Xml.PCData "test"])])])])]))); + assert_equal + ~printer:string_of_message + (XmlRpc.MethodResponse (`String "test")) + (XmlRpc.message_of_xml_element + (Xml.Element + ("methodResponse", [], + [Xml.Element + ("params", [], + [Xml.Element + ("param", [], + (* test untyped value *) + [Xml.Element + ("value", [], [Xml.PCData "test"])])])])))); + + "of_fault" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element + ("methodResponse", [], + [Xml.Element + ("fault", [], + [Xml.Element + ("value", [], + [Xml.Element + ("struct", [], + [Xml.Element + ("member", [], + [Xml.Element ("name", [], + [Xml.PCData "faultCode"]); + Xml.Element + ("value", [], + [Xml.Element ("int", [], + [Xml.PCData "12345"])])]); + Xml.Element + ("member", [], + [Xml.Element ("name", [], + [Xml.PCData "faultString"]); + Xml.Element + ("value", [], + [Xml.Element + ("string", [], + [Xml.PCData + "something terrible happened" + ])])])])])])])) + (XmlRpc.xml_element_of_message + (XmlRpc.Fault (12345, "something terrible happened")))); + + "to_fault" >:: + (fun () -> + assert_equal + ~printer:string_of_message + (XmlRpc.Fault (12345, "something terrible happened")) + (XmlRpc.message_of_xml_element + (Xml.Element + ("methodResponse", [], + [Xml.Element + ("fault", [], + [Xml.Element + ("value", [], + [Xml.Element + ("struct", [], + [Xml.Element + ("member", [], + [Xml.Element ("name", [], + [Xml.PCData "faultCode"]); + Xml.Element + ("value", [], + [Xml.Element ("int", [], + [Xml.PCData "12345"])])]); + Xml.Element + ("member", [], + [Xml.Element ("name", [], + [Xml.PCData "faultString"]); + Xml.Element + ("value", [], + [Xml.Element + ("string", [], + [Xml.PCData + "something terrible happened" + ])])])])])])]))); + assert_equal + ~printer:string_of_message + (XmlRpc.Fault (12345, "something terrible happened")) + (XmlRpc.message_of_xml_element + (Xml.Element + ("methodResponse", [], + [Xml.Element + ("fault", [], + [Xml.Element + ("value", [], + [Xml.Element + ("struct", [], + [Xml.Element + ("member", [], + [Xml.Element ("name", [], + [Xml.PCData "faultCode"]); + Xml.Element + ("value", [], + [Xml.Element ("int", [], + [Xml.PCData "12345"])])]); + Xml.Element + ("member", [], + [Xml.Element ("name", [], + [Xml.PCData "faultString"]); + (* test untyped value *) + Xml.Element + ("value", [], + [Xml.PCData + "something terrible happened" + ])])])])])])))); + ] + +let tests = test :: tests diff --git a/test/test_serve.ml b/test/test_serve.ml new file mode 100644 index 0000000..aef07a2 --- /dev/null +++ b/test/test_serve.ml @@ -0,0 +1,85 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +let test = "test_serve" >::: + [ + "reverse" >:: + (fun () -> + let data = [`Int 1; `Int 2; `Int 3] in + assert_equal + ~printer:string_of_message + (XmlRpc.MethodResponse (`Array (List.rev data))) + (XmlRpc.message_of_xml_element + (Xml.parse_string + (XmlRpc.serve + (function + | "reverse" -> + (function + | [`Array items] -> + `Array (List.rev items) + | _ -> failwith "wrong parameters") + | _ -> failwith "unknown method") + (Xml.to_string + (XmlRpc.xml_element_of_message + (XmlRpc.MethodCall + ("reverse", [`Array data])))))))); + + "error_normal" >:: + (fun () -> + let fault = (12345, "My fault") in + assert_equal + ~printer:string_of_message + (XmlRpc.Fault fault) + (XmlRpc.message_of_xml_element + (Xml.parse_string + (XmlRpc.serve + (fun _ _ -> raise (XmlRpc.Error fault)) + (Xml.to_string + (XmlRpc.xml_element_of_message + (XmlRpc.MethodCall ("dummy", [])))))))); + + "error_exception" >:: + (fun () -> + assert_equal + ~printer:string_of_message + (XmlRpc.Fault + (-32500, "application error. Failure(\"WHAT HAPPEN ?\")")) + (XmlRpc.message_of_xml_element + (Xml.parse_string + (XmlRpc.serve + (fun _ _ -> failwith "WHAT HAPPEN ?") + (Xml.to_string + (XmlRpc.xml_element_of_message + (XmlRpc.MethodCall ("dummy", [])))))))); + + "error_quiet" >:: + (fun () -> + assert_raises + (Failure "SOMEONE SET UP US THE BOMB") + (fun () -> + (ignore + (XmlRpc.serve + ~error_handler:XmlRpc.quiet_error_handler + (fun _ _ -> failwith "SOMEONE SET UP US THE BOMB") + (Xml.to_string + (XmlRpc.xml_element_of_message + (XmlRpc.MethodCall ("dummy", [])))))))); + ] + +let tests = test :: tests diff --git a/test/test_value.ml b/test/test_value.ml new file mode 100644 index 0000000..8c1f61a --- /dev/null +++ b/test/test_value.ml @@ -0,0 +1,284 @@ +(* + * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet + * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *) + +let test = "test_value" >::: + [ + "of_int" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element ("int", [], [Xml.PCData "42"])) + (XmlRpc.xml_element_of_value (`Int 42))); + + "to_int" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Int 42) + (XmlRpc.value_of_xml_element + (Xml.Element ("int", [], [Xml.PCData "42"])))); + + "to_int_i4" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Int 42) + (XmlRpc.value_of_xml_element + (Xml.Element ("i4", [], [Xml.PCData "42"])))); + + "of_int32" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element ("int", [], [Xml.PCData "2000000000"])) + (XmlRpc.xml_element_of_value (`Int32 2000000000l))); + + "to_int32" >:: + (fun () -> + if Sys.word_size = 32 + then + assert_equal + ~printer:XmlRpc.dump + (`Int32 2000000000l) + (XmlRpc.value_of_xml_element + (Xml.Element ("int", [], [Xml.PCData "2000000000"])))); + + "of_double" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element ("double", [], [Xml.PCData "42.000000001"])) + (XmlRpc.xml_element_of_value (`Double 42.000000001))); + + "to_double" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Double 42.000000001) + (XmlRpc.value_of_xml_element + (Xml.Element ("double", [], [Xml.PCData "42.000000001"])))); + + "of_nil" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element ("nil", [], [])) + (XmlRpc.xml_element_of_value `Nil)); + + "to_nil" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + `Nil + (XmlRpc.value_of_xml_element + (Xml.Element ("nil", [], [])))); + + "of_boolean" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element ("boolean", [], [Xml.PCData "1"])) + (XmlRpc.xml_element_of_value (`Boolean true))); + + "to_boolean" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Boolean false) + (XmlRpc.value_of_xml_element + (Xml.Element ("boolean", [], [Xml.PCData "0"])))); + + "of_string" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element ("string", [], + [Xml.PCData " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n "])) + (XmlRpc.xml_element_of_value + (`String " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n "))); + + "to_string" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`String " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n ") + (XmlRpc.value_of_xml_element + (Xml.Element ("string", [], + [Xml.PCData " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n "])))); + + "of_binary" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element ("base64", [], + [Xml.PCData "IDwmPkFCQ0RFRkcwMTIzNDUgDX4hQCMkJV4mKigpCQ0KIA=="])) + (XmlRpc.xml_element_of_value + (`Binary " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n "))); + + "to_binary" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Binary " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n ") + (XmlRpc.value_of_xml_element + (Xml.Element ("base64", [], + [Xml.PCData "IDwmPkFCQ0\r\nRFRkcwMTIzN\nDUgDX4hQCMkJV4mKigpCQ0KIA=="])))); + + "of_array" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element + ("array", [], + [Xml.Element + ("data", [], + [Xml.Element ("value", [], + [Xml.Element ("int", [], [Xml.PCData "5"])]); + Xml.Element + ("value", [], + [Xml.Element ("string", [], [Xml.PCData "six"])]); + Xml.Element + ("value", [], + [Xml.Element + ("array", [], + [Xml.Element + ("data", [], + [Xml.Element + ("value", [], + [Xml.Element + ("boolean", [], [Xml.PCData "0"])]); + Xml.Element + ("value", [], + [Xml.Element + ("double", [], + [Xml.PCData "-1."])])])])])])])) + (XmlRpc.xml_element_of_value + (`Array + [`Int 5; `String "six"; + `Array [`Boolean false; `Double (-1.0)]]))); + + "to_array" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Array + [`Int 5; `String "six"; + `Array [`Boolean false; `Double (-1.0)]]) + (XmlRpc.value_of_xml_element + (Xml.Element + ("array", [], + [Xml.Element + ("data", [], + [Xml.Element ("value", [], + [Xml.Element ("int", [], + [Xml.PCData "5"])]); + (* test untyped value - should be treated as string *) + Xml.Element ("value", [], [Xml.PCData "six"]); + Xml.Element + ("value", [], + [Xml.Element + ("array", [], + [Xml.Element + ("data", [], + [Xml.Element + ("value", [], + [Xml.Element + ("boolean", [], [Xml.PCData "0"])]); + Xml.Element + ("value", [], + [Xml.Element + ("double", [], + [Xml.PCData "-1."])])])])])])])))); + + "of_struct" >:: + (fun () -> + assert_equal + ~printer:Xml.to_string + (Xml.Element + ("struct", [], + [Xml.Element + ("member", [], + [Xml.Element ("name", [], [Xml.PCData "foo"]); + Xml.Element ("value", [], + [Xml.Element ("int", [], + [Xml.PCData "42"])])]); + Xml.Element + ("member", [], + [Xml.Element ("name", [], [Xml.PCData "bar"]); + Xml.Element + ("value", [], + [Xml.Element + ("struct", [], + [Xml.Element + ("member", [], + [Xml.Element ("name", [], [Xml.PCData "baz"]); + Xml.Element + ("value", [], + [Xml.Element ("string", [], + [Xml.PCData + "rutabega"])])])])])])])) + (XmlRpc.xml_element_of_value + (`Struct + ["foo", `Int 42; + "bar", `Struct ["baz", `String "rutabega"]]))); + + "to_struct" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Struct + ["foo", `Int 42; + "bar", `Struct ["baz", `String "rutabega"]]) + (XmlRpc.value_of_xml_element + (Xml.Element + ("struct", [], + [Xml.Element + ("member", [], + [Xml.Element ("name", [], [Xml.PCData "foo"]); + Xml.Element ("value", [], + [Xml.Element ("int", [], + [Xml.PCData "42"])])]); + Xml.Element + ("member", [], + [Xml.Element ("name", [], [Xml.PCData "bar"]); + Xml.Element + ("value", [], + [Xml.Element + ("struct", [], + [Xml.Element + ("member", [], + [Xml.Element ("name", [], [Xml.PCData "baz"]); + (* test untyped value *) + Xml.Element + ("value", [], + [Xml.PCData "rutabega"])])])])])])))); + "to_struct_empty_name" >:: + (fun () -> + assert_equal + ~printer:XmlRpc.dump + (`Struct ["", `String ""; "", `Int 42]) + (XmlRpc.value_of_xml_element + (Xml.parse_string + " + + 42 + "))); + ] + +let tests = test :: tests -- cgit v1.2.3 From c0f62f3cd6ce44564d13e198b2e56830aef1ed04 Mon Sep 17 00:00:00 2001 From: Mehdi Dogguy Date: Fri, 16 Oct 2015 23:50:43 +0200 Subject: Import xmlrpc-light_0.6.1-4.debian.tar.xz [dgit import tarball xmlrpc-light 0.6.1-4 xmlrpc-light_0.6.1-4.debian.tar.xz] --- META.xmlrpc-light.in | 6 ++ changelog | 76 +++++++++++++++ clean | 3 + compat | 1 + control | 41 ++++++++ copyright | 15 +++ gbp.conf | 2 + libxmlrpc-light-ocaml-dev.dirs.in | 1 + libxmlrpc-light-ocaml-dev.docs | 1 + libxmlrpc-light-ocaml-dev.examples | 0 libxmlrpc-light-ocaml-dev.ocamldoc | 1 + ...llation-under-a-given-div-externally-pass.patch | 30 ++++++ patches/0002-Compile-with-ocamlnet-3.3.5.patch | 39 ++++++++ patches/0003-Compile-with-ocamlnet-4.0.4.patch | 104 +++++++++++++++++++++ patches/series | 3 + rules | 42 +++++++++ source/format | 1 + watch | 4 + 18 files changed, 370 insertions(+) create mode 100644 META.xmlrpc-light.in create mode 100644 changelog create mode 100644 clean create mode 100644 compat create mode 100644 control create mode 100644 copyright create mode 100644 gbp.conf create mode 100644 libxmlrpc-light-ocaml-dev.dirs.in create mode 100644 libxmlrpc-light-ocaml-dev.docs create mode 100644 libxmlrpc-light-ocaml-dev.examples create mode 100644 libxmlrpc-light-ocaml-dev.ocamldoc create mode 100644 patches/0001-Allow-installation-under-a-given-div-externally-pass.patch create mode 100644 patches/0002-Compile-with-ocamlnet-3.3.5.patch create mode 100644 patches/0003-Compile-with-ocamlnet-4.0.4.patch create mode 100644 patches/series create mode 100755 rules create mode 100644 source/format create mode 100644 watch diff --git a/META.xmlrpc-light.in b/META.xmlrpc-light.in new file mode 100644 index 0000000..5367308 --- /dev/null +++ b/META.xmlrpc-light.in @@ -0,0 +1,6 @@ +name = "xmlrpc-light" +version = "@VERSION@" +description = "XML-RPC client based on Xml-Light" +requires = "xml-light,netclient,nethttpd-for-netcgi2" +archive(byte) = "xmlrpc-light.cma" +archive(native) = "xmlrpc-light.cmxa" diff --git a/changelog b/changelog new file mode 100644 index 0000000..f4ce2df --- /dev/null +++ b/changelog @@ -0,0 +1,76 @@ +xmlrpc-light (0.6.1-4) unstable; urgency=medium + + * Port to ocamlnet 4.0.4 + - Bump minimum version requirement on ocamlnet to 4.0.4~ + - Replace uses of Http_client by Nethttp_client + - Use package nethttpd instead of nethttpd-for-netcgi2 when building + the library and its ocamldoc documentation, in the META file as well + as in example and test files. + + -- Mehdi Dogguy Fri, 16 Oct 2015 23:50:43 +0200 + +xmlrpc-light (0.6.1-3) unstable; urgency=low + + * Team upload + * Fix build with ocamlnet 3.3.5 + * debian/control: + - remove Stefano from Uploaders + - suggest ocaml-findlib + - bump Standards-Version to 3.9.2 + * Switch source package format to 3.0 (quilt) + * Update debian/watch + + -- Stéphane Glondu Sat, 23 Jul 2011 17:10:04 +0200 + +xmlrpc-light (0.6.1-2) unstable; urgency=low + + * Use ocaml.mk as a CDBS "rules" file (Closes: #549723) + * Swap the include order of debhelper.mk and dpatch.mk to workaround + a CDBS bug. + * Add myself to uploaders + * Move the package to section ocaml + * Use new features of dh-ocaml 0.9 + - Generate documentation using dh_ocamldoc + * Bump standards version to 3.8.3 + - Add a debian/README.source + + -- Mehdi Dogguy Sun, 01 Nov 2009 13:19:46 +0100 + +xmlrpc-light (0.6.1-1) unstable; urgency=low + + * new upstream release + * fix lintian warnings + * update std version to 3.8.1 + * bump debhelper compat to 7 + * add build dependency to dh-ocaml + * add debian/clean file + * switch packaging to git + + -- Pietro Abate Fri, 20 Mar 2009 14:09:38 +0100 + +xmlrpc-light (0.6-3) unstable; urgency=low + + [ Stefano Zacchiroli ] + * fix vcs-svn field to point just above the debian/ dir + * debian/control: set d-o-m as the Maintainer, me and Pietro as Uploaders + + [ Pietro Abate ] + * fix url in debian/watch (Closes: #456488) + * fix build error for architectures that do not support + ocamlopt (Closes: #457348) + + -- Stefano Zacchiroli Thu, 31 Jan 2008 11:20:31 +0100 + +xmlrpc-light (0.6-2) unstable; urgency=low + + * fixed typo in the copyright file + * added XmlRpcDateTime.cmi and XmlRpcDateTime.mli to the package + * fixed documentation + + -- Pietro Abate Thu, 20 Dec 2007 13:08:12 +0100 + +xmlrpc-light (0.6-1) unstable; urgency=low + + * Initial Release (Closes: #452076) + + -- Pietro Abate Mon, 26 Nov 2007 19:03:16 +0100 diff --git a/clean b/clean new file mode 100644 index 0000000..bcb39b5 --- /dev/null +++ b/clean @@ -0,0 +1,3 @@ +xmlrpc-light.a +debian/libxml-lightrpc-ocaml-dev.dirs +debian/libxml-lightrpc-ocaml-dev.install diff --git a/compat b/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/compat @@ -0,0 +1 @@ +7 diff --git a/control b/control new file mode 100644 index 0000000..78c7f80 --- /dev/null +++ b/control @@ -0,0 +1,41 @@ +Source: xmlrpc-light +Section: ocaml +Priority: optional +Maintainer: Debian OCaml Maintainers +Uploaders: + Pietro Abate , + Mehdi Dogguy +Build-Depends: + cdbs, + debhelper (>= 7), + ocaml-nox, + libocamlnet-ocaml-dev (>= 4.0.4), + libxml-light-ocaml-dev, + libnethttpd-ocaml-dev, + ocaml-findlib, + dh-ocaml (>= 0.9) +Standards-Version: 3.9.2 +Vcs-Git: git://git.debian.org/git/pkg-ocaml-maint/packages/xmlrpc-light.git +Vcs-Browser: http://git.debian.org/?p=pkg-ocaml-maint/packages/xmlrpc-light.git +Homepage: http://code.google.com/p/xmlrpc-light/ + +Package: libxmlrpc-light-ocaml-dev +Architecture: any +Depends: + ${misc:Depends}, + ${ocaml:Depends}, + ${shlibs:Depends}, + libocamlnet-ocaml, + libxml-light-ocaml-dev, + libnethttpd-ocaml-dev +Provides: + ${ocaml:Provides} +Suggests: + ocaml-findlib +Description: XmlRpc-Light is an XmlRpc library written in OCaml + XmlRpc Light is a minimal XmlRpc library based on Xml Light + and Ocamlnet. + . + It provides a type for values, a client class with a simple + calling interface, and low-level tools that can be used to + implement a server. diff --git a/copyright b/copyright new file mode 100644 index 0000000..61cc4d6 --- /dev/null +++ b/copyright @@ -0,0 +1,15 @@ +This package was debianized by Pietro Abate + Fri, 16 Nov 2007 16:02:44 +0100 + +It was downloaded from : +http://code.google.com/p/xmlrpc-light/ + +Upstream Author: +Dave Benjamin + +Copyright: +(c)2006-2007 Dave Benjamin + +Xmlrpc-light is distributed under the terms the LGPL-3 licence, which can be +found in the /usr/share/common-licenses/LGPL-3 file on debian systems. + diff --git a/gbp.conf b/gbp.conf new file mode 100644 index 0000000..cec628c --- /dev/null +++ b/gbp.conf @@ -0,0 +1,2 @@ +[DEFAULT] +pristine-tar = True diff --git a/libxmlrpc-light-ocaml-dev.dirs.in b/libxmlrpc-light-ocaml-dev.dirs.in new file mode 100644 index 0000000..702950d --- /dev/null +++ b/libxmlrpc-light-ocaml-dev.dirs.in @@ -0,0 +1 @@ +@OCamlStdlibDir@/xmlrpc-light diff --git a/libxmlrpc-light-ocaml-dev.docs b/libxmlrpc-light-ocaml-dev.docs new file mode 100644 index 0000000..71dfd5b --- /dev/null +++ b/libxmlrpc-light-ocaml-dev.docs @@ -0,0 +1 @@ +README.txt diff --git a/libxmlrpc-light-ocaml-dev.examples b/libxmlrpc-light-ocaml-dev.examples new file mode 100644 index 0000000..e69de29 diff --git a/libxmlrpc-light-ocaml-dev.ocamldoc b/libxmlrpc-light-ocaml-dev.ocamldoc new file mode 100644 index 0000000..db2c80e --- /dev/null +++ b/libxmlrpc-light-ocaml-dev.ocamldoc @@ -0,0 +1 @@ + -package xml-light,nethttpd diff --git a/patches/0001-Allow-installation-under-a-given-div-externally-pass.patch b/patches/0001-Allow-installation-under-a-given-div-externally-pass.patch new file mode 100644 index 0000000..f9aea24 --- /dev/null +++ b/patches/0001-Allow-installation-under-a-given-div-externally-pass.patch @@ -0,0 +1,30 @@ +From: Pietro Abate +Date: Fri, 22 Jul 2011 00:34:28 +0200 +Subject: Allow installation under a given div, externally passed by + debian/rules + +--- + Makefile | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/Makefile b/Makefile +index e9f50e6..e7dee0b 100644 +--- a/Makefile ++++ b/Makefile +@@ -5,10 +5,13 @@ SOURCES = XmlRpcBase64.mli XmlRpcBase64.ml XmlRpcDateTime.mli XmlRpcDateTime.ml + PACKS = xml-light,netclient,nethttpd-for-netcgi2 + LIBINSTALL_FILES = XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi xmlrpc-light.cma xmlrpc-light.cmxa xmlrpc-light.a + OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd-for-netcgi2 +-DOC_FILES = XmlRpc.mli XmlRpcServer.mli XmlRpcDateTime.mli XmlRpcBase64.mli ++DOC_FILES = XmlRpcBase64.mli XmlRpcDateTime.mli XmlRpc.mli XmlRpcServer.mli + + all: native-code-library byte-code-library +-install: libinstall ++install: ++ cp META XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi xmlrpc-light.cma $(INSTALLDIR) ++installopt: ++ cp xmlrpc-light.cmxa xmlrpc-light.a $(INSTALLDIR) + uninstall: libuninstall + + .PHONY: test +-- diff --git a/patches/0002-Compile-with-ocamlnet-3.3.5.patch b/patches/0002-Compile-with-ocamlnet-3.3.5.patch new file mode 100644 index 0000000..8215812 --- /dev/null +++ b/patches/0002-Compile-with-ocamlnet-3.3.5.patch @@ -0,0 +1,39 @@ +From: Stephane Glondu +Date: Fri, 22 Jul 2011 00:32:59 +0200 +Subject: Compile with ocamlnet 3.3.5 + +--- + XmlRpcServer.ml | 8 +++----- + 1 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/XmlRpcServer.ml b/XmlRpcServer.ml +index 3d4f130..47d6a8b 100644 +--- a/XmlRpcServer.ml ++++ b/XmlRpcServer.ml +@@ -331,13 +331,11 @@ object (self) + Netcgi_cgi.run ~config ~output_type:(`Transactional buffered) self#process + end + +-open Netcgi1_compat +- + class netplex ?(parallelizer=Netplex_mp.mp()) ?(handler="xmlrpc") () = + object (self) + inherit base + +- method private process env (cgi : Netcgi_types.cgi_activation) = ++ method private process env (cgi : Netcgi.cgi_activation) = + match cgi#request_method with + | `POST -> + let input = cgi#argument_value "BODY" in +@@ -377,8 +375,8 @@ object (self) + } in + + let config_cgi = +- { Netcgi_env.default_config with +- Netcgi_env.permitted_input_content_types = [ "text/xml" ] ++ { Netcgi.default_config with ++ Netcgi.permitted_input_content_types = [ "text/xml" ] + } in + + let handlers = [handler, xmlrpc] in +-- diff --git a/patches/0003-Compile-with-ocamlnet-4.0.4.patch b/patches/0003-Compile-with-ocamlnet-4.0.4.patch new file mode 100644 index 0000000..fb485b5 --- /dev/null +++ b/patches/0003-Compile-with-ocamlnet-4.0.4.patch @@ -0,0 +1,104 @@ +From: Mehdi Dogguy +Date: Fri, 16 Oct 2015 23:36:37 +0200 +Subject: Compile with ocamlnet 4.0.4 + +--- + META | 2 +- + Makefile | 4 ++-- + XmlRpc.ml | 8 ++++---- + examples/adder/Makefile | 2 +- + test/test.ml | 2 +- + 5 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/META b/META +index 9e153c9..befe597 100644 +--- a/META ++++ b/META +@@ -1,6 +1,6 @@ + name = "xmlrpc-light" + version = "0.6.1" + description = "XML-RPC client based on Xml-Light" +-requires = "xml-light,netclient,nethttpd-for-netcgi2" ++requires = "xml-light,netclient,nethttpd" + archive(byte) = "xmlrpc-light.cma" + archive(native) = "xmlrpc-light.cmxa" +diff --git a/Makefile b/Makefile +index e7dee0b..5540de5 100644 +--- a/Makefile ++++ b/Makefile +@@ -2,9 +2,9 @@ OCAMLMAKEFILE = OCamlMakefile + + RESULT = xmlrpc-light + SOURCES = XmlRpcBase64.mli XmlRpcBase64.ml XmlRpcDateTime.mli XmlRpcDateTime.ml XmlRpc.mli XmlRpc.ml XmlRpcServer.mli XmlRpcServer.ml +-PACKS = xml-light,netclient,nethttpd-for-netcgi2 ++PACKS = xml-light,netclient,nethttpd + LIBINSTALL_FILES = XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi xmlrpc-light.cma xmlrpc-light.cmxa xmlrpc-light.a +-OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd-for-netcgi2 ++OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd + DOC_FILES = XmlRpcBase64.mli XmlRpcDateTime.mli XmlRpc.mli XmlRpcServer.mli + + all: native-code-library byte-code-library +diff --git a/XmlRpc.ml b/XmlRpc.ml +index b398318..9d81a79 100644 +--- a/XmlRpc.ml ++++ b/XmlRpc.ml +@@ -414,7 +414,7 @@ object (self) + Neturl.string_of_url + (Neturl.remove_from_url ~user:true ~password:true parsed_url) in + +- let call = new Http_client.post_raw url xml in ++ let call = new Nethttp_client.post_raw url xml in + call#set_req_header "User-Agent" useragent; + call#set_req_header "Content-Type" "text/xml"; + List.iter (fun (n, v) -> call#set_req_header n v) headers; +@@ -428,12 +428,12 @@ object (self) + | None -> () + end; + +- let pipeline = new Http_client.pipeline in ++ let pipeline = new Nethttp_client.pipeline in + pipeline#set_proxy_from_environment (); + + let opt = pipeline#get_options in + pipeline#set_options +- {opt with Http_client. ++ {opt with Nethttp_client. + connection_timeout = timeout; + }; + +@@ -441,7 +441,7 @@ object (self) + begin + let opt = pipeline#get_options in + pipeline#set_options +- {opt with Http_client. ++ {opt with Nethttp_client. + verbose_status = true; + verbose_request_header = true; + verbose_response_header = true; +diff --git a/examples/adder/Makefile b/examples/adder/Makefile +index 0504c93..4ef2ec3 100644 +--- a/examples/adder/Makefile ++++ b/examples/adder/Makefile +@@ -2,7 +2,7 @@ OCAMLMAKEFILE = OCamlMakefile + + RESULT = adder + SOURCES = adder.ml +-PACKS = xmlrpc-light,nethttpd-for-netcgi2 ++PACKS = xmlrpc-light,nethttpd + + all: native-code + +diff --git a/test/test.ml b/test/test.ml +index f1c919d..48e6400 100644 +--- a/test/test.ml ++++ b/test/test.ml +@@ -21,7 +21,7 @@ + + #require "oUnit";; + #require "netclient";; +-#require "nethttpd-for-netcgi2";; ++#require "nethttpd";; + #require "xml-light";; + + #load "xmlrpc-light.cma";; +-- diff --git a/patches/series b/patches/series new file mode 100644 index 0000000..c655853 --- /dev/null +++ b/patches/series @@ -0,0 +1,3 @@ +0001-Allow-installation-under-a-given-div-externally-pass.patch +0002-Compile-with-ocamlnet-3.3.5.patch +0003-Compile-with-ocamlnet-4.0.4.patch diff --git a/rules b/rules new file mode 100755 index 0000000..ebb82bc --- /dev/null +++ b/rules @@ -0,0 +1,42 @@ +#!/usr/bin/make -f +# debian/rules for xmlrpc-light package +# Adapted from debian/rules for xml-light package by Pietro Abate +# Copyright (C) 2006 Sylvain Le Gall +# Copyright (C) 2007 Sylvain Le Gall +# +# 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 St, Fifth Floor, Boston, +# MA 02110-1301, USA. + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/makefile.mk +include /usr/share/cdbs/1/rules/ocaml.mk + +PACKAGE_DEV := libxmlrpc-light-ocaml-dev +DESTDIR_DEV := $(CURDIR)/debian/$(PACKAGE_DEV) + +DEB_MAKE_CLEAN_TARGET := clean + +DEB_MAKE_BUILD_TARGET := byte-code-library +ifeq ($(OCAML_HAVE_OCAMLOPT),yes) +DEB_MAKE_BUILD_TARGET += native-code-library +endif + +DEB_MAKE_INSTALL_TARGET := install +ifeq ($(OCAML_HAVE_OCAMLOPT),yes) +DEB_MAKE_INSTALL_TARGET += installopt +endif +DEB_MAKE_INSTALL_TARGET += INSTALLDIR="$(DESTDIR_DEV)/$(OCAML_STDLIB_DIR)/xmlrpc-light" + +CDBS_BUILD_DEPENDS := $(subst ocaml-nox,ocaml-nox (>= 3.10.0-8),$(CDBS_BUILD_DEPENDS)) diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/watch b/watch new file mode 100644 index 0000000..5ac7646 --- /dev/null +++ b/watch @@ -0,0 +1,4 @@ +version=3 + +opts=downloadurlmangle=s#.*(xmlrpc-light-([\d.]+)\.tar\.gz).*#http://xmlrpc-light.googlecode.com/files/$1#,filenamemangle=s#.*(xmlrpc-light-([\d.]+)\.tar\.gz).*#$1# \ + http://code.google.com/p/xmlrpc-light/downloads/list ^.*detail\?name=xmlrpc-light-([\d.]+)\.tar\.gz.* -- cgit v1.2.3 From 4424b2301793a002f61859f37cc78bf38201de1c Mon Sep 17 00:00:00 2001 From: Pietro Abate Date: Fri, 22 Jul 2011 00:34:28 +0200 Subject: Allow installation under a given div, externally passed by debian/rules Gbp-Pq: Name 0001-Allow-installation-under-a-given-div-externally-pass.patch --- Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index e9f50e6..e7dee0b 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,13 @@ SOURCES = XmlRpcBase64.mli XmlRpcBase64.ml XmlRpcDateTime.mli XmlRpcDateTime.ml PACKS = xml-light,netclient,nethttpd-for-netcgi2 LIBINSTALL_FILES = XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi xmlrpc-light.cma xmlrpc-light.cmxa xmlrpc-light.a OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd-for-netcgi2 -DOC_FILES = XmlRpc.mli XmlRpcServer.mli XmlRpcDateTime.mli XmlRpcBase64.mli +DOC_FILES = XmlRpcBase64.mli XmlRpcDateTime.mli XmlRpc.mli XmlRpcServer.mli all: native-code-library byte-code-library -install: libinstall +install: + cp META XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi xmlrpc-light.cma $(INSTALLDIR) +installopt: + cp xmlrpc-light.cmxa xmlrpc-light.a $(INSTALLDIR) uninstall: libuninstall .PHONY: test -- cgit v1.2.3 From 56ff9ef638ea4c483073d31d1eea71f1f82ff5d4 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Fri, 22 Jul 2011 00:32:59 +0200 Subject: Compile with ocamlnet 3.3.5 Gbp-Pq: Name 0002-Compile-with-ocamlnet-3.3.5.patch --- XmlRpcServer.ml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/XmlRpcServer.ml b/XmlRpcServer.ml index 3d4f130..47d6a8b 100644 --- a/XmlRpcServer.ml +++ b/XmlRpcServer.ml @@ -331,13 +331,11 @@ object (self) Netcgi_cgi.run ~config ~output_type:(`Transactional buffered) self#process end -open Netcgi1_compat - class netplex ?(parallelizer=Netplex_mp.mp()) ?(handler="xmlrpc") () = object (self) inherit base - method private process env (cgi : Netcgi_types.cgi_activation) = + method private process env (cgi : Netcgi.cgi_activation) = match cgi#request_method with | `POST -> let input = cgi#argument_value "BODY" in @@ -377,8 +375,8 @@ object (self) } in let config_cgi = - { Netcgi_env.default_config with - Netcgi_env.permitted_input_content_types = [ "text/xml" ] + { Netcgi.default_config with + Netcgi.permitted_input_content_types = [ "text/xml" ] } in let handlers = [handler, xmlrpc] in -- cgit v1.2.3 From a19dd20d251aa312f325feab771a5d1117b5b20d Mon Sep 17 00:00:00 2001 From: Mehdi Dogguy Date: Fri, 16 Oct 2015 23:36:37 +0200 Subject: Compile with ocamlnet 4.0.4 Gbp-Pq: Name 0003-Compile-with-ocamlnet-4.0.4.patch --- META | 2 +- Makefile | 4 ++-- XmlRpc.ml | 8 ++++---- examples/adder/Makefile | 2 +- test/test.ml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/META b/META index 9e153c9..befe597 100644 --- a/META +++ b/META @@ -1,6 +1,6 @@ name = "xmlrpc-light" version = "0.6.1" description = "XML-RPC client based on Xml-Light" -requires = "xml-light,netclient,nethttpd-for-netcgi2" +requires = "xml-light,netclient,nethttpd" archive(byte) = "xmlrpc-light.cma" archive(native) = "xmlrpc-light.cmxa" diff --git a/Makefile b/Makefile index e7dee0b..5540de5 100644 --- a/Makefile +++ b/Makefile @@ -2,9 +2,9 @@ OCAMLMAKEFILE = OCamlMakefile RESULT = xmlrpc-light SOURCES = XmlRpcBase64.mli XmlRpcBase64.ml XmlRpcDateTime.mli XmlRpcDateTime.ml XmlRpc.mli XmlRpc.ml XmlRpcServer.mli XmlRpcServer.ml -PACKS = xml-light,netclient,nethttpd-for-netcgi2 +PACKS = xml-light,netclient,nethttpd LIBINSTALL_FILES = XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi xmlrpc-light.cma xmlrpc-light.cmxa xmlrpc-light.a -OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd-for-netcgi2 +OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd DOC_FILES = XmlRpcBase64.mli XmlRpcDateTime.mli XmlRpc.mli XmlRpcServer.mli all: native-code-library byte-code-library diff --git a/XmlRpc.ml b/XmlRpc.ml index b398318..9d81a79 100644 --- a/XmlRpc.ml +++ b/XmlRpc.ml @@ -414,7 +414,7 @@ object (self) Neturl.string_of_url (Neturl.remove_from_url ~user:true ~password:true parsed_url) in - let call = new Http_client.post_raw url xml in + let call = new Nethttp_client.post_raw url xml in call#set_req_header "User-Agent" useragent; call#set_req_header "Content-Type" "text/xml"; List.iter (fun (n, v) -> call#set_req_header n v) headers; @@ -428,12 +428,12 @@ object (self) | None -> () end; - let pipeline = new Http_client.pipeline in + let pipeline = new Nethttp_client.pipeline in pipeline#set_proxy_from_environment (); let opt = pipeline#get_options in pipeline#set_options - {opt with Http_client. + {opt with Nethttp_client. connection_timeout = timeout; }; @@ -441,7 +441,7 @@ object (self) begin let opt = pipeline#get_options in pipeline#set_options - {opt with Http_client. + {opt with Nethttp_client. verbose_status = true; verbose_request_header = true; verbose_response_header = true; diff --git a/examples/adder/Makefile b/examples/adder/Makefile index 0504c93..4ef2ec3 100644 --- a/examples/adder/Makefile +++ b/examples/adder/Makefile @@ -2,7 +2,7 @@ OCAMLMAKEFILE = OCamlMakefile RESULT = adder SOURCES = adder.ml -PACKS = xmlrpc-light,nethttpd-for-netcgi2 +PACKS = xmlrpc-light,nethttpd all: native-code diff --git a/test/test.ml b/test/test.ml index f1c919d..48e6400 100644 --- a/test/test.ml +++ b/test/test.ml @@ -21,7 +21,7 @@ #require "oUnit";; #require "netclient";; -#require "nethttpd-for-netcgi2";; +#require "nethttpd";; #require "xml-light";; #load "xmlrpc-light.cma";; -- cgit v1.2.3