diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/CMakeLists.txt opencamlib-11.10-1/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/CMakeLists.txt 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/CMakeLists.txt 2020-06-14 12:13:19.000000000 +0000 @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 2.4) +project(OpenCamLib) +cmake_minimum_required(VERSION 3.9) set( CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src ) add_subdirectory( src ) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/COPYING opencamlib-11.10-1/COPYING --- opencamlib-11.10+git201801200005~ubuntu16.04.1/COPYING 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/COPYING 2020-06-14 12:13:19.000000000 +0000 @@ -1,674 +1,502 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble +[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.] - The GNU General Public License is a free, copyleft license for -software and other kinds of works. + Preamble - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. + 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. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or + + 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. +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 - How to Apply These Terms to Your New Programs + 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. - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - + Copyright (C) - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + This library is distributed in the hope that 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. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +That's all there is to it! diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/point/CMakeLists.txt opencamlib-11.10-1/cpp_examples/point/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/point/CMakeLists.txt 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/point/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -project(OCL_POINT_EXAMPLE) - -cmake_minimum_required(VERSION 2.4) - -if (CMAKE_BUILD_TOOL MATCHES "make") - add_definitions(-Wall -Werror -Wno-deprecated -pedantic-errors) -endif (CMAKE_BUILD_TOOL MATCHES "make") - -# find BOOST and boost-python -find_package( Boost ) -if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) - MESSAGE(STATUS "found Boost: " ${Boost_LIB_VERSION}) - MESSAGE(STATUS "boost-incude dirs are: " ${Boost_INCLUDE_DIRS}) -endif() - -find_package( OpenMP REQUIRED ) -IF (OPENMP_FOUND) - MESSAGE(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} ) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") -ENDIF(OPENMP_FOUND) - -find_library(OCL_LIBRARY - NAMES ocl - PATHS /usr/local/lib/opencamlib - DOC "The opencamlib library" -) -#find_package(ocl REQUIRED) -MESSAGE(STATUS "OCL_LIBRARY is now: " ${OCL_LIBRARY}) - - -set(OCL_TST_SRC - ${OCL_POINT_EXAMPLE_SOURCE_DIR}/point_example.cpp -) - -add_executable( - point_example - ${OCL_TST_SRC} -) -target_link_libraries(point_example ${OCL_LIBRARY} ${Boost_LIBRARIES}) - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/point/point_example.cpp opencamlib-11.10-1/cpp_examples/point/point_example.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/point/point_example.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/point/point_example.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ - -#include -#include -#include - -#include -#include - -int main() { - std::cout << ocl::revision() << "\n"; - ocl::Point p1; - p1.x = 1.2; - p1.y = sqrt(p1.x); - p1.z = p1.x + p1.y; - std::cout << "p1=" << p1 << "\n"; - ocl::Point p2(1.23,4.56,3.219); - std::cout << "p2=" << p2 << "\n"; - - std::cout << "addition:\n"; - std::cout << " " << p1 << " + " << p2 << " = " << p1+p2 << "\n"; - std::cout << "subtraction:\n"; - std::cout << " " << p1 << " - " << p2 << " = " << p1-p2 << "\n"; - std::cout << "dot product:\n"; - std::cout << " " << p1 << " dot " << p2 << " = " << p1.dot(p2) << "\n"; - std::cout << "cross product:\n"; - std::cout << " " << p1 << " cross " << p2 << " = " << p1.cross(p2) << "\n"; - std::cout << "scalar multiplication:\n"; - std::cout << " " << p1 << " * 0.1 = " << 0.1*p1 << "\n"; - std::cout << "norm:\n"; - std::cout << " norm( " << p1 << " ) = " << p1.norm() << "\n"; - std::cout << "normalize:\n"; - ocl::Point p3 = p1; - p3.normalize(); - std::cout << " " << p1 << ".normalize() = " << p3 << " norm=" << p3.norm() << "\n"; - - return 0; -} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/qt_vtk_renderwindow/CMakeLists.txt opencamlib-11.10-1/cpp_examples/qt_vtk_renderwindow/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/qt_vtk_renderwindow/CMakeLists.txt 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/qt_vtk_renderwindow/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -cmake_minimum_required(VERSION 2.6) - -PROJECT(RenderWindow) - -FIND_PACKAGE(VTK REQUIRED) -INCLUDE(${VTK_USE_FILE}) -MESSAGE(STATUS "VTK_USE_FILE = " ${VTK_USE_FILE} ) - -FIND_PACKAGE(Qt4 REQUIRED) -INCLUDE(${QT_USE_FILE}) - MESSAGE(STATUS "QT_USE_FILE = " ${QT_USE_FILE} ) - -ADD_EXECUTABLE(RenderWindow RenderWindow.cpp) -TARGET_LINK_LIBRARIES(RenderWindow QVTK vtkHybrid) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/qt_vtk_renderwindow/RenderWindow.cpp opencamlib-11.10-1/cpp_examples/qt_vtk_renderwindow/RenderWindow.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/qt_vtk_renderwindow/RenderWindow.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/qt_vtk_renderwindow/RenderWindow.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -int main(int argc, char** argv) -{ - QApplication app(argc, argv); - - QVTKWidget widget; - widget.resize(512,256); - - //setup sphere - vtkSmartPointer sphereSource = - vtkSmartPointer::New(); - sphereSource->Update(); - vtkSmartPointer sphereMapper = - vtkSmartPointer::New(); - sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); - vtkSmartPointer sphereActor = - vtkSmartPointer::New(); - sphereActor->SetMapper(sphereMapper); - - //setup window - vtkSmartPointer renderWindow = - vtkSmartPointer::New(); - - //setup renderer - vtkSmartPointer renderer = - vtkSmartPointer::New(); - renderWindow->AddRenderer(renderer); - - renderer->AddActor(sphereActor); - renderer->ResetCamera(); - - widget.SetRenderWindow(renderWindow); - widget.show(); - - app.exec(); - - return EXIT_SUCCESS; -} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/CMakeLists.txt opencamlib-11.10-1/cpp_examples/renderwindowUI/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/CMakeLists.txt 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/renderwindowUI/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -PROJECT(RenderWindowUI) - -FIND_PACKAGE(VTK) -INCLUDE(${VTK_USE_FILE}) # include UseVTK.cmake - -FIND_PACKAGE(Qt4 REQUIRED) -INCLUDE(${QT_USE_FILE}) # include UseQt4.cmake - -# support for out-of-source build -INCLUDE_DIRECTORIES( - ${CMAKE_CURRENT_BINARY_DIR} #this is where ui_SimpleViewUI.h is generated - ${CMAKE_CURRENT_SOURCE_DIR} -) - -# Set your files and resources here -SET(SimpleViewSrcs RenderWindowUI.cxx SimpleViewUI.cxx) -SET(SimpleViewUI SimpleViewUI.ui) -SET(SimpleViewHeaders SimpleViewUI.h) - -QT4_WRAP_UI(UISrcs ${SimpleViewUI}) -QT4_WRAP_CPP(MOCSrcs ${SimpleViewHeaders} ) - -SOURCE_GROUP("Resources" FILES - ${SimpleViewUI} -) - -SOURCE_GROUP("Generated" FILES - ${UISrcs} - ${MOCSrcs} -) - -ADD_EXECUTABLE( RenderWindowUI ${SimpleViewSrcs} ${UISrcs} ${MOCSrcs}) -TARGET_LINK_LIBRARIES( RenderWindowUI QVTK ) - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/RenderWindowUI.cxx opencamlib-11.10-1/cpp_examples/renderwindowUI/RenderWindowUI.cxx --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/RenderWindowUI.cxx 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/renderwindowUI/RenderWindowUI.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -#include -#include "SimpleViewUI.h" - -int main( int argc, char** argv ) -{ - QApplication app( argc, argv ); - SimpleView mySimpleView; - mySimpleView.show(); - return app.exec(); -} - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/SimpleViewUI.cxx opencamlib-11.10-1/cpp_examples/renderwindowUI/SimpleViewUI.cxx --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/SimpleViewUI.cxx 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/renderwindowUI/SimpleViewUI.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -#include "ui_SimpleViewUI.h" -#include "SimpleViewUI.h" - -#include -#include -#include -#include -#include - -#include "vtkSmartPointer.h" - -// Constructor -SimpleView::SimpleView() { - this->ui = new Ui_SimpleView; - this->ui->setupUi(this); - - // sphere - vtkSmartPointer sphereSource = vtkSmartPointer::New(); - sphereSource->Update(); - vtkSmartPointer sphereMapper = vtkSmartPointer::New(); - sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); - vtkSmartPointer sphereActor = vtkSmartPointer::New(); - sphereActor->SetMapper(sphereMapper); - - // VTK Renderer - vtkSmartPointer renderer = vtkSmartPointer::New(); - renderer->AddActor(sphereActor); - - // VTK/Qt wedded - this->ui->qvtkWidget->GetRenderWindow()->AddRenderer(renderer); - - // Set up action signals and slots - connect(this->ui->actionExit, SIGNAL(triggered()), this, SLOT(slotExit())); - -}; - -void SimpleView::slotExit() { - qApp->exit(); -} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/SimpleViewUI.h opencamlib-11.10-1/cpp_examples/renderwindowUI/SimpleViewUI.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/SimpleViewUI.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/renderwindowUI/SimpleViewUI.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#ifndef SimpleViewUI_H -#define SimpleViewUI_H - -#include "vtkSmartPointer.h" -#include - -// Forward Qt class declarations -class Ui_SimpleView; - -class SimpleView : public QMainWindow -{ - Q_OBJECT - public: - SimpleView(); - ~SimpleView() {}; - - public slots: - virtual void slotExit(); - protected: - protected slots: - private: - Ui_SimpleView *ui; -}; - -#endif // SimpleViewUI_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/SimpleViewUI.ui opencamlib-11.10-1/cpp_examples/renderwindowUI/SimpleViewUI.ui --- opencamlib-11.10+git201801200005~ubuntu16.04.1/cpp_examples/renderwindowUI/SimpleViewUI.ui 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/cpp_examples/renderwindowUI/SimpleViewUI.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ - - - SimpleView - - - - 0 - 0 - 807 - 696 - - - - SimpleView - - - - - - 160 - 20 - 721 - 621 - - - - - - - 0 - 20 - 161 - 621 - - - - - - - - 0 - 0 - 807 - 23 - - - - - File - - - - - - Help - - - false - - - - - - - - - true - - - Open File... - - - - - Exit - - - - - Print - - - - - Help - - - - - Save - - - - - Exit - - - - - - QVTKWidget - QWidget -
QVTKWidget.h
-
-
- - -
diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/bzr-builder.manifest opencamlib-11.10-1/debian/bzr-builder.manifest --- opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/bzr-builder.manifest 2018-01-20 00:05:24.000000000 +0000 +++ opencamlib-11.10-1/debian/bzr-builder.manifest 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -# bzr-builder format 0.3 deb-version {debupstream}+git201801200005 -lp:opencamlib revid:git-v1:f8bd0a66ad4f1114a3caf84f430027c2da79c91d -nest packaging lp:~neomilium/opencamlib/packaging debian revid:neomilium@gmail.com-20171115233328-2ngbkslxbw1e9tl2 -nest-part versioning lp:~neomilium/opencamlib/versioning src/version_string.hpp src/version_string.hpp revid:neomilium@gmail.com-20140613122717-mhb9173sx94yjx0e diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/changelog opencamlib-11.10-1/debian/changelog --- opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/changelog 2018-01-20 00:05:24.000000000 +0000 +++ opencamlib-11.10-1/debian/changelog 2020-06-14 12:13:21.000000000 +0000 @@ -1,8 +1,8 @@ -opencamlib (11.10+git201801200005~ubuntu16.04.1) xenial; urgency=low +opencamlib (11.10-1-1+git202005211103~ubuntu16.04.1) xenial; urgency=low * Auto build. - -- neomilium Sat, 20 Jan 2018 00:05:24 +0000 + -- neomilium Sun, 14 Jun 2020 12:13:21 +0000 opencamlib (11.10-1) unstable; urgency=low diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/control opencamlib-11.10-1/debian/control --- opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/control 2018-01-20 00:05:23.000000000 +0000 +++ opencamlib-11.10-1/debian/control 2020-06-14 12:13:21.000000000 +0000 @@ -2,7 +2,7 @@ Priority: extra Section: misc Maintainer: Romuald Conty -Build-Depends: debhelper (>= 7.0.0), cmake (>= 2.4), python-dev, libboost-dev, libboost-system-dev, libboost-python-dev +Build-Depends: debhelper (>= 9.0.0), cmake (>= 2.4), python-dev, libboost-dev, libboost-system-dev, libboost-python-dev Standards-Version: 3.9.3 Homepage: https://github.com/aewallin/opencamlib Vcs-Git: https://github.com/aewallin/opencamlib.git diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/git-build-recipe.manifest opencamlib-11.10-1/debian/git-build-recipe.manifest --- opencamlib-11.10+git201801200005~ubuntu16.04.1/debian/git-build-recipe.manifest 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/debian/git-build-recipe.manifest 2020-06-14 12:13:21.000000000 +0000 @@ -0,0 +1,3 @@ +# git-build-recipe format 0.4 deb-version {debversion}-1+git202005211103 +lp:opencamlib git-commit:c31b069cfa6deb57708e19c185e932117879f24b +nest packaging lp:~neomilium/opencamlib/+git/packaging debian git-commit:8d85ed825f93f0b8344117d49b3c07b7e97bd68e diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/doc/pushcutter_drawing.svg opencamlib-11.10-1/doc/pushcutter_drawing.svg --- opencamlib-11.10+git201801200005~ubuntu16.04.1/doc/pushcutter_drawing.svg 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/doc/pushcutter_drawing.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - tool axis - n - - nxy - - c - - radius(h) - - h - BullCutter - Triangle facet - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Dockerfile opencamlib-11.10-1/Dockerfile --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Dockerfile 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/Dockerfile 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,24 @@ +FROM ubuntu:16.04 +RUN rm /bin/sh && ln -s /bin/bash /bin/sh +RUN apt-get update +RUN apt-get install -y cmake build-essential subversion doxygen texlive-latex-base libboost-all-dev git python-vtk6 python-dev x11vnc fluxbox wget wmctrl xvfb +RUN git clone --depth=50 --branch=master https://github.com/aewallin/opencamlib.git aewallin/opencamlib +ENV CXX g++ +ENV CC gcc +ENV DISPLAY :20 +WORKDIR ./aewallin/opencamlib +RUN mkdir build +RUN ls +WORKDIR ./build +RUN cmake ../src +RUN make +RUN make install +WORKDIR /usr/lib/x86_64-linux-gnu +EXPOSE 5900 +RUN useradd -ms /bin/bash cam +USER cam +ENV USER cam +WORKDIR /aewallin/opencamlib/ +ADD dockerinit.sh / +CMD '/dockerinit.sh' + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/dockerinit.sh opencamlib-11.10-1/dockerinit.sh --- opencamlib-11.10+git201801200005~ubuntu16.04.1/dockerinit.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/dockerinit.sh 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,85 @@ +#!/bin/bash + +# Based on: http://www.richud.com/wiki/Ubuntu_Fluxbox_GUI_with_x11vnc_and_Xvfb + +readonly G_LOG_I='[INFO]' +readonly G_LOG_W='[WARN]' +readonly G_LOG_E='[ERROR]' + +main() { + launch_xvfb + launch_window_manager + run_vnc_server +} + +launch_xvfb() { + # Set defaults if the user did not specify envs. + export DISPLAY=${XVFB_DISPLAY:-:1} + local screen=${XVFB_SCREEN:-0} + local resolution=${XVFB_RESOLUTION:-1280x1024x24} + local timeout=${XVFB_TIMEOUT:-5} + + # Start and wait for either Xvfb to be fully up or we hit the timeout. + Xvfb ${DISPLAY} -screen ${screen} ${resolution} & + local loopCount=0 + until xdpyinfo -display ${DISPLAY} > /dev/null 2>&1 + do + loopCount=$((loopCount+1)) + sleep 1 + if [ ${loopCount} -gt ${timeout} ] + then + echo "${G_LOG_E} xvfb failed to start." + exit 1 + fi + done +} + +launch_window_manager() { + local timeout=${XVFB_TIMEOUT:-5} + + # Start and wait for either fluxbox to be fully up or we hit the timeout. + fluxbox & + local loopCount=0 + until wmctrl -m > /dev/null 2>&1 + do + loopCount=$((loopCount+1)) + sleep 1 + if [ ${loopCount} -gt ${timeout} ] + then + echo "${G_LOG_E} fluxbox failed to start." + exit 1 + fi + done +} + +run_vnc_server() { + local passwordArgument='-nopw' + + if [ -n "${VNC_SERVER_PASSWORD}" ] + then + local passwordFilePath="${HOME}/x11vnc.pass" + if ! x11vnc -storepasswd "${VNC_SERVER_PASSWORD}" "${passwordFilePath}" + then + echo "${G_LOG_E} Failed to store x11vnc password." + exit 1 + fi + passwordArgument=-"-rfbauth ${passwordFilePath}" + echo "${G_LOG_I} The VNC server will ask for a password." + else + echo "${G_LOG_W} The VNC server will NOT ask for a password." + fi + + x11vnc -display ${DISPLAY} -forever ${passwordArgument} & + wait $! +} + +control_c() { + echo "" + exit +} + +trap control_c SIGINT SIGTERM SIGHUP + +main + +exit diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/adaptivepathdropcutter.rst opencamlib-11.10-1/docs/adaptivepathdropcutter.rst --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/adaptivepathdropcutter.rst 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/adaptivepathdropcutter.rst 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,6 @@ +AdaptivePathDropCutter +====================== + +.. doxygenclass:: ocl::AdaptivePathDropCutter + :project: opencamlib + :members: \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/api.rst opencamlib-11.10-1/docs/api.rst --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/api.rst 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/api.rst 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,148 @@ +API Documentation +================= + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + point + adaptivepathdropcutter + +To Document: +============ + +.. doxygenclass:: ocl::AdaptiveWaterline + :project: opencamlib + :members: +.. doxygenclass:: ocl::AlignedEllipse + :project: opencamlib + :members: +.. doxygenclass:: ocl::Arc + :project: opencamlib + :members: +.. doxygenclass:: ocl::ArcSpan + :project: opencamlib + :members: +.. doxygenclass:: ocl::BallConeCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::BallCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::BatchDropCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::BatchPushCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::Bbox + :project: opencamlib + :members: +.. doxygenclass:: ocl::BullConeCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::BullCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::CCPoint + :project: opencamlib + :members: +.. doxygenclass:: ocl::CLFilter + :project: opencamlib + :members: +.. doxygenclass:: ocl::CLPoint + :project: opencamlib + :members: +.. doxygenclass:: ocl::CompBallCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::CompCylCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::CompositeCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::ConeConeCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::ConeCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::CylConeCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::CylCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::Ellipse + :project: opencamlib + :members: +.. doxygenclass:: ocl::EllipsePosition + :project: opencamlib + :members: +.. doxygenclass:: ocl::Fiber + :project: opencamlib + :members: +.. doxygenclass:: ocl::FiberPushCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::Interval + :project: opencamlib + :members: +.. doxygenclass:: ocl::VertexPairCompare + :project: opencamlib + :members: +.. doxygenclass:: ocl::KDNode + :project: opencamlib + :members: +.. doxygenclass:: ocl::KDTree + :project: opencamlib + :members: +.. doxygenclass:: ocl::Line + :project: opencamlib + :members: +.. doxygenclass:: ocl::LineCLFilter + :project: opencamlib + :members: +.. doxygenclass:: ocl::LineSpan + :project: opencamlib + :members: +.. doxygenclass:: ocl::MillingCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::Operation + :project: opencamlib + :members: +.. doxygenclass:: ocl::Path + :project: opencamlib + :members: +.. doxygenclass:: ocl::PathDropCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::Point + :project: opencamlib + :members: +.. doxygenclass:: ocl::PointDropCutter + :project: opencamlib + :members: +.. doxygenclass:: ocl::Span + :project: opencamlib + :members: +.. doxygenclass:: ocl::Spread + :project: opencamlib + :members: +.. doxygenclass:: ocl::STLReader + :project: opencamlib + :members: +.. doxygenclass:: ocl::STLSurf + :project: opencamlib + :members: +.. doxygenclass:: ocl::Triangle + :project: opencamlib + :members: +.. doxygenclass:: ocl::Waterline + :project: opencamlib + :members: +.. doxygenclass:: ocl::ZigZag + :project: opencamlib + :members: \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/conf.py opencamlib-11.10-1/docs/conf.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/conf.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/conf.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- +# +# opencamlib documentation build configuration file, created by +# sphinx-quickstart on Sat Aug 4 21:55:45 2018. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os +import subprocess + +# https://breathe.readthedocs.io/en/latest/readthedocs.html +# generates doxygen XML files +read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True' + +if read_the_docs_build: + subprocess.call('cd ../src; doxygen', shell=True) + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ "breathe" ] +breathe_projects = {"opencamlib":"../src/doc/xml"} +breathe_default_project = "opencamlib" + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'opencamlib' +copyright = u'2018, Anders E.E. Wallin' +author = u'Anders E.E. Wallin' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'2018.08' +# The full version, including alpha/beta/rc tags. +release = u'2018.08' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = ['../src/doc/html'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'opencamlibdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'opencamlib.tex', u'opencamlib Documentation', + u'Anders E.E. Wallin', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'opencamlib', u'opencamlib Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'opencamlib', u'opencamlib Documentation', + author, 'opencamlib', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/index.rst opencamlib-11.10-1/docs/index.rst --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/index.rst 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/index.rst 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,67 @@ +.. opencamlib documentation master file, created by + sphinx-quickstart on Sat Aug 4 21:55:45 2018. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +OpenCAMLib +========== + +Introduction +============ + +OpenCAMLib (ocl) is a c++ library with python bindings for creating 3D toolpaths for cnc-machines such as mills and lathes. From August 2018 OpenCAMLib is released under LGPL license. + +repository https://github.com/aewallin/opencamlib +mailing-list http://groups.google.com/group/opencamlib +IRC-channel #cam on irc.freenode.net +coding standard (?) http://www.possibility.com/Cpp/CppCodingStandard.html +BUILDING and INSTALLING +to clone, build and install install the ocl.so library and camvtk.py run the following: + +.. code-block:: console + + git clone git://github.com/aewallin/opencamlib.git + cd opencamlib + mkdir build + cd build + cmake ../src + make (try make -j4 for a faster build if you have a multi-core machine) + sudo make install + +if you also want to build the documentation, then run: + +.. code-block:: console + + make doc + make doc-pdf + +this should create the ocl manual named "ocl-manual.pdf" in the build/doc directory + +using cmake and cpack it is possible to build a binary .deb package with: + +.. code-block:: console + + make package + +For uploading debian source-packages to the PPA there is also a custom target: + +.. code-block:: console + + make spackage + +The build directory opencamlib/build can be wiped clean ("rm -rf *") and cmake run again if/when you want a clean build. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + api + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/Makefile opencamlib-11.10-1/docs/Makefile --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/Makefile 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,216 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/opencamlib.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/opencamlib.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/opencamlib" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/opencamlib" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/point.rst opencamlib-11.10-1/docs/point.rst --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/point.rst 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/point.rst 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,6 @@ +Point +===== + +.. doxygenclass:: ocl::Point + :project: opencamlib + :members: \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/pushcutter_drawing.svg opencamlib-11.10-1/docs/pushcutter_drawing.svg --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/pushcutter_drawing.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/pushcutter_drawing.svg 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,247 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + tool axis + n + + nxy + + c + + radius(h) + + h + BullCutter + Triangle facet + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/requirements.txt opencamlib-11.10-1/docs/requirements.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/docs/requirements.txt 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/docs/requirements.txt 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,2 @@ +breathe +sphinx_rtd_theme \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/point/CMakeLists.txt opencamlib-11.10-1/examples/cpp/point/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/point/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/point/CMakeLists.txt 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,42 @@ +project(OCL_POINT_EXAMPLE) + +cmake_minimum_required(VERSION 2.4) + +if (CMAKE_BUILD_TOOL MATCHES "make") + add_definitions(-Wall -Werror -Wno-deprecated -pedantic-errors) +endif (CMAKE_BUILD_TOOL MATCHES "make") + +# find BOOST and boost-python +find_package( Boost ) +if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + MESSAGE(STATUS "found Boost: " ${Boost_LIB_VERSION}) + MESSAGE(STATUS "boost-incude dirs are: " ${Boost_INCLUDE_DIRS}) +endif() + +find_package( OpenMP REQUIRED ) +IF (OPENMP_FOUND) + MESSAGE(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +ENDIF(OPENMP_FOUND) + +find_library(OCL_LIBRARY + NAMES ocl + PATHS /usr/local/lib/opencamlib + DOC "The opencamlib library" +) +#find_package(ocl REQUIRED) +MESSAGE(STATUS "OCL_LIBRARY is now: " ${OCL_LIBRARY}) + + +set(OCL_TST_SRC + ${OCL_POINT_EXAMPLE_SOURCE_DIR}/point_example.cpp +) + +add_executable( + point_example + ${OCL_TST_SRC} +) +target_link_libraries(point_example ${OCL_LIBRARY} ${Boost_LIBRARIES}) + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/point/point_example.cpp opencamlib-11.10-1/examples/cpp/point/point_example.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/point/point_example.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/point/point_example.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,37 @@ + +#include +#include +#include + +#include +#include + +int main() { + std::cout << ocl::revision() << "\n"; + ocl::Point p1; + p1.x = 1.2; + p1.y = sqrt(p1.x); + p1.z = p1.x + p1.y; + std::cout << "p1=" << p1 << "\n"; + ocl::Point p2(1.23,4.56,3.219); + std::cout << "p2=" << p2 << "\n"; + + std::cout << "addition:\n"; + std::cout << " " << p1 << " + " << p2 << " = " << p1+p2 << "\n"; + std::cout << "subtraction:\n"; + std::cout << " " << p1 << " - " << p2 << " = " << p1-p2 << "\n"; + std::cout << "dot product:\n"; + std::cout << " " << p1 << " dot " << p2 << " = " << p1.dot(p2) << "\n"; + std::cout << "cross product:\n"; + std::cout << " " << p1 << " cross " << p2 << " = " << p1.cross(p2) << "\n"; + std::cout << "scalar multiplication:\n"; + std::cout << " " << p1 << " * 0.1 = " << 0.1*p1 << "\n"; + std::cout << "norm:\n"; + std::cout << " norm( " << p1 << " ) = " << p1.norm() << "\n"; + std::cout << "normalize:\n"; + ocl::Point p3 = p1; + p3.normalize(); + std::cout << " " << p1 << ".normalize() = " << p3 << " norm=" << p3.norm() << "\n"; + + return 0; +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/qt_vtk_renderwindow/CMakeLists.txt opencamlib-11.10-1/examples/cpp/qt_vtk_renderwindow/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/qt_vtk_renderwindow/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/qt_vtk_renderwindow/CMakeLists.txt 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 2.6) + +PROJECT(RenderWindow) + +FIND_PACKAGE(VTK REQUIRED) +INCLUDE(${VTK_USE_FILE}) +MESSAGE(STATUS "VTK_USE_FILE = " ${VTK_USE_FILE} ) + +FIND_PACKAGE(Qt4 REQUIRED) +INCLUDE(${QT_USE_FILE}) + MESSAGE(STATUS "QT_USE_FILE = " ${QT_USE_FILE} ) + +ADD_EXECUTABLE(RenderWindow RenderWindow.cpp) +TARGET_LINK_LIBRARIES(RenderWindow QVTK vtkHybrid) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/qt_vtk_renderwindow/RenderWindow.cpp opencamlib-11.10-1/examples/cpp/qt_vtk_renderwindow/RenderWindow.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/qt_vtk_renderwindow/RenderWindow.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/qt_vtk_renderwindow/RenderWindow.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,51 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +int main(int argc, char** argv) +{ + QApplication app(argc, argv); + + QVTKWidget widget; + widget.resize(512,256); + + //setup sphere + vtkSmartPointer sphereSource = + vtkSmartPointer::New(); + sphereSource->Update(); + vtkSmartPointer sphereMapper = + vtkSmartPointer::New(); + sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); + vtkSmartPointer sphereActor = + vtkSmartPointer::New(); + sphereActor->SetMapper(sphereMapper); + + //setup window + vtkSmartPointer renderWindow = + vtkSmartPointer::New(); + + //setup renderer + vtkSmartPointer renderer = + vtkSmartPointer::New(); + renderWindow->AddRenderer(renderer); + + renderer->AddActor(sphereActor); + renderer->ResetCamera(); + + widget.SetRenderWindow(renderWindow); + widget.show(); + + app.exec(); + + return EXIT_SUCCESS; +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/CMakeLists.txt opencamlib-11.10-1/examples/cpp/renderwindowUI/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/renderwindowUI/CMakeLists.txt 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,36 @@ +cmake_minimum_required(VERSION 2.8) + +PROJECT(RenderWindowUI) + +FIND_PACKAGE(VTK) +INCLUDE(${VTK_USE_FILE}) # include UseVTK.cmake + +FIND_PACKAGE(Qt4 REQUIRED) +INCLUDE(${QT_USE_FILE}) # include UseQt4.cmake + +# support for out-of-source build +INCLUDE_DIRECTORIES( + ${CMAKE_CURRENT_BINARY_DIR} #this is where ui_SimpleViewUI.h is generated + ${CMAKE_CURRENT_SOURCE_DIR} +) + +# Set your files and resources here +SET(SimpleViewSrcs RenderWindowUI.cxx SimpleViewUI.cxx) +SET(SimpleViewUI SimpleViewUI.ui) +SET(SimpleViewHeaders SimpleViewUI.h) + +QT4_WRAP_UI(UISrcs ${SimpleViewUI}) +QT4_WRAP_CPP(MOCSrcs ${SimpleViewHeaders} ) + +SOURCE_GROUP("Resources" FILES + ${SimpleViewUI} +) + +SOURCE_GROUP("Generated" FILES + ${UISrcs} + ${MOCSrcs} +) + +ADD_EXECUTABLE( RenderWindowUI ${SimpleViewSrcs} ${UISrcs} ${MOCSrcs}) +TARGET_LINK_LIBRARIES( RenderWindowUI QVTK ) + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/RenderWindowUI.cxx opencamlib-11.10-1/examples/cpp/renderwindowUI/RenderWindowUI.cxx --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/RenderWindowUI.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/renderwindowUI/RenderWindowUI.cxx 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,11 @@ +#include +#include "SimpleViewUI.h" + +int main( int argc, char** argv ) +{ + QApplication app( argc, argv ); + SimpleView mySimpleView; + mySimpleView.show(); + return app.exec(); +} + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/SimpleViewUI.cxx opencamlib-11.10-1/examples/cpp/renderwindowUI/SimpleViewUI.cxx --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/SimpleViewUI.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/renderwindowUI/SimpleViewUI.cxx 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,39 @@ +#include "ui_SimpleViewUI.h" +#include "SimpleViewUI.h" + +#include +#include +#include +#include +#include + +#include "vtkSmartPointer.h" + +// Constructor +SimpleView::SimpleView() { + this->ui = new Ui_SimpleView; + this->ui->setupUi(this); + + // sphere + vtkSmartPointer sphereSource = vtkSmartPointer::New(); + sphereSource->Update(); + vtkSmartPointer sphereMapper = vtkSmartPointer::New(); + sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); + vtkSmartPointer sphereActor = vtkSmartPointer::New(); + sphereActor->SetMapper(sphereMapper); + + // VTK Renderer + vtkSmartPointer renderer = vtkSmartPointer::New(); + renderer->AddActor(sphereActor); + + // VTK/Qt wedded + this->ui->qvtkWidget->GetRenderWindow()->AddRenderer(renderer); + + // Set up action signals and slots + connect(this->ui->actionExit, SIGNAL(triggered()), this, SLOT(slotExit())); + +}; + +void SimpleView::slotExit() { + qApp->exit(); +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/SimpleViewUI.h opencamlib-11.10-1/examples/cpp/renderwindowUI/SimpleViewUI.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/SimpleViewUI.h 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/renderwindowUI/SimpleViewUI.h 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,25 @@ +#ifndef SimpleViewUI_H +#define SimpleViewUI_H + +#include "vtkSmartPointer.h" +#include + +// Forward Qt class declarations +class Ui_SimpleView; + +class SimpleView : public QMainWindow +{ + Q_OBJECT + public: + SimpleView(); + ~SimpleView() {}; + + public slots: + virtual void slotExit(); + protected: + protected slots: + private: + Ui_SimpleView *ui; +}; + +#endif // SimpleViewUI_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/SimpleViewUI.ui opencamlib-11.10-1/examples/cpp/renderwindowUI/SimpleViewUI.ui --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/cpp/renderwindowUI/SimpleViewUI.ui 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/cpp/renderwindowUI/SimpleViewUI.ui 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,108 @@ + + + SimpleView + + + + 0 + 0 + 807 + 696 + + + + SimpleView + + + + + + 160 + 20 + 721 + 621 + + + + + + + 0 + 20 + 161 + 621 + + + + + + + + 0 + 0 + 807 + 23 + + + + + File + + + + + + Help + + + false + + + + + + + + + true + + + Open File... + + + + + Exit + + + + + Print + + + + + Help + + + + + Save + + + + + Exit + + + + + + QVTKWidget + QWidget +
QVTKWidget.h
+
+
+ + +
diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/nodejs/adaptivewaterline.js opencamlib-11.10-1/examples/nodejs/adaptivewaterline.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/nodejs/adaptivewaterline.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/nodejs/adaptivewaterline.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,23 @@ +const ocl = require('../..') +const { + STLSurf, + STLReader, + CylCutter, + AdaptiveWaterline +} = ocl + +const surface = new STLSurf() +new STLReader(__dirname + '/../../stl/gnu_tux_mod.stl', surface) +const cutter = new CylCutter(4, 20) +const awl = new AdaptiveWaterline() +awl.setSTL(surface) +awl.setCutter(cutter) +awl.setSampling(0.1) +awl.setMinSampling(0.001) +awl.setZ(1) +awl.run() +awl.getLoops().forEach(function (loop) { + loop.forEach(function (point) { + console.log('G01 X' + point[0] + ' Y' + point[1] + ' Z' + point[2]) + }) +}) \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/nodejs/parallel_finish_zig.js opencamlib-11.10-1/examples/nodejs/parallel_finish_zig.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/nodejs/parallel_finish_zig.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/nodejs/parallel_finish_zig.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,99 @@ +const ocl = require('../..') +const { + STLSurf, + STLReader, + CylCutter, + BallCutter, + BullCutter, + ConeCutter, + AdaptivePathDropCutter, + Path, + Line, + Point +} = ocl + +function assert(condition, message) { + if (!condition) { + throw message || "Assertion failed"; + } +} + +// create a simple "Zig" pattern where we cut only in one direction. +// the first line is at ymin +// the last line is at ymax +function YdirectionZigPath(xmin, xmax, ymin, ymax, Ny) { + const paths = [] + const dy = (ymax - ymin) / (Ny - 1) // the y step-over + for (let n = 0; n < Ny; n++) { + const path = new Path() + const y = ymin + n * dy // current y-coordinate + if (n === Ny - 1) { + assert(y == ymax) + } else if (n === 0) { + assert(y == ymin) + } + const p1 = new Point(xmin, y, 0) // start-point of line + const p2 = new Point(xmax, y, 0) // end-point of line + const l = new Line(p1, p2) // line-object + path.append(l) // add the line to the path + paths.push(path) + } + return paths +} + +// run the actual drop-cutter algorithm +function adaptivePathDropCutter(surface, cutter, paths) { + const apdc = new AdaptivePathDropCutter() + apdc.setSTL(surface) + apdc.setCutter(cutter) + // maximum sampling or "step-forward" distance + // should be set so that we don't loose any detail of the STL model + // i.e. this number should be similar or smaller than the smallest triangle + apdc.setSampling(0.04) + // minimum sampling or step-forward distance + // the algorithm subdivides "steep" portions of the toolpath + // until we reach this limit. + apdc.setMinSampling(0.01) + let cl_paths = [] + paths.forEach(function (path) { + apdc.setPath(path) + apdc.run() + cl_points = apdc.getCLPoints() + cl_paths.push(cl_points) + }) + return cl_paths +} + +const surface = new STLSurf() +new STLReader(__dirname + '/../../stl/gnu_tux_mod.stl', surface) +// choose a cutter for the operation: +// http://www.anderswallin.net/2011/08/opencamlib-cutter-shapes/ +const diameter = 0.25 +const length = 5 +// const cutter = new BallCutter(diameter, length) +// const cutter = new CylCutter(diameter, length) +// const corner_radius = 0.05 +// const cutter = new BullCutter(diameter, corner_radius, length) +const angle = Math.PI / 4 +const cutter = new ConeCutter(diameter, angle, length) +// const cutter = cutter.offsetCutter(0.4) + +// toolpath is contained in this simple box +const ymin = 0 +const ymax = 12 +const xmin = 0 +const xmax = 10 +const Ny = 40 // number of lines in the y-direction + +const paths = YdirectionZigPath(xmin, xmax, ymin, ymax, Ny) + +// now project onto the STL surface +const toolpaths = adaptivePathDropCutter(surface, cutter, paths) +toolpaths.forEach(function (points) { + console.log('G00 X' + Math.round(points[0][0] * 10000) / 10000 + ' Y' + Math.round(points[0][1] * 10000) / 10000) + console.log('G01 Z' + Math.round(points[0][2] * 10000) / 10000) + points.forEach(function (point) { + console.log('G01 X' + Math.round(point[0] * 10000) / 10000 + ' Y' + Math.round(point[1] * 10000) / 10000 + ' Z' + Math.round(point[2] * 10000) / 10000) + }) + console.log('G00 Z3') +}) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/nodejs/test.js opencamlib-11.10-1/examples/nodejs/test.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/nodejs/test.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/nodejs/test.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,21 @@ +const { + STLSurf, + STLReader, + CylCutter, + Waterline +} = require('../..') + +const surface = new STLSurf() +new STLReader(__dirname + '/../../stl/gnu_tux_mod.stl', surface) +const cutter = new CylCutter(4, 20) +const wl = new Waterline() +wl.setSTL(surface) +wl.setCutter(cutter) +wl.setZ(1) +wl.setSampling(0.1) +wl.run() +wl.getLoops().forEach(function (loop) { + loop.forEach(function (point) { + console.log('G01 X' + point[0] + ' Y' + point[1] + ' Z' + point[2]) + }) +}) \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/clsurf_1.py opencamlib-11.10-1/examples/python/clsurf_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/clsurf_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/clsurf_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,93 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math +import random + +def drawVertex(myscreen, p, vertexColor, rad=0.1): + myscreen.addActor( camvtk.Sphere( center=(p.x,p.y,p.z), radius=rad, color=vertexColor ) ) + +def drawEdge(myscreen, e, edgeColor=camvtk.yellow): + p1 = e[0] + p2 = e[1] + myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z), p2=(p2.x,p2.y,p2.z), color=edgeColor ) ) + +#def drawFarCircle(myscreen, r, circleColor): +# myscreen.addActor( camvtk.Circle( center=(0,0,0), radius=r, color=circleColor ) ) + +def drawDiagram( myscreen, diag ): + #drawFarCircle(myscreen, vd.getFarRadius(), camvtk.pink) + for v in diag.getVertices(): + drawVertex(myscreen, v, camvtk.green) + edges = diag.getEdges() + for e in edges: + drawEdge(myscreen,e, camvtk.cyan) + +def writeFrame( w2if, lwr, n ): + w2if.Modified() + lwr.SetFileName("frames/vd500_zoomout"+ ('%05d' % n)+".png") + lwr.Write() + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + + + camvtk.drawOCLtext(myscreen) + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("tux1.png") + +# SURFACE + + #stl = camvtk.STLSurf("../stl/Cylinder_1.stl") + #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") + stl = camvtk.STLSurf("../stl/demo.stl") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + + + far = 20 + # far = 0.000002 generator 52 face_count crash + # far = 0.000010 crashes at n=192 + + camPos = 2* far + myscreen.camera.SetPosition(camPos/1000, camPos/1000, camPos) + myscreen.camera.SetClippingRange(-2*camPos,2*camPos) + myscreen.camera.SetFocalPoint(0.051, 0, 0) + + cls = ocl.CutterLocationSurface(10) + + cutter = ocl.BallCutter(2,10) + cls.setCutter(cutter) + cls.setSampling(1) + cls.setMinSampling(0.1) + cls.setSTL(s) + + drawDiagram(myscreen, cls) + #vd = ocl.VoronoiDiagram(far,1200) + + #vod = VD(myscreen,vd,scale) + #vod.setAll(vd) + #drawFarCircle(myscreen, scale*vd.getFarRadius(), camvtk.orange) + + + + print("PYTHON All DONE.") + + + + myscreen.render() + myscreen.iren.Start() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/cutter_shapes.py opencamlib-11.10-1/examples/python/cutter_shapes.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/cutter_shapes.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/cutter_shapes.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,165 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def drawLoops(myscreen, loops, loopcolor): + nloop = 0 + for lop in loops: + n = 0 + N = len(lop) + first_point=ocl.Point(-1,-1,5) + previous=ocl.Point(-1,-1,5) + for p in lop: + if n==0: # don't draw anything on the first iteration + previous=p + first_point = p + elif n== (N-1): # the last point + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=loopcolor) ) # the normal line + # and a line from p to the first point + myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=loopcolor) ) + else: + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=loopcolor) ) + previous=p + n=n+1 + print("rendered loop ",nloop, " with ", len(lop), " points") + nloop = nloop+1 + +def getWaterline(s, cutter, zh, sampling): + wl = ocl.Waterline() + #wl.setThreads(1) # single thread for easier debug + wl.setSTL(s) + wl.setCutter(cutter) + wl.setZ(zh) + wl.setSampling(sampling) + wl.run() + loops = wl.getLoops() + return loops + +def getPathsY(s,cutter,sampling,y): + #apdc = ocl.PathDropCutter() + apdc = ocl.AdaptivePathDropCutter() + apdc.setSTL(s) + apdc.setCutter(cutter) + apdc.setZ( -20 ) + apdc.setSampling(sampling) + apdc.setMinSampling(sampling/700) + path = ocl.Path() + p1 = ocl.Point(-1.52*cutter.getDiameter() , y,-111) # start-point of line + p2 = ocl.Point(+1.52*cutter.getDiameter(), y,-111) # end-point of line + l = ocl.Line(p1,p2) # line-object + path.append( l ) + apdc.setPath( path ) + apdc.run() + return apdc.getCLPoints() + +def getPathsX(s,cutter,sampling,x): + #apdc = ocl.PathDropCutter() + apdc = ocl.AdaptivePathDropCutter() + apdc.setSTL(s) + apdc.setCutter(cutter) + apdc.setZ( -20 ) + apdc.setSampling(sampling) + apdc.setMinSampling(sampling/700) + path = ocl.Path() + p1 = ocl.Point(x, -1.52*cutter.getDiameter() , -111) # start-point of line + p2 = ocl.Point(x, +1.52*cutter.getDiameter(), -111) # end-point of line + l = ocl.Line(p1,p2) # line-object + path.append( l ) + apdc.setPath( path ) + apdc.run() + return apdc.getCLPoints() + +if __name__ == "__main__": + print(ocl.version()) # revision() + myscreen = camvtk.VTKScreen() + #stl = camvtk.STLSurf("../stl/demo.stl") + #stl = camvtk.STLSurf("../stl/30sphere.stl") + #myscreen.addActor(stl) + + base=0.1 + tip=10 + a=ocl.Point(base,0,-tip) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); + b=ocl.Point(-base,0,-tip) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); + c=ocl.Point(0,0,0) + myscreen.addActor( camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))); + #myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,0,0.3)) ) + #myscreen.addActor( camvtk.Line(p1=(0,0,0.3),p2=(0,1,0)) ) + #myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,1,0)) ) + t = ocl.Triangle(a,b,c) + s = ocl.STLSurf() + s.addTriangle(t) + + print("STL surface read,", s.size(), "triangles") + + Nwaterlines = 40 + zh=[-0.15*x for x in range(Nwaterlines)] + #zh=[15] + diam = 3.01 + length = 50 + loops = [] + sampling = 0.1 + + #cutter = ocl.CylCutter( diam , length ) + #cutter = ocl.BallCutter( diam , length ) + #cutter = ocl.BullCutter( diam , diam/5, length ) + #cutter = ocl.ConeCutter(diam, math.pi/3, length) + #cutter = ocl.CylConeCutter(diam/float(3),diam,math.pi/float(9)) + #cutter = ocl.BallConeCutter(diam/float(2.3),diam,math.pi/float(5)) + #cutter = ocl.BullConeCutter(diam/1.5, diam/10, diam, math.pi/10) + cutter = ocl.ConeConeCutter(diam/2,math.pi/3,diam,math.pi/6) + + print(cutter) + #raw_input("Press Enter to terminate") + + ptsy_all = [] + ptsx_all = [] + yvals=[] + Nmax=15 + for i in range(Nmax): + yvals.append( diam* float(i)/float(Nmax) ) + yvals.append( -diam* float(i)/float(Nmax) ) + + for y in yvals: #[diam*0.4, diam*0.2, 0, -diam*0.2,diam*(-0.4)]: + ptsy = getPathsY(s,cutter,sampling, y) + ptsx = getPathsX(s,cutter,sampling, y) + ptsy_all.append(ptsy) + ptsx_all.append(ptsx) + + #print " got ",len(pts)," cl-points" + #for p in pts: + # print(p.x," ",p.y," ",p.z) + #exit() + + loops = [] + for z in zh: + + z_loops = getWaterline(s, cutter, z, sampling) + for l in z_loops: + loops.append(l) + + + #for l in line: + + #drawLoops(myscreen, line, camvtk.cyan) + #for l in cutter_loops: + # loops.append(l) + + print("All waterlines done. Got", len(loops)," loops in total.") + # draw the loops + drawLoops(myscreen, loops, camvtk.cyan) + drawLoops(myscreen, ptsy_all, camvtk.pink) + drawLoops(myscreen, ptsx_all, camvtk.lblue) + + print("done.") + myscreen.camera.SetPosition(15, 13, 7) + myscreen.camera.SetFocalPoint(5, 5, 0) + camvtk.drawArrows(myscreen,center=(0,0,3)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_mtrush.py opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_mtrush.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_mtrush.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_mtrush.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,97 @@ +import ocl +import pyocl +import camvtk +import time +import vtk +import datetime +import math + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + + #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") + stl = camvtk.STLSurf("../stl/mount_rush.stl") + #stl = camvtk.STLSurf("../stl/pycam-textbox.stl") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface with", s.size(), "triangles read") + + # define a cutter + length=5 + cutter = ocl.BallCutter(15.4321, length) + #cutter = ocl.CylCutter(1.123, length) + #cutter = ocl.BullCutter(1.123, 0.2, length) + #cutter = ocl.ConeCutter(0.43, math.pi/7, length) + + + print(cutter) + + #define grid of CL-points + minx=-42 + dx=0.5 + maxx=47 + miny=-27 + dy=0.2 + maxy=20 + z=-55 + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + print("generated grid with", len(clpoints)," CL-points") + + # batchdropcutter + bdc1 = ocl.BatchDropCutter() + bdc1.setSTL(s) + bdc1.setCutter(cutter) + + # push the points to ocl + for p in clpoints: + bdc1.appendPoint(p) + + # run the actual calculation + t_before = time.time() + bdc1.run() + t_after = time.time() + calctime = t_after-t_before + print(" done in ", calctime," s" ) + + + # get back results from ocl + clpts = bdc1.getCLPoints() + + + # draw the results + print("rendering...",) + camvtk.drawCLPointCloud(myscreen, clpts) + print("done") + + myscreen.camera.SetPosition(25, 23, 15) + myscreen.camera.SetFocalPoint(4, 5, 0) + + # ocl text + t = camvtk.Text() + t.SetText("OpenCAMLib") + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + myscreen.addActor( t) + + # other text + t2 = camvtk.Text() + stltext = "%i triangles\n%i CL-points\n%0.1f seconds" % (s.size(), len(clpts), calctime) + t2.SetText(stltext) + t2.SetPos( (50, myscreen.height-100) ) + myscreen.addActor( t2) + + t3 = camvtk.Text() + ctext = "Cutter: %s" % ( str(cutter) ) + + t3.SetText(ctext) + t3.SetPos( (50, myscreen.height-150) ) + myscreen.addActor( t3) + + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_test_1.py opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_test_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_test_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_test_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,99 @@ +import ocl +import pyocl +import camvtk +import time +import vtk +import datetime + + + +if __name__ == "__main__": + print(ocl.version() ) + myscreen = camvtk.VTKScreen() + + #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") + stl = camvtk.STLSurf("../../stl/demo.stl") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + length=5 + cutter = ocl.BallCutter(1.4321, length) + #cutter = ocl.CylCutter(1.123, length) + #cutter = ocl.BullCutter(1.123, 0.2, length) + print(cutter) + + minx=0 + dx=0.1/6 + maxx=10 + miny=0 + dy=1 + maxy=10 + z=-17 + # this generates a list of CL-points in a grid + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + print("generated grid with", len(clpoints)," CL-points") + + # batchdropcutter + bdc1 = ocl.BatchDropCutter() + bdc1.setSTL(s) + bdc1.setCutter(cutter) + for p in clpoints: + bdc1.appendPoint(p) + + t_before = time.time() + print("threads=",bdc1.getThreads()) + bdc1.run() + t_after = time.time() + calctime = t_after-t_before + print(" done in ", calctime," s") + + clpoints = bdc1.getCLPoints() + + print(len(clpoints), " cl points evaluated") + + print("rendering...",) + + # draw the CL-points + camvtk.drawCLPointCloud(myscreen, clpoints) + + print("done") + + myscreen.camera.SetPosition(3, 23, 15) + myscreen.camera.SetFocalPoint(4, 5, 0) + + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("tux1.png") + #lwr.Write() + + t = camvtk.Text() + t.SetText("OpenCAMLib") + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + myscreen.addActor( t) + + t2 = camvtk.Text() + stltext = "%i triangles\n%i CL-points\n%0.1f seconds" % (s.size(), len(clpoints), calctime) + t2.SetText(stltext) + t2.SetPos( (50, myscreen.height-200) ) + myscreen.addActor( t2) + + t3 = camvtk.Text() + ctext = "Cutter: %s" % ( str(cutter) ) + + t3.SetText(ctext) + t3.SetPos( (50, myscreen.height-250) ) + myscreen.addActor( t3) + + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_test_2.py opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_test_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_test_2.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_test_2.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,82 @@ +import ocl +import pyocl +import camvtk +import time +import vtk +import datetime +import math + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + #stl = camvtk.STLSurf("../stl/beet_mm.stl") + #stl = camvtk.STLSurf("../stl/Blade.stl") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read ", s.size(), " triangles") + length=5 + cutter = ocl.BallCutter(1.4321, length) + #cutter = ocl.CylCutter(1.123, length) + #cutter = ocl.BullCutter(1.4123, 0.5, length) + #cutter = ocl.ConeCutter(0.43, math.pi/7, length) + print(cutter) + + minx=0 + dx=0.06 + maxx=9 + miny=0 + dy=1 + maxy=12 + z=-5 + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + print("generated grid with", len(clpoints)," CL-points") + + # batchdropcutter + bdc1 = ocl.BatchDropCutter() + bdc1.setSTL(s) + bdc1.setCutter(cutter) + + for p in clpoints: + bdc1.appendPoint(p) + + t_before = time.time() + bdc1.run() + t_after = time.time() + calctime = t_after-t_before + print(" done in ", calctime," s" ) + + clpts = bdc1.getCLPoints() + print("rendering...",) + camvtk.drawCLPointCloud(myscreen, clpts) + print("done") + + myscreen.camera.SetPosition(3, 23, 15) + myscreen.camera.SetFocalPoint(4, 5, 0) + + t = camvtk.Text() + t.SetText("OpenCAMLib") + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + myscreen.addActor( t) + + t2 = camvtk.Text() + stltext = "%i triangles\n%i CL-points\n%0.1f seconds" % (s.size(), len(clpts), calctime) + t2.SetText(stltext) + t2.SetPos( (50, myscreen.height-200) ) + myscreen.addActor( t2) + + t3 = camvtk.Text() + ctext = "Cutter: %s" % ( str(cutter) ) + + t3.SetText(ctext) + t3.SetPos( (50, myscreen.height-250) ) + myscreen.addActor( t3) + + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_with_linefilter_test_1.py opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_with_linefilter_test_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/batchdropcutter_with_linefilter_test_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/batchdropcutter_with_linefilter_test_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,127 @@ +import ocl +import pyocl +import camvtk +import time +import vtk +import datetime +import math + +if __name__ == "__main__": + print(ocl.version() ) + myscreen = camvtk.VTKScreen() + #stl = camvtk.STLSurf("../stl/Cylinder_1.stl") + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + #stl = camvtk.STLSurf("../stl/demo.stl") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + + angle = math.pi/4 + diameter=1.77321 + length=5 + #cutter = ocl.BallCutter(diameter, length) + cutter = ocl.CylCutter(diameter, length) + #cutter = ocl.BullCutter(diameter, 0.2, length) + #cutter = ocl.ConeCutter(diameter, angle, length) + #cutter = cutter.offsetCutter( 0.4 ) + + print(cutter) + + minx=-1 + dx=0.1/5 + + maxx=10 + miny=-1 + dy=1/float(2) + maxy=13 + z=-1 + # this generates a list of CL-points in a grid + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + print("generated grid with", len(clpoints)," CL-points") + + # batchdropcutter + bdc = ocl.BatchDropCutter() + #bdc.setThreads(1) + print("bdc()") + bdc.setBucketSize(2) + print("bucketSize") + bdc.setSTL(s) + print("setSTL()") + bdc.setCutter(cutter) + print("setCutter()") + #bdc.setThreads(1) # explicitly setting one thread is better for debugging + for p in clpoints: + bdc.appendPoint(p) + print("bdc has ",len(clpoints)," cl-points") + + t_before = time.time() + bdc.run() # run the actual drop-cutter + dc_calls = bdc.getCalls() + t_after = time.time() + calctime = t_after-t_before + print(" BDC done in ", calctime," s", dc_calls," dc-calls" ) + dropcutter_time = calctime + clpoints = bdc.getCLPoints() + + #print len(clpoints), " cl points evaluated" + + print("rendering raw CL-points.") + + # draw the CL-points + camvtk.drawCLPointCloud(myscreen, clpoints) + + # filter + print("filtering. before filter we have", len(clpoints),"cl-points") + t_before = time.time() + f = ocl.LineCLFilter() + f.setTolerance(0.001) + for p in clpoints: + f.addCLPoint(p) + f.run() + t_after = time.time() + calctime = t_after-t_before + print(" done in ", calctime," s") + + clp2 = f.getCLPoints() + print("after filtering we have", len(clp2),"cl-points") + + # draw the filtered points + # offset these points up for clarity + for p in clp2: + p.z=p.z+3 + + print("rendering filtered CL-points.") + camvtk.drawCLPointCloud(myscreen, clp2) + print("all done.") + myscreen.camera.SetPosition(3, 23, 15) + myscreen.camera.SetFocalPoint(4, 5, 0) + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("tux1.png") + #lwr.Write() + + t = camvtk.Text() + t.SetText("OpenCAMLib") + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + myscreen.addActor( t) + + t2 = camvtk.Text() + stltext = "%s\n%i triangles\n%i CL-points\n%i DropCutter() calls\n%0.1f seconds\n%0.3f us/call\n%i filtered CL-points" \ + % ( str(cutter), s.size(), len(clpoints), dc_calls, dropcutter_time, 1e6* dropcutter_time/dc_calls, len(clp2) ) + t2.SetText(stltext) + t2.SetPos( (50, myscreen.height-200) ) + myscreen.addActor( t2) + + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_one-triangle_1.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_one-triangle_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_one-triangle_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_one-triangle_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,104 @@ +import ocl +import pyocl +import camvtk +import vtk +import math + +if __name__ == "__main__": + print(ocl.version()) # print out git version tag + + # set up VTK visualization + myscreen = camvtk.VTKScreen() + myscreen.setAmbient(20,20,20) + myscreen.camera.SetPosition(4, 4, 3) + myscreen.camera.SetFocalPoint(0.6, 0.6, 0) + myscreen.setAmbient(1,1,1) + + #camvtk.drawArrows(myscreen) + + # three corners of a triangle + a = ocl.Point(1,0,-0.000010) + b = ocl.Point(0,1,+0.0) + c = ocl.Point(0.001,0,+0.3001) + #c = ocl.Point(0,0,0.3) + t = ocl.Triangle(a,b,c) + + # draw the triangle with VTK + myscreen.addActor( camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); + myscreen.addActor( camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); + myscreen.addActor( camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))); + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + + # Define a cutter + angle = math.pi/8 + length = 5.0 + #c1 = ocl.BullCutter(0.5,0.1, length) + #c1 = ocl.CylCutter(0.5, length) + #c1 = ocl.BallCutter(0.5, length) + c1 = ocl.ConeCutter(0.5,angle, length) + cutter = c1 + cutter = c1.offsetCutter(0.1) + + print(cutter) + + + # grid parameters + minx=-0.7 + dx=0.03 + maxx=1.7 + miny=-0.7 + dy=0.03 + maxy=1.7 + z=-0.5 + # generate list of CL-poins at height z + clpoints=[] + # we calculate cutter-locations for this grid of XY points + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + + # loop through the cl-points + n=0 + print(len(clpoints), "cl-points to evaluate") + for cl in clpoints: + cutter.vertexDrop(cl,t) + cutter.edgeDrop(cl,t) + cutter.facetDrop(cl,t) + n=n+1 + print("drop-cutter done.") + # cl has now been updated so it is a valid cutter-location point + # drop-cutter only updates the z-coordinate of cl, x/y are not changed. + + print("rendering...",) + # render all the points + camvtk.drawCLPointCloud(myscreen, clpoints) + camvtk.drawCCPoints(myscreen, clpoints) + print("done." ) + + tx = camvtk.Text() + tx.SetPos( (myscreen.width-200, myscreen.height-130) ) + tx.SetText("opencamlib\ndrop-cutter") + myscreen.addActor( tx ) + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + + + # animate by rotating the camera + """ + for n in range(1,90): + tx.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + myscreen.camera.Azimuth( 4 ) + #time.sleep(0.01) + myscreen.render() + lwr.SetFileName("frames/ball_all"+ ('%05d' % n)+".png") + w2if.Modified() + #lwr.Write() # write screenshot to file + """ + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_one-triangle_2.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_one-triangle_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_one-triangle_2.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_one-triangle_2.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,80 @@ +import ocl +import pyocl +import camvtk +import vtk +import math + + +def drawPoints(myscreen, clpoints, ccpoints): + c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) + c.SetPoints() + myscreen.addActor(c ) + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + + # triangle + a=ocl.Point(1,0,0.4) + b=ocl.Point(0,1,0) + c=ocl.Point(0,0,-0.2) + t = ocl.Triangle(b,c,a) + + # draw the triangle with VTK + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + + # cutter + radius1=1 + length=5 + angle = math.pi/4 + #cutter = ocl.ConeCutter(0.37, angle) + cutter = ocl.BallCutter(0.532, length) + #cutter = ocl.CylCutter(0.3, length) + #cutter = ocl.BullCutter(0.5,0.123, length) + print(cutter) + + # grid on which we run drop-cutter + minx=-0.5 + dx=0.0051 + maxx=1.5 + miny=-0.7 + dy=dx + maxy=1.5 + z=-0.7 + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + + print(len(clpoints), "cl-points to evaluate") + n=0 + for cl in clpoints: + #cutter.vertexDrop(cl,t) + #cutter.edgeDrop(cl,t) + #cutter.facetDrop(cl,t) + cutter.dropCutter(cl,t) # this calls all three above: vertex,facet,edge + n=n+1 + if (n % int(len(clpoints)/10)) == 0: + print(n/int(len(clpoints)/10), " ",) + + print("done.") + + print("rendering...") + print(" len(clpoints)=", len(clpoints)) + + camvtk.drawCLPointCloud(myscreen, clpoints) + print("done.") + + # draw a sphere, just for fun + origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) + origo.SetOpacity(0.2) + myscreen.addActor( origo ) + + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + myscreen.camera.SetClippingRange(-20,20) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,76 @@ +import ocl +import pyocl # pyocl.CLPointGrid() +import camvtk +import vtk +import math + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + + a=ocl.Point(1,0.6,0.1) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b=ocl.Point(0,1,0) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c=ocl.Point(0,0,0.0) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + + t = ocl.Triangle(b,c,a) + radius1=1 + angle = math.pi/4 + #cutter = ocl.ConeCutter(0.37, angle) + #cutter = ocl.BallCutter(0.532) + #cutter = ocl.CylCutter(0.3) + #cutter = ocl.BullCutter(1,0.2) + + #cutter = ocl.CylConeCutter(0.2,0.5,math.pi/9) + #cutter = ocl.BallConeCutter(0.4,0.6,math.pi/9) + cutter = ocl.BullConeCutter(0.4,0.1,0.7,math.pi/6) + #cutter = ocl.ConeConeCutter(0.4,math.pi/3,0.7,math.pi/6) + #cutter = ocl.ConeCutter(0.4, math.pi/3) + print(cutter) + + #print cc.type + minx=-0.5 + dx=0.0051 + maxx=1.5 + miny=-0.7 + dy=dx + maxy=1.5 + z=-1.8 + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + nv=0 + nn=0 + ne=0 + nf=0 + print(len(clpoints), "cl-points to evaluate") + n=0 + + for cl in clpoints: + cutter.vertexDrop(cl,t) + cutter.edgeDrop(cl,t) + cutter.facetDrop(cl,t) + #cutter.dropCutter(cl,t) + n=n+1 + if (n % int(len(clpoints)/10)) == 0: + print(n/int(len(clpoints)/10), " ",) + + print("done.") + print("rendering...") + print(" len(clpoints)=", len(clpoints)) + + camvtk.drawCLPointCloud(myscreen, clpoints) + print("done.") + origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) + origo.SetOpacity(0.2) + myscreen.addActor( origo ) + + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_1.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,31 @@ +import ocl +import camvtk +import time + +if __name__ == "__main__": + cutter = ocl.CylCutter(.1, 5) + print(cutter) + a = ocl.Point(1,0,0) + b = ocl.Point(0,1,0) + c = ocl.Point(0,0,1) + t = ocl.Triangle(a,b,c) + print("triangle created t=", t) + cl = ocl.CLPoint(0.2,0.2,-5) + print("CL= ", cl) + cutter.vertexDrop( cl , t ) + print("after vertex CL=", cl) + print("t=",t) + + #print "t.n", t.n.str() + + cutter.facetDrop( cl, t ) + #print "after facetDrop" + print("after facet t=",t) + #print "t.n", t.n.str() + print("after facet CL=", cl) + + + + cutter.edgeDrop( cl, t ) + print("after edge cl =", cl) + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_2.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_2.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_2.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,16 @@ +import ocl +import camvtk +import time + +if __name__ == "__main__": + cutter = ocl.CylCutter(.1, 5) + print(cutter) + a=ocl.Point(1,0,0) + b=ocl.Point(0,1,0) + c=ocl.Point(0,0,1) + t = ocl.Triangle(a,b,c) + print("triangle created t=", t) + cl = ocl.CLPoint(0.2,0.2,0) + + cutter.dropCutter(cl,t) + print("CL= ", cl) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_3.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_3.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_3.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_3.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,46 @@ +import ocl +import pyocl +import camvtk +import time + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + + a=ocl.Point(1,0,0) + myscreen.addActor(camvtk.Point(center=(1,0,0), color=(1,1,1))); + b=ocl.Point(0,1,0) + myscreen.addActor(camvtk.Point(center=(0,1,0), color=(1,1,1))); + c=ocl.Point(0,0,0.2) + myscreen.addActor( camvtk.Point(center=(0,0,0.2), color=(1,1,1))); + myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,0,0.2)) ) + myscreen.addActor( camvtk.Line(p1=(0,0,0.2),p2=(0,1,0)) ) + myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,1,0)) ) + t = ocl.Triangle(a,b,c) + + cutter = ocl.CylCutter(.3, 5) + print(cutter) + + minx=-0.2 + dx=0.02 + maxx=1.2 + miny=-0.2 + dy=0.2 + maxy=1.2 + z=-0.2 + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + + for cl in clpoints: + cutter.dropCutter(cl,t) + + print(len(clpoints), " cl points evaluated") + # draw the points + camvtk.drawCLPointCloud(myscreen, clpoints) + + #position camera + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_4.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_4.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_4.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_4.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,91 @@ +import ocl +import pyocl +import camvtk +import time +import vtk +import datetime +import math + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + + a=ocl.Point(1,0,0) + myscreen.addActor(camvtk.Point(center=(1,0,0), color=(1,0,1))); + b=ocl.Point(0,1,0) + myscreen.addActor(camvtk.Point(center=(0,1,0), color=(1,0,1))); + c=ocl.Point(0,0,0.3) + myscreen.addActor( camvtk.Point(center=(0,0,0.3), color=(1,0,1))); + myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,0,0.3)) ) + myscreen.addActor( camvtk.Line(p1=(0,0,0.3),p2=(0,1,0)) ) + myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,1,0)) ) + t = ocl.Triangle(a,b,c) + s = ocl.STLSurf() + s.addTriangle(t) + + diameter = 0.5234 + corneradius = 0.1 + angle = math.pi/4 + length = 5 + cutter = ocl.CylCutter(diameter, length) + #cutter = ocl.BallCutter(diameter, length) + #cutter = ocl.BullCutter(diameter,corneradius, length) + #cutter = ocl.ConeCutter(diameter, angle, length) + + print(cutter) + + minx=-0.5 + dx=0.01 + maxx=1.5 + miny=-0.5 + dy=0.05 + maxy=1.5 + z=-0.8 + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + print(len(clpoints), "cl-points to evaluate") + n=0 + clp=[] + bdc = ocl.BatchDropCutter() + bdc.setSTL(s) + bdc.setCutter(cutter) + for p in clpoints: + bdc.appendPoint(p) + + bdc.run() + + print("done.") + clpoints = bdc.getCLPoints() + print("rendering...") + print(" len(clpoints)=", len(clpoints)) + + camvtk.drawCLPointCloud(myscreen, clpoints) + + print("done.") + + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + myscreen.render() + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + t = camvtk.Text() + t.SetPos( (myscreen.width-350, myscreen.height-30) ) + myscreen.addActor(t) + + #for n in range(1,18): + # t.SetText("OpenCAMLib " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + # myscreen.camera.Azimuth( 2 ) + # time.sleep(0.1) + # myscreen.render() + # w2if.Modified() + # lwr.SetFileName("frames/tc"+ ('%04d' % n)+".png") + #lwr.Write() + + + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_5.py opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_5.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/drop-cutter/drop_cutter_tst_5.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/drop-cutter/drop_cutter_tst_5.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,73 @@ +import ocl +import pyocl +import camvtk +import time +import vtk +import datetime + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + + polydata = stl.src.GetOutput() + s= ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles" ) + + cutter = ocl.CylCutter(0.6, 6) + print(cutter) + + minx=-0.2 + dx=1 + maxx=10.2 + miny=-0.2 + dy=1 + maxy=12.2 + z=-0.2 + clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + print(len(clpoints),"CL-points to evaluate...") + tris = s.getTriangles() + # very naive approach to drop-cutter (and doing loops in python is slow) + # this is so slow in practice it is not usable with the tux-model STL-file (22k triangles) + for cl in clpoints: # loop through all the cl-points + for t in tris: # for each cl-point loop through all triangles + cutter.vertexDrop(cl,t) # vertex test + cutter.edgeDrop(cl,t) # edge test + cutter.facetDrop(cl,t) # facet test + print("done.") + + camvtk.drawCLPointCloud(myscreen, clpoints) + + print(len(clpoints), " cl points evaluated") + myscreen.camera.SetPosition(3, 23, 15) + myscreen.camera.SetFocalPoint(4, 5, 0) + myscreen.render() + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("tux1.png") + #lwr.Write() + + t = camvtk.Text() + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + myscreen.addActor( t) + + for n in range(1,36): + t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + myscreen.camera.Azimuth( 1 ) + time.sleep(0.01) + myscreen.render() + #lwr.SetFileName("frame"+ ('%03d' % n)+".png") + #w2if.Modified() + #lwr.Write() #uncomment to write screenshots to disk + + myscreen.iren.Start() + raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/edge_offset_tst_1.py opencamlib-11.10-1/examples/python/edge_offset_tst_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/edge_offset_tst_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/edge_offset_tst_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,97 @@ +import ocl +import pyocl +import camvtk +import time +import vtk +import datetime +import math + +def drawEdge(myscreen, a, b): + myscreen.addActor(camvtk.Sphere(center=(a.x,a.y,a.z), radius=0.0351, color=camvtk.green)); + myscreen.addActor(camvtk.Sphere(center=(b.x,b.y,b.z), radius=0.0351, color=camvtk.red)); + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + camvtk.drawOCLtext(myscreen) + camvtk.drawArrows(myscreen,center=(-1,-2,0)) + a=ocl.Point(0,1.7,-0.6) + b=ocl.Point(0,0.11,0.3) + + drawEdge(myscreen, a, b) + diameter=0.4 + length=1 + # spherical cutter and cylinder + s1 = camvtk.Sphere(center=(a.x,a.y,a.z), radius=diameter/2, color=camvtk.lgreen) + s2 = camvtk.Sphere(center=(b.x,b.y,b.z), radius=diameter/2, color=camvtk.pink) + s1.SetOpacity(1) + s2.SetOpacity(1) + myscreen.addActor(s1) + myscreen.addActor(s2) + # tube + cyltube = camvtk.Tube( p1=(a.x,a.y,a.z) , p2=(b.x,b.y,b.z), radius=diameter/2, color=camvtk.yellow ) + cyltube.SetOpacity(0.2) + myscreen.addActor( cyltube ) + + + # Cylinder + a = a + ocl.Point(1,0,0) + b = b + ocl.Point(1,0,0) + drawEdge(myscreen, a, b) + cir1 = camvtk.Circle(center=(a.x,a.y,a.z) , radius=diameter/2, color=camvtk.lgreen, resolution=50 ) + cir1.SetOpacity(1) + myscreen.addActor(cir1) + cir2 = camvtk.Circle(center=(b.x,b.y,b.z) , radius=diameter/2, color=camvtk.pink, resolution=50 ) + cir2.SetOpacity(1) + myscreen.addActor(cir2) + + # draw lines along the elliptic tube + + # Toroid + a = a + ocl.Point(1,0,0) + b = b + ocl.Point(1,0,0) + drawEdge(myscreen, a, b) + tor1 = camvtk.Toroid(r1=diameter/2, r2=diameter/6, center=(a.x,a.y,a.z), rotXYZ=(0,0,0), color=camvtk.lgreen) + tor1.SetOpacity(1) + myscreen.addActor(tor1) + tor2 = camvtk.Toroid(r1=diameter/2, r2=diameter/6, center=(b.x,b.y,b.z), rotXYZ=(0,0,0), color=camvtk.pink) + tor2.SetOpacity(1) + myscreen.addActor(tor2) + + # Cone + a = a + ocl.Point(1,0,0) + b = b + ocl.Point(1,0,0) + drawEdge(myscreen, a, b) + con1 = camvtk.Cone(center=(a.x,a.y,a.z), radius=diameter/2, height = 0.3, color=camvtk.lgreen ) + myscreen.addActor(con1) + con2 = camvtk.Cone(center=(b.x,b.y,b.z), radius=diameter/2, height = 0.3, color=camvtk.pink ) + myscreen.addActor(con2) + + + print("done.") + + myscreen.camera.SetPosition(4, 3, 2) + myscreen.camera.SetFocalPoint(0, 0, 0) + myscreen.render() + + w2if = vtk.vtkWindowToImageFilter() + w2if.SetInput(myscreen.renWin) + lwr = vtk.vtkPNGWriter() + lwr.SetInput( w2if.GetOutput() ) + + + #for n in range(1,18): + # t.SetText("OpenCAMLib " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + # myscreen.camera.Azimuth( 2 ) + # time.sleep(0.1) + # myscreen.render() + # w2if.Modified() + # lwr.SetFileName("frames/tc"+ ('%04d' % n)+".png") + #lwr.Write() + + + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_01.py opencamlib-11.10-1/examples/python/fiber/fiber_01.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_01.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_01.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,90 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + + +def drawPoints(myscreen, clpoints, ccpoints): + c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) + c.SetPoints() + myscreen.addActor(c ) + +def drawFiber(myscreen, f): + #myscreen.addActor( camvtk.Line(p1=(f.p1.x,f.p1.y,f.p1.z),p2=(f.p2.x,f.p2.y,f.p2.z), color=camvtk.orange) ) + #myscreen.addActor( camvtk.Sphere(center=(f.p1.x,f.p1.y,f.p1.z),radius=0.05, color=camvtk.lgreen) ) + #myscreen.addActor( camvtk.Sphere(center=(f.p2.x,f.p2.y,f.p2.z),radius=0.05, color=camvtk.pink) ) + inter = f.getInts() + for i in inter: + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=camvtk.red) ) + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + + a=ocl.Point(1,0.6,0.5) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b=ocl.Point(0,1,0) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c=ocl.Point(0,0,0.0) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + + f1 = ocl.Point(-2,0.5,-0.2) + f2 = ocl.Point(2,0.5,-0.2) + t = ocl.Triangle(b,c,a) + #radius1=1 + #angle = math.pi/4 + #cutter = ocl.ConeCutter(0.37, angle) + #cutter = ocl.BallCutter(0.532,5) + cutter = ocl.CylCutter(0.3,5) + + #cutter = ocl.CylConeCutter(0.2,0.5,math.pi/9) + #cutter = ocl.BallConeCutter(0.4,0.6,math.pi/9) + #cutter = ocl.BullConeCutter(0.4,0.1,0.7,math.pi/6) + #cutter = ocl.ConeConeCutter(0.4,math.pi/3,0.7,math.pi/6) + #cutter = ocl.ConeCutter(0.4, math.pi/3) + + print("fiber...") + + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + f.printInts() + print("vertexPush") + cc = ocl.CCPoint() + cutter.pushCutter(f,i,t) + print(i) + f.addInterval(i) + print("AFTER vertexPush") + f.printInts() + + #inter = f.getInts() + #print inter + print("done.") + + print("rendering...") + drawFiber(myscreen, f) + print("done.") + origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) + origo.SetOpacity(0.2) + myscreen.addActor( origo ) + + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + myscreen.render() + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + t = camvtk.Text() + t.SetPos( (myscreen.width-350, myscreen.height-30) ) + myscreen.addActor(t) + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_02_onetriangle_drawfibers.py opencamlib-11.10-1/examples/python/fiber/fiber_02_onetriangle_drawfibers.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_02_onetriangle_drawfibers.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_02_onetriangle_drawfibers.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,95 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def drawPoints(myscreen, clpoints, ccpoints): + c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) + c.SetPoints() + myscreen.addActor(c ) + +def drawFiber(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + cc1 = i.lower_cc + cc2 = i.upper_cc + myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) + myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) + # cutter circle + #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c1) + #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c2) + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + + a = ocl.Point(0,1,0.3) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b = ocl.Point(1,0.5,0.3) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c = ocl.Point(0,0,0) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + diameter = 0.2 + length = 5 + angle = math.pi/4 + cutter = ocl.CylCutter(diameter, length) + #cutter = ocl.BallCutter(diameter, length) + #cutter = ocl.BullCutter(diameter, diameter/5, length) + #cutter = ocl.ConeCutter(diameter, angle, length) + + print(cutter) + fiber_range=6 + Nmax = 500 + yvals = [float(n - float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n - float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + + zh = 0.1071567 + for y in yvals: + f1 = ocl.Point(-0.5,y,zh) # start point of fiber + f2 = ocl.Point(1.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + cutter.pushCutter(f,i,t) + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + f.addInterval(i) + drawFiber(myscreen, f, camvtk.red) + + for x in xvals: + f1 = ocl.Point(x,-0.5,zh) # start point of fiber + f2 = ocl.Point(x,1.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + cutter.pushCutter(f,i,t) + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + f.addInterval(i) + drawFiber(myscreen, f, camvtk.lblue) + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_03_onetri_many-z-levels.py opencamlib-11.10-1/examples/python/fiber/fiber_03_onetri_many-z-levels.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_03_onetri_many-z-levels.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_03_onetri_many-z-levels.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,128 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def drawPoints(myscreen, clpoints, ccpoints): + c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) + c.SetPoints() + myscreen.addActor(c ) + +def drawFiber(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + print("fiber has ", len(inter) , " intervals") + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) + # cutter circle + #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c1) + #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c2) + +def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + #print "fiber has ", len(inter) , " intervals" + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) + +def yfiber(yvals,t,zh,myscreen): + for y in yvals: + f1 = ocl.Point(-0.5,y,zh) # start point of fiber + f2 = ocl.Point(1.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.red) + +def xfiber(xvals,t,zh,myscreen): + for x in xvals: + f1 = ocl.Point(x,-0.5,zh) # start point of fiber + f2 = ocl.Point(x,1.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.lblue) + + + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + a = ocl.Point(0,1,0.3) + b = ocl.Point(1,0.5,0.0) + c = ocl.Point(0.1,0.1,0.0) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + angle = math.pi/4 + diameter=0.3 + length=5 + #cutter = ocl.BallCutter(diameter, length) + cutter = ocl.CylCutter(diameter, length) + #cutter = ocl.BullCutter(diameter, diameter/4, length) + #cutter = ocl.ConeCutter(diameter, angle, length) + #cutter = cutter.offsetCutter( 0.1 ) + + print("cutter= ", cutter) + print("lengt=", cutter.getLength()) + print("fiber...",) + fiber_range=2 + Nmax = 100 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + zmin = -0.2082 + zmax = 0.3115 + zNmax = 20 + dz = (zmax-zmin)/(zNmax-1) + zvals=[] + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + for zh in zvals: + yfiber(yvals,t,zh,myscreen) + xfiber(xvals,t,zh,myscreen) + print("done.") + print("rendering...",) + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + print("done.") + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_04_stl.py opencamlib-11.10-1/examples/python/fiber/fiber_04_stl.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_04_stl.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_04_stl.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,125 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def drawPoints(myscreen, clpoints, ccpoints): + c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) + c.SetPoints() + myscreen.addActor(c ) + +def drawFiber(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + cc1 = i.lower_cc + cc2 = i.upper_cc + myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) + myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) + # cutter circle + #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c1) + #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c2) + +def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) + +def yfiber(yvals,s,zh,myscreen): + for y in yvals: + f1 = ocl.Point(-20,y,zh) # start point of fiber + f2 = ocl.Point(+20,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + for t in s.getTriangles(): + i = ocl.Interval() + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.red) + +def xfiber(xvals,s,zh,myscreen): + for x in xvals: + f1 = ocl.Point(x,-20,zh) # start point of fiber + f2 = ocl.Point(x,+20,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + for t in s.getTriangles(): + i = ocl.Interval() + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.lblue) + +if __name__ == "__main__": + print(ocl.version() ) + myscreen = camvtk.VTKScreen() + #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") + stl = camvtk.STLSurf("../../stl/demo.stl") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((1,1,1)) + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + + cutter = ocl.CylCutter(0.3, 6) + print("lengt=", cutter.getLength()) + print("fiber...",) + fiber_range=30 + Nmax = 200 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + zmin = -0.1 + zmax = 0.5 + zNmax = 2 + dz = (zmax-zmin)/(zNmax-1) + zvals=[] + #for n in range(0,zNmax): + # zvals.append(zmin+n*dz) + zvals.append(0.1) + #zvals = [ float(n-float(zNmax)/2)/zNmax*fiber_range for n in range(0,zNmax+1)] + #print zvals + #exit() + #cc = ocl.CCPoint() + #zh = -0.1 + #zh = 0.2571567 + + for zh in zvals: + print("fibers at z=",zh) + yfiber(yvals,s,zh,myscreen) + xfiber(xvals,s,zh,myscreen) + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_05_batch.py opencamlib-11.10-1/examples/python/fiber/fiber_05_batch.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_05_batch.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_05_batch.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,86 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +if __name__ == "__main__": + print(ocl.version()) + + myscreen = camvtk.VTKScreen() + + a = ocl.Point(0,1,0.3) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b = ocl.Point(1,0.5,0.3) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c = ocl.Point(0,0,0) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + s = ocl.STLSurf() + s.addTriangle(t) # a one-triangle STLSurf + + cutter = ocl.CylCutter(0.3,6) + #cutter = ocl.BallCutter(0.3,6) + print("fiber...") + fiber_range=6 + Nmax = 800 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + zmin = -0.1 + zmax = 0.5 + zNmax = 50 + dz = (zmax-zmin)/(zNmax-1) + zvals=[] + #zvals.append(0.2) + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + + bpc_x = ocl.BatchPushCutter() + bpc_x.setXDirection() + bpc_x.setSTL(s) + bpc_x.setCutter(cutter) + + + bpc_y = ocl.BatchPushCutter() + bpc_y.setYDirection() + bpc_y.setSTL(s) + bpc_y.setCutter(cutter) + + + # create fibers + for zh in zvals: + for y in yvals: + f1 = ocl.Point(-0.5,y,zh) # start point of fiber + f2 = ocl.Point(1.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_x.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,-0.5,zh) # start point of fiber + f2 = ocl.Point(x,1.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_y.appendFiber(f) + + # run + bpc_x.run() + bpc_y.run() + clpoints = bpc_x.getCLPoints() + clp2 = bpc_y.getCLPoints() + clpoints +=clp2 + print("rendering raw CL-points.") + + # draw the CL-points + camvtk.drawCLPointCloud(myscreen, clpoints) + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + + myscreen.render() + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_06_batch_stl.py opencamlib-11.10-1/examples/python/fiber/fiber_06_batch_stl.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_06_batch_stl.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_06_batch_stl.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,115 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def generateRange(zmin,zmax,zNmax): + dz = (float(zmax)-float(zmin))/(zNmax-1) + zvals=[] + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + return zvals + + +if __name__ == "__main__": + print(ocl.version()) + + myscreen = camvtk.VTKScreen() + #stl = camvtk.STLSurf("../stl/demo.stl") + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + myscreen.addActor(stl) + #stl.SetWireframe() + stl.SetSurface() + stl.SetColor(camvtk.cyan) + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + bounds = s.getBounds() + print("STLSurf.Bounds()=", bounds) + cutter = ocl.CylCutter(0.3,6) + #cutter = ocl.BallCutter(0.3,6) + + cutter.length = 4.0 + print(cutter) + xmin=-1 + xmax=15 + N=100 + ymin=-1 + ymax=15 + yvals = generateRange(ymin,ymax,N) + xvals = generateRange(xmin,xmax,N) + #print xvals + zmin = -0.1 + zmax = 2.75 + zNmax = 7 + zvals = generateRange(zmin,zmax,zNmax) + print(" calculating waterlines at ", len(zvals)," different z-heights") + #print zvals + bpc_x = ocl.BatchPushCutter() + bpc_y = ocl.BatchPushCutter() + bpc_x.setXDirection() + bpc_y.setYDirection() + bpc_x.setSTL(s) + bpc_y.setSTL(s) + bpc_x.setCutter(cutter) + bpc_y.setCutter(cutter) + # create fibers + nfibers=0 + for zh in zvals: + for y in yvals: + f1 = ocl.Point(xmin,y,zh) # start point of fiber + f2 = ocl.Point(xmax,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_x.appendFiber(f) + + nfibers=nfibers+1 + for x in xvals: + f1 = ocl.Point(x,ymin,zh) # start point of fiber + f2 = ocl.Point(x,ymax,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_y.appendFiber(f) + + nfibers=nfibers+1 + # run + #t_before = time.time() + #bpc2.pushCutter2() + #t_after = time.time() + #push_calctime = t_after-t_before + #print " BPC done in ", push_calctime," s", bpc2.nCalls," push-calls" + #print (push_calctime/bpc2.nCalls)*1e6, " us/call" + + t_before = time.time() + bpc_x.run() + bpc_y.run() + t_after = time.time() + push_calctime = t_after-t_before + print(" BPC 3 done in ", push_calctime," s", bpc_x.getCalls()," push-calls" ) + + + clpoints = bpc_x.getCLPoints() + clp2 = bpc_y.getCLPoints() + clpoints+=clp2 + print("got ", len(clpoints), " CL-points") + print("rendering raw CL-points.") + + # draw the CL-points + camvtk.drawCLPointCloud(myscreen, clpoints) + for p in clpoints: + myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z),radius=0.02, color=camvtk.clColor( p.cc() ) ) ) + + + + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + + myscreen.render() + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_07_weave.py opencamlib-11.10-1/examples/python/fiber/fiber_07_weave.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_07_weave.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_07_weave.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,131 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +# note 2018.08: +# the Weave class is not provided to python, so this deprecated example script won't run + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + a = ocl.Point(0,1,0.3) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b = ocl.Point(1,0.5,0.3) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c = ocl.Point(0,0,0.1) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + s = ocl.STLSurf() + s.addTriangle(t) # a one-triangle STLSurf + + cutter = ocl.CylCutter(0.3, 5) + #cutter = ocl.BallCutter(0.4, 5) + #cutter = ocl.BullCutter(0.4, 0.1, 5) + + print("fiber...") + fiber_range=4 + Nmax = 100 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + zmin = -0.1 + zmax = 0.5 + zNmax = 5 + dz = (zmax-zmin)/(zNmax-1) + zvals=[ 0.23] + #zvals.append(0.2) + #for n in range(0,zNmax): + # zvals.append(zmin+n*dz) + + bpc_x = ocl.BatchPushCutter() + bpc_y = ocl.BatchPushCutter() + bpc_x.setXDirection() + bpc_y.setYDirection() + bpc_x.setSTL(s) + bpc_y.setSTL(s) + bpc_x.setCutter(cutter) + bpc_y.setCutter(cutter) + # create fibers + for zh in zvals: + for y in yvals: + f1 = ocl.Point(-0.5,y,zh) # start point of fiber + f2 = ocl.Point(1.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_x.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,-0.5,zh) # start point of fiber + f2 = ocl.Point(x,1.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_y.appendFiber(f) + + # run + bpc_x.run() + bpc_y.run() + clpoints = bpc_x.getCLPoints() + clp2 = bpc_y.getCLPoints() + clpoints+=clp2 + xfibers = bpc_x.getFibers() + yfibers = bpc_y.getFibers() + fibers = xfibers+yfibers + print(" got ",len(xfibers)," xfibers") + print(" got ",len(yfibers)," yfibers") + print("rendering fibers and CL-points.") + w = ocl.Weave() + print("push fibers to Weave...",) + for f in fibers: + w.addFiber(f) + print("done.") + print("Weave build()...",) + w.build() + print("done") + print("face_traverse...") + w.face_traverse() + print("done.") + w_clpts = w.getCLPoints() + w_ipts = w.getIPoints() + w_edges = w.getEdges() + w_loop = w.getLoops() + + print(" weave: got ", len(w_clpts)," CL-points and ", len(w_ipts)," internal points") + + print(" got: ", len(w_edges), " edges") + print(" got: ", len(w_loop), " loop points") + #zoffset = 0.0 + #for p in w_clpts: + # myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z+zoffset), radius=0.0031, color=camvtk.red ) ) + + previous = 0 + # draw the loop as a yellow line + for loop in w_loop: + np = 0 + for p in loop: + #myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z+zoffset2), radius=0.006, color=camvtk.pink ) ) + if np is not 0: + myscreen.addActor( camvtk.Line( p1=(previous.x,previous.y, previous.z), + p2=(p.x,p.y,p.z), color=camvtk.yellow) ) + np=np+1 + previous = p + + # draw edges of weave + ne = 0 + zoffset=0.1 + dzoffset = 0.0005 + for e in w_edges: + p1 = e[0] + p2 = e[1] + myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z+zoffset+ne*dzoffset), p2=(p2.x,p2.y,p2.z+zoffset+ne*dzoffset) ) ) + ne = ne+1 + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_08_stl_weave.py opencamlib-11.10-1/examples/python/fiber/fiber_08_stl_weave.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_08_stl_weave.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_08_stl_weave.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,175 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +# note 2018.08: won't run becayse we don't have ocl.Weave() + +def generateRange(zmin,zmax,zNmax): + dz = (float(zmax)-float(zmin))/(zNmax-1) + zvals=[] + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + return zvals + + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + #stl = camvtk.STLSurf("../stl/demo.stl") + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + myscreen.addActor(stl) + stl.SetWireframe() + #stl.SetSurface() + stl.SetColor(camvtk.cyan) + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + bounds = s.getBounds() + print("STLSurf.Bounds()=", bounds) + cutter = ocl.CylCutter(1.6,5) + #cutter = ocl.BallCutter(0.3,5) + + print(cutter) + xmin=-1 + xmax=15 + N=100 + ymin=-1 + ymax=15 + yvals = generateRange(ymin,ymax,N) + xvals = generateRange(xmin,xmax,N) + #print xvals + zmin = -0.1 + zmax = 2.75 + zNmax = 5 + zvals = generateRange(zmin,zmax,zNmax) + print(" calculating waterlines at ", len(zvals)," different z-heights") + #print zvals + bpcx = ocl.BatchPushCutter() + bpcy = ocl.BatchPushCutter() + bpcx.setXDirection() + bpcy.setYDirection() + bpcx.setSTL(s) + bpcy.setSTL(s) + bpcx.setCutter(cutter) + bpcy.setCutter(cutter) + # create fibers + nfibers=0 + for zh in zvals: + for y in yvals: + f1 = ocl.Point(xmin,y,zh) # start point of fiber + f2 = ocl.Point(xmax,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpcx.appendFiber(f) + nfibers=nfibers+1 + for x in xvals: + f1 = ocl.Point(x,ymin,zh) # start point of fiber + f2 = ocl.Point(x,ymax,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpcy.appendFiber(f) + nfibers=nfibers+1 + + # run + t_before = time.time() + bpcx.run() + bpcy.run() + t_after = time.time() + push_calctime = t_after-t_before + + + + clpoints = bpcx.getCLPoints() + clp2=bpcy.getCLPoints() + clpoints+=clp2 + print("got ", len(clpoints), " CL-points") + print("rendering raw CL-points.") + + # draw the CL-points + #camvtk.drawCLPointCloud(myscreen, clpoints) + #for p in clpoints: + # myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z),radius=0.02, color=camvtk.clColor( p.cc() ) ) ) + + + xfibers = bpcx.getFibers() + yfibers = bpcy.getFibers() + fibers=xfibers+yfibers + # sort fibers into different z-levels + sorted_fibers=[] + for zh in zvals: + zlevel_fibers=[] + for f in fibers: + if f.p1.z == zh: + zlevel_fibers.append(f) + sorted_fibers.append(zlevel_fibers) + print(" found ",len(sorted_fibers)," z-levels") + + n=0 + loops = [] + t2_before = time.time() + for zlev_fibers in sorted_fibers: + print(" z-level ",n," at z=", zvals[n], " has ", len(zlev_fibers), "fibers") + n=n+1 + w = ocl.Weave() + for f in zlev_fibers: + w.addFiber(f) + print(" build()...",) + w.build() + print("done") + print(" split()...",) + subw = w.get_components() + print(" graph has ", len(subw)," sub-weaves") + m=0 + for sw in subw: + print(m," face_traverse...",) + t_before = time.time() + sw.face_traverse() + t_after = time.time() + calctime = t_after-t_before + print("done in ", calctime," s") + w_loop = sw.getLoops() + for lop in w_loop: + loops.append(lop) + m=m+1 + t2_after = time.time() + print(" found", len(loops)," loops") + print(" loop extraction took ", t2_after-t2_before," seconds") + # draw the loops + for lop in loops: + n = 0 + N = len(lop) + first_point=ocl.Point(-1,-1,5) + previous=ocl.Point(-1,-1,5) + for p in lop: + if n==0: # don't draw anything on the first iteration + previous=p + first_point = p + elif n== (N-1): # the last point + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) # the normal line + # and a line from p to the first point + myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=camvtk.yellow) ) + else: + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) + previous=p + n=n+1 + + t2 = camvtk.Text() + stltext = "%s\n%i triangles\n%i waterlines\n%i Fibers\n%i CL-points\n%i pushCutter() calls\n%0.1f seconds\n%0.3f us/call" \ + % ( str(cutter), s.size(), len(zvals), nfibers, len(clpoints), bpc.nCalls, push_calctime, 1e6* push_calctime/bpc.nCalls ) + t2.SetText(stltext) + t2.SetPos( (50, myscreen.height-200) ) + myscreen.addActor( t2) + + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + + myscreen.render() + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_09_ballcutter.py opencamlib-11.10-1/examples/python/fiber/fiber_09_ballcutter.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_09_ballcutter.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_09_ballcutter.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,100 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math +def drawFiber(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) + # cutter circle + #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c1) + #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c2) + +if __name__ == "__main__": + print(ocl.version()) + + myscreen = camvtk.VTKScreen() + + a = ocl.Point(0,1,0.3) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b = ocl.Point(1,0.5,0.3) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c = ocl.Point(0,0,0) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + s = ocl.STLSurf() + s.addTriangle(t) # a one-triangle STLSurf + length = 10 + #cutter = ocl.CylCutter(0.3, length) + cutter = ocl.BallCutter(0.3, length) + + print("fiber...") + fiber_range=4 + Nmax = 100 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + zmin = -0.1 + zmax = 0.5 + zNmax = 20 + dz = (zmax-zmin)/(zNmax-1) + zvals=[] + zvals.append(0.2) + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + + bpc = ocl.BatchPushCutter() + bpc.setSTL(s) + bpc.setCutter(cutter) + # create fibers + for zh in zvals: + for y in yvals: + f1 = ocl.Point(-0.5,y,zh) # start point of fiber + f2 = ocl.Point(1.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,-0.5,zh) # start point of fiber + f2 = ocl.Point(x,1.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc.appendFiber(f) + + # run + bpc.run() + clpoints = bpc.getCLPoints() + fibers = bpc.getFibers() + print(" got ",len(fibers)," fibers from bpc") + print("rendering fibers and CL-points.") + #camvtk.drawCLPointCloud(myscreen, clpoints) + for f in fibers: + drawFiber(myscreen, f, camvtk.red) + + #exit() + + + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + + myscreen.render() + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_10_offsets.py opencamlib-11.10-1/examples/python/fiber/fiber_10_offsets.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_10_offsets.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_10_offsets.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,120 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +# 2018.08: Weave not wrapped.. + +def generateRange(zmin,zmax,zNmax): + if zNmax>1: + dz = (float(zmax)-float(zmin))/(zNmax-1) + else: + dz = 0 + zvals=[] + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + return zvals + +def waterline(cutter, s, zh, tol = 0.1 ): + bpc = ocl.BatchPushCutter() + bpc.setSTL(s) + bpc.setCutter(cutter) + bounds = s.getBounds() + xmin= bounds[0] - 2*cutter.getRadius() + xmax= bounds[1] + 2*cutter.getRadius() + ymin= bounds[2] - 2*cutter.getRadius() + ymax= bounds[3] + 2*cutter.getRadius() + Nx= int( (xmax-xmin)/tol ) + Ny= int( (ymax-ymin)/tol ) + xvals = generateRange(xmin,xmax,Nx) + yvals = generateRange(ymin,ymax,Ny) + for y in yvals: + f1 = ocl.Point(xmin,y,zh) # start point of fiber + f2 = ocl.Point(xmax,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,ymin,zh) # start point of fiber + f2 = ocl.Point(x,ymax,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc.appendFiber(f) + bpc.run() + fibers = bpc.getFibers() # get fibers + w = ocl.Weave() + for f in fibers: + w.addFiber(f) + + print(" build()...",) + w.build() + print("done") + print(" split()...",) + subw = w.get_components() + print("done. graph has", len(subw),"sub-weaves") + m=0 + loops = [] + for sw in subw: + print(m," face_traverse...",) + t_before = time.time() + sw.face_traverse() + t_after = time.time() + calctime = t_after-t_before + print("done in ", calctime," s.") + sw_loops = sw.getLoops() + for lop in sw_loops: + loops.append(lop) + m=m+1 + return loops + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + #stl = camvtk.STLSurf("../stl/demo.stl") + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + myscreen.addActor(stl) + stl.SetWireframe() + #stl.SetSurface() + stl.SetColor(camvtk.cyan) + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + zh=1.9 + cutter_diams = generateRange(0.1, 6, 5) + loops = [] + length = 20 # cutter length + for diam in cutter_diams: + cutter = ocl.CylCutter( diam, length ) + cutter_loops = waterline(cutter, s, zh, 0.05 ) + for l in cutter_loops: + loops.append(l) + + print("All waterlines done. Got", len(loops)," loops in total.") + # draw the loops + for lop in loops: + n = 0 + N = len(lop) + first_point=ocl.Point(-1,-1,5) + previous=ocl.Point(-1,-1,5) + for p in lop: + if n==0: # don't draw anything on the first iteration + previous=p + first_point = p + elif n== (N-1): # the last point + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) # the normal line + # and a line from p to the first point + myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=camvtk.yellow) ) + else: + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) + previous=p + n=n+1 + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_12_waterline_onetriangle.py opencamlib-11.10-1/examples/python/fiber/fiber_12_waterline_onetriangle.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_12_waterline_onetriangle.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_12_waterline_onetriangle.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,97 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +# 2018.08: Weave not wrapped + +def loop_waterline(zh, cutter,s): + fiber_range=2 + Nmax = 200 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + bpc = ocl.BatchPushCutter() + bpc.setXDirection() + bpc.setSTL(s) + bpc.setCutter(cutter) + for y in yvals: + f1 = ocl.Point(-fiber_range,y,zh) # start point of fiber + f2 = ocl.Point(+fiber_range,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,-fiber_range,zh) # start point of fiber + f2 = ocl.Point(x,+fiber_range,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc.appendFiber(f) + bpc.run() + clpoints = bpc.getCLPoints() + fibers = bpc.getFibers() + w = ocl.Weave() + print("Weave...",) + for f in fibers: + w.addFiber(f) + print("build()...",) + w.build() + print("face_traverse()...",) + w.face_traverse() + print("done.") + return w.getLoops() + +def drawLoop(myscreen, w_loop): # draw the loop as a yellow line + previous = 0 + for loop in w_loop: + np = 0 + for p in loop: + if np is not 0: + myscreen.addActor( camvtk.Line( p1=(previous.x,previous.y, previous.z), + p2=(p.x,p.y,p.z), color=camvtk.yellow) ) + np=np+1 + previous = p + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + a = ocl.Point(0,1,0.3) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b = ocl.Point(1,0.5,0.3) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c = ocl.Point(0,0,0.1) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + s = ocl.STLSurf() + s.addTriangle(t) # a one-triangle STLSurf + diameter = 0.4 + angle = math.pi/4 + length = 5 + cutter = ocl.CylCutter(0.3, 5) + #cutter = ocl.BallCutter(0.4, 5) + #cutter = ocl.BullCutter(0.4, 0.1, 5) + #cutter = ocl.ConeCutter(diameter, angle, length) + print(cutter) + zstart = 0 + zend = 0.35 + zvals=[] + Nz = 7 + for n in range(0,Nz): + zvals.append( zstart + n*(zend-zstart)/float(Nz-1) ) + for zh in zvals: + print("zh=", zh) + w_loop = loop_waterline(zh, cutter,s) + drawLoop( myscreen, w_loop ) + + print("done.") + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + + myscreen.render() + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_13_onetri_cutter_comparison.py opencamlib-11.10-1/examples/python/fiber/fiber_13_onetri_cutter_comparison.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_13_onetri_cutter_comparison.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_13_onetri_cutter_comparison.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,141 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def drawPoints(myscreen, clpoints, ccpoints): + c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) + c.SetPoints() + myscreen.addActor(c ) + +def drawFiber(myscreen, f, fibercolor): + inter = f.getInts() + print("fiber has ", len(inter) , " intervals") + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) + # cutter circle + #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c1) + #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) + #myscreen.addActor(c2) + +def drawFiber_clpts(myscreen, f, clcolor): + inter = f.getInts() + #print "fiber has ", len(inter) , " intervals" + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + sphcolor = camvtk.clColor( i.lower_cc) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=sphcolor ) ) + sphcolor = camvtk.clColor( i.upper_cc) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=sphcolor ) ) + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) + +def yfiber(yvals,t,zh,myscreen,cutter,color): + for y in yvals: + f1 = ocl.Point(-0.5,y,zh) # start point of fiber + f2 = ocl.Point(1.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, color) + +def xfiber(xvals,t,zh,myscreen,cutter,color): + for x in xvals: + f1 = ocl.Point(x,-0.5,zh) # start point of fiber + f2 = ocl.Point(x,1.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + #cutter.vertexPush(f,i,t) + #cutter.facetPush(f,i,t) + #cutter.edgePush(f,i,t) + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, color) + +def oneCutterWaterline(myscreen, cutter, zh, color): + fiber_range=2 + Nmax = 100 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + yfiber(yvals,t,zh,myscreen,cutter, color) + xfiber(xvals,t,zh,myscreen,cutter, color) + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + + a = ocl.Point(0,1,0.2) + b = ocl.Point(1,0.5,0.0) + c = ocl.Point(0.1,0.1,0.0) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + angle = math.pi/4 + diameter=0.3 + length=5 + cutter1 = ocl.BallCutter(diameter, length) + cutter2 = ocl.CylCutter(diameter, length) + cutter3 = ocl.BullCutter(diameter, diameter/4, length) + cutter4 = ocl.ConeCutter(diameter, angle, length) + #cutter = cutter.offsetCutter( 0.1 ) + + + fiber_range=2 + Nmax = 50 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + zmin = -0.1 + zmax = 0.25 + zNmax =5 + dz = (zmax-zmin)/(zNmax-1) + zvals=[] + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + + for zh in zvals: + oneCutterWaterline(myscreen, cutter1, zh, camvtk.yellow) + oneCutterWaterline(myscreen, cutter2, zh, camvtk.cyan) + oneCutterWaterline(myscreen, cutter3, zh, camvtk.mag) + oneCutterWaterline(myscreen, cutter4, zh, camvtk.mag) + #yfiber(yvals,t,zh,myscreen) + #xfiber(xvals,t,zh,myscreen) + + print("done.") + + myscreen.render() + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_14_z-levels_cc-colors.py opencamlib-11.10-1/examples/python/fiber/fiber_14_z-levels_cc-colors.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_14_z-levels_cc-colors.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_14_z-levels_cc-colors.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,138 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + #print "fiber has ", len(inter) , " intervals" + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + ballradius = 0.002 + ballradius = 0.005 + #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=ballradius, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=ballradius, color=camvtk.clColor( i.upper_cc) ) ) + + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) + +# colors from camvtk.py: +# ocl.CCType.VERTEX: col = red +# ocl.CCType.EDGE_HORIZ: col = orange +# ocl.CCType.EDGE_SHAFT: col = mag + +def yfiber(yvals,t,zh,myscreen): + for y in yvals: + f1 = ocl.Point(-3.5,y,zh) # start point of fiber + f2 = ocl.Point(3.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.red) + +def xfiber(xvals,t,zh,myscreen): + for x in xvals: + f1 = ocl.Point(x,-15.5,zh) # start point of fiber + f2 = ocl.Point(x,55.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.lblue) + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + + ztri = 0.3 # this is the shallow case + #ztri = 0.8 # this produces the steep case where we hit the circular rim + + ztri_lo = 0.1 + a = ocl.Point(0,1,ztri) + b = ocl.Point(1,0.5,ztri) + c = ocl.Point(0.2,0.2,ztri_lo) + + a = ocl.Point(0,1,0.3) + b = ocl.Point(1,0.5,0.3) + c = ocl.Point(0,0,0) + + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + angle = math.pi/5 + diameter=0.6 + length=25 + cutter = ocl.BallCutter(diameter, length) + #cutter = ocl.CylCutter(diameter, length) + #cutter = ocl.BullCutter(diameter, diameter/4, length) + #cutter = ocl.ConeCutter(diameter, angle, length) + #cutter = cutter.offsetCutter( 0.1 ) + + #cutter = ocl.CompCylCutter(diameter, length) + #cutter = ocl.CompBallCutter(diameter, length) + + #cutter = ocl.CylConeCutter(diameter/float(3), diameter, math.pi/float(9)) + cutter = ocl.BallConeCutter(diameter/float(3), diameter, math.pi/float(5)) + + + print("cutter= ", cutter) + print("length=", cutter.getLength()) + print("fiber...") + fiberrange=5 + Nmax = 100 + yvals = [float(n-float(Nmax)/2)/Nmax*fiberrange for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiberrange for n in range(0,Nmax+1)] + """ + zmin = ztri_lo - 0.2 + zmax = ztri + zNmax = 20 + dz = (zmax-zmin)/(zNmax-1) + zvals=[] + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + """ + + zheights=[] + Nmax=30 + zmin=-0.85 + zmax= 0.3 + dz = (zmax-zmin)/float(Nmax-1) + z = zmin + for n in range(Nmax): + zheights.append(z) + z=z+dz + #zheights= [] + #zheights.append(-0.25) + + print(len(zheights)," to do: ",) + n=0 + for zh in zheights: + print(n,) + yfiber(yvals,t,zh,myscreen) + xfiber(xvals,t,zh,myscreen) + n=n+1 + print("done.") + myscreen.camera.SetPosition(-1, -1, 3) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_15_conecutter_anim.py opencamlib-11.10-1/examples/python/fiber/fiber_15_conecutter_anim.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_15_conecutter_anim.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_15_conecutter_anim.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,142 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math +import os + +def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): + inter = f.getInts() + #print "fiber has ", len(inter) , " intervals" + for i in inter: + if not i.empty(): + ip1 = f.point( i.lower ) + ip2 = f.point( i.upper ) + #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) + myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) + myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) + #cc1 = i.lower_cc + #cc2 = i.upper_cc + #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) + #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) + +# colors from camvtk.py: +# ocl.CCType.VERTEX: col = red +# ocl.CCType.EDGE_HORIZ: col = orange +# ocl.CCType.EDGE_SHAFT: col = mag + +def yfiber(cutter,yvals,t,zh,myscreen): + for y in yvals: + f1 = ocl.Point(-5.5,y,zh) # start point of fiber + f2 = ocl.Point(5.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.red) + +def xfiber(cutter,xvals,t,zh,myscreen): + for x in xvals: + f1 = ocl.Point(x,-5.5,zh) # start point of fiber + f2 = ocl.Point(x,5.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + i = ocl.Interval() + cutter.pushCutter(f,i,t) + f.addInterval(i) + drawFiber_clpts(myscreen, f, camvtk.lblue) + +def drawScreen(a,b,c,filename,write_flag): + print(ocl.version()) + myscreen = camvtk.VTKScreen() + z_hi = a.z + if b.z > z_hi: + z_hi = b.z + if c.z > z_hi: + z_hi = c.z + + z_lo = a.z + if b.z < z_lo: + z_lo = b.z + if c.z < z_lo: + z_lo = c.z + #z_hi = 0.3 # this is the shallow case + #ztri = 0.8 # this produces the steep case where we hit the circular rim + + #z_lo = 0.1 + #a = ocl.Point(0,1,ztri) + #b = ocl.Point(1,0.5,ztri) + #c = ocl.Point(0.2,0.2,ztri_lo) + + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + t = ocl.Triangle(b,c,a) + angle = math.pi/5 + diameter=0.3 + length=5 + #cutter = ocl.BallCutter(diameter, length) + #cutter = ocl.CylCutter(diameter, length) + #cutter = ocl.BullCutter(diameter, diameter/4, length) + cutter = ocl.ConeCutter(diameter, angle, length) + #cutter = cutter.offsetCutter( 0.1 ) + + print("cutter= ", cutter) + print("length=", cutter.getLength()) + print("fiber...") + fiber_range=2 + Nmax = 100 + yvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*fiber_range for n in range(0,Nmax+1)] + zmin = z_lo - 0.3 + zmax = z_hi + zNmax = 20 + dz = (zmax-zmin)/(zNmax-1) + zvals=[] + for n in range(0,zNmax): + zvals.append(zmin+n*dz) + for zh in zvals: + yfiber(cutter,yvals,t,zh,myscreen) + xfiber(cutter,xvals,t,zh,myscreen) + print("done.") + myscreen.camera.SetPosition(-2, -1, 3) + myscreen.camera.SetFocalPoint(1.0, 0.0, -0.5) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + """ + w2if = vtk.vtkWindowToImageFilter() + w2if.SetInput(myscreen.renWin) + lwr = vtk.vtkPNGWriter() + lwr.SetInput( w2if.GetOutput() ) + w2if.Modified() + lwr.SetFileName(filename) + if write_flag: + lwr.Write() + print("wrote ",filename) + """ + + #myscreen.iren.Start() + #raw_input("Press Enter to terminate") + +if __name__ == "__main__": + ztri = 0.3 # this is the shallow case + #ztri = 0.8 # this produces the steep case where we hit the circular rim + ztri_lo = 0.1 + Nmax = 300 + thetamax = 2*math.pi + for n in range(0,Nmax): + theta=thetamax/Nmax + a = ocl.Point(0,1,ztri) + a.xRotate(theta*n) + b = ocl.Point(1,0.0,0) + b.xRotate(theta*n) + c = ocl.Point(0.2,0.0,ztri) + c.xRotate(theta*n) + current_dir = os.getcwd() + filename = current_dir + "/frames/conecutter_"+ ('%05d' % n)+".png" + drawScreen(a,b,c,filename, 1) + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_15_weave2.py opencamlib-11.10-1/examples/python/fiber/fiber_15_weave2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_15_weave2.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_15_weave2.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,143 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +# 2018.08: Weave not wrapped + +def drawVertices(myscreen, weave, vertexType, vertexRadius, vertexColor): + pts = weave.getVertices( vertexType ) + print(" got ",len(pts)," of type ", vertexType) + for p in pts: + myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z), radius=vertexRadius, color=vertexColor ) ) + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + a = ocl.Point(0,1,0.3) + #myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b = ocl.Point(1,0.5,0.3) + #myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c = ocl.Point(0,0,0.1) + #myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + #myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + #myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + #myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + + # a second triangle + offset=ocl.Point(0.51,0.51,0) + a2 = a+ offset + b2 = b+ offset + c2 = c+ offset + t2 = ocl.Triangle(b2,c2,a2) + + t = ocl.Triangle(b,c,a) + s = ocl.STLSurf() + s.addTriangle(t) # a one-triangle STLSurf + s.addTriangle(t2) + + cutter = ocl.CylCutter(0.3, 5) + #cutter = ocl.BallCutter(0.4, 5) + #cutter = ocl.BullCutter(0.4, 0.1, 5) + + print("fiber...") + fiber_range=7 + Nmax = 200 + yvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in range(0,Nmax+1)] + + zvals=[ 0.23] + + + bpc_x = ocl.BatchPushCutter() + bpc_y = ocl.BatchPushCutter() + bpc_x.setXDirection() + bpc_y.setYDirection() + bpc_x.setSTL(s) + bpc_y.setSTL(s) + bpc_x.setCutter(cutter) + bpc_y.setCutter(cutter) + # create fibers + for zh in zvals: + for y in yvals: + f1 = ocl.Point(-5.5,y,zh) # start point of fiber + f2 = ocl.Point(5.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_x.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,-5.5,zh) # start point of fiber + f2 = ocl.Point(x,5.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_y.appendFiber(f) + + # run + bpc_x.run() + bpc_y.run() + #clpoints = bpc_x.getCLPoints() + #clp2 = bpc_y.getCLPoints() + #clpoints+=clp2 + xfibers = bpc_x.getFibers() + yfibers = bpc_y.getFibers() + fibers = xfibers+yfibers + print(" got ",len(xfibers)," xfibers") + print(" got ",len(yfibers)," yfibers") + print("rendering fibers and CL-points.") + w = ocl.Weave() + print("push fibers to Weave...",) + for f in fibers: + w.addFiber(f) + print("done.") + print("Weave build()...",) + #w.build() + w.build() + print("done") + print("face_traverse...") + w.face_traverse() + print("done.") + w_clpts = w.getCLVertices() + w_ipts = w.getINTVertices() + w_edges = w.getEdges() + w_loop = w.getLoops() + vertexRadius = 0.007 + drawVertices(myscreen, w, ocl.WeaveVertexType.CL, vertexRadius, camvtk.red) + drawVertices(myscreen, w, ocl.WeaveVertexType.INT, vertexRadius, camvtk.orange) + drawVertices(myscreen, w, ocl.WeaveVertexType.FULLINT, vertexRadius, camvtk.yellow) + drawVertices(myscreen, w, ocl.WeaveVertexType.ADJ, vertexRadius, camvtk.green) + drawVertices(myscreen, w, ocl.WeaveVertexType.TWOADJ, vertexRadius, camvtk.lblue) + + print(" got: ", len(w_edges), " edges") + print(" got: ", len(w_loop), " loop points") + + + previous = 0 + # draw the loop as a yellow line + for loop in w_loop: + np = 0 + for p in loop: + #myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z+zoffset2), radius=0.006, color=camvtk.pink ) ) + if np is not 0: + myscreen.addActor( camvtk.Line( p1=(previous.x,previous.y, previous.z), + p2=(p.x,p.y,p.z), color=camvtk.yellow) ) + np=np+1 + previous = p + + # draw edges of weave + ne = 0 + zoffset=0.0 # 1 + dzoffset = 0.000 # 5 + for e in w_edges: + p1 = e[0] + p2 = e[1] + myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z+zoffset+ne*dzoffset), p2=(p2.x,p2.y,p2.z+zoffset+ne*dzoffset) ) ) + ne = ne+1 + + print("done.") + myscreen.camera.SetPosition(0.8051, 0.8051, 3.5) + myscreen.camera.SetFocalPoint(0.805, 0.805, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_16_weave2_RAMusage.py opencamlib-11.10-1/examples/python/fiber/fiber_16_weave2_RAMusage.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_16_weave2_RAMusage.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_16_weave2_RAMusage.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,112 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math +import procmemory +import csv +import gc + +# 2018.08: Weave not wrapped + +def drawVertices(myscreen, weave, vertexType, vertexRadius, vertexColor): + pts = weave.getVertices( vertexType ) + print(" got ",len(pts)," of type ", vertexType) + for p in pts: + myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z), radius=vertexRadius, color=vertexColor ) ) + +def getWeaveRAM(Nmax,weave2_flag): + #stl = camvtk.STLSurf("../stl/demo.stl") + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + cutter = ocl.CylCutter(0.3, 5) + fiber_range=30 + #Nmax = 400 + yvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in range(0,Nmax+1)] + zvals=[ 1.6523] + bpc_x = ocl.BatchPushCutter() + bpc_y = ocl.BatchPushCutter() + bpc_x.setXDirection() + bpc_y.setYDirection() + bpc_x.setSTL(s) + bpc_y.setSTL(s) + bpc_x.setCutter(cutter) + bpc_y.setCutter(cutter) + # create fibers + for zh in zvals: + for y in yvals: + f1 = ocl.Point(-15.5,y,zh) # start point of fiber + f2 = ocl.Point(15.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_x.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,-15.5,zh) # start point of fiber + f2 = ocl.Point(x,15.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_y.appendFiber(f) + + # run + bpc_x.run() + bpc_y.run() + xfibers = bpc_x.getFibers() + yfibers = bpc_y.getFibers() + fibers = xfibers+yfibers + print(" got ",len(xfibers)," xfibers") + print(" got ",len(yfibers)," yfibers") + fibercount = len(xfibers) + len(yfibers) + print("rendering fibers and CL-points.") + w = ocl.Weave() + print("push fibers to Weave...",) + for f in fibers: + w.addFiber(f) + print("done.") + print("Weave build()...",) + mem1 = procmemory.memory() + if weave2_flag==1: + w.build2() + else: + w.build() + mem2 = procmemory.memory() + #print "after ", float(mem2)/float(1024*1024), " MB" + megabytes = float(mem2-mem1)/float(1024*1024) + megabytes2 = float(mem2)/float(1024*1024) + verts = w.numVertices() + print(" before: ", float(mem1)/float(1024*1024)) + print(" after: ", float(mem2)/float(1024*1024)) + print(" build() memory: ",megabytes," MB") + print("done") + print("face_traverse...") + w.face_traverse() + print("done.") + w_clpts = w.getCLVertices() + w_ipts = w.getINTVertices() + w_edges = w.getEdges() + w_loop = w.getLoops() + + + print(" got: ", len(w_edges), " edges") + print(" got: ", len(w_loop), " loops") + out=[] + out.append(fibercount) + out.append(verts) + return out + +if __name__ == "__main__": + writer = csv.writer( open('weave2ram_6.csv','wb'), delimiter=',') + + #Nmax=400 + Nmaxlist = [100,200,400,800, 1600, 3200] + + for Nmax in Nmaxlist: + mb = getWeaveRAM(Nmax,0) + mb2 = getWeaveRAM(Nmax,1) + #print mb2 + print(mb[0], " :=> ", mb[1], " MB") + writer.writerow(mb+mb2) + gc.collect() + + raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_16_weave2_STL.py opencamlib-11.10-1/examples/python/fiber/fiber_16_weave2_STL.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/fiber/fiber_16_weave2_STL.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/fiber/fiber_16_weave2_STL.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,146 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math +import procmemory + +# 2018.08: Weave not wrapped + +def drawVertices(myscreen, weave, vertexType, vertexRadius, vertexColor): + pts = weave.getVertices( vertexType ) + print(" got ",len(pts)," of type ", vertexType) + for p in pts: + myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z), radius=vertexRadius, color=vertexColor ) ) + +if __name__ == "__main__": + print(ocl.version()) + myscreen = camvtk.VTKScreen() + #stl = camvtk.STLSurf("../stl/demo.stl") + stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") + myscreen.addActor(stl) + stl.SetWireframe() + #stl.SetSurface() + stl.SetColor(camvtk.grey) + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + + cutter = ocl.CylCutter(0.3, 5) + #cutter = ocl.BallCutter(0.4, 5) + #cutter = ocl.BullCutter(0.4, 0.1, 5) + + print("fiber...") + fiber_range=30 + Nmax = 400 + yvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in range(0,Nmax+1)] + xvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in range(0,Nmax+1)] + + zvals=[ 1.6523] + + + bpc_x = ocl.BatchPushCutter() + bpc_y = ocl.BatchPushCutter() + bpc_x.setXDirection() + bpc_y.setYDirection() + bpc_x.setSTL(s) + bpc_y.setSTL(s) + bpc_x.setCutter(cutter) + bpc_y.setCutter(cutter) + # create fibers + for zh in zvals: + for y in yvals: + f1 = ocl.Point(-15.5,y,zh) # start point of fiber + f2 = ocl.Point(15.5,y,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_x.appendFiber(f) + for x in xvals: + f1 = ocl.Point(x,-15.5,zh) # start point of fiber + f2 = ocl.Point(x,15.5,zh) # end point of fiber + f = ocl.Fiber( f1, f2) + bpc_y.appendFiber(f) + + # run + bpc_x.run() + bpc_y.run() + + xfibers = bpc_x.getFibers() + yfibers = bpc_y.getFibers() + fibers = xfibers+yfibers + print(" got ",len(xfibers)," xfibers") + print(" got ",len(yfibers)," yfibers") + print("rendering fibers and CL-points.") + w = ocl.Weave() + print("push fibers to Weave...",) + for f in fibers: + w.addFiber(f) + print("done.") + print("Weave build()...",) + mem1 = procmemory.resident() + print("before ", mem1) + w.build() + #w.build2() + mem2 = procmemory.resident() + print("after ", float(mem2)/float(1024*1024), " MB") + print(" build() memory: ",float(mem2-mem1)/float(1024*1024)," MB") + print("done") + print("face_traverse...") + w.face_traverse() + print("done.") + w_clpts = w.getCLVertices() + w_ipts = w.getINTVertices() + w_edges = w.getEdges() + w_loop = w.getLoops() + vertexRadius = 0.007 + drawVertices(myscreen, w, ocl.WeaveVertexType.CL, vertexRadius, camvtk.red) + drawVertices(myscreen, w, ocl.WeaveVertexType.INT, vertexRadius, camvtk.orange) + drawVertices(myscreen, w, ocl.WeaveVertexType.FULLINT, vertexRadius, camvtk.yellow) + drawVertices(myscreen, w, ocl.WeaveVertexType.ADJ, vertexRadius, camvtk.green) + drawVertices(myscreen, w, ocl.WeaveVertexType.TWOADJ, vertexRadius, camvtk.lblue) + + print(" got: ", len(w_edges), " edges") + print(" got: ", len(w_loop), " loops") + + # draw the loops + + nloop = 0 + for lop in w_loop: + n = 0 + N = len(lop) + first_point=ocl.Point(-1,-1,5) + previous=ocl.Point(-1,-1,5) + for p in lop: + if n==0: # don't draw anything on the first iteration + previous=p + first_point = p + elif n== (N-1): # the last point + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) # the normal line + # and a line from p to the first point + myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=camvtk.yellow) ) + else: + myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) + previous=p + n=n+1 + print("rendered loop ",nloop, " with ", len(lop), " points") + nloop = nloop+1 + + + # draw edges of weave + ne = 0 + zoffset=0.0 # 1 + dzoffset = 0.000 # 5 + for e in w_edges: + p1 = e[0] + p2 = e[1] + myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z+zoffset+ne*dzoffset), p2=(p2.x,p2.y,p2.z+zoffset+ne*dzoffset) ) ) + ne = ne+1 + + print("done.") + myscreen.camera.SetPosition(0.8051, 0.8051, 3.5) + myscreen.camera.SetFocalPoint(0.805, 0.805, 0) + camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) + camvtk.drawOCLtext(myscreen) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/issues/issue08_bug2010-04-02.py opencamlib-11.10-1/examples/python/issues/issue08_bug2010-04-02.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/issues/issue08_bug2010-04-02.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/issues/issue08_bug2010-04-02.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,19 @@ +import ocl + +# this illustrates issue 8 + +if __name__ == "__main__": + print(ocl.version()) + cutter = ocl.CylCutter(3.0, 6) + path = ocl.Path() + path.append(ocl.Line(ocl.Point(-6.51, 0, 0), ocl.Point(6.51, 1.2, 0))) + s=ocl.STLSurf() + ocl.STLReader("../../stl/sphere2.stl",s) + pdc = ocl.PathDropCutter() + pdc.setSTL(s) + pdc.setCutter(cutter) + pdc.setPath(path) + pdc.run() + clpts = pdc.getCLPoints() + for p in clpts: + print(p) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/issues/issue20bug.py opencamlib-11.10-1/examples/python/issues/issue20bug.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/issues/issue20bug.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/issues/issue20bug.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,47 @@ +import ocl +import camvtk +import issue20data + +if __name__ == "__main__": + s = ocl.STLSurf() + triangles = issue20data.trilist + + for t in triangles: + s.addTriangle(t) + + print(ocl.version() ) + # define a cutter + length = 10 + cutter = ocl.CylCutter(3, length) + #cutter = ocl.BallCutter(3, length) + #cutter = ocl.BullCutter(3,0.5, length) + + pdf = ocl.PathDropCutter() # create a pdf-object for the surface s + pdf.setSTL(s) + pdf.setCutter(cutter) # set the cutter + pdf.minimumZ = -1 # set the minimum Z-coordinate, or + # "floor" for drop-cutter + + path = ocl.Path() # create an empty path object + # add a line to the path + path.append(ocl.Line(ocl.Point(0, 0.098, 0), ocl.Point(4, 0.098, 0))) + + # set the path for pdf + pdf.setPath( path ) + + pdf.run() # run drop-cutter on the path + + clp = pdf.getCLPoints() # get the cl-points from pdf + + + print('first point ', clp[0], ' ( z should be at z5 )') + + # visualize things with VTK + myscreen = camvtk.VTKScreen() + myscreen.addActor( camvtk.PointCloud( pointlist=clp ) ) + #myscreen.addActor( camvtk.PointCloud( pointlist=ccp, collist=ccp ) ) + su = camvtk.STLSurf(filename=None, triangleList=triangles ) + su.SetWireframe() + myscreen.addActor(su) + myscreen.render() + myscreen.iren.Start() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/issues/issue20data.py opencamlib-11.10-1/examples/python/issues/issue20data.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/issues/issue20data.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/issues/issue20data.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,79 @@ +import ocl + +trilist = [] +trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), + ocl.Point(2.89783, -7.09741e-016, 4.07462), + ocl.Point(4, -9.79685e-016, 3))) +trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), + ocl.Point(4,0.673874, 2.92334), + ocl.Point(4, 1, 2.82843))) +trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), + ocl.Point(4,0.339111, 2.98077), + ocl.Point(4, 0.673874, 2.92334))) +trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), ocl.Point(4, +-9.79685e-016, 3), ocl.Point(4, 0.339111, 2.98077))) +trilist.append(ocl.Triangle(ocl.Point(1.53379, 1, 4.65268), +ocl.Point(1.521, -3.72525e-016, 4.76304), ocl.Point(2.89783, -7.09741e-016, +4.07462))) +trilist.append(ocl.Triangle(ocl.Point(1.53379, 1, 4.65268), +ocl.Point(2.89783, -7.09741e-016, 4.07462), ocl.Point(2.91337, 1, 3.93857))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.669179, 4.95502), +ocl.Point(1.53379, 1, 4.65268), ocl.Point(-1.19986e-015, 1, 4.89898))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.335345, 4.98874), +ocl.Point(1.53379, 1, 4.65268), ocl.Point(0, 0.669179, 4.95502))) +trilist.append(ocl.Triangle(ocl.Point(3.06152e-016, -7.4983e-032, 5), +ocl.Point(1.521, -3.72525e-016, 4.76304), ocl.Point(1.53379, 1, 4.65268))) +trilist.append(ocl.Triangle(ocl.Point(3.06152e-016, -7.4983e-032, 5), +ocl.Point(1.53379, 1, 4.65268), ocl.Point(0, 0.335345, 4.98874))) +trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(0, 1, +0), ocl.Point(-1.19986e-015, 1, 4.89898))) +trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), +ocl.Point(-1.19986e-015, 1, 4.89898), ocl.Point(1.53379, 1, 4.65268))) +trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(1.53379, +1, 4.65268), ocl.Point(2.91337, 1, 3.93857))) +trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(2.91337, +1, 3.93857), ocl.Point(4, 1, 2.82843))) +trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(4, 1, +2.82843), ocl.Point(4, 1, 0))) +trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(4, 1, +0), ocl.Point(0, 1, 0))) +trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, +-9.79685e-016, 3), ocl.Point(4, 0, 0))) +trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, 0, 0), +ocl.Point(4, 1, 0))) +trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, 1, 0), +ocl.Point(4, 1, 2.82843))) +trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, 1, +2.82843), ocl.Point(4, 0.673874, 2.92334))) +trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, +0.673874, 2.92334), ocl.Point(4, 0.339111, 2.98077))) +trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, +0.339111, 2.98077), ocl.Point(4, -9.79685e-016, 3))) +trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), +ocl.Point(3.06152e-016, -7.4983e-032, 5), ocl.Point(0, 0, 0))) +trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(4, +-9.79685e-016, 3), ocl.Point(2.89783, -7.09741e-016, 4.07462))) +trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(2.89783, +-7.09741e-016, 4.07462), ocl.Point(1.521, -3.72525e-016, 4.76304))) +trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(1.521, +-3.72525e-016, 4.76304), ocl.Point(3.06152e-016, -7.4983e-032, 5))) +trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(4, 0, 0), +ocl.Point(4, -9.79685e-016, 3))) +trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(0, 0, 0), +ocl.Point(4, 0, 0))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), +ocl.Point(-1.19986e-015, 1, 4.89898), ocl.Point(0, 1, 0))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, +0.669179, 4.95502), ocl.Point(-1.19986e-015, 1, 4.89898))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, +0.335345, 4.98874), ocl.Point(0, 0.669179, 4.95502))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), +ocl.Point(3.06152e-016, -7.4983e-032, 5), ocl.Point(0, 0.335345, 4.98874))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, 0, 0), +ocl.Point(3.06152e-016, -7.4983e-032, 5))) +trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, 1, 0), +ocl.Point(0, 0, 0))) +trilist.append(ocl.Triangle(ocl.Point(4, 1, 0), ocl.Point(0, 0, 0), +ocl.Point(0, 1, 0))) +trilist.append(ocl.Triangle(ocl.Point(4, 1, 0), ocl.Point(4, 0, 0), +ocl.Point(0, 0, 0))) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_debug_0.py opencamlib-11.10-1/examples/python/kdtree_debug_0.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_debug_0.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/kdtree_debug_0.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,126 @@ +import ocl as cam +import camvtk +import time +import vtk +import math +import datetime + + + + +def main(): + myscreen = camvtk.VTKScreen() + focal = cam.Point(5, 5, 0) + r = 30 + theta = (float(45)/360)*2*math.pi + fi=45 + + campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) + myscreen.camera.SetPosition(campos.x, campos.y, campos.z) + myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) + + t = camvtk.Text() + t.SetPos( (myscreen.width-450, myscreen.height-30) ) + + + myscreen.addActor( t) + t2 = camvtk.Text() + ytext = "kd-tree debug" #"Y: %3.3f" % (ycoord) + t2.SetText(ytext) + t2.SetPos( (50, myscreen.height-50) ) + myscreen.addActor( t2) + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + + t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + + #ycoord = 1.1 + + stl = camvtk.STLSurf(filename="../stl/demo.stl") + #stl = camvtk.STLSurf(filename="../stl/demo2.stl") + print("STL surface read") + #myscreen.addActor(stl) + #stl.SetWireframe() + #stl.SetColor((0.5,0.5,0.5)) + polydata = stl.src.GetOutput() + s= cam.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STLSurf with ", s.size(), " triangles") + + + myscreen.addActor( camvtk.Sphere( center=(0,0,0), radius=0.2, color = camvtk.yellow ) ) + + s.build_kdtree() + print("built kd-tree") + s.jump_kd_reset() + + tlist = s.get_kd_triangles() + + print("got", len(tlist), " triangles") + + while (s.jump_kd_hi()): + lotris = s.get_kd_triangles() + s.jump_kd_up() + cut = s.get_kd_cut() + s.jump_kd_lo() + hitris = s.get_kd_triangles() + lev = s.get_kd_level() + + print("l=", lev, " hi=", len(hitris), " lo=", len(lotris), " cut=", cut) + + if ( cut[0] < 2 ): + print("x cut ",) + if ( cut[0] == 0): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) + else: + print("min" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) + #myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) + else: + print("y cut ",) + if ( cut[0] == 2): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) + else: + print("min") + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) + + + slo = camvtk.STLSurf(triangleList=lotris) + slo.SetColor(camvtk.pink) + slo.SetWireframe() + shi = camvtk.STLSurf(triangleList=hitris) + shi.SetColor(camvtk.lgreen) + shi.SetWireframe() + myscreen.addActor(slo) + myscreen.addActor(shi) + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") + time.sleep(1) + myscreen.removeActor(slo) + myscreen.removeActor(shi) + + + + print("done.") + myscreen.render() + #lwr.SetFileName(filename) + + #raw_input("Press Enter to terminate") + time.sleep(0.2) + #lwr.Write() + myscreen.iren.Start() + + +if __name__ == "__main__": + main() + #raw_input("Press Enter to terminate") + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_debug_1.py opencamlib-11.10-1/examples/python/kdtree_debug_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_debug_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/kdtree_debug_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,128 @@ +import ocl as cam +import camvtk +import time +import vtk +import math +import datetime + + + + +def main(): + myscreen = camvtk.VTKScreen() + focal = cam.Point(50, 0, 0) + r = 300 + theta = (float(45)/360)*2*math.pi + fi=45 + + campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) + myscreen.camera.SetPosition(campos.x, campos.y, campos.z) + myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) + + t = camvtk.Text() + t.SetPos( (myscreen.width-450, myscreen.height-30) ) + + + myscreen.addActor( t) + t2 = camvtk.Text() + ytext = "kd-tree debug" #"Y: %3.3f" % (ycoord) + t2.SetText(ytext) + t2.SetPos( (50, myscreen.height-50) ) + myscreen.addActor( t2) + + w2if = vtk.vtkWindowToImageFilter() + w2if.SetInput(myscreen.renWin) + lwr = vtk.vtkPNGWriter() + lwr.SetInput( w2if.GetOutput() ) + + epos = cam.Epos() + epos.setS(0,1) + + t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + + #ycoord = 1.1 + + stl = camvtk.STLSurf(filename="../stl/demo.stl") + #stl = camvtk.STLSurf(filename="../stl/demo2.stl") + print("STL surface read") + #myscreen.addActor(stl) + #stl.SetWireframe() + #stl.SetColor((0.5,0.5,0.5)) + polydata = stl.src.GetOutput() + s= cam.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STLSurf with ", s.size(), " triangles") + + + myscreen.addActor( camvtk.Sphere( center=(0,0,0), radius=0.2, color = camvtk.yellow ) ) + + s.build_kdtree() + print("built kd-tree") + s.jump_kd_reset() + + tlist = s.get_kd_triangles() + + print("got", len(tlist), " triangles") + + while (s.jump_kd_hi()): + lotris = s.get_kd_triangles() + s.jump_kd_up() + cut = s.get_kd_cut() + s.jump_kd_lo() + hitris = s.get_kd_triangles() + lev = s.get_kd_level() + + print("l=", lev, " hi=", len(hitris), " lo=", len(lotris), " cut=", cut) + + if ( cut[0] < 2 ): + print("x cut ",) + if ( cut[0] == 0): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) + else: + print("min" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) + #myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) + else: + print("y cut ",) + if ( cut[0] == 2): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) + else: + print("min") + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) + + + slo = camvtk.STLSurf(triangleList=lotris) + slo.SetColor(camvtk.pink) + slo.SetWireframe() + shi = camvtk.STLSurf(triangleList=hitris) + shi.SetColor(camvtk.lgreen) + shi.SetWireframe() + myscreen.addActor(slo) + myscreen.addActor(shi) + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") + time.sleep(1) + myscreen.removeActor(slo) + myscreen.removeActor(shi) + + + + print("done.") + myscreen.render() + #lwr.SetFileName(filename) + + #raw_input("Press Enter to terminate") + time.sleep(0.2) + lwr.Write() + myscreen.iren.Start() + + +if __name__ == "__main__": + main() + #raw_input("Press Enter to terminate") + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_debug_3.py opencamlib-11.10-1/examples/python/kdtree_debug_3.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_debug_3.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/kdtree_debug_3.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,309 @@ +import ocl as cam +import camvtk +import time +import vtk +import math +import datetime + + + +def kdtreesearch(myscreen, tlist, s, cutter, cl, depth): + #print "surface=", s.str() + #print "cutter=", cutter.str() + #print "cl=", cl.str() + myscreen.render() + #raw_input("Press Enter to terminate") + #time.sleep(1) + if (depth==1): # stop jumping and return all triangles + tris = s.get_kd_triangles() + for t in tris: + tlist.append(t) + return + + # jump high or low depending on search + cut = s.get_kd_cut() + print("cutvalues: ", cut) + dim = cut[0] + cval = cut[1] + if dim == 0: # cut along xmax + + print(cval, " < ", cl.x - cutter.radius, " ??") + if ( cval < ( cl.x - cutter.radius) ): + myscreen.addActor( camvtk.Line( p1=(cval,100,0), p2=(cval,-100,0), color = camvtk.green ) ) + s.jump_kd_lo() + trilist = s.get_kd_triangles() + drawtriangles(myscreen, trilist, camvtk.blue) + s.jump_kd_up() + print("xmax: jump ONLY hi" ) + s.jump_kd_hi() + print("search hi at level=", s.get_kd_level()) + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + print("len tlist=", len(tlist), " now level=", s.get_kd_level()) + else: + #print "xmax: jump both hi and lo" + s.jump_kd_hi() + #print "search hi at level=", s.get_kd_level() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + #print "len tlist=", len(tlist), " now level=", s.get_kd_level() + s.jump_kd_up() + s.jump_kd_lo() + #print "search lo at level=", s.get_kd_level() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + #print "len tlist=", len(tlist), " now level=", s.get_kd_level() + if dim == 1: + + print(cval, " > ", cl.x + cutter.radius, " ??") + if ( cval > ( cl.x + cutter.radius) ): + myscreen.addActor( camvtk.Line( p1=(cval,100,0), p2=(cval,-100,0), color = camvtk.lgreen ) ) + s.jump_kd_hi() + trilist = s.get_kd_triangles() + drawtriangles(myscreen, trilist, camvtk.blue) + s.jump_kd_up() + print("xmin: jump only lo") + s.jump_kd_lo() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + else: + #print "xmin: jump both hi and lo" + s.jump_kd_lo() + kdtreesearch(tlist, s, cutter, cl, depth-1) + s.jump_kd_up() + s.jump_kd_hi() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + if dim == 2: + print(cval, " < ", cl.y - cutter.radius, " ??") + if ( cval < ( cl.y - cutter.radius) ): + myscreen.addActor( camvtk.Line( p1=(100,cval,0), p2=(-100,cval,0), color = camvtk.red ) ) + s.jump_kd_lo() + trilist = s.get_kd_triangles() + drawtriangles(myscreen, trilist, camvtk.yellow) + s.jump_kd_up() + + s.jump_kd_hi() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + else: + #print "ymax: jump both hi and lo" + s.jump_kd_lo() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + s.jump_kd_up() + s.jump_kd_hi() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + if dim == 3: # cut along ymin + + print(cval, " > ", cl.y + cutter.radius, " ??") + if ( cval > ( cl.y + cutter.radius) ): + myscreen.addActor( camvtk.Line( p1=(100,cval,0), p2=(-100,cval,0), color = camvtk.pink ) ) + + s.jump_kd_hi() + trilist = s.get_kd_triangles() + drawtriangles(myscreen, trilist, camvtk.yellow) + s.jump_kd_up() + + print("ymin: jump ONLY lo") + s.jump_kd_lo() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + else: + #print "ymin: jump both hi and lo" + s.jump_kd_hi() + #print "search hi at level=", s.get_kd_level() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + #print "len tlist=", len(tlist), " now level=", s.get_kd_level() + s.jump_kd_up() + s.jump_kd_lo() + #print "search lo at level=", s.get_kd_level() + kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) + + return + +def drawtriangles(myscreen, trilist, color): + cpp = camvtk.STLSurf(triangleList=trilist) + cpp.SetColor(color) + cpp.SetWireframe() + myscreen.addActor(cpp) + +def drawcuts(myscreen, s): + cut = s.get_kd_cut() + if ( cut[0] < 2 ): + print("x cut ",) + if ( cut[0] == 0): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) + else: + print("min" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) + else: + print("y cut ",) + if ( cut[0] == 2): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) + else: + print("min") + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) + + if (s.jump_kd_hi()): + drawcuts(myscreen, s) + s.jump_kd_up() + if (s.jump_kd_lo()): + drawcuts(myscreen, s) + s.jump_kd_up() + return + + + +def main(): + myscreen = camvtk.VTKScreen() + focal = cam.Point(50, 0, 0) + r = 300 + theta = (float(45)/360)*2*math.pi + fi=45 + + campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) + myscreen.camera.SetPosition(campos.x, campos.y, campos.z) + myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) + + t = camvtk.Text() + t.SetPos( (myscreen.width-450, myscreen.height-30) ) + + + myscreen.addActor( t) + t2 = camvtk.Text() + ytext = "kd-tree debug" #"Y: %3.3f" % (ycoord) + t2.SetText(ytext) + t2.SetPos( (50, myscreen.height-50) ) + myscreen.addActor( t2) + + w2if = vtk.vtkWindowToImageFilter() + w2if.SetInput(myscreen.renWin) + lwr = vtk.vtkPNGWriter() + lwr.SetInput( w2if.GetOutput() ) + + epos = cam.Epos() + epos.setS(0,1) + + t.SetText("OpenCAMLib 10.04-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + + #ycoord = 1.1 + + stl = camvtk.STLSurf(filename="../stl/carpet2.stl") + #stl = camvtk.STLSurf(filename="demo2.stl") + print("STL surface read") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + polydata = stl.src.GetOutput() + s= cam.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STLSurf with ", s.size(), " triangles") + + cutterDiameter=7 + cutter = cam.CylCutter(cutterDiameter) + + cl = cam.Point(31, 42, 3) + + cutactor = camvtk.Cylinder(center=(cl.x,cl.y,cl.z), + radius=cutterDiameter/2, + height=2, + rotXYZ=(90,0,0), + color=camvtk.green) + myscreen.addActor( cutactor ) + + # sphere to see (0,0) + myscreen.addActor( camvtk.Sphere( center=(0,0,0), radius=0.2, color = camvtk.yellow ) ) + + s.build_kdtree() + print("built kd-tree") + s.jump_kd_reset() + + + cpp_tlist = s.getTrianglesUnderCutter(cl, cutter) + + py_tlist = [] + depth = 6 + kdtreesearch(myscreen, py_tlist, s, cutter, cl, depth) + + print("len(cpp_list) after search=", len(cpp_tlist)) + print("len(py_list) after search=", len(py_tlist)) + + cpp = camvtk.STLSurf(triangleList=cpp_tlist) + cpp.SetColor(camvtk.lgreen) + cpp.SetWireframe() + myscreen.addActor(cpp) + + py = camvtk.STLSurf(triangleList=py_tlist) + py.SetColor(camvtk.pink) + py.SetWireframe() + myscreen.addActor(py) + + + + #drawcuts(myscreen, s) + + myscreen.render() + myscreen.iren.Start() + time.sleep(2) + exit() + + tlist = s.get_kd_triangles() + + print("got", len(tlist), " triangles") + + while (s.jump_kd_hi()): + lotris = s.get_kd_triangles() + s.jump_kd_up() + cut = s.get_kd_cut() + s.jump_kd_lo() + hitris = s.get_kd_triangles() + lev = s.get_kd_level() + + print("l=", lev, " hi=", len(hitris), " lo=", len(lotris), " cut=", cut) + + if ( cut[0] < 2 ): + print("x cut ",) + if ( cut[0] == 0): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) + else: + print("min" ) + myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) + else: + print("y cut ",) + if ( cut[0] == 2): + print("max" ) + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) + else: + print("min") + myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) + + + slo = camvtk.STLSurf(triangleList=lotris) + slo.SetColor(camvtk.pink) + slo.SetWireframe() + shi = camvtk.STLSurf(triangleList=hitris) + shi.SetColor(camvtk.lgreen) + shi.SetWireframe() + myscreen.addActor(slo) + myscreen.addActor(shi) + myscreen.render() + #myscreen.iren.Start() + #raw_input("Press Enter to terminate") + time.sleep(1) + myscreen.removeActor(slo) + myscreen.removeActor(shi) + + + + print("done.") + myscreen.render() + #lwr.SetFileName(filename) + + #raw_input("Press Enter to terminate") + time.sleep(0.2) + lwr.Write() + myscreen.iren.Start() + + +if __name__ == "__main__": + main() + #raw_input("Press Enter to terminate") + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_movie1.py opencamlib-11.10-1/examples/python/kdtree_movie1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_movie1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/kdtree_movie1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,183 @@ +import ocl as cam +import camvtk +import time +import vtk +import datetime + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + myscreen.setAmbient(20,20,20) + + #stl = camvtk.STLSurf(filename="demo.stl") + stl = camvtk.STLSurf(filename="demo2.stl") + print("STL surface read") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + #stl.SetFlat() + polydata = stl.src.GetOutput() + s= cam.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STLSurf with ", s.size(), " triangles") + cutterDiameter=0.6 + cutter = cam.CylCutter(cutterDiameter) + #print cutter.str() + #print cc.type + minx=-20 + dx=1 + maxx=20 + + miny=-20 + dy=01 + maxy=20 + z=-0.2 + + bucketSize = 20 + + #pftp = cam.ParallelFinish() + #pftp.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) + #pftp.initSTLSurf(s, bucketSize) + #pftp.dropCutterSTL1(cutter) + #print " made ", pftp.dcCalls, " drop-cutter calls" + #exit + + pf2 = cam.ParallelFinish() + pf2.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) + pf2.initSTLSurf(s, bucketSize) + pf2.dropCutterSTL2(cutter) + print(" made ", pf2.dcCalls, " drop-cutter calls") + + #clpoints = pftp.getCLPoints() + #ccpoints = pftp.getCCPoints() + + clpoints = pf2.getCLPoints() + ccpoints = pf2.getCCPoints() + + #CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + nv=0 + nn=0 + ne=0 + nf=0 + myscreen.camera.SetPosition(3, 100, 15) + myscreen.camera.SetFocalPoint(50, 50, 0) + t = camvtk.Text() + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + + myscreen.addActor( t) + + t2 = camvtk.Text() + t2.SetPos( (myscreen.width-200, 30) ) + myscreen.addActor( t2) + t3 = camvtk.Text() + t3.SetPos( (30, 30)) + myscreen.addActor( t3) + + t4 = camvtk.Text() + t4.SetPos( (30, myscreen.height-60)) + myscreen.addActor( t4) + + n=0 + precl = cam.Point() + + w2if = vtk.vtkWindowToImageFilter() + w2if.SetInput(myscreen.renWin) + lwr = vtk.vtkPNGWriter() + lwr.SetInput( w2if.GetOutput() ) + w2if.Modified() + lwr.SetFileName("tux1.png") + + for cl,cc in zip(clpoints,ccpoints): + + camEye = myscreen.camera.GetFocalPoint() + camPos = myscreen.camera.GetPosition() + postext = "(%3.3f, %3.3f, %3.3f)" % (camPos[0], camPos[1], camPos[2]) + eyetext = "(%3.3f, %3.3f, %3.3f)" % (camEye[0], camEye[1], camEye[2]) + camtext = "Camera LookAt: "+eyetext+"\nCamera Pos: "+ postext + t4.SetText(camtext) + + t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + xtext = "%3.3f" % cl.x + ytext = "%3.3f" % cl.y + ztext = "%3.3f" % cl.z + t2.SetText( "X: " + xtext + "\nY: " + ytext + "\nZ: " + ztext ) + if cc.type==cam.CCType.FACET: + nf+=1 + col = (0,1,1) + elif cc.type == cam.CCType.VERTEX: + nv+=1 + col = (0,1,0) + elif cc.type == cam.CCType.EDGE: + ne+=1 + col = (1,0,0) + elif cc.type == cam.CCType.NONE: + #print "type=NONE!" + nn+=1 + col = (1,1,1) + #if cl.isInside(t): + # col = (0, 1, 0) + #else: + # col = (1, 0, 0) + trilist = pf2.getTrianglesUnderCutter(cl, cutter) + #print "at cl=", cl.str() , " where len(trilist)=", len(trilist) + t3.SetText("Total Triangles: "+ str(s.size()) +"\nUnder Cutter (red): "+str(len(trilist))) + + stl2 = camvtk.STLSurf(filename=None, triangleList=trilist, color=(1,0,0)) # a new surface with only triangles under cutter + stl2.SetWireframe() + #stl2.SetFlat() + myscreen.addActor(stl2) + trilist=[] + + + cutactor = camvtk.Cylinder(center=(cl.x,cl.y,cl.z), radius=cutterDiameter/2, height=2, color=(0.7,1,1)) + myscreen.addActor( cutactor ) + + #myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=col) ) + + if n==0: + precl = cl + else: + d = cl-precl + if (d.norm() < 9): + myscreen.addActor( camvtk.Line( p1=(precl.x, precl.y, precl.z), p2=(cl.x, cl.y, cl.z), color=(0,1,1) ) ) + precl = cl + n=n+1 + #myscreen.addActor( camvtk.Point(center=(cl2.x,cl2.y,cl2.z+0.2) , color=(0.6,0.2,0.9)) ) + #myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z), color=col) ) + #print cc.type + myscreen.camera.Azimuth( 0.2 ) + #time.sleep(0.01) + myscreen.render() + w2if.Modified() + lwr.SetFileName("kdmov"+ ('%05d' % n)+".png") + #lwr.Write() + + + #raw_input("Press Enter to continue") + myscreen.removeActor(stl2) + myscreen.removeActor( cutactor ) + + print("none=",nn," vertex=",nv, " edge=",ne, " facet=",nf, " sum=", nn+nv+ne+nf) + print(len(clpoints), " cl points evaluated") + + + + + #lwr.Write() + + + + for n in range(1,36): + t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + myscreen.camera.Azimuth( 1 ) + time.sleep(0.01) + myscreen.render() + lwr.SetFileName("kd_frame"+ ('%03d' % n)+".png") + w2if.Modified() + #lwr.Write() + + + + + myscreen.iren.Start() + raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_movie2.py opencamlib-11.10-1/examples/python/kdtree_movie2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/kdtree_movie2.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/kdtree_movie2.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,192 @@ +import ocl as cam +import camvtk +import time +import vtk +import datetime + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + myscreen.setAmbient(20,20,20) + + myscreen.camera.SetPosition(20, 30, 50) + myscreen.camera.SetFocalPoint(5, 5, 0) + + stl = camvtk.STLSurf(filename="stl/demo.stl") + #stl = camvtk.STLSurf(filename="demo2.stl") + print("STL surface read") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + #stl.SetFlat() + polydata = stl.src.GetOutput() + s= cam.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STLSurf with ", s.size(), " triangles") + cutterDiameter=1 + cutter = cam.CylCutter(cutterDiameter) + #print cutter.str() + #print cc.type + minx=0 + dx=1 + maxx=10 + + miny=0 + dy=1 + maxy=10 + z=-10 + + bucketSize = 20 + + #pftp = cam.ParallelFinish() + #pftp.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) + #pftp.initSTLSurf(s, bucketSize) + #pftp.dropCutterSTL1(cutter) + #print " made ", pftp.dcCalls, " drop-cutter calls" + #exit + + pf2 = cam.ParallelFinish() + pf2.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) + pf2.initSTLSurf(s, bucketSize) + pf2.dropCutterSTL2(cutter) + print(" made ", pf2.dcCalls, " drop-cutter calls") + + #clpoints = pftp.getCLPoints() + #ccpoints = pftp.getCCPoints() + + clpoints = pf2.getCLPoints() + ccpoints = pf2.getCCPoints() + + #CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + nv=0 + nn=0 + ne=0 + nf=0 + + t = camvtk.Text() + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + + myscreen.addActor( t) + + t2 = camvtk.Text() + t2.SetPos( (myscreen.width-200, 30) ) + myscreen.addActor( t2) + t3 = camvtk.Text() + t3.SetPos( (30, 30)) + myscreen.addActor( t3) + + t4 = camvtk.Text() + t4.SetPos( (30, myscreen.height-60)) + myscreen.addActor( t4) + + n=0 + precl = cam.Point() + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("tux1.png") + + for cl,cc in zip(clpoints,ccpoints): + + camEye = myscreen.camera.GetFocalPoint() + camPos = myscreen.camera.GetPosition() + postext = "(%3.3f, %3.3f, %3.3f)" % (camPos[0], camPos[1], camPos[2]) + eyetext = "(%3.3f, %3.3f, %3.3f)" % (camEye[0], camEye[1], camEye[2]) + camtext = "Camera LookAt: "+eyetext+"\nCamera Pos: "+ postext + t4.SetText(camtext) + + t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + xtext = "%3.3f" % cl.x + ytext = "%3.3f" % cl.y + ztext = "%3.3f" % cl.z + t2.SetText( "X: " + xtext + "\nY: " + ytext + "\nZ: " + ztext ) + if cc.type==cam.CCType.FACET: + nf+=1 + col = (0,1,1) + elif cc.type == cam.CCType.VERTEX: + nv+=1 + col = (0,1,0) + elif cc.type == cam.CCType.EDGE: + ne+=1 + col = (1,0,0) + elif cc.type == cam.CCType.NONE: + #print "type=NONE!" + nn+=1 + col = (1,1,1) + #if cl.isInside(t): + # col = (0, 1, 0) + #else: + # col = (1, 0, 0) + trilist = pf2.getTrianglesUnderCutter(cl, cutter) + #print "at cl=", cl.str() , " where len(trilist)=", len(trilist) + t3.SetText("Total Triangles: "+ str(s.size()) +"\nUnder Cutter (red): "+str(len(trilist))) + + stl2 = camvtk.STLSurf(filename=None, triangleList=trilist, color=(1,0,0)) # a new surface with only triangles under cutter + stl2.SetWireframe() + #stl2.SetFlat() + myscreen.addActor(stl2) + trilist=[] + + + cutactor = camvtk.Cylinder(center=(cl.x,cl.y,cl.z), + radius=cutterDiameter/2, + height=20, + rotXYZ=(90,0,0), + color=(0.7,0,1)) + myscreen.addActor( cutactor ) + + myscreen.addActor( camvtk.Sphere(center=(cl.x,cl.y,cl.z) ,radius=0.03, color=col) ) + + """ + if n==0: + precl = cl + else: + d = cl-precl + if (d.norm() < 90): + myscreen.addActor( camvtk.Line( p1=(precl.x, precl.y, precl.z), p2=(cl.x, cl.y, cl.z), color=(0,1,1) ) ) + precl = cl + """ + + n=n+1 + #myscreen.addActor( camvtk.Point(center=(cl2.x,cl2.y,cl2.z+0.2) , color=(0.6,0.2,0.9)) ) + #myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z), color=col) ) + #print cc.type + #myscreen.camera.Azimuth( 0.2 ) + time.sleep(0.1) + myscreen.render() + #w2if.Modified() + #lwr.SetFileName("kdbig"+ ('%05d' % n)+".png") + #lwr.Write() + + + #raw_input("Press Enter to continue") + myscreen.removeActor(stl2) + myscreen.removeActor( cutactor ) + + print("none=",nn," vertex=",nv, " edge=",ne, " facet=",nf, " sum=", nn+nv+ne+nf) + print(len(clpoints), " cl points evaluated") + + + + + #lwr.Write() + + + + for n in range(1,36): + t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + myscreen.camera.Azimuth( 1 ) + time.sleep(0.01) + myscreen.render() + #lwr.SetFileName("kd_frame"+ ('%03d' % n)+".png") + #w2if.Modified() + #lwr.Write() + + + + + myscreen.iren.Start() + raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/lineclfilter_test.py opencamlib-11.10-1/examples/python/lineclfilter_test.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/lineclfilter_test.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/lineclfilter_test.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,21 @@ +import ocl + +print ocl.version() + +p0 = ocl.CLPoint(0,0,0) +p1 = ocl.CLPoint(1,2,3) +p2 = ocl.CLPoint(1.1,2.2,3.3) +clp=[] +clp.append(p0) +clp.append(p1) +clp.append(p2) + +f = ocl.LineCLFilter() +f.setTolerance(0.01) +for p in clp: + f.addCLPoint(p) + +f.run() +p2 = f.getCLPoints() +for p in p2: + print(p) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/mov_kdtree.sh opencamlib-11.10-1/examples/python/mov_kdtree.sh --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/mov_kdtree.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/mov_kdtree.sh 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,19 @@ +#!/bin/sh + +#first convert to JPEG +#mogrify -format jpg -quality 97 *.png + +# a script for encoding jpeg-frames into a video suitable for uploading to youtube or vimeo + +# oldest, not very good... +#mencoder mf://*.jpg -mf fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4 -ac copy -o output.avi -ffourcc DX50 + +# -aspect 16:9 +# -mf fps=25:type=png - +# better. +mencoder mf://*.png -mf type=png -of lavf -ovc lavc -lavcopts aglobal=1:vglobal=1:coder=0:vcodec=mpeg4:vbitrate=24000000 -vf scale=1280:720 -ofps 30000/1001 -o OUTPUTp_24long.mp4 + +# not so good. +#mencoder mf://*.jpg -mf w=800:h=600:fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output4.avi + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/mov.sh opencamlib-11.10-1/examples/python/mov.sh --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/mov.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/mov.sh 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,16 @@ +#!/bin/sh + +# a script for encoding jpeg-frames into a video suitable for uploading to youtube or vimeo + +# oldest, not very good... +#mencoder mf://*.jpg -mf fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4 -ac copy -o output.avi -ffourcc DX50 + +# better. +mencoder mf://frames/*.png -mf fps=3:type=png -aspect 16:9 -of lavf -ovc lavc -lavcopts aglobal=1:vglobal=1:coder=0:vcodec=mpeg4:vbitrate=4500 -vf scale=1280:720 -ofps 3000/1001 -o OUTPUT3.mp4 + +# not so good. +#mencoder mf://*.jpg -mf w=800:h=600:fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output4.avi + + +# joining two or more files: +# mencoder f1.mp4 f2.mp4 f3.mp4 f4.mp4 -mf fps=3 -oac copy -of lavf -ovc copy -lavcopts aglobal=1:vglobal=1:coder=0:vcodec=mpeg4:vbitrate=4500 -vf scale=1280:720 -o output.mp4 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_bounding-box.py opencamlib-11.10-1/examples/python/ocl_bounding-box.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_bounding-box.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_bounding-box.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,70 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def drawBB(myscreen, bb): + lines=[] + # x-direction lines, red color + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.minpt.y, bb.minpt.z), color=camvtk.red) ) + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.maxpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.minpt.z), color=camvtk.red) ) + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.maxpt.z), p2=(bb.maxpt.x, bb.minpt.y, bb.maxpt.z), color=camvtk.red) ) + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.maxpt.y, bb.maxpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.red) ) + + # y-direction lines, green color + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.minpt.x, bb.maxpt.y, bb.minpt.z), color=camvtk.green) ) + lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.minpt.z), color=camvtk.green) ) + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.maxpt.z), p2=(bb.minpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.green) ) + lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.minpt.y, bb.maxpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.green) ) + + # z-direction lines, blue color + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.minpt.x, bb.minpt.y, bb.maxpt.z), color=camvtk.blue) ) + lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.minpt.y, bb.maxpt.z), color=camvtk.blue) ) + lines.append( camvtk.Line( p1=(bb.minpt.x, bb.maxpt.y, bb.minpt.z), p2=(bb.minpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.blue) ) + lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.maxpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.blue) ) + + for l in lines: + myscreen.addActor(l) + +if __name__ == "__main__": + print(ocl.version()) + + myscreen = camvtk.VTKScreen() + + stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") + #stl = camvtk.STLSurf("../stl/beet_mm.stl") + #stl = camvtk.STLSurf("../stl/Blade.stl") + myscreen.addActor(stl) + stl.SetWireframe() + stl.SetColor((0.5,0.5,0.5)) + + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read ", s.size(), " triangles") + + minimum_point = s.bb.minpt + maximum_point = s.bb.maxpt + print("min point =", minimum_point) + print("max point =", maximum_point) + print(s.getBounds()) + + # render the min and max points + myscreen.addActor( camvtk.Sphere( center=(minimum_point.x, minimum_point.y, minimum_point.z), radius=0.1, color=camvtk.red) ) + myscreen.addActor( camvtk.Sphere( center=(maximum_point.x, maximum_point.y, maximum_point.z), radius=0.1, color=camvtk.green) ) + + # render a bounding-box + drawBB( myscreen, s.bb ) + + myscreen.camera.SetPosition(3, 23, 15) + myscreen.camera.SetFocalPoint(4, 5, 0) + t = camvtk.Text() + t.SetText("OpenCAMLib") + t.SetPos( (myscreen.width-200, myscreen.height-30) ) + myscreen.addActor( t) + + myscreen.render() + myscreen.iren.Start() + raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_clpoint.py opencamlib-11.10-1/examples/python/ocl_clpoint.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_clpoint.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_clpoint.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,16 @@ +import ocl + +# print(ocl.version()) + +p = ocl.Point(1,2,3) +print p +cc = ocl.CCPoint(4,5,6) +print cc +cl = ocl.CLPoint() +print cl +cl2 = ocl.CLPoint(7,8,9) +print cl2 +cl3 = ocl.CLPoint(10,11,12,cc) +print cl3 +cc.x=77 +print cl3 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_docstring_test.py opencamlib-11.10-1/examples/python/ocl_docstring_test.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_docstring_test.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_docstring_test.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,8 @@ +import ocl +#help(ocl) + +# +c=ocl.BallCutter(1,2) +print c.__doc__ +print ocl.version() +help(ocl.BallCutter(4,5)) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_interval.py opencamlib-11.10-1/examples/python/ocl_interval.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_interval.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_interval.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,24 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + + +if __name__ == "__main__": + print(ocl.version()) + i = ocl.Interval() + print(i) + i = ocl.Interval(0.123, 0.456) + print(i) + cc = ocl.CCPoint(1,2,3) + cc.type = ocl.CCType.VERTEX + i.updateLower(-0.222,cc) + print(i) + i.updateLower(0,cc) + print(i) + i.updateUpper(0,cc) + print(i) + i.updateUpper(2,cc) + print(i) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_offsetCutter_1.py opencamlib-11.10-1/examples/python/ocl_offsetCutter_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_offsetCutter_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_offsetCutter_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,33 @@ +import ocl +import math + +print ocl.version() + +# cylinder +c = ocl.CylCutter(2.345, 5) +d = c.offsetCutter(0.1) +print c +print "offset: ",d +print + +# ball +c = ocl.BallCutter(2.345, 6) +d = c.offsetCutter(0.1) +print c +print "offset: ",d +print + +# bull +c = ocl.BullCutter(2.345, 0.123, 6) +d = c.offsetCutter(0.1) +print c +print "offset: ",d +print + +# cone +c = ocl.ConeCutter(2.345, math.pi/6) +d = c.offsetCutter(0.1) +print c +print "offset: ",d + +# TODO: add compound-cutters here below. diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_stl2ocl_tst.py opencamlib-11.10-1/examples/python/ocl_stl2ocl_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_stl2ocl_tst.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_stl2ocl_tst.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,21 @@ +import ocl +import camvtk +import time + +if __name__ == "__main__": + s= ocl.STLSurf() + print(s) + myscreen = camvtk.VTKScreen() + stl = camvtk.STLSurf("../stl/demo.stl") + print("STL surface read") + myscreen.addActor(stl) + stl.SetWireframe() + + polydata = stl.src.GetOutput() + camvtk.vtkPolyData2OCLSTL(polydata, s) + + print(s) + myscreen.render() + myscreen.iren.Start() + + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_stlsurf_polydata.py opencamlib-11.10-1/examples/python/ocl_stlsurf_polydata.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_stlsurf_polydata.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_stlsurf_polydata.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,52 @@ +import ocl +import camvtk +import time + + +if __name__ == "__main__": + p = ocl.Point() + p.x=7 + p.y=8 + p.z=-3 + print(p) + q = ocl.Point(1,2,3) + r = p + q + t = ocl.Triangle(p,q,r) + print(t) + s= ocl.STLSurf() + print(s) + s.addTriangle(t) + s.addTriangle(t) + print(s) + print("end.") + + myscreen = camvtk.VTKScreen() + print("screen created") + stl = camvtk.STLSurf("../stl/sphere.stl") + print("STL surface read") + myscreen.addActor(stl) + + b = stl.src.GetOutput() + print(b) + print("Verts:",b.GetNumberOfVerts()) + print("Cells:",b.GetNumberOfCells()) + print("Lines:",b.GetNumberOfLines()) + print("Polys:",b.GetNumberOfPolys()) + print("Strips:",b.GetNumberOfStrips()) + c = b.GetCell(0) + print(c) + print("Points:",c.GetNumberOfPoints()) + print("Edges:",c.GetNumberOfEdges()) + print("Faces:",c.GetNumberOfFaces()) + ps = c.GetPoints() + print(ps) + n=ps.GetNumberOfPoints() + print("Nr of Points:",n) + for id in range(0,n): + print(id,"=",) + print(ps.GetPoint(id)) + myscreen.addActor( camvtk.Sphere(radius=0.5,center=ps.GetPoint(id)) ) + myscreen.render() + myscreen.iren.Start() + #raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_test0.py opencamlib-11.10-1/examples/python/ocl_test0.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/ocl_test0.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/ocl_test0.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,32 @@ +import ocl + +if __name__ == "__main__": + p = ocl.Point() + p.x=7 + p.y=8 + p.z=-3 + + print(p) + q = ocl.Point(1,2,3) + print(q) + r = p + q + s = ocl.Point(66,66,66) + s += r + print(r) + print(s) + print("2*s=", (s*2)) + print("s.norm=", s.norm()) + print("normalizing") + s.normalize() + print("s.norm=", s.norm()) + print("s dot r", s.dot(r)) + print("s cross r", s.cross(r)) + t = ocl.Triangle(p,q,r) + print(t) + s= ocl.STLSurf() + print(s) + s.addTriangle(t) + s.addTriangle(t) + print(s) + print("end.") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/octree_fig.py opencamlib-11.10-1/examples/python/octree_fig.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/octree_fig.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/octree_fig.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,93 @@ +import ocl +import pyocl +import camvtk +import time +import datetime +import vtk +import math +""" +This scripts draws a picture which enumerates the vertices, edges, and faces +of an octree node, as used in the octree cutting simulation and +marching-cubes. +""" +def main(): + print(ocl.version()) + myscreen = camvtk.VTKScreen() + myscreen.camera.SetPosition(-8, -4, 25) + myscreen.camera.SetFocalPoint(0,0, 0) + arpos=-1.5 + camvtk.drawArrows(myscreen,center=(arpos,arpos,arpos)) + camvtk.drawOCLtext(myscreen) + octtext = camvtk.Text() + octtext.SetPos( (70, myscreen.height-600) ) + myscreen.addActor( octtext) + octtext.SetText("Octree") + vertex = [ ocl.Point( 1, 1,-1), #// 0 + ocl.Point(-1, 1,-1), #// 1 + ocl.Point(-1,-1,-1), #// 2 + ocl.Point( 1,-1,-1), #// 3 + ocl.Point( 1, 1, 1), #// 4 + ocl.Point(-1, 1, 1), #// 5 + ocl.Point(-1,-1, 1), #// 6 + ocl.Point( 1,-1, 1) #// 7 + ] + + n=0 + for v in vertex: + myscreen.addActor( camvtk.Sphere(center=(v.x,v.y,v.z), radius=0.1,color=camvtk.red)) + v=v + t = camvtk.Text3D(color=camvtk.red, center=(v.x+0.1,v.y+0.1,v.z), text=str(n), scale=0.2, camera=myscreen.camera) + myscreen.addActor(t) + n=n+1 + + edgeTable = [ [0,1] , + [1,2] , + [2,3] , + [3,0] , + [4,5] , + [5,6] , + [6,7] , + [7,4] , + [0,4] , + [1,5] , + [2,6] , + [3,7] , + ] + + # draw the edges as tubes + ne = 0 + for e in edgeTable: + + ep1 = vertex[ e[0] ] + ep2 = vertex[ e[1] ] + tu = camvtk.Tube( p1=(ep1.x,ep1.y,ep1.z), p2=(ep2.x,ep2.y,ep2.z), radius=0.051, color=camvtk.green ) + myscreen.addActor(tu) + mid = 0.5*(ep1 + ep2) + t = camvtk.Text3D(color=camvtk.green, center=(mid.x+0.1,mid.y+0.1,mid.z), text=str(ne), scale=0.2, camera=myscreen.camera) + myscreen.addActor(t) + ne=ne+1 + + # number the faces + face = [ [2,3,6,7] , + [0,3,4,7] , + [0,1,4,5] , + [1,2,5,6] , + [0,1,2,3] , + [4,5,6,7] , + ] + nf=0 + for f in face: + mid = ocl.Point() + for v in f: + mid = mid+vertex[v] + mid=0.25*mid + t = camvtk.Text3D(color=camvtk.blue, center=(mid.x,mid.y,mid.z), text=str(nf), scale=0.2, camera=myscreen.camera) + myscreen.addActor(t) + nf=nf+1 + myscreen.render() + print("All done.") + myscreen.iren.Start() + +if __name__ == "__main__": + + main() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offsetCutter_test_2.py opencamlib-11.10-1/examples/python/offsetCutter_test_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offsetCutter_test_2.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offsetCutter_test_2.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,115 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +def CLPointGrid(minx,dx,maxx,miny,dy,maxy,z): + plist = [] + xvalues = [round(minx+n*dx,2) for n in range(int(round((maxx-minx)/dx))+1) ] + yvalues = [round(miny+n*dy,2) for n in range(int(round((maxy-miny)/dy))+1) ] + for y in yvalues: + for x in xvalues: + plist.append( ocl.CLPoint(x,y,z) ) + return plist + +def drawPoints(myscreen, clpoints, ccpoints): + c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) + c.SetPoints() + myscreen.addActor(c ) + + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + + a=ocl.Point(1,0.6,0.1) + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) + b=ocl.Point(0,1,0) + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) + c=ocl.Point(0,0,0.0) + myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) + + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) + myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + + t = ocl.Triangle(b,c,a) + radius1=1 + angle = math.pi/4 + length=10 + #cutter = ocl.ConeCutter(0.37, angle) + + cutter = ocl.BallCutter(0.532, length) + #cutter = ocl.CylCutter(0.3, length) + #cutter = ocl.BullCutter(0.7,0.1, length) + + # these cutters do not have offsets yet (?) + #cutter = ocl.CylConeCutter(0.2,0.5,math.pi/9) + #cutter = ocl.BallConeCutter(0.4,0.6,math.pi/9) + #cutter = ocl.BullConeCutter(0.4,0.1,0.7,math.pi/6) + #cutter = ocl.ConeConeCutter(0.4,math.pi/3,0.7,math.pi/6) + #cutter = ocl.ConeCutter(0.4, math.pi/3) + print(cutter) + offset=0.1 + c2 = cutter.offsetCutter(offset) + print(c2) + + minx=-0.5 + dx=0.0051 + maxx=1.5 + miny=-0.7 + dy=dx + maxy=1.5 + z=-1.8 + clpoints = CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) + print(len(clpoints), "cl-points to evaluate") + n=0 + ccpoints=[] + cl2pts=[] + for p in clpoints: + cl2pts.append(ocl.CLPoint(p.x,p.y,p.z)) + + for (cl,cl2) in zip(clpoints,cl2pts): + + #cutter.vertexDrop(cl,t) + #cutter.edgeDrop(cl,t) + #cutter.facetDrop(cl,t) + #c2.vertexDrop(cl2,t) + cutter.dropCutter(cl,t) + c2.dropCutter(cl2,t) + n=n+1 + if (n % int(len(clpoints)/10)) == 0: + print(n/int(len(clpoints)/10), " ",) + + print("done.") + + print("rendering...") + print(" len(clpoints)=", len(clpoints)) + print(" len(ccl2pts)=", len(cl2pts)) + print("rendering clpoints...",) + camvtk.drawCLPointCloud(myscreen, clpoints) + print("done.") + cl2ptsofs=[] + for p in cl2pts: + p.z = p.z + offset + cl2ptsofs.append(p) + print("rendering offset clpoints...",) + camvtk.drawCLPointCloud(myscreen, cl2ptsofs) + print("done.") + origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) + origo.SetOpacity(0.2) + myscreen.addActor( origo ) + + myscreen.camera.SetPosition(0.5, 3, 2) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + myscreen.render() + w2if = vtk.vtkWindowToImageFilter() + w2if.SetInput(myscreen.renWin) + lwr = vtk.vtkPNGWriter() + lwr.SetInput( w2if.GetOutput() ) + t = camvtk.Text() + t.SetPos( (myscreen.width-350, myscreen.height-30) ) + myscreen.addActor(t) + myscreen.iren.Start() + #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/epos_test.py opencamlib-11.10-1/examples/python/offset-ellipse/epos_test.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/epos_test.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offset-ellipse/epos_test.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,17 @@ +import ocl +import camvtk +import time +import vtk +import datetime +import math + +if __name__ == "__main__": + p = ocl.Epos() + print("initial Epos() is ",p, "with dia=",p.d) + + for n in range(0,30): + print(p.d," : ",p) + p.d = p.d - 0.25 + p.setD() + + raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oeanim.py opencamlib-11.10-1/examples/python/offset-ellipse/oeanim.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oeanim.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offset-ellipse/oeanim.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,18 @@ +import oellipse5_tst as oe +import math + +Nsteps = 500 +ystart = -0.2 +ystop = 2.2 + +ystep = (ystop-ystart)/(Nsteps-1) +fiangle = 55 + +def radian(deg): + return (float(deg)/360)*2*math.pi + +for n in range(0,Nsteps): + yc = ystart + n*ystep + fname = "frames/oet"+ ('%05d' % n)+".png" + oe.main(ycoord=yc, filename=fname, theta=70, fi=radian(fiangle)) + #fiangle = fiangle + 2 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse0_tst.py opencamlib-11.10-1/examples/python/offset-ellipse/oellipse0_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse0_tst.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offset-ellipse/oellipse0_tst.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,219 @@ +import ocl as cam +import camvtk +import time +import vtk +import math + +red= (1,0,0) +green= (0,1,0) +blue= (0,0,1) +cyan= (0,1,1) +yellow= (1,1,0) +magenta =(float(255)/255,0,float(225)/255) +pink =(float(255)/255,float(193)/255,float(203)/255) + +def ccColor2(cc): + """ this function returns a different color depending on the type of + the CC-point. Useful for visualizing CL or CC points """ + if cc.type==cam.CCType.FACET: + col = (1,0,1) + elif cc.type == cam.CCType.VERTEX: + col = (1,1,0) + elif cc.type == cam.CCType.EDGE: + col = (0,1,1) + elif cc.type == cam.CCType.NONE: + col = (1,1,1) + elif cc.type == cam.CCType.ERROR: + col = (0,0.5,1) + return col + +class OffsetEllipse(): + """ + // (s, t) where: s^2 + t^2 = 1 + // point of ellipse is: ecen + j s + n t + // tangent at point is: -j t + n s + // normal at point is: j (s / eccen) + n (t * eccen) + // point on offset-ellipse: point on ellipse + offrad*normal + """ + def __init__(self, ecen, a, b, ofs): + self.a = a + self.b = b + self.ecen = ecen + self.ofs = ofs + + def ePoint(self,t,s): + # return a point on the ellipse + p = cam.Point() + p.x = self.ecen.x + self.a*s + p.y = self.ecen.y + self.b*t + return p + + def oePoint(self,t,s): + # return point on offset-ellipse + p = self.ePoint(t,s) + normal = cam.Point( self.b*s, self.a*t, 0) + normal.normalize() + p = p + self.ofs*normal + return p + + def teval(self, s, side): + ssq = s*s + tsq = 1 - ssq + if side == 1: + return 1 * math.sqrt(tsq) + else: + return -1* math.sqrt(tsq) + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + + a=cam.Point(3,2,-2) + b=cam.Point(-1,2,3) + + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); + #c=cam.Point(0,0,0.3) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + #t = cam.Triangle(a,b,c) + length = 5 + cutter = cam.BullCutter(1,0.2,length) + + + print(cutter) + + xar = camvtk.Arrow(color=red, rotXYZ=(0,0,0)) + myscreen.addActor(xar) + yar = camvtk.Arrow(color=green, rotXYZ=(0,0,90)) + myscreen.addActor(yar) + zar = camvtk.Arrow(color=blue, rotXYZ=(0,-90,0)) + myscreen.addActor(zar) + + cl = cam.Point(2.193, 1, 0) + radius1=1 + radius2=0.25 + + tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) + #tor.SetWireframe() + tor.SetSurface() + tor.SetOpacity(0.3) + myscreen.addActor(tor) + + cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), + rotXYZ=(90,0,0), resolution=50 ) + #myscreen.addActor(cyl) + + tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),radius=radius2, color=(1,1,0)) + tube.SetOpacity(0.1) + myscreen.addActor(tube) + + cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=yellow) + myscreen.addActor(cir) + + clp = camvtk.Sphere(radius=0.02, center=(cl.x,cl.y,cl.z), color=yellow) + myscreen.addActor(clp) + + # short axis of ellipse = radius2 + # long axis of ellipse = radius2/sin(theta) + # where theta is the slope of the line + dx = b.x - a.x + dz = b.z - a.z + print("dx=", dx) + print("dz=", dz) + theta = math.atan(dz/dx) + print("theta=",theta) + a = abs( radius2/math.sin(theta) ) + print("a=", a, " = ", a/radius2,"* radius2") + # ellipse + #a=2 + b=radius2 + print("b= ", b) + + + ecen_tmp=cam.Point(1.38,2,0) + resolution=50 + for n in range(0,resolution): + angle1= (float(n)/float(resolution))*2*math.pi + angle2= (float(n+1)/float(resolution))*2*math.pi + x=ecen_tmp.x + a*math.cos(angle1) + y=ecen_tmp.y + b*math.sin(angle1) + x2=ecen_tmp.x + a*math.cos(angle2) + y2=ecen_tmp.y + b*math.sin(angle2) + + #myscreen.addActor(camvtk.Point(center=(x,y,0), color=(1,0,1))) + #myscreen.addActor( camvtk.Line(p1=(x,y,0),p2=(x2,y2,0)) ) + + oe = cam.Ellipse(ecen_tmp, a, b, radius1) + + myscreen.camera.SetPosition(5, 7, 1) + myscreen.camera.SetFocalPoint(0.5, 0.5, 0) + + nmax=80 + dd = float(4.0)/nmax + diangles = [ n*dd for n in range(nmax) ] + epos1 = cam.EllipsePosition() + epos2 = cam.EllipsePosition() + for n in range(nmax): + #s = float(n)/float(nmax-1) * 2-1 + #t = oe.teval(s, 1) + #t2 = oe.teval(s, 0) + n2 = n+1 + if n2==nmax: + n2=0 + epos1.setDiangle( diangles[n] ) + epos2.setDiangle( diangles[n2] ) + + p1 = oe.ePoint( epos1 ) + p2 = oe.ePoint( epos2 ) + + p1o = oe.oePoint( epos1 ) + p2o = oe.oePoint( epos2 ) + #print "s=", s, "t=", t," epoint=", p1.str() + + myscreen.addActor( camvtk.Line(p1=(p1.x,p1.y,p1.z),p2=(p2.x,p2.y,p2.z), color=magenta) ) + + myscreen.addActor( camvtk.Line(p1=(p1o.x,p1o.y,p1o.z),p2=(p2o.x,p2o.y,p2o.z), color=pink) ) + #myscreen.addActor(camvtk.Point(center=(p1.x,p1.y,0), color=green)) + #myscreen.addActor(camvtk.Point(center=(p2.x,p2.y,0), color=red)) + + #myscreen.addActor(camvtk.Point(center=(p1o.x,p1o.y,0), color=green)) + #myscreen.addActor(camvtk.Point(center=(p2o.x,p2o.y,0), color=red)) + + # ellipse point, normal + #epos1.setDiangle(3.48) # approx solution + epos1.setDiangle(0) + ep = oe.ePoint( epos1 ) + oep = oe.oePoint( epos1 ) + myscreen.addActor( camvtk.Sphere(radius=0.02, center=(ep.x,ep.y,ep.z), color=magenta) ) + myscreen.addActor( camvtk.Sphere(radius=0.02, center=(oep.x,oep.y,oep.z), color=pink) ) + myscreen.addActor( camvtk.Line(p1=(ep.x,ep.y,ep.z),p2=(oep.x,oep.y,oep.z), color=red) ) + + myscreen.render() + #time.sleep(0.5) + + print("rendering...",) + #for cl,cc in zip(clpoints,ccpoints): + # myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=ccColor(cc) ) ) + # if cc.type != cam.CCType.NONE: # only render interesting cc-points + # myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z) , color=ccColor2(cc) ) ) + + + print("done.") + + + + + myscreen.render() + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("5_all.png") + #lwr.Write() + + + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse2_tst.py opencamlib-11.10-1/examples/python/offset-ellipse/oellipse2_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse2_tst.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offset-ellipse/oellipse2_tst.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,387 @@ +import ocl as cam +import camvtk +import time +import vtk +import math +import datetime + +red= (1,0,0) +green= (0,1,0) +blue= (0,0,1) +cyan= (0,1,1) +yellow= (1,1,0) +pink = ( float(255)/255,float(192)/255,float(203)/255) +grey = ( float(127)/255,float(127)/255,float(127)/255) +orange = ( float(255)/255,float(165)/255,float(0)/255) + +def ccColor2(cc): + """ this function returns a different color depending on the type of + the CC-point. Useful for visualizing CL or CC points """ + if cc.type==cam.CCType.FACET: + col = (1,0,1) + elif cc.type == cam.CCType.VERTEX: + col = (1,1,0) + elif cc.type == cam.CCType.EDGE: + col = (0,1,1) + elif cc.type == cam.CCType.NONE: + col = (1,1,1) + elif cc.type == cam.CCType.ERROR: + col = (0,0.5,1) + return col + +class OffsetEllipse(): + """ + // (s, t) where: s^2 + t^2 = 1 + // point of ellipse is: ecen + j s + n t + // tangent at point is: -j t + n s + // normal at point is: j (s / eccen) + n (t * eccen) + // point on offset-ellipse: point on ellipse + offrad*normal + """ + def __init__(self, ecen, a, b, ofs): + self.a = a + self.b = b + self.ecen = ecen + self.ofs = ofs + + def ePoint(self,epos): + # return a point on the ellipse + p = cam.Point() + p.x = self.ecen.x + self.a*epos.s + p.y = self.ecen.y + self.b*epos.t + return p + + def oePoint(self,epos): + # return point on offset-ellipse + p = self.ePoint(epos) + normal = self.eNorm(epos) + p.x = p.x + self.ofs*normal.x + p.y = p.y + self.ofs*normal.y + return p + + def eNorm(self, epos): + normal = cam.Point( self.b*epos.s, self.a*epos.t, 0) + normal.normalize() + return normal + + def eTang(self, epos): + p = cam.Point(-self.a*epos.t, self.b*epos.s, 0) + p.normalize() + return p + + def error(self,epos,cl): + p1 = self.oePoint(epos) + p2 = cl + dx = p1.x - cl.x + dy = p1.y - cl.y + #return dx*dx+dy*dy + return dy + + + +class EPos(): + """ + // (s, t) where: s^2 + t^2 = 1 + // point of ellipse is: ecen + j s + n t + // tangent at point is: -j t + n s + // normal at point is: j (s / eccen) + n (t * eccen) + // point on offset-ellipse: point on ellipse + offrad*normal + """ + def __init__(self): + self.t = 1 + self.s = 0 + self.sett(self.t,1) + + def sets(self, s, side): + if s > 1.0: + s = 1.0 + if s < -1.0: + s = -1.0 + + self.s = s + ssq = s*s + tsq = 1 - ssq + if side == 1: + self.t = 1 * math.sqrt(tsq) + else: + self.t = -1 * math.sqrt(tsq) + + def sett(self, t, side): + if t > 1.0: + t = 1.0 + if t < -1.0: + t = -1.0 + + self.t = t + tsq = t*t + ssq = 1 - tsq + if side == 1: + self.s = 1 * math.sqrt(ssq) + else: + self.s = -1* math.sqrt(ssq) + + def stepTang(self, ellipse, delta): + tang = oe.eTang(self) + #print " epos= (", self.s," , ", self.t , " )" + #print "steptang tang=", tang.str() + if abs(tang.x) > abs(tang.y): + #print "s-dir step" + news = self.s + delta*tang.x + if self.t > 0: + self.sets(news,1) + else: + self.sets(news,0) + else: + #print "t-dir step" + newt = self.t + delta*tang.y + if self.s>0: + self.sett( newt,1) + else: + self.sett( newt,0) + + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + + myscreen.camera.SetPosition(5, 3, 2) + myscreen.camera.SetFocalPoint(1.38,1, 0) + + a=cam.Point(3,2,-2) + b=cam.Point(-1,2,3) + + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); + #c=cam.Point(0,0,0.3) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + #t = cam.Triangle(a,b,c) + + cutter_length = 2 + cutter = cam.BullCutter(1,0.2, cutter_length) + + + print(cutter) + + xar = camvtk.Arrow(color=red, rotXYZ=(0,0,0)) + myscreen.addActor(xar) + yar = camvtk.Arrow(color=green, rotXYZ=(0,0,90)) + myscreen.addActor(yar) + zar = camvtk.Arrow(color=blue, rotXYZ=(0,-90,0)) + myscreen.addActor(zar) + + cl = cam.Point(2.193, 1, 0) + radius1=1 + radius2=0.25 + + tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) + #tor.SetWireframe() + #myscreen.addActor(tor) + + cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), + rotXYZ=(90,0,0), resolution=50 ) + #myscreen.addActor(cyl) + + tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),color=(1,1,0)) + tube.SetOpacity(0.2) + #myscreen.addActor(tube) + + cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=yellow) + myscreen.addActor(cir) + + clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) + myscreen.addActor(clp) + + # short axis of ellipse = radius2 + # long axis of ellipse = radius2/sin(theta) + # where theta is the slope of the line + dx = b.x - a.x + dz = b.z - a.z + #print "dx=", dx + #print "dz=", dz + theta = math.atan(dz/dx) + #print "theta=",theta + a = abs( radius2/math.sin(theta) ) + #print "a=", a, " = ", a/radius2,"* radius2" + # ellipse + #a=2 + b=radius2 + #print "b= ", b + + + ecen_tmp=cam.Point(1.38,2,0) + resolution=50 + for n in range(0,resolution): + angle1= (float(n)/float(resolution))*2*math.pi + angle2= (float(n+1)/float(resolution))*2*math.pi + x=ecen_tmp.x + a*math.cos(angle1) + y=ecen_tmp.y + b*math.sin(angle1) + x2=ecen_tmp.x + a*math.cos(angle2) + y2=ecen_tmp.y + b*math.sin(angle2) + + #myscreen.addActor(camvtk.Point(center=(x,y,0), color=(1,0,1))) + #myscreen.addActor( camvtk.Line(p1=(x,y,0),p2=(x2,y2,0)) ) + + oe = OffsetEllipse(ecen_tmp, a, b, radius1) + + + + nmax=20 + delta=0.05 + td = 1 + epos1 = EPos() + epos2 = EPos() + epos3 = EPos() + epos4 = EPos() + epos5 = EPos() + for n in range(0,nmax): + s = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) + t = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) + + epos1.sets(s,1) + epos2.sets(s,0) + epos3.sett(t,1) + epos4.sett(t,0) + + p1 = oe.ePoint(epos1) + p2 = oe.ePoint(epos2) + p3 = oe.ePoint(epos3) + p4 = oe.ePoint(epos4) + p5 = oe.ePoint(epos5) + + p1o = oe.oePoint(epos1) + p2o = oe.oePoint(epos2) + #print "s=", s, "t=", t," epoint=", p1.str() + myscreen.addActor(camvtk.Point(center=(p1.x,p1.y,0), color=green)) # green steps along s (side=1) + myscreen.addActor(camvtk.Point(center=(p2.x,p2.y,0), color=red)) # red steps along s (side=0) + myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) # orange steps along t (side=1) + myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) # pink steps along t (side=0) + + #myscreen.addActor(camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=red)) + #myscreen.addActor(camvtk.Point(center=(p1o.x,p1o.y,0), color=green)) + #myscreen.addActor(camvtk.Point(center=(p2o.x,p2o.y,0), color=red)) + + """ + tx = float(n)/float(nmax-1) * 2 - 1 + sx = oe.seval(tx, 1) + sx2 = oe.seval(tx, 0) + p3 = oe.ePoint(sx,tx) + p4 = oe.ePoint(sx2,tx) + #myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) + #myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) + + sd = oe.seval(td,1) + p5 = oe.ePoint(td,sd) + myscreen.addActor(camvtk.Point(center=(p5.x,p5.y,0), color=orange)) + """ + myscreen.render() + #time.sleep(0.05) + + t = camvtk.Text() + t.SetPos( (myscreen.width-450, myscreen.height-30) ) + + myscreen.addActor( t) + t2 = camvtk.Text() + t2.SetPos( (50, myscreen.height-150) ) + + myscreen.addActor( t2) + + epos5.sets(0.5,1) + Nsteps=10 + endcondition = 0 + n = 1 + NRStep=0.1 + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + + while not endcondition: + #for n in range(0,Nsteps): + t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + current_error = oe.error(epos5, cl) + + print("current error=", current_error) + epos_tmp = EPos() + epos_tmp.s = epos5.s + epos_tmp.t = epos5.t + # take a small step, to determine rerivative: + dt = 0.2*NRStep + epos_tmp.stepTang(oe,dt) + new_error = oe.error(epos_tmp, cl) + print("new_error=", new_error) + deriv = (new_error-current_error)/dt + print("derivative = ", deriv) + paramtext = "(s, t) = (%3.3f, %3.3f)\n NR iteration # = %i \n error= %3.9f\n de=%3.3f" % (epos5.s, epos5.t, n, current_error,deriv) + t2.SetText(paramtext) + # take Newton rhapson step + NRStep = (-current_error/deriv) + print(" step=", NRStep) + #NRStep=0.05 # debug/demo + epos5.stepTang(oe, NRStep) + + p5 = oe.ePoint(epos5) + esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=red) + myscreen.addActor(esphere) + + p6 = oe.eTang(epos5) + p7 = oe.oePoint(epos5) + oesphere = camvtk.Sphere(center=(p7.x,p7.y,p7.z), radius=0.02, color=green) + tangline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p5.x+p6.x,p5.y+p6.y,p5.z+p6.z)) + normline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p7.x,p7.y,p7.z), color=yellow) + + myscreen.addActor( tangline ) + myscreen.addActor( normline ) + myscreen.addActor( oesphere ) + + + myscreen.render() + time.sleep(0.5) + + if abs(current_error) < 1e-8: + endcondition=1 + if n>125: + endcondition=1 + + if not endcondition: + myscreen.removeActor(esphere) + myscreen.removeActor(tangline) + myscreen.removeActor(normline) + myscreen.removeActor(oesphere) + + + #w2if.Modified() + #lwr.SetFileName("5_all.png") + """ + for i in range(0,10): + lwr.SetFileName("frames/oe_nrx"+ ('%05d%02d' % (n,i))+".png") + lwr.Write() + """ + n=n+1 + + print("rendering...",) + #for cl,cc in zip(clpoints,ccpoints): + # myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=ccColor(cc) ) ) + # if cc.type != cam.CCType.NONE: # only render interesting cc-points + # myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z) , color=ccColor2(cc) ) ) + + + print("done.") + + + + + myscreen.render() + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("5_all.png") + #lwr.Write() + + + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse3_tst.py opencamlib-11.10-1/examples/python/offset-ellipse/oellipse3_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse3_tst.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offset-ellipse/oellipse3_tst.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,455 @@ +import ocl as cam +import camvtk +import time +import vtk +import math +import datetime + +red= (1,0,0) +green= (0,1,0) +blue= (0,0,1) +cyan= (0,1,1) +yellow= (1,1,0) +pink = ( float(255)/255,float(192)/255,float(203)/255) +grey = ( float(127)/255,float(127)/255,float(127)/255) +orange = ( float(255)/255,float(165)/255,float(0)/255) + +def ccColor2(cc): + """ this function returns a different color depending on the type of + the CC-point. Useful for visualizing CL or CC points """ + if cc.type==cam.CCType.FACET: + col = (1,0,1) + elif cc.type == cam.CCType.VERTEX: + col = (1,1,0) + elif cc.type == cam.CCType.EDGE: + col = (0,1,1) + elif cc.type == cam.CCType.NONE: + col = (1,1,1) + elif cc.type == cam.CCType.ERROR: + col = (0,0.5,1) + return col + +class OffsetEllipse(): + """ + // (s, t) where: s^2 + t^2 = 1 + // point of ellipse is: ecen + j s + n t + // tangent at point is: -j t + n s + // normal at point is: j (s / eccen) + n (t * eccen) + // point on offset-ellipse: point on ellipse + offrad*normal + """ + def __init__(self, ecen, a, b, ofs): + self.a = a + self.b = b + self.ecen = ecen + self.ofs = ofs + + def ePoint(self,epos): + # return a point on the ellipse + p = cam.Point() + p.x = self.ecen.x + self.a*epos.s + p.y = self.ecen.y + self.b*epos.t + return p + + def oePoint(self,epos): + # return point on offset-ellipse + p = self.ePoint(epos) + normal = self.eNorm(epos) + p.x = p.x + self.ofs*normal.x + p.y = p.y + self.ofs*normal.y + return p + + def eNorm(self, epos): + normal = cam.Point( self.b*epos.s, self.a*epos.t, 0) + normal.normalize() + return normal + + def eTang(self, epos): + p = cam.Point(-self.a*epos.t, self.b*epos.s, 0) + p.normalize() + return p + + def error(self,epos,cl): + p1 = self.oePoint(epos) + p2 = cl + dx = p1.x - cl.x + dy = p1.y - cl.y + #return dx*dx+dy*dy + return dy + + + +class EPos(): + """ + // (s, t) where: s^2 + t^2 = 1 + // point of ellipse is: ecen + j s + n t + // tangent at point is: -j t + n s + // normal at point is: j (s / eccen) + n (t * eccen) + // point on offset-ellipse: point on ellipse + offrad*normal + """ + def __init__(self): + self.t = 1 + self.s = 0 + self.sett(self.t,1) + + def sets(self, s, side): + if s > 1.0: + s = 1.0 + if s < -1.0: + s = -1.0 + + self.s = s + ssq = s*s + tsq = 1 - ssq + if side == 1: + self.t = 1 * math.sqrt(tsq) + else: + self.t = -1 * math.sqrt(tsq) + + def sett(self, t, side): + if t > 1.0: + t = 1.0 + if t < -1.0: + t = -1.0 + + self.t = t + tsq = t*t + ssq = 1 - tsq + if side == 1: + self.s = 1 * math.sqrt(ssq) + else: + self.s = -1* math.sqrt(ssq) + + def stepTang(self, ellipse, delta): + tang = oe.eTang(self) + #print " epos= (", self.s," , ", self.t , " )" + #print "steptang tang=", tang.str() + if abs(tang.x) > abs(tang.y): + #print "s-dir step" + news = self.s + delta*tang.x + if self.t > 0: + self.sets(news,1) + else: + self.sets(news,0) + else: + #print "t-dir step" + newt = self.t + delta*tang.y + if self.s>0: + self.sett( newt,1) + else: + self.sett( newt,0) + +def solver(oe, epos, cl): + endcondition = 0 + NRStep = 0.1 + n=0 + while not endcondition: + current_error = oe.error(epos, cl) + #print "current error=", current_error + epos_tmp = EPos() + epos_tmp.s = epos.s + epos_tmp.t = epos.t + # take a small step, to determine rerivative: + dt = 0.2*NRStep + epos_tmp.stepTang(oe,dt) + new_error = oe.error(epos_tmp, cl) + #print "new_error=", new_error + deriv = (new_error-current_error)/dt + #print "derivative = ", deriv + # take Newton rhapson step + NRStep = (-current_error/deriv) + #print " NRstep=", NRStep + #NRStep=0.05 # debug/demo + epos5.stepTang(oe, NRStep) + + # check endcondition + if abs(current_error) < 1e-8: + endcondition=1 + if n>125: + endcondition=1 + n=n+1 + return n + +if __name__ == "__main__": + myscreen = camvtk.VTKScreen() + + myscreen.camera.SetPosition(5, 3, 2) + myscreen.camera.SetFocalPoint(1.38,1, 0) + + a=cam.Point(3,2,-2) + b=cam.Point(-1,2,3) + + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); + #c=cam.Point(0,0,0.3) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + #t = cam.Triangle(a,b,c) + + cutter_length = 2 + cutter = cam.BullCutter(1,0.2, cutter_length) + + + print(cutter) + + xar = camvtk.Arrow(color=red, rotXYZ=(0,0,0)) + #xar.SetFlat() + myscreen.addActor(xar) + yar = camvtk.Arrow(color=green, rotXYZ=(0,0,90)) + #yar.SetGouraud() + myscreen.addActor(yar) + zar = camvtk.Arrow(color=blue, rotXYZ=(0,-90,0)) + #zar.SetPhong() + myscreen.addActor(zar) + + cl = cam.Point(2.193, 1, 0) + radius1=1 + radius2=0.25 + + tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) + #tor.SetWireframe() + #myscreen.addActor(tor) + + cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), + rotXYZ=(90,0,0), resolution=50 ) + #myscreen.addActor(cyl) + + tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),color=(1,1,0)) + tube.SetOpacity(0.2) + #myscreen.addActor(tube) + + cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=yellow) + myscreen.addActor(cir) + + clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) + myscreen.addActor(clp) + + # short axis of ellipse = radius2 + # long axis of ellipse = radius2/sin(theta) + # where theta is the slope of the line + dx = b.x - a.x + dz = b.z - a.z + #print "dx=", dx + #print "dz=", dz + theta = math.atan(dz/dx) + #print "theta=",theta + a = abs( radius2/math.sin(theta) ) + #print "a=", a, " = ", a/radius2,"* radius2" + # ellipse + #a=2 + b=radius2 + #print "b= ", b + + + ecen_tmp=cam.Point(1.38,2,0) + resolution=50 + """ + for n in range(0,resolution): + angle1= (float(n)/float(resolution))*2*math.pi + angle2= (float(n+1)/float(resolution))*2*math.pi + x=ecen_tmp.x + a*math.cos(angle1) + y=ecen_tmp.y + b*math.sin(angle1) + x2=ecen_tmp.x + a*math.cos(angle2) + y2=ecen_tmp.y + b*math.sin(angle2) + + #myscreen.addActor(camvtk.Point(center=(x,y,0), color=(1,0,1))) + #myscreen.addActor( camvtk.Line(p1=(x,y,0),p2=(x2,y2,0)) ) + """ + + oe = OffsetEllipse(ecen_tmp, a, b, radius1) + oe2 = OffsetEllipse(ecen_tmp, a, b, 0.05) + + + nmax=20 + delta=0.05 + td = 1 + epos1 = EPos() + epos2 = EPos() + epos3 = EPos() + epos4 = EPos() + epos5 = EPos() + """ + for n in range(0,nmax): + s = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) + t = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) + + epos1.sets(s,1) + epos2.sets(s,0) + epos3.sett(t,1) + epos4.sett(t,0) + + p1 = oe.ePoint(epos1) + p2 = oe.ePoint(epos2) + p3 = oe.ePoint(epos3) + p4 = oe.ePoint(epos4) + p5 = oe.ePoint(epos5) + + p1o = oe.oePoint(epos1) + p2o = oe.oePoint(epos2) + #print "s=", s, "t=", t," epoint=", p1.str() + myscreen.addActor(camvtk.Point(center=(p1.x,p1.y,0), color=green)) # green steps along s (side=1) + myscreen.addActor(camvtk.Point(center=(p2.x,p2.y,0), color=red)) # red steps along s (side=0) + myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) # orange steps along t (side=1) + myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) # pink steps along t (side=0) + + #myscreen.addActor(camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=red)) + #myscreen.addActor(camvtk.Point(center=(p1o.x,p1o.y,0), color=green)) + #myscreen.addActor(camvtk.Point(center=(p2o.x,p2o.y,0), color=red)) + + + tx = float(n)/float(nmax-1) * 2 - 1 + sx = oe.seval(tx, 1) + sx2 = oe.seval(tx, 0) + p3 = oe.ePoint(sx,tx) + p4 = oe.ePoint(sx2,tx) + #myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) + #myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) + + sd = oe.seval(td,1) + p5 = oe.ePoint(td,sd) + myscreen.addActor(camvtk.Point(center=(p5.x,p5.y,0), color=orange)) + + myscreen.render() + #time.sleep(0.05) + """ + + t = camvtk.Text() + t.SetPos( (myscreen.width-450, myscreen.height-30) ) + + myscreen.addActor( t) + t2 = camvtk.Text() + t2.SetPos( (50, myscreen.height-150) ) + + myscreen.addActor( t2) + + #epos5.sets(0.5,1) + Nsteps=62 + endcondition = 0 + n = 1 + NRStep=0.1 + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + + epos5.sets(0,1) + epos1.sets(0,1) + #while not endcondition: + convlist=[] + for n in range(0,Nsteps): + t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + #current_error = oe.error(epos5, cl) + epos5.s=epos1.s + epos5.t=epos1.t + #print "current error=", current_error + #epos_tmp = EPos() + #epos_tmp.s = epos5.s + #epos_tmp.t = epos5.t + # take a small step, to determine rerivative: + #dt = 0.2*NRStep + #epos_tmp.stepTang(oe,dt) + #new_error = oe.error(epos_tmp, cl) + #print "new_error=", new_error + #deriv = (new_error-current_error)/dt + #print "derivative = ", deriv + #paramtext = "(s, t) = (%3.3f, %3.3f)\n NR iteration # = %i \n error= %3.9f\n de=%3.3f" % (epos5.s, epos5.t, n, current_error,deriv) + #t2.SetText(paramtext) + # take Newton rhapson step + #NRStep = (-current_error/deriv) + #print " step=", NRStep + #NRStep=0.05 # debug/demo + #epos5.stepTang(oe, NRStep) + + + + + #p6 = oe.eTang(epos5) + #p7 = oe.oePoint(epos5) + #oesphere = camvtk.Sphere(center=(p7.x,p7.y,p7.z), radius=0.02, color=green) + #tangline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p5.x+p6.x,p5.y+p6.y,p5.z+p6.z)) + #normline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p7.x,p7.y,p7.z), color=yellow) + + #myscreen.addActor( tangline ) + #myscreen.addActor( normline ) + #myscreen.addActor( oesphere ) + p5 = oe.ePoint(epos5) + pt = oe2.oePoint(epos5) + #print "before= ", epos5.s, " , ", epos5.t + nsteps = solver(oe, epos5, cl) + print(nsteps ) + convlist.append(nsteps) + + convtext = "%i" % (nsteps) + print((pt.x, pt.y, pt.z)) + #center=(pt.x, pt.y, pt.z) + tst = camvtk.Text3D( color=(1,1,1), center=(pt.x, pt.y, 0) , + text=convtext, scale=0.02) + #tst.SetCamera(myscreen.camera) + myscreen.addActor(tst) + + colmax=11 + colmin=4 + nsteps = nsteps - colmin + colmax = colmax - colmin + convcolor=( float(nsteps*nsteps)/(colmax), float((colmax-nsteps))/colmax, 0 ) + esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=convcolor) + myscreen.addActor(esphere) + + + + + #print "after= ", epos5.s, " , ", epos5.t + epos1.stepTang(oe, 0.1) + #print "after= ", epos5.s, " , ", epos5.t + + myscreen.render() + #time.sleep(0.1) + #raw_input("Press Enter to terminate") + #if abs(current_error) < 1e-8: + # endcondition=1 + #if n>125: + # endcondition=1 + + #if not endcondition: + # myscreen.removeActor(esphere) + # myscreen.removeActor(tangline) + # myscreen.removeActor(normline) + # myscreen.removeActor(oesphere) + + + #w2if.Modified() + #lwr.SetFileName("5_all.png") + """ + for i in range(0,10): + lwr.SetFileName("frames/oe_nrx"+ ('%05d%02d' % (n,i))+".png") + lwr.Write() + """ + n=n+1 + print(convlist) + #print "rendering...", + #for cl,cc in zip(clpoints,ccpoints): + # myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=ccColor(cc) ) ) + # if cc.type != cam.CCType.NONE: # only render interesting cc-points + # myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z) , color=ccColor2(cc) ) ) + + + print("done.") + + + + + myscreen.render() + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + #w2if.Modified() + #lwr.SetFileName("5_all.png") + #lwr.Write() + + + + myscreen.iren.Start() + #raw_input("Press Enter to terminate") + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse4_tst.py opencamlib-11.10-1/examples/python/offset-ellipse/oellipse4_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse4_tst.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offset-ellipse/oellipse4_tst.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,237 @@ +import ocl as cam +import camvtk +import time +import vtk +import math +import datetime + +# 2018.08: Epos not wrapped + +def drawellipse(myscreen, ellcenter, a_axis, b_axis): + resolution=50 + for n in range(0,resolution): + angle1= (float(n)/float(resolution))*2*math.pi + angle2= (float(n+1)/float(resolution))*2*math.pi + x=ellcenter.x + a_axis*math.cos(angle1) + y=ellcenter.y + b_axis*math.sin(angle1) + z=ellcenter.z + x2=ellcenter.x + a_axis*math.cos(angle2) + y2=ellcenter.y + b_axis*math.sin(angle2) + myscreen.addActor( camvtk.Line(p1=(x,y,z),p2=(x2,y2,z), color=camvtk.grey) ) + +def main(ycoord=0.970, filename="test"): + myscreen = camvtk.VTKScreen() + + myscreen.camera.SetPosition(2, 5, 5) + myscreen.camera.SetFocalPoint(1.38,1, 0) + + #ycoord = 1.1 + + a=cam.Point(3,ycoord,-2) + b=cam.Point(-1,ycoord,3) + + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); + #c=cam.Point(0,0,0.3) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + #t = cam.Triangle(a,b,c) + + cutter = cam.BullCutter(1,0.2,20) + + print(cutter ) + xar = camvtk.Arrow(color=camvtk.red, rotXYZ=(0,0,0)) + myscreen.addActor(xar) + yar = camvtk.Arrow(color=camvtk.green, rotXYZ=(0,0,90)) + myscreen.addActor(yar) + zar = camvtk.Arrow(color=camvtk.blue, rotXYZ=(0,-90,0)) + myscreen.addActor(zar) + + cl = cam.Point(2.1748, 1, 0) + radius1=1 + radius2=0.25 + + tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) + #tor.SetWireframe() + #myscreen.addActor(tor) + + cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), + rotXYZ=(90,0,0), resolution=50 ) + #myscreen.addActor(cyl) + + cl_line = camvtk.Line( p1=(cl.x,cl.y,-100),p2=(cl.x,cl.y,+100), color=camvtk.red ) + myscreen.addActor(cl_line) + + tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),color=(1,1,0)) + tube.SetOpacity(0.2) + myscreen.addActor(tube) + + # cylindrical-cutter circle at z=0 plane + #cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=camvtk.yellow) + #myscreen.addActor(cir) + + #clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) + #myscreen.addActor(clp) + + # short axis of ellipse = radius2 + # long axis of ellipse = radius2/sin(theta) + # where theta is the slope of the line + dx = b.x - a.x + dz = b.z - a.z + #print "dx=", dx + #print "dz=", dz + theta = math.atan(dz/dx) ## dx==0 is special case!! (i.e. vertical lines) + print("theta=",theta) + a_axis = abs( radius2/math.sin(theta) ) + print("a=", a_axis) + # ellipse + #a=2 + b_axis=radius2 + print("b= ", b_axis) + + + # slice the tube with a plane at z=0 and find the ellipse center + # line is from Point a to b: + # a + t*(b-a) + # find t so that z-component is zero: + # a.z + t( b.z -a.z) = 0 + # t= a.z / (b.z - a.z) + # so point + tparam = -a.z / (b.z - a.z) # NOTE horizontal lines are a special case!! + ellcenter = a + tparam*(b-a) + print("ellcenter (z=0?) =", ellcenter) + # center of the + # ecen_tmp=cam.Point(ellcenter,a.y,0) + + #drawellipse(myscreen, ellcenter, a_axis, b_axis) + + + + oe = cam.Ellipse(ellcenter, a_axis, b_axis, radius1) + + #oe2 = cam.Ellipse(ellcenter, a_axis, b_axis, 0.05) # to locate text on the outside of the ellipse + + + nmax=20 + #delta=0.05 + #td = 1 + + + + t = camvtk.Text() + t.SetPos( (myscreen.width-450, myscreen.height-30) ) + + + myscreen.addActor( t) + t2 = camvtk.Text() + ytext = "Y: %3.3f" % (ycoord) + t2.SetText(ytext) + t2.SetPos( (50, myscreen.height-150) ) + myscreen.addActor( t2) + + + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + epos = cam.Epos() + epos.setS(0,1) + #epos1.setS(0,1) + + t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + + #p5 = oe.ePoint(epos5) + #pt = oe2.oePoint(epos5) + #print "before= ", epos5.s, " , ", epos5.t + nsteps = cam.Ellipse.solver(oe, cl) + epos = oe.epos1 + cce = oe.ePoint(epos) + cle = oe.oePoint(epos) + #epos2 = cam.Epos() + #epos.s = epos.s + #epos.t = epos.t + #print nsteps + print("solution1 at: ", epos.s , " , ", epos.t ) + #print "solution2 at: ", epos2.s , " , ", epos2.t + print(" cl =", cl) + print(" cle=", cle) + + xoffset = cl.x - cle.x + print("xoffset= ", xoffset) + # we slide xoffset along the x-axis from ellcenter + # to find the correct z-plane + # line is: a + t*(b-a) + # find t so that x-component is ellcenter.x + xoffset + # a.x + t(b.x-a.x) = ellcenter.x + xoffset + # t= (ellcenter.x + xoffset - a.x) / (b.x - a.x) + tparam2 = (ellcenter.x + xoffset - a.x) / (b.x - a.x) + slide = tparam2*(b-a) + print("sliding z-delta: ", slide.z) + elc2 = a + tparam2*(b-a) + print("ellcenter2=", elc2) + #convlist.append(nsteps) + fe = cam.Ellipse(elc2, a_axis, b_axis, radius1) + fecen = camvtk.Sphere(center=(elc2.x,elc2.y,elc2.z), radius=0.01, color=camvtk.pink) + myscreen.addActor(fecen) + fccp = fe.ePoint(epos) + fclp = fe.oePoint(epos) + print("solver cl=", fclp, " == ", cl, " ??") + + fcir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,elc2.z), color=camvtk.yellow) + myscreen.addActor(fcir) + + fccpoint = camvtk.Sphere(center=(fccp.x,fccp.y,fccp.z), radius=0.01, color=camvtk.green) + myscreen.addActor(fccpoint) + + fclpoint = camvtk.Sphere(center=(fclp.x,fclp.y,fclp.z), radius=0.01, color=camvtk.blue) + myscreen.addActor(fclpoint) + + # line from ellipse center to fcc + myscreen.addActor(camvtk.Line( p1=(elc2.x,elc2.y,elc2.z),p2=(fccp.x,fccp.y,fccp.z), color=camvtk.cyan )) + # the offset normal + myscreen.addActor(camvtk.Line( p1=(fclp.x,fclp.y,fclp.z),p2=(fccp.x,fccp.y,fccp.z), color=camvtk.yellow )) + + drawellipse(myscreen, elc2, a_axis, b_axis) + #convtext = "%i" % (nsteps) + #print (pt.x, pt.y, pt.z) + #center=(pt.x, pt.y, pt.z) + #tst = camvtk.Text3D( color=(1,1,1), center=(pt.x, pt.y, 0) , + #text=convtext, scale=0.02) + #tst.SetCamera(myscreen.camera) + #myscreen.addActor(tst) + + colmax=11 + colmin=4 + nsteps = nsteps - colmin + colmax = colmax - colmin + convcolor=( float(nsteps*nsteps)/(colmax), float((colmax-nsteps))/colmax, 0 ) + #esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.01, color=convcolor) + end_sphere = camvtk.Sphere(center=(cce.x,cce.y,0), radius=0.01, color=camvtk.green) + cl_sphere = camvtk.Sphere(center=(cle.x,cle.y,0), radius=0.01, color=camvtk.pink) + cl_sphere.SetOpacity(0.4) + + clcir= camvtk.Circle(radius=radius1, center=(cle.x,cle.y,cle.z), color=camvtk.pink) + myscreen.addActor(clcir) + + #myscreen.addActor(esphere) + myscreen.addActor(end_sphere) + myscreen.addActor(cl_sphere) + #myscreen.render() + + print("done.") + myscreen.render() + lwr.SetFileName(filename) + #lwr.Write() + #raw_input("Press Enter to terminate") + #time.sleep(0.5) + myscreen.iren.Start() + + +if __name__ == "__main__": + main() + #myscreen.iren.Start() + #raw_input("Press Enter to terminate") + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse5_tst.py opencamlib-11.10-1/examples/python/offset-ellipse/oellipse5_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/offset-ellipse/oellipse5_tst.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/offset-ellipse/oellipse5_tst.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,293 @@ +import ocl as cam +import camvtk +import time +import vtk +import math +import datetime + +# 2018.08: Epos not wrapped + +def drawellipse(myscreen, ellcenter, a_axis, b_axis): + resolution=50 + for n in range(0,resolution): + angle1= (float(n)/float(resolution))*2*math.pi + angle2= (float(n+1)/float(resolution))*2*math.pi + x=ellcenter.x + a_axis*math.cos(angle1) + y=ellcenter.y + b_axis*math.sin(angle1) + z=ellcenter.z + x2=ellcenter.x + a_axis*math.cos(angle2) + y2=ellcenter.y + b_axis*math.sin(angle2) + myscreen.addActor( camvtk.Line(p1=(x,y,z),p2=(x2,y2,z), color=camvtk.grey) ) + +def calcEcenter(oe,a,b,cl,sln): + pos = cam.Epos() + if sln == 1: + pos = oe.epos1 + if sln == 2: + pos = oe.epos2 + + cce = oe.ePoint(pos) + cle = oe.oePoint(pos) + print("solution at: ", pos) + print(" cce=", cce) + print(" cle=", cle) + + xoffset = cl.x - cle.x + print(" xoffset= ", xoffset) + # we slide xoffset along the x-axis from ellcenter + # to find the correct z-plane + # line is: a + t*(b-a) + # find t so that x-component is ellcenter.x + xoffset + # a.x + t(b.x-a.x) = ellcenter.x + xoffset + # t= (ellcenter.x + xoffset - a.x) / (b.x - a.x) + tparam = (oe.center.x + xoffset - a.x) / (b.x - a.x) + return a + tparam*(b-a) + + + +def main(ycoord=1.2, filename="test", theta=60, fi=45): + myscreen = camvtk.VTKScreen() + focal = cam.Point(2.17, 1, 0) + r = 14 + theta = (float(theta)/360)*2*math.pi + + + campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) + myscreen.camera.SetPosition(campos.x, campos.y, campos.z) + myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) + + #ycoord = 1.1 + + # the two points that define the edge + a=cam.Point( 3 , ycoord , 2.999999) + b=cam.Point( -1, ycoord , 3) + + myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); + myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); + #c=cam.Point(0,0,0.3) + myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) + #t = cam.Triangle(a,b,c) + + cutter_length = 2 + cutter = cam.BullCutter(1,0.2, cutter_length) + + print(cutter ) + xar = camvtk.Arrow(color=camvtk.red, rotXYZ=(0,0,0)) + myscreen.addActor(xar) + yar = camvtk.Arrow(color=camvtk.green, rotXYZ=(0,0,90)) + myscreen.addActor(yar) + zar = camvtk.Arrow(color=camvtk.blue, rotXYZ=(0,-90,0)) + myscreen.addActor(zar) + + cl = cam.Point(2.1748, 1, 0) + radius1=1 + radius2=0.25 + + + #tor.SetWireframe() + #myscreen.addActor(tor) + + cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), + rotXYZ=(90,0,0), resolution=50 ) + #myscreen.addActor(cyl) + + cl_line = camvtk.Line( p1=(cl.x,cl.y,-100),p2=(cl.x,cl.y,+100), color=camvtk.red ) + myscreen.addActor(cl_line) + + cl_tube = camvtk.Tube(p1=(cl.x,cl.y,-100),p2=(cl.x,cl.y,+100),radius=radius1, color=camvtk.green) + cl_tube.SetOpacity(0.1) + myscreen.addActor(cl_tube) + + a_inf = a + (-100*(b-a)) + b_inf = a + (+100*(b-a)) + + tube = camvtk.Tube(p1=(a_inf.x,a_inf.y,a_inf.z),p2=(b_inf.x,b_inf.y,b_inf.z),radius=0.05*radius2, color=camvtk.red) + tube.SetOpacity(0.3) + myscreen.addActor(tube) + + # cylindrical-cutter circle at z=0 plane + #cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=camvtk.yellow) + #myscreen.addActor(cir) + + #clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) + #myscreen.addActor(clp) + + # short axis of ellipse = radius2 + # long axis of ellipse = radius2/sin(theta) + # where theta is the slope of the line + dx = b.x - a.x + dz = b.z - a.z + #print "dx=", dx + #print "dz=", dz + theta = math.atan(dz/dx) ## dx==0 is special case!! (i.e. vertical lines) + print("theta=",theta) + a_axis = abs( radius2/math.sin(theta) ) + print("a=", a_axis) + # ellipse + #a=2 + b_axis=radius2 + print("b= ", b_axis) + + + # slice the tube with a plane at z=0 and find the ellipse center + # line is from Point a to b: + # a + t*(b-a) + # find t so that z-component is zero: + # a.z + t( b.z -a.z) = 0 + # t= a.z / (b.z - a.z) + # so point + tparam = -a.z / (b.z - a.z) # NOTE horizontal lines are a special case!! + ellcenter = a + tparam*(b-a) + print("ellcenter (z=0?) =", ellcenter) + # center of the + # ecen_tmp=cam.Point(ellcenter,a.y,0) + + #drawellipse(myscreen, ellcenter, a_axis, b_axis) + + oe = cam.Ellipse(ellcenter, a_axis, b_axis, radius1) + + #oe2 = cam.Ellipse(ellcenter, a_axis, b_axis, 0.05) # to locate text on the outside of the ellipse + + + nmax=20 + #delta=0.05 + #td = 1 + + + + t = camvtk.Text() + t.SetPos( (myscreen.width-450, myscreen.height-30) ) + t.SetText("OpenCAMLib " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + myscreen.addActor( t) + + t2 = camvtk.Text() + ytext = "Y: %3.3f" % (ycoord) + t2.SetText(ytext) + t2.SetPos( (50, myscreen.height-150) ) + myscreen.addActor( t2) + + + + #w2if = vtk.vtkWindowToImageFilter() + #w2if.SetInput(myscreen.renWin) + #lwr = vtk.vtkPNGWriter() + #lwr.SetInput( w2if.GetOutput() ) + + epos = cam.Epos() + epos.setS(0,1) + + + + #p5 = oe.ePoint(epos5) + #pt = oe2.oePoint(epos5) + #print "before= ", epos5.s, " , ", epos5.t + + # RUN THE SOLVER! + nsteps = cam.Ellipse.solver(oe, cl) + + print("solver done. back to python:") + print("1st (s,t) solution=", oe.epos1) + print("2st (s,t) solution=", oe.epos2) + + elc1 = calcEcenter(oe,a,b, cl,1) + elc2 = calcEcenter(oe,a,b, cl,2) + print("elc1=", elc1) + print("elc2=", elc2) + #exit() + + #elc2 = elc2 + #epos = oe.epos2 + + fe1 = cam.Ellipse(elc1, a_axis, b_axis, radius1) + fe2 = cam.Ellipse(elc2, a_axis, b_axis, radius1) + + # draw ellipse-centers + myscreen.addActor( camvtk.Sphere(center=(elc1.x,elc1.y,elc1.z), radius=0.01, color=camvtk.lgreen) ) + myscreen.addActor( camvtk.Sphere(center=(elc2.x,elc2.y,elc2.z), radius=0.01, color=camvtk.pink) ) + + # cc-points on the ellipse + ccp1 = fe1.ePoint(oe.epos1) + ccp2 = fe2.ePoint(oe.epos2) + myscreen.addActor( camvtk.Sphere(center=(ccp1.x,ccp1.y,ccp1.z), radius=0.01, color=camvtk.lgreen) ) + myscreen.addActor( camvtk.Sphere(center=(ccp2.x,ccp2.y,ccp2.z), radius=0.01, color=camvtk.pink) ) + + cl1 = fe1.oePoint(oe.epos1) + cl2 = fe2.oePoint(oe.epos2) + + # circles + myscreen.addActor( camvtk.Circle(radius=radius1, center=(cl1.x,cl1.y,cl1.z), color=camvtk.green) ) + myscreen.addActor( camvtk.Circle(radius=radius1, center=(cl2.x,cl2.y,cl2.z), color=camvtk.pink) ) + + # torus + tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl1.x, cl1.y, cl1.z),rotXYZ=(0,0,0), color=camvtk.green) + tor.SetOpacity(0.4) + myscreen.addActor( tor) + tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl2.x, cl2.y, cl2.z),rotXYZ=(0,0,0), color=camvtk.pink) + tor.SetOpacity(0.4) + myscreen.addActor( tor) + + # line: ellipse-center to cc-point + myscreen.addActor(camvtk.Line( p1=(elc1.x,elc1.y,elc1.z),p2=(ccp1.x,ccp1.y,ccp1.z), color=camvtk.cyan )) + myscreen.addActor(camvtk.Line( p1=(elc2.x,elc2.y,elc2.z),p2=(ccp2.x,ccp2.y,ccp2.z), color=camvtk.cyan )) + + # line: cc-point to cl-point + myscreen.addActor(camvtk.Line( p1=(cl1.x,cl1.y,cl1.z),p2=(ccp1.x,ccp1.y,ccp1.z), color=camvtk.yellow )) + myscreen.addActor(camvtk.Line( p1=(cl2.x,cl2.y,cl2.z),p2=(ccp2.x,ccp2.y,ccp2.z), color=camvtk.yellow )) + + # true cl + #clt = cc1. + + #fclpoint = camvtk.Sphere(center=(fclp.x,fclp.y,fclp.z), radius=0.01, color=camvtk.blue) + #myscreen.addActor(fclpoint) + + # line from ellipse center to fcc + # the offset normal + #myscreen.addActor(camvtk.Line( p1=(fclp.x,fclp.y,fclp.z),p2=(fccp.x,fccp.y,fccp.z), color=camvtk.yellow )) + + drawellipse(myscreen, elc1, a_axis, b_axis) + drawellipse(myscreen, elc2, a_axis, b_axis) + + #convtext = "%i" % (nsteps) + #print (pt.x, pt.y, pt.z) + #center=(pt.x, pt.y, pt.z) + #tst = camvtk.Text3D( color=(1,1,1), center=(pt.x, pt.y, 0) , + #text=convtext, scale=0.02) + #tst.SetCamera(myscreen.camera) + #myscreen.addActor(tst) + + #colmax=11 + #colmin=4 + #nsteps = nsteps - colmin + #colmax = colmax - colmin + #convcolor=( float(nsteps*nsteps)/(colmax), float((colmax-nsteps))/colmax, 0 ) + #esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.01, color=convcolor) + #cce = oe.ePoint(epos) + #cle = oe.oePoint(epos) + #end_sphere = camvtk.Sphere(center=(cce.x,cce.y,0), radius=0.01, color=camvtk.green) + #cl_sphere = camvtk.Sphere(center=(cle.x,cle.y,0), radius=0.01, color=camvtk.pink) + #cl_sphere.SetOpacity(0.4) + + #clcir= camvtk.Circle(radius=radius1, center=(cle.x,cle.y,cle.z), color=camvtk.pink) + #myscreen.addActor(clcir) + + #myscreen.addActor(esphere) + #myscreen.addActor(end_sphere) + #myscreen.addActor(cl_sphere) + #myscreen.render() + + print("done.") + myscreen.render() + lwr.SetFileName(filename) + + #raw_input("Press Enter to terminate") + time.sleep(0.5) + #lwr.Write() + myscreen.iren.Start() + + +if __name__ == "__main__": + main() + #myscreen.iren.Start() + #raw_input("Press Enter to terminate") + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/old/cutsim_test_tux_1.py opencamlib-11.10-1/examples/python/old/cutsim_test_tux_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/examples/python/old/cutsim_test_tux_1.py 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/examples/python/old/cutsim_test_tux_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,248 @@ +import ocl +import pyocl +import camvtk +import time +import datetime +import vtk + + + +def main(filename="frame/f.png"): + print(ocl.version()) + + myscreen = camvtk.VTKScreen() + myscreen.camera.SetPosition(-15, -8, 15) + myscreen.camera.SetFocalPoint(5,5, 0) + # axis arrows + camvtk.drawArrows(myscreen,center=(-1,-1,0)) + + + # screenshot writer + w2if = vtk.vtkWindowToImageFilter() + w2if.SetInput(myscreen.renWin) + lwr = vtk.vtkPNGWriter() + lwr.SetInput( w2if.GetOutput() ) + + + + c = ocl.CylCutter(1,4) # cutter + c.length = 3 + print("cutter length=", c.length) + + # generate CL-points + stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") + polydata = stl.src.GetOutput() + s = ocl.STLSurf() + camvtk.vtkPolyData2OCLSTL(polydata, s) + print("STL surface read,", s.size(), "triangles") + print(s.getBounds()) + #exit() + minx=0 + dx=0.1 + maxx=9 + miny=0 + dy=0.4 + maxy=12 + z=-17 + # this generates a list of CL-points in a grid + clpoints = pyocl.CLPointGridZigZag(minx,dx,maxx,miny,dy,maxy,z) + print("generated grid with", len(clpoints)," CL-points") + # batchdropcutter + bdc = ocl.BatchDropCutter() + bdc.setSTL(s) + bdc.setCutter(c) + for p in clpoints: + bdc.appendPoint(p) + t_before = time.time() + print("threads=",bdc.getThreads()) + bdc.run() + t_after = time.time() + calctime = t_after-t_before + print(" done in ", calctime," s") + clpoints = bdc.getCLPoints() + + # filter + print("filtering. before filter we have", len(clpoints),"cl-points") + t_before = time.time() + f = ocl.LineCLFilter() + f.setTolerance(0.001) + for p in clpoints: + f.addCLPoint(p) + f.run() + clpts = f.getCLPoints() + calctime = time.time()-t_before + print("after filtering we have", len(clpts),"cl-points") + print(" done in ", calctime," s") + + #exit() + + # stupid init code + ocode=ocl.Ocode() + tree_maxdepth=10 + ocode.set_depth(tree_maxdepth) # depth and scale set here. + ocode.set_scale(10) + + # cube + stockvol = ocl.BoxOCTVolume() + stockvol.corner = ocl.Point(0,0,-0.5) + stockvol.v1 = ocl.Point(9,0,0) + stockvol.v2 = ocl.Point(0,12,0) + stockvol.v3 = ocl.Point(0,0,3.5) + stockvol.calcBB() + + t_before = time.time() + stock = ocl.LinOCT() + stock.init(0) + stock.build( stockvol ) + calctime = time.time()-t_before + print(" stock built in ", calctime," s, stock.size()=",stock.size()) + + # draw initial octree + #tlist = pyocl.octree2trilist(stock) + #surf = camvtk.STLSurf(triangleList=tlist) + #myscreen.addActor(surf) + + # draw initial cutter + #startp = ocl.Point(0,0,0) + #cyl = camvtk.Cylinder(center=(startp.x,startp.y,startp.z), radius=c.radius, + # height=c.length, + # rotXYZ=(90,0,0), color=camvtk.grey) + #cyl.SetWireframe() + #myscreen.addActor(cyl) + + timetext = camvtk.Text() + timetext.SetPos( (myscreen.width-300, myscreen.height-30) ) + myscreen.addActor( timetext) + + ocltext = camvtk.Text() + ocltext.SetPos( (myscreen.width-300, myscreen.height-60) ) + myscreen.addActor( ocltext) + ocltext.SetText("OpenCAMLib") + + octtext = camvtk.Text() + octtext.SetPos( (myscreen.width-300, myscreen.height-90) ) + myscreen.addActor( octtext) + octtext.SetText("Octree cutting-simulation") + + infotext = camvtk.Text() + infotext.SetPos( (myscreen.width-300, myscreen.height-180) ) + myscreen.addActor( infotext) + + + Nmoves = len(clpts) + print(Nmoves,"CL-points to process") + for n in range(0,Nmoves-1): + timetext.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + #if n=0.3.0 <0.4" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "cmake-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-4.0.1.tgz", + "integrity": "sha512-ShCnSfCmcy9LfFomcMbQJuQ+hnanlMZbOqfiA8EmkYlW2uUwi4/m4/Rt+mOFmAdvNceP3bTLjHymYNNsM4tjFQ==", + "requires": { + "bluebird": "^3", + "debug": "^4", + "fs-extra": "^5.0.0", + "is-iojs": "^1.0.1", + "lodash": "^4", + "memory-stream": "0", + "npmlog": "^1.2.0", + "rc": "^1.2.7", + "request": "^2.54.0", + "semver": "^5.0.3", + "splitargs": "0", + "tar": "^4", + "traceur": "0.0.x", + "unzipper": "^0.8.13", + "url-join": "0", + "which": "^1.0.9", + "yargs": "^3.6.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-iojs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", + "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, + "lodash": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + }, + "memory-stream": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", + "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", + "requires": { + "readable-stream": "~1.0.26-2" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node-addon-api": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.6.2.tgz", + "integrity": "sha512-479Bjw9nTE5DdBSZZWprFryHGjUaQC31y1wHo19We/k0BZlrmhqQitWoUL0cD8+scljCbIUL+E58oRDEakdGGA==" + }, + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "requires": { + "source-map": "0.1.32" + } + }, + "splitargs": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", + "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=" + }, + "sshpk": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", + "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "traceur": { + "version": "0.0.111", + "resolved": "https://registry.npmjs.org/traceur/-/traceur-0.0.111.tgz", + "integrity": "sha1-wE3nTRRpbDNzQn3k/Ajsr5E/w6E=", + "requires": { + "commander": "2.9.x", + "glob": "5.0.x", + "rsvp": "^3.0.13", + "semver": "^4.3.3", + "source-map-support": "~0.2.8" + }, + "dependencies": { + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + } + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unzipper": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "~1.0.10", + "listenercount": "~1.0.1", + "readable-stream": "~2.1.5", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-join": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", + "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/applied-patches opencamlib-11.10-1/.pc/applied-patches --- opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/applied-patches 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/.pc/applied-patches 2020-06-14 12:13:21.000000000 +0000 @@ -0,0 +1 @@ +001-Set-Version.diff diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/.quilt_patches opencamlib-11.10-1/.pc/.quilt_patches --- opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/.quilt_patches 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/.pc/.quilt_patches 2020-06-14 12:13:21.000000000 +0000 @@ -0,0 +1 @@ +/home/buildd/build-RECIPEBRANCHBUILD-2587511/chroot-autobuild/home/buildd/work/tree/recipe/debian/patches diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/.quilt_series opencamlib-11.10-1/.pc/.quilt_series --- opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/.quilt_series 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/.pc/.quilt_series 2020-06-14 12:13:21.000000000 +0000 @@ -0,0 +1 @@ +/home/buildd/build-RECIPEBRANCHBUILD-2587511/chroot-autobuild/home/buildd/work/tree/recipe/debian/patches/series diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/.version opencamlib-11.10-1/.pc/.version --- opencamlib-11.10+git201801200005~ubuntu16.04.1/.pc/.version 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/.pc/.version 2020-06-14 12:13:21.000000000 +0000 @@ -0,0 +1 @@ +2 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/README opencamlib-11.10-1/README --- opencamlib-11.10+git201801200005~ubuntu16.04.1/README 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -OpenCAMLib README - -1. INTRODUCTION -OpenCAMLib (ocl) is a c++ library for creating toolpaths for cnc-machines -such as mills and lathes. - -The OpenCAMLib code is hosted at: -https://github.com/aewallin/opencamlib - -The mailing-list for general development and user-discussion is: -http://groups.google.com/group/opencamlib - -IRC-channel #cam on irc.freenode.net - -It's probably a good idea to try to adhere to some coding standard. Maybe this one: -http://www.possibility.com/Cpp/CppCodingStandard.html - - -2. CLONING, BUILDING and INSTALLING (on unix/debian-like systems) - $ git clone git://github.com/aewallin/opencamlib.git - $ cd opencamlib - $ mkdir build - $ cd build - $ cmake ../src - $ make (try make -j4 for a faster build if you have a multi-core machine) - $ sudo make install -will install the ocl.so library and camvtk.py so that any python shell will find them. - -if you also want to build the documentation, then run - $ make doc - $> make doc-pdf -this should create the ocl manual named "ocl-manual.pdf" in the build/doc directory - -using cmake and cpack it is possible to build a binary .deb package with - $ make package -For uploading debian source-packages to the PPA there is also a custom target - $ make spackage - -The build directory opencamlib/build can be wiped clean ("rm -rf *") and cmake run -again if/when you want a clean build. - -3. ORGANIZATION OF FILES -(generate this with 'tree -dL 2') - -├── cpp_examples c++ example use of opencamlib -│   ├── point minimal example of ocl::Point -├── debian files for building a debian package -├── doc documentation (not much here yet!) -├── lib useful python helper libraries -├── scripts python scripts that test or demonstrate use of ocl -│   ├── issues -│   ├── ocode old linear octree code -│   ├── offset-ellipse relates to BullCutter drop- and push-cutter -│   ├── old -│   └── voronoi vd scripts/tests -├── src -│   ├── algo algorithms under development -│   ├── attic old deprecated code -│   ├── common common algorithms and data-structures -│   ├── cutters cutter-classes -│   ├── dropcutter drop-cutter algorithms and operations -│   ├── geo primitive geometry classes (point,triangle,stlsurf, etc.) -│   └── voronoi -├── stl STL files for testing -└── Windows Visual-studio project for building on windows - - -3. Ubuntu 10.04LTS-> install and build -- install 64-bit Ubuntu 10.04LTS -- run update manager and install all suggested updates. reboot. -- using synaptic or apt-get, install the following packages(and their dependencies) --- build-essential --- cmake --- subversion --- doxygen --- texlive-latex-base --- libboost-all-dev -- checkout ocl from svn --- instructions: http://code.google.com/p/opencamlib/source/checkout -- in the /src directory, first run "cmake ." then "make" and then "sudo make install" --- this should build and install ocl correctly. - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/README.rst opencamlib-11.10-1/README.rst --- opencamlib-11.10+git201801200005~ubuntu16.04.1/README.rst 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/README.rst 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,123 @@ +.. image:: https://img.shields.io/badge/License-LGPL%20v2.1-blue.svg + :target: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html + +.. image:: https://travis-ci.org/aewallin/opencamlib.svg?branch=master + :target: https://travis-ci.org/aewallin/opencamlib + +.. image:: https://readthedocs.org/projects/opencamlib/badge/?version=latest + :target: https://opencamlib.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +OpenCAMLib README +================= + + + +INTRODUCTION +--------------- + +OpenCAMLib (ocl) is a c++ library with python bindings for creating 3D toolpaths for cnc-machines +such as mills and lathes. From August 2018 OpenCAMLib is released under LGPL license. + +- repository https://github.com/aewallin/opencamlib +- mailing-list http://groups.google.com/group/opencamlib +- IRC-channel #cam on irc.freenode.net +- coding standard (?) http://www.possibility.com/Cpp/CppCodingStandard.html + + +BUILDING and INSTALLING +----------------------- + +to clone, build and install install the ocl.so library and camvtk.py run the following:: + + $ git clone git://github.com/aewallin/opencamlib.git + $ cd opencamlib + $ mkdir build + $ cd build + $ sudo apt install cmake + $ sudo apt install libboost-program-options-dev + $ sudo apt install doxygen + $ sudo apt install texlive-full + $ cmake ../src + $ make (try make -j4 for a faster build if you have a multi-core machine) + $ sudo make install + +if you also want to build the documentation, then run:: + + $ make doc + $ make doc-pdf + +this should create the ocl manual named "ocl-manual.pdf" in the build/doc directory + +using cmake and cpack it is possible to build a binary .deb package with:: + + $ make package + +For uploading debian source-packages to the PPA there is also a custom target:: + + $ make spackage + +The build directory opencamlib/build can be wiped clean ("rm -rf *") and cmake run +again if/when you want a clean build. + +ORGANIZATION OF FILES +--------------------- + +(generate this with 'tree -dL 2'):: + + ├── cpp_examples c++ example use of opencamlib + │   ├── point minimal example of ocl::Point + ├── debian files for building a debian package + ├── doc documentation (not much here yet!) + ├── lib useful python helper libraries + ├── scripts python scripts that test or demonstrate use of ocl + │   ├── issues + │   ├── ocode old linear octree code + │   ├── offset-ellipse relates to BullCutter drop- and push-cutter + │   ├── old + │   └── voronoi vd scripts/tests + ├── src + │   ├── algo algorithms under development + │   ├── attic old deprecated code + │   ├── common common algorithms and data-structures + │   ├── cutters cutter-classes + │   ├── dropcutter drop-cutter algorithms and operations + │   ├── geo primitive geometry classes (point,triangle,stlsurf, etc.) + │   └── voronoi + ├── stl STL files for testing + └── Windows Visual-studio project for building on windows + + +Ubuntu 10.04LTS-> install and build +----------------------------------- + +(these notes are about 8 years old now and should be updated for relevant OSs) + +- install 64-bit Ubuntu 10.04LTS +- run update manager and install all suggested updates. reboot. +- using synaptic or apt-get, install the following packages(and their dependencies) + - build-essential + - cmake + - subversion + - doxygen + - texlive-latex-base + - libboost-all-dev +- checkout ocl from svn + - instructions: http://code.google.com/p/opencamlib/source/checkout +- in the /src directory, first run "cmake ." then "make" and then "sudo make install" + - this should build and install ocl correctly. + + +DOCKER BUILD +----------------------- + +To run this in Docker, simply run:: + + $ docker build . -t opencamlib + $ docker run -it -p 5900:5900 -e VNC_SERVER_PASSWORD=TestVNC --user cam --privileged opencamlib + +Then simply open up a VNC socket connection. With Mac, you can just open Finder, then run CMD + K. + +Type in "vnc://localhost:5900" as the server address, and type "TestVNC" as the password. + +Right click on the desktop terminal that shows up and you can open up a terminal inside there. This is a easy and quick way to get started with opencamlib, while still maintaining all the functionality diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_mtrush.py opencamlib-11.10-1/scripts/batchdropcutter_mtrush.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_mtrush.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/batchdropcutter_mtrush.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import vtk -import datetime -import math - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - - #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - #stl = camvtk.STLSurf("../stl/mount_rush.stl") - stl = camvtk.STLSurf("../stl/pycam-textbox.stl") - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface with", s.size(), "triangles read" - - # define a cutter - length=5 - cutter = ocl.BallCutter(15.4321, length) - #cutter = ocl.CylCutter(1.123, length) - #cutter = ocl.BullCutter(1.123, 0.2, length) - #cutter = ocl.ConeCutter(0.43, math.pi/7, length) - - - print cutter - - #define grid of CL-points - minx=-42 - dx=2 - maxx=47 - miny=-27 - dy=1 - maxy=20 - z=-55 - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - print "generated grid with", len(clpoints)," CL-points" - - # batchdropcutter - bdc1 = ocl.BatchDropCutter() - bdc1.setSTL(s) - bdc1.setCutter(cutter) - - # push the points to ocl - for p in clpoints: - bdc1.appendPoint(p) - - # run the actual calculation - t_before = time.time() - bdc1.run() - t_after = time.time() - calctime = t_after-t_before - print " done in ", calctime," s" - - - # get back results from ocl - clpts = bdc1.getCLPoints() - - - # draw the results - print "rendering...", - camvtk.drawCLPointCloud(myscreen, clpts) - print "done" - - myscreen.camera.SetPosition(25, 23, 15) - myscreen.camera.SetFocalPoint(4, 5, 0) - - # ocl text - t = camvtk.Text() - t.SetText("OpenCAMLib") - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - myscreen.addActor( t) - - # other text - t2 = camvtk.Text() - stltext = "%i triangles\n%i CL-points\n%0.1f seconds" % (s.size(), len(clpts), calctime) - t2.SetText(stltext) - t2.SetPos( (50, myscreen.height-100) ) - myscreen.addActor( t2) - - t3 = camvtk.Text() - ctext = "Cutter: %s" % ( str(cutter) ) - - t3.SetText(ctext) - t3.SetPos( (50, myscreen.height-150) ) - myscreen.addActor( t3) - - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_test_1.py opencamlib-11.10-1/scripts/batchdropcutter_test_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_test_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/batchdropcutter_test_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import vtk -import datetime - - - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - - #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - stl = camvtk.STLSurf("../stl/demo.stl") - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - length=5 - cutter = ocl.BallCutter(1.4321, length) - #cutter = ocl.CylCutter(1.123, length) - #cutter = ocl.BullCutter(1.123, 0.2, length) - print cutter - - minx=0 - dx=0.1/6 - maxx=10 - miny=0 - dy=1 - maxy=10 - z=-17 - # this generates a list of CL-points in a grid - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - print "generated grid with", len(clpoints)," CL-points" - - # batchdropcutter - bdc1 = ocl.BatchDropCutter() - bdc1.setSTL(s) - bdc1.setCutter(cutter) - for p in clpoints: - bdc1.appendPoint(p) - - t_before = time.time() - print "threads=",bdc1.getThreads() - bdc1.run() - t_after = time.time() - calctime = t_after-t_before - print " done in ", calctime," s" - - clpoints = bdc1.getCLPoints() - - print len(clpoints), " cl points evaluated" - - print "rendering...", - - # draw the CL-points - camvtk.drawCLPointCloud(myscreen, clpoints) - - print "done" - - myscreen.camera.SetPosition(3, 23, 15) - myscreen.camera.SetFocalPoint(4, 5, 0) - - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName("tux1.png") - #lwr.Write() - - t = camvtk.Text() - t.SetText("OpenCAMLib") - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - myscreen.addActor( t) - - t2 = camvtk.Text() - stltext = "%i triangles\n%i CL-points\n%0.1f seconds" % (s.size(), len(clpoints), calctime) - t2.SetText(stltext) - t2.SetPos( (50, myscreen.height-200) ) - myscreen.addActor( t2) - - t3 = camvtk.Text() - ctext = "Cutter: %s" % ( str(cutter) ) - - t3.SetText(ctext) - t3.SetPos( (50, myscreen.height-250) ) - myscreen.addActor( t3) - - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_test_2.py opencamlib-11.10-1/scripts/batchdropcutter_test_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_test_2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/batchdropcutter_test_2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import vtk -import datetime -import math - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - #stl = camvtk.STLSurf("../stl/beet_mm.stl") - #stl = camvtk.STLSurf("../stl/Blade.stl") - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read ", s.size(), " triangles" - length=5 - cutter = ocl.BallCutter(1.4321, length) - #cutter = ocl.CylCutter(1.123, length) - #cutter = ocl.BullCutter(1.4123, 0.5, length) - #cutter = ocl.ConeCutter(0.43, math.pi/7, length) - print cutter - - minx=0 - dx=0.06 - maxx=9 - miny=0 - dy=1 - maxy=12 - z=-5 - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - print "generated grid with", len(clpoints)," CL-points" - - # batchdropcutter - bdc1 = ocl.BatchDropCutter() - bdc1.setSTL(s) - bdc1.setCutter(cutter) - - for p in clpoints: - bdc1.appendPoint(p) - - t_before = time.time() - bdc1.run() - t_after = time.time() - calctime = t_after-t_before - print " done in ", calctime," s" - - clpts = bdc1.getCLPoints() - print "rendering...", - camvtk.drawCLPointCloud(myscreen, clpts) - print "done" - - myscreen.camera.SetPosition(3, 23, 15) - myscreen.camera.SetFocalPoint(4, 5, 0) - - t = camvtk.Text() - t.SetText("OpenCAMLib") - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - myscreen.addActor( t) - - t2 = camvtk.Text() - stltext = "%i triangles\n%i CL-points\n%0.1f seconds" % (s.size(), len(clpts), calctime) - t2.SetText(stltext) - t2.SetPos( (50, myscreen.height-200) ) - myscreen.addActor( t2) - - t3 = camvtk.Text() - ctext = "Cutter: %s" % ( str(cutter) ) - - t3.SetText(ctext) - t3.SetPos( (50, myscreen.height-250) ) - myscreen.addActor( t3) - - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_with_linefilter_test_1.py opencamlib-11.10-1/scripts/batchdropcutter_with_linefilter_test_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/batchdropcutter_with_linefilter_test_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/batchdropcutter_with_linefilter_test_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import vtk -import datetime -import math - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - #stl = camvtk.STLSurf("../stl/Cylinder_1.stl") - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - #stl = camvtk.STLSurf("../stl/demo.stl") - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - - angle = math.pi/4 - diameter=1.77321 - length=5 - #cutter = ocl.BallCutter(diameter, length) - cutter = ocl.CylCutter(diameter, length) - #cutter = ocl.BullCutter(diameter, 0.2, length) - #cutter = ocl.ConeCutter(diameter, angle, length) - #cutter = cutter.offsetCutter( 0.4 ) - - print cutter - - minx=-1 - dx=0.1/5 - - maxx=10 - miny=-1 - dy=1/float(2) - maxy=13 - z=-1 - # this generates a list of CL-points in a grid - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - print "generated grid with", len(clpoints)," CL-points" - - # batchdropcutter - bdc = ocl.BatchDropCutter() - #bdc.setThreads(1) - print "bdc()" - bdc.setBucketSize(2) - print "bucketSize" - bdc.setSTL(s) - print "setSTL()" - bdc.setCutter(cutter) - print "setCutter()" - #bdc.setThreads(1) # explicitly setting one thread is better for debugging - for p in clpoints: - bdc.appendPoint(p) - print "bdc has ",len(clpoints)," cl-points" - - t_before = time.time() - bdc.run() # run the actual drop-cutter - dc_calls = bdc.getCalls() - t_after = time.time() - calctime = t_after-t_before - print " BDC done in ", calctime," s", dc_calls," dc-calls" - dropcutter_time = calctime - clpoints = bdc.getCLPoints() - - #print len(clpoints), " cl points evaluated" - - print "rendering raw CL-points." - - # draw the CL-points - camvtk.drawCLPointCloud(myscreen, clpoints) - - # filter - print "filtering. before filter we have", len(clpoints),"cl-points" - t_before = time.time() - f = ocl.LineCLFilter() - f.setTolerance(0.001) - for p in clpoints: - f.addCLPoint(p) - f.run() - t_after = time.time() - calctime = t_after-t_before - print " done in ", calctime," s" - - clp2 = f.getCLPoints() - print "after filtering we have", len(clp2),"cl-points" - - # draw the filtered points - # offset these points up for clarity - for p in clp2: - p.z=p.z+3 - - print "rendering filtered CL-points." - camvtk.drawCLPointCloud(myscreen, clp2) - print "all done." - myscreen.camera.SetPosition(3, 23, 15) - myscreen.camera.SetFocalPoint(4, 5, 0) - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName("tux1.png") - #lwr.Write() - - t = camvtk.Text() - t.SetText("OpenCAMLib") - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - myscreen.addActor( t) - - t2 = camvtk.Text() - stltext = "%s\n%i triangles\n%i CL-points\n%i DropCutter() calls\n%0.1f seconds\n%0.3f us/call\n%i filtered CL-points" \ - % ( str(cutter), s.size(), len(clpoints), dc_calls, dropcutter_time, 1e6* dropcutter_time/dc_calls, len(clp2) ) - t2.SetText(stltext) - t2.SetPos( (50, myscreen.height-200) ) - myscreen.addActor( t2) - - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/clsurf_1.py opencamlib-11.10-1/scripts/clsurf_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/clsurf_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/clsurf_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math -import random - -def drawVertex(myscreen, p, vertexColor, rad=0.1): - myscreen.addActor( camvtk.Sphere( center=(p.x,p.y,p.z), radius=rad, color=vertexColor ) ) - -def drawEdge(myscreen, e, edgeColor=camvtk.yellow): - p1 = e[0] - p2 = e[1] - myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z), p2=(p2.x,p2.y,p2.z), color=edgeColor ) ) - -#def drawFarCircle(myscreen, r, circleColor): -# myscreen.addActor( camvtk.Circle( center=(0,0,0), radius=r, color=circleColor ) ) - -def drawDiagram( myscreen, diag ): - #drawFarCircle(myscreen, vd.getFarRadius(), camvtk.pink) - for v in diag.getVertices(): - drawVertex(myscreen, v, camvtk.green) - edges = diag.getEdges() - for e in edges: - drawEdge(myscreen,e, camvtk.cyan) - -def writeFrame( w2if, lwr, n ): - w2if.Modified() - lwr.SetFileName("frames/vd500_zoomout"+ ('%05d' % n)+".png") - lwr.Write() - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - - - camvtk.drawOCLtext(myscreen) - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - #w2if.Modified() - #lwr.SetFileName("tux1.png") - -# SURFACE - - #stl = camvtk.STLSurf("../stl/Cylinder_1.stl") - #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - stl = camvtk.STLSurf("../stl/demo.stl") - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - - - far = 20 - # far = 0.000002 generator 52 face_count crash - # far = 0.000010 crashes at n=192 - - camPos = 2* far - myscreen.camera.SetPosition(camPos/1000, camPos/1000, camPos) - myscreen.camera.SetClippingRange(-2*camPos,2*camPos) - myscreen.camera.SetFocalPoint(0.051, 0, 0) - - cls = ocl.CutterLocationSurface(10) - - cutter = ocl.BallCutter(2,10) - cls.setCutter(cutter) - cls.setSampling(1) - cls.setMinSampling(0.1) - cls.setSTL(s) - - drawDiagram(myscreen, cls) - #vd = ocl.VoronoiDiagram(far,1200) - - #vod = VD(myscreen,vd,scale) - #vod.setAll(vd) - #drawFarCircle(myscreen, scale*vd.getFarRadius(), camvtk.orange) - - - - print "PYTHON All DONE." - - - - myscreen.render() - myscreen.iren.Start() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/cutter_shapes.py opencamlib-11.10-1/scripts/cutter_shapes.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/cutter_shapes.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/cutter_shapes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,165 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawLoops(myscreen, loops, loopcolor): - nloop = 0 - for lop in loops: - n = 0 - N = len(lop) - first_point=ocl.Point(-1,-1,5) - previous=ocl.Point(-1,-1,5) - for p in lop: - if n==0: # don't draw anything on the first iteration - previous=p - first_point = p - elif n== (N-1): # the last point - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=loopcolor) ) # the normal line - # and a line from p to the first point - myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=loopcolor) ) - else: - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=loopcolor) ) - previous=p - n=n+1 - print "rendered loop ",nloop, " with ", len(lop), " points" - nloop = nloop+1 - -def getWaterline(s, cutter, zh, sampling): - wl = ocl.Waterline() - #wl.setThreads(1) # single thread for easier debug - wl.setSTL(s) - wl.setCutter(cutter) - wl.setZ(zh) - wl.setSampling(sampling) - wl.run() - loops = wl.getLoops() - return loops - -def getPathsY(s,cutter,sampling,y): - #apdc = ocl.PathDropCutter() - apdc = ocl.AdaptivePathDropCutter() - apdc.setSTL(s) - apdc.setCutter(cutter) - apdc.setZ( -20 ) - apdc.setSampling(sampling) - apdc.setMinSampling(sampling/700) - path = ocl.Path() - p1 = ocl.Point(-1.52*cutter.getDiameter() , y,-111) # start-point of line - p2 = ocl.Point(+1.52*cutter.getDiameter(), y,-111) # end-point of line - l = ocl.Line(p1,p2) # line-object - path.append( l ) - apdc.setPath( path ) - apdc.run() - return apdc.getCLPoints() - -def getPathsX(s,cutter,sampling,x): - #apdc = ocl.PathDropCutter() - apdc = ocl.AdaptivePathDropCutter() - apdc.setSTL(s) - apdc.setCutter(cutter) - apdc.setZ( -20 ) - apdc.setSampling(sampling) - apdc.setMinSampling(sampling/700) - path = ocl.Path() - p1 = ocl.Point(x, -1.52*cutter.getDiameter() , -111) # start-point of line - p2 = ocl.Point(x, +1.52*cutter.getDiameter(), -111) # end-point of line - l = ocl.Line(p1,p2) # line-object - path.append( l ) - apdc.setPath( path ) - apdc.run() - return apdc.getCLPoints() - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - #stl = camvtk.STLSurf("../stl/demo.stl") - #stl = camvtk.STLSurf("../stl/30sphere.stl") - #myscreen.addActor(stl) - - base=0.1 - tip=10 - a=ocl.Point(base,0,-tip) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); - b=ocl.Point(-base,0,-tip) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); - c=ocl.Point(0,0,0) - myscreen.addActor( camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))); - #myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,0,0.3)) ) - #myscreen.addActor( camvtk.Line(p1=(0,0,0.3),p2=(0,1,0)) ) - #myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,1,0)) ) - t = ocl.Triangle(a,b,c) - s = ocl.STLSurf() - s.addTriangle(t) - - print "STL surface read,", s.size(), "triangles" - - Nwaterlines = 40 - zh=[-0.15*x for x in xrange(Nwaterlines)] - #zh=[15] - diam = 3.01 - length = 50 - loops = [] - sampling = 0.1 - - #cutter = ocl.CylCutter( diam , length ) - #cutter = ocl.BallCutter( diam , length ) - #cutter = ocl.BullCutter( diam , diam/5, length ) - #cutter = ocl.ConeCutter(diam, math.pi/3, length) - #cutter = ocl.CylConeCutter(diam/float(3),diam,math.pi/float(9)) - #cutter = ocl.BallConeCutter(diam/float(2.3),diam,math.pi/float(5)) - #cutter = ocl.BullConeCutter(diam/1.5, diam/10, diam, math.pi/10) - cutter = ocl.ConeConeCutter(diam/2,math.pi/3,diam,math.pi/6) - - print cutter - #raw_input("Press Enter to terminate") - - ptsy_all = [] - ptsx_all = [] - yvals=[] - Nmax=15 - for i in range(Nmax): - yvals.append( diam* float(i)/float(Nmax) ) - yvals.append( -diam* float(i)/float(Nmax) ) - - for y in yvals: #[diam*0.4, diam*0.2, 0, -diam*0.2,diam*(-0.4)]: - ptsy = getPathsY(s,cutter,sampling, y) - ptsx = getPathsX(s,cutter,sampling, y) - ptsy_all.append(ptsy) - ptsx_all.append(ptsx) - - #print " got ",len(pts)," cl-points" - #for p in pts: - # print p.x," ",p.y," ",p.z - #exit() - - loops = [] - for z in zh: - - z_loops = getWaterline(s, cutter, z, sampling) - for l in z_loops: - loops.append(l) - - - #for l in line: - - #drawLoops(myscreen, line, camvtk.cyan) - #for l in cutter_loops: - # loops.append(l) - - print "All waterlines done. Got", len(loops)," loops in total." - # draw the loops - drawLoops(myscreen, loops, camvtk.cyan) - drawLoops(myscreen, ptsy_all, camvtk.pink) - drawLoops(myscreen, ptsx_all, camvtk.lblue) - - print "done." - myscreen.camera.SetPosition(15, 13, 7) - myscreen.camera.SetFocalPoint(5, 5, 0) - camvtk.drawArrows(myscreen,center=(0,0,3)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_one-triangle_1.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_one-triangle_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_one-triangle_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_one-triangle_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -import ocl -import pyocl -import camvtk -import vtk -import math - -if __name__ == "__main__": - print ocl.version() # print out git version tag - - # set up VTK visualization - myscreen = camvtk.VTKScreen() - myscreen.setAmbient(20,20,20) - myscreen.camera.SetPosition(4, 4, 3) - myscreen.camera.SetFocalPoint(0.6, 0.6, 0) - myscreen.setAmbient(1,1,1) - - #camvtk.drawArrows(myscreen) - - # three corners of a triangle - a = ocl.Point(1,0,-0.000010) - b = ocl.Point(0,1,+0.0) - c = ocl.Point(0.001,0,+0.3001) - #c = ocl.Point(0,0,0.3) - t = ocl.Triangle(a,b,c) - - # draw the triangle with VTK - myscreen.addActor( camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); - myscreen.addActor( camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); - myscreen.addActor( camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))); - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - - # Define a cutter - angle = math.pi/8 - length = 5.0 - #c1 = ocl.BullCutter(0.5,0.1, length) - #c1 = ocl.CylCutter(0.5, length) - #c1 = ocl.BallCutter(0.5, length) - c1 = ocl.ConeCutter(0.5,angle, length) - cutter = c1 - cutter = c1.offsetCutter(0.1) - - print cutter - - - # grid parameters - minx=-0.7 - dx=0.03 - maxx=1.7 - miny=-0.7 - dy=0.03 - maxy=1.7 - z=-0.5 - # generate list of CL-poins at height z - clpoints=[] - # we calculate cutter-locations for this grid of XY points - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - - # loop through the cl-points - n=0 - print len(clpoints), "cl-points to evaluate" - for cl in clpoints: - cutter.vertexDrop(cl,t) - cutter.edgeDrop(cl,t) - cutter.facetDrop(cl,t) - n=n+1 - print "drop-cutter done." - # cl has now been updated so it is a valid cutter-location point - # drop-cutter only updates the z-coordinate of cl, x/y are not changed. - - print "rendering...", - # render all the points - camvtk.drawCLPointCloud(myscreen, clpoints) - camvtk.drawCCPoints(myscreen, clpoints) - print "done." - - tx = camvtk.Text() - tx.SetPos( (myscreen.width-200, myscreen.height-130) ) - tx.SetText("opencamlib\ndrop-cutter") - myscreen.addActor( tx ) - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - - - # animate by rotating the camera - """ - for n in range(1,90): - tx.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - myscreen.camera.Azimuth( 4 ) - #time.sleep(0.01) - myscreen.render() - lwr.SetFileName("frames/ball_all"+ ('%05d' % n)+".png") - w2if.Modified() - #lwr.Write() # write screenshot to file - """ - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_one-triangle_2.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_one-triangle_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_one-triangle_2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_one-triangle_2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -import ocl -import pyocl -import camvtk -import vtk -import math - - -def drawPoints(myscreen, clpoints, ccpoints): - c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) - c.SetPoints() - myscreen.addActor(c ) - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - - # triangle - a=ocl.Point(1,0,0.4) - b=ocl.Point(0,1,0) - c=ocl.Point(0,0,-0.2) - t = ocl.Triangle(b,c,a) - - # draw the triangle with VTK - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - - # cutter - radius1=1 - length=5 - angle = math.pi/4 - #cutter = ocl.ConeCutter(0.37, angle) - cutter = ocl.BallCutter(0.532, length) - #cutter = ocl.CylCutter(0.3, length) - #cutter = ocl.BullCutter(0.5,0.123, length) - print cutter - - # grid on which we run drop-cutter - minx=-0.5 - dx=0.0051 - maxx=1.5 - miny=-0.7 - dy=dx - maxy=1.5 - z=-0.7 - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - - print len(clpoints), "cl-points to evaluate" - n=0 - for cl in clpoints: - #cutter.vertexDrop(cl,t) - #cutter.edgeDrop(cl,t) - #cutter.facetDrop(cl,t) - cutter.dropCutter(cl,t) # this calls all three above: vertex,facet,edge - n=n+1 - if (n % int(len(clpoints)/10)) == 0: - print n/int(len(clpoints)/10), " ", - - print "done." - - print "rendering..." - print " len(clpoints)=", len(clpoints) - - camvtk.drawCLPointCloud(myscreen, clpoints) - print "done." - - # draw a sphere, just for fun - origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) - origo.SetOpacity(0.2) - myscreen.addActor( origo ) - - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - myscreen.camera.SetClippingRange(-20,20) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_one-triangle_3_compoundcutter.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -import ocl -import pyocl # pyocl.CLPointGrid() -import camvtk -import vtk -import math - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - - a=ocl.Point(1,0.6,0.1) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b=ocl.Point(0,1,0) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c=ocl.Point(0,0,0.0) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - - t = ocl.Triangle(b,c,a) - radius1=1 - angle = math.pi/4 - #cutter = ocl.ConeCutter(0.37, angle) - #cutter = ocl.BallCutter(0.532) - #cutter = ocl.CylCutter(0.3) - #cutter = ocl.BullCutter(1,0.2) - - #cutter = ocl.CylConeCutter(0.2,0.5,math.pi/9) - #cutter = ocl.BallConeCutter(0.4,0.6,math.pi/9) - cutter = ocl.BullConeCutter(0.4,0.1,0.7,math.pi/6) - #cutter = ocl.ConeConeCutter(0.4,math.pi/3,0.7,math.pi/6) - #cutter = ocl.ConeCutter(0.4, math.pi/3) - print cutter - - #print cc.type - minx=-0.5 - dx=0.0051 - maxx=1.5 - miny=-0.7 - dy=dx - maxy=1.5 - z=-1.8 - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - nv=0 - nn=0 - ne=0 - nf=0 - print len(clpoints), "cl-points to evaluate" - n=0 - - for cl in clpoints: - cutter.vertexDrop(cl,t) - cutter.edgeDrop(cl,t) - cutter.facetDrop(cl,t) - #cutter.dropCutter(cl,t) - n=n+1 - if (n % int(len(clpoints)/10)) == 0: - print n/int(len(clpoints)/10), " ", - - print "done." - print "rendering..." - print " len(clpoints)=", len(clpoints) - - camvtk.drawCLPointCloud(myscreen, clpoints) - print "done." - origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) - origo.SetOpacity(0.2) - myscreen.addActor( origo ) - - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_1.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -import ocl -import camvtk -import time - -if __name__ == "__main__": - cutter = ocl.CylCutter(.1, 5) - print cutter - a = ocl.Point(1,0,0) - b = ocl.Point(0,1,0) - c = ocl.Point(0,0,1) - t = ocl.Triangle(a,b,c) - print "triangle created t=", t - cl = ocl.CLPoint(0.2,0.2,-5) - print "CL= ", cl - cutter.vertexDrop( cl , t ) - print "after vertex CL=", cl - print "t=",t - - #print "t.n", t.n.str() - - cutter.facetDrop( cl, t ) - #print "after facetDrop" - print "after facet t=",t - #print "t.n", t.n.str() - print "after facet CL=", cl - - - - cutter.edgeDrop( cl, t ) - print "after edge cl =", cl - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_2.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -import ocl -import camvtk -import time - -if __name__ == "__main__": - cutter = ocl.CylCutter(.1, 5) - print cutter - a=ocl.Point(1,0,0) - b=ocl.Point(0,1,0) - c=ocl.Point(0,0,1) - t = ocl.Triangle(a,b,c) - print "triangle created t=", t - cl = ocl.CLPoint(0.2,0.2,0) - - cutter.dropCutter(cl,t) - print "CL= ", cl diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_3.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_3.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_3.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -import ocl -import pyocl -import camvtk -import time - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - - a=ocl.Point(1,0,0) - myscreen.addActor(camvtk.Point(center=(1,0,0), color=(1,1,1))); - b=ocl.Point(0,1,0) - myscreen.addActor(camvtk.Point(center=(0,1,0), color=(1,1,1))); - c=ocl.Point(0,0,0.2) - myscreen.addActor( camvtk.Point(center=(0,0,0.2), color=(1,1,1))); - myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,0,0.2)) ) - myscreen.addActor( camvtk.Line(p1=(0,0,0.2),p2=(0,1,0)) ) - myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,1,0)) ) - t = ocl.Triangle(a,b,c) - - cutter = ocl.CylCutter(.3, 5) - print cutter - - minx=-0.2 - dx=0.02 - maxx=1.2 - miny=-0.2 - dy=0.2 - maxy=1.2 - z=-0.2 - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - - for cl in clpoints: - cutter.dropCutter(cl,t) - - print len(clpoints), " cl points evaluated" - # draw the points - camvtk.drawCLPointCloud(myscreen, clpoints) - - #position camera - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_4.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_4.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_4.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_4.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import vtk -import datetime -import math - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - - a=ocl.Point(1,0,0) - myscreen.addActor(camvtk.Point(center=(1,0,0), color=(1,0,1))); - b=ocl.Point(0,1,0) - myscreen.addActor(camvtk.Point(center=(0,1,0), color=(1,0,1))); - c=ocl.Point(0,0,0.3) - myscreen.addActor( camvtk.Point(center=(0,0,0.3), color=(1,0,1))); - myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,0,0.3)) ) - myscreen.addActor( camvtk.Line(p1=(0,0,0.3),p2=(0,1,0)) ) - myscreen.addActor( camvtk.Line(p1=(1,0,0),p2=(0,1,0)) ) - t = ocl.Triangle(a,b,c) - s = ocl.STLSurf() - s.addTriangle(t) - - diameter = 0.5234 - corneradius = 0.1 - angle = math.pi/4 - length = 5 - cutter = ocl.CylCutter(diameter, length) - #cutter = ocl.BallCutter(diameter, length) - #cutter = ocl.BullCutter(diameter,corneradius, length) - #cutter = ocl.ConeCutter(diameter, angle, length) - - print cutter - - minx=-0.5 - dx=0.01 - maxx=1.5 - miny=-0.5 - dy=0.05 - maxy=1.5 - z=-0.8 - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - print len(clpoints), "cl-points to evaluate" - n=0 - clp=[] - bdc = ocl.BatchDropCutter() - bdc.setSTL(s) - bdc.setCutter(cutter) - for p in clpoints: - bdc.appendPoint(p) - - bdc.run() - - print "done." - clpoints = bdc.getCLPoints() - print "rendering..." - print " len(clpoints)=", len(clpoints) - - camvtk.drawCLPointCloud(myscreen, clpoints) - - print "done." - - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - myscreen.render() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - t = camvtk.Text() - t.SetPos( (myscreen.width-350, myscreen.height-30) ) - myscreen.addActor(t) - - #for n in range(1,18): - # t.SetText("OpenCAMLib " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - # myscreen.camera.Azimuth( 2 ) - # time.sleep(0.1) - # myscreen.render() - # w2if.Modified() - # lwr.SetFileName("frames/tc"+ ('%04d' % n)+".png") - #lwr.Write() - - - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_5.py opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_5.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/drop-cutter/drop_cutter_tst_5.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/drop-cutter/drop_cutter_tst_5.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import vtk -import datetime - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - stl = camvtk.STLSurf("../../stl/gnu_tux_mod.stl") - - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - - polydata = stl.src.GetOutput() - s= ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - - cutter = ocl.CylCutter(0.6, 6) - print cutter - - minx=-0.2 - dx=2 - maxx=10.2 - miny=-0.2 - dy=3 - maxy=12.2 - z=-0.2 - clpoints = pyocl.CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - print len(clpoints),"CL-points to evaluate..." - tris = s.getTriangles() - # very naive approach to drop-cutter (and doing loops in python is slow) - # this is so slow in practice it is not usable with the tux-model STL-file (22k triangles) - for cl in clpoints: # loop through all the cl-points - for t in tris: # for each cl-point loop through all triangles - cutter.vertexDrop(cl,t) # vertex test - cutter.edgeDrop(cl,t) # edge test - cutter.facetDrop(cl,t) # facet test - print "done." - - camvtk.drawCLPointCloud(myscreen, clpoints) - - print len(clpoints), " cl points evaluated" - myscreen.camera.SetPosition(3, 23, 15) - myscreen.camera.SetFocalPoint(4, 5, 0) - myscreen.render() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName("tux1.png") - #lwr.Write() - - t = camvtk.Text() - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - myscreen.addActor( t) - - for n in range(1,36): - t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - myscreen.camera.Azimuth( 1 ) - time.sleep(0.01) - myscreen.render() - lwr.SetFileName("frame"+ ('%03d' % n)+".png") - w2if.Modified() - #lwr.Write() #uncomment to write screenshots to disk - - myscreen.iren.Start() - raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/edge_offset_tst_1.py opencamlib-11.10-1/scripts/edge_offset_tst_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/edge_offset_tst_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/edge_offset_tst_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import vtk -import datetime -import math - -def drawEdge(myscreen, a, b): - myscreen.addActor(camvtk.Sphere(center=(a.x,a.y,a.z), radius=0.0351, color=camvtk.green)); - myscreen.addActor(camvtk.Sphere(center=(b.x,b.y,b.z), radius=0.0351, color=camvtk.red)); - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - -if __name__ == "__main__": - print ocl.version() - myscreen = camvtk.VTKScreen() - camvtk.drawOCLtext(myscreen) - camvtk.drawArrows(myscreen,center=(-1,-2,0)) - a=ocl.Point(0,1.7,-0.6) - b=ocl.Point(0,0.11,0.3) - - drawEdge(myscreen, a, b) - diameter=0.4 - length=1 - # spherical cutter and cylinder - s1 = camvtk.Sphere(center=(a.x,a.y,a.z), radius=diameter/2, color=camvtk.lgreen) - s2 = camvtk.Sphere(center=(b.x,b.y,b.z), radius=diameter/2, color=camvtk.pink) - s1.SetOpacity(1) - s2.SetOpacity(1) - myscreen.addActor(s1) - myscreen.addActor(s2) - # tube - cyltube = camvtk.Tube( p1=(a.x,a.y,a.z) , p2=(b.x,b.y,b.z), radius=diameter/2, color=camvtk.yellow ) - cyltube.SetOpacity(0.2) - myscreen.addActor( cyltube ) - - - # Cylinder - a = a + ocl.Point(1,0,0) - b = b + ocl.Point(1,0,0) - drawEdge(myscreen, a, b) - cir1 = camvtk.Circle(center=(a.x,a.y,a.z) , radius=diameter/2, color=camvtk.lgreen, resolution=50 ) - cir1.SetOpacity(1) - myscreen.addActor(cir1) - cir2 = camvtk.Circle(center=(b.x,b.y,b.z) , radius=diameter/2, color=camvtk.pink, resolution=50 ) - cir2.SetOpacity(1) - myscreen.addActor(cir2) - - # draw lines along the elliptic tube - - # Toroid - a = a + ocl.Point(1,0,0) - b = b + ocl.Point(1,0,0) - drawEdge(myscreen, a, b) - tor1 = camvtk.Toroid(r1=diameter/2, r2=diameter/6, center=(a.x,a.y,a.z), rotXYZ=(0,0,0), color=camvtk.lgreen) - tor1.SetOpacity(1) - myscreen.addActor(tor1) - tor2 = camvtk.Toroid(r1=diameter/2, r2=diameter/6, center=(b.x,b.y,b.z), rotXYZ=(0,0,0), color=camvtk.pink) - tor2.SetOpacity(1) - myscreen.addActor(tor2) - - # Cone - a = a + ocl.Point(1,0,0) - b = b + ocl.Point(1,0,0) - drawEdge(myscreen, a, b) - con1 = camvtk.Cone(center=(a.x,a.y,a.z), radius=diameter/2, height = 0.3, color=camvtk.lgreen ) - myscreen.addActor(con1) - con2 = camvtk.Cone(center=(b.x,b.y,b.z), radius=diameter/2, height = 0.3, color=camvtk.pink ) - myscreen.addActor(con2) - - - print "done." - - myscreen.camera.SetPosition(4, 3, 2) - myscreen.camera.SetFocalPoint(0, 0, 0) - myscreen.render() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - - #for n in range(1,18): - # t.SetText("OpenCAMLib " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - # myscreen.camera.Azimuth( 2 ) - # time.sleep(0.1) - # myscreen.render() - # w2if.Modified() - # lwr.SetFileName("frames/tc"+ ('%04d' % n)+".png") - #lwr.Write() - - - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_01.py opencamlib-11.10-1/scripts/fiber/fiber_01.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_01.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_01.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - - -def drawPoints(myscreen, clpoints, ccpoints): - c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) - c.SetPoints() - myscreen.addActor(c ) - -def drawFiber(myscreen, f): - #myscreen.addActor( camvtk.Line(p1=(f.p1.x,f.p1.y,f.p1.z),p2=(f.p2.x,f.p2.y,f.p2.z), color=camvtk.orange) ) - #myscreen.addActor( camvtk.Sphere(center=(f.p1.x,f.p1.y,f.p1.z),radius=0.05, color=camvtk.lgreen) ) - #myscreen.addActor( camvtk.Sphere(center=(f.p2.x,f.p2.y,f.p2.z),radius=0.05, color=camvtk.pink) ) - inter = f.getInts() - for i in inter: - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=camvtk.red) ) - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - - a=ocl.Point(1,0.6,0.5) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b=ocl.Point(0,1,0) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c=ocl.Point(0,0,0.0) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - - f1 = ocl.Point(-2,0.5,-0.2) - f2 = ocl.Point(2,0.5,-0.2) - t = ocl.Triangle(b,c,a) - #radius1=1 - #angle = math.pi/4 - #cutter = ocl.ConeCutter(0.37, angle) - #cutter = ocl.BallCutter(0.532,5) - cutter = ocl.CylCutter(0.3,5) - - #cutter = ocl.CylConeCutter(0.2,0.5,math.pi/9) - #cutter = ocl.BallConeCutter(0.4,0.6,math.pi/9) - #cutter = ocl.BullConeCutter(0.4,0.1,0.7,math.pi/6) - #cutter = ocl.ConeConeCutter(0.4,math.pi/3,0.7,math.pi/6) - #cutter = ocl.ConeCutter(0.4, math.pi/3) - - print "fiber..." - - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - f.printInts() - print "vertexPush" - cc = ocl.CCPoint() - cutter.pushCutter(f,i,t) - print i - f.addInterval(i) - print "AFTER vertexPush" - f.printInts() - - #inter = f.getInts() - #print inter - print "done." - - print "rendering..." - drawFiber(myscreen, f) - print "done." - origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) - origo.SetOpacity(0.2) - myscreen.addActor( origo ) - - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - myscreen.render() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - t = camvtk.Text() - t.SetPos( (myscreen.width-350, myscreen.height-30) ) - myscreen.addActor(t) - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_02_onetriangle_drawfibers.py opencamlib-11.10-1/scripts/fiber/fiber_02_onetriangle_drawfibers.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_02_onetriangle_drawfibers.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_02_onetriangle_drawfibers.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawPoints(myscreen, clpoints, ccpoints): - c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) - c.SetPoints() - myscreen.addActor(c ) - -def drawFiber(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - cc1 = i.lower_cc - cc2 = i.upper_cc - myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) - myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) - # cutter circle - #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c1) - #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c2) - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - - a = ocl.Point(0,1,0.3) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b = ocl.Point(1,0.5,0.3) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c = ocl.Point(0,0,0) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - diameter = 0.2 - length = 5 - angle = math.pi/4 - cutter = ocl.CylCutter(diameter, length) - #cutter = ocl.BallCutter(diameter, length) - #cutter = ocl.BullCutter(diameter, diameter/5, length) - #cutter = ocl.ConeCutter(diameter, angle, length) - - print cutter - range=6 - Nmax = 500 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - - zh = 0.1071567 - for y in yvals: - f1 = ocl.Point(-0.5,y,zh) # start point of fiber - f2 = ocl.Point(1.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - cutter.pushCutter(f,i,t) - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - f.addInterval(i) - drawFiber(myscreen, f, camvtk.red) - - for x in xvals: - f1 = ocl.Point(x,-0.5,zh) # start point of fiber - f2 = ocl.Point(x,1.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - cutter.pushCutter(f,i,t) - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - f.addInterval(i) - drawFiber(myscreen, f, camvtk.lblue) - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_03_onetri_many-z-levels.py opencamlib-11.10-1/scripts/fiber/fiber_03_onetri_many-z-levels.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_03_onetri_many-z-levels.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_03_onetri_many-z-levels.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawPoints(myscreen, clpoints, ccpoints): - c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) - c.SetPoints() - myscreen.addActor(c ) - -def drawFiber(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - print "fiber has ", len(inter) , " intervals" - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) - # cutter circle - #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c1) - #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c2) - -def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - #print "fiber has ", len(inter) , " intervals" - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) - -def yfiber(yvals,t,zh,myscreen): - for y in yvals: - f1 = ocl.Point(-0.5,y,zh) # start point of fiber - f2 = ocl.Point(1.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.red) - -def xfiber(xvals,t,zh,myscreen): - for x in xvals: - f1 = ocl.Point(x,-0.5,zh) # start point of fiber - f2 = ocl.Point(x,1.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.lblue) - - - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - a = ocl.Point(0,1,0.3) - b = ocl.Point(1,0.5,0.0) - c = ocl.Point(0.1,0.1,0.0) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - angle = math.pi/4 - diameter=0.3 - length=5 - #cutter = ocl.BallCutter(diameter, length) - cutter = ocl.CylCutter(diameter, length) - #cutter = ocl.BullCutter(diameter, diameter/4, length) - #cutter = ocl.ConeCutter(diameter, angle, length) - #cutter = cutter.offsetCutter( 0.1 ) - - print "cutter= ", cutter - print "lengt=", cutter.getLength() - print "fiber...", - range=2 - Nmax = 100 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - zmin = -0.2082 - zmax = 0.3115 - zNmax = 20 - dz = (zmax-zmin)/(zNmax-1) - zvals=[] - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - for zh in zvals: - yfiber(yvals,t,zh,myscreen) - xfiber(xvals,t,zh,myscreen) - print "done." - print "rendering...", - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - print "done." - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_04_stl.py opencamlib-11.10-1/scripts/fiber/fiber_04_stl.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_04_stl.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_04_stl.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawPoints(myscreen, clpoints, ccpoints): - c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) - c.SetPoints() - myscreen.addActor(c ) - -def drawFiber(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - cc1 = i.lower_cc - cc2 = i.upper_cc - myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) - myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) - # cutter circle - #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c1) - #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c2) - -def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) - -def yfiber(yvals,s,zh,myscreen): - for y in yvals: - f1 = ocl.Point(-20,y,zh) # start point of fiber - f2 = ocl.Point(+20,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - for t in s.getTriangles(): - i = ocl.Interval() - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.red) - -def xfiber(xvals,s,zh,myscreen): - for x in xvals: - f1 = ocl.Point(x,-20,zh) # start point of fiber - f2 = ocl.Point(x,+20,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - for t in s.getTriangles(): - i = ocl.Interval() - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.lblue) - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - #stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - stl = camvtk.STLSurf("../stl/demo.stl") - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((1,1,1)) - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - - cutter = ocl.CylCutter(0.3, 6) - print "lengt=", cutter.getLength() - print "fiber...", - range=30 - Nmax = 200 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - zmin = -0.1 - zmax = 0.5 - zNmax = 2 - dz = (zmax-zmin)/(zNmax-1) - zvals=[] - #for n in xrange(0,zNmax): - # zvals.append(zmin+n*dz) - zvals.append(0.1) - #zvals = [ float(n-float(zNmax)/2)/zNmax*range for n in xrange(0,zNmax+1)] - #print zvals - #exit() - #cc = ocl.CCPoint() - #zh = -0.1 - #zh = 0.2571567 - - for zh in zvals: - yfiber(yvals,s,zh,myscreen) - xfiber(xvals,s,zh,myscreen) - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_05_batch.py opencamlib-11.10-1/scripts/fiber/fiber_05_batch.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_05_batch.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_05_batch.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -if __name__ == "__main__": - print ocl.revision() - - myscreen = camvtk.VTKScreen() - - a = ocl.Point(0,1,0.3) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b = ocl.Point(1,0.5,0.3) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c = ocl.Point(0,0,0) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - s = ocl.STLSurf() - s.addTriangle(t) # a one-triangle STLSurf - - cutter = ocl.CylCutter(0.3,6) - #cutter = ocl.BallCutter(0.3,6) - print "fiber..." - range=6 - Nmax = 800 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - zmin = -0.1 - zmax = 0.5 - zNmax = 50 - dz = (zmax-zmin)/(zNmax-1) - zvals=[] - #zvals.append(0.2) - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - - bpc_x = ocl.BatchPushCutter() - bpc_x.setXDirection() - bpc_x.setSTL(s) - bpc_x.setCutter(cutter) - - - bpc_y = ocl.BatchPushCutter() - bpc_y.setYDirection() - bpc_y.setSTL(s) - bpc_y.setCutter(cutter) - - - # create fibers - for zh in zvals: - for y in yvals: - f1 = ocl.Point(-0.5,y,zh) # start point of fiber - f2 = ocl.Point(1.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_x.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,-0.5,zh) # start point of fiber - f2 = ocl.Point(x,1.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_y.appendFiber(f) - - # run - bpc_x.run() - bpc_y.run() - clpoints = bpc_x.getCLPoints() - clp2 = bpc_y.getCLPoints() - clpoints +=clp2 - print "rendering raw CL-points." - - # draw the CL-points - camvtk.drawCLPointCloud(myscreen, clpoints) - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - - myscreen.render() - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_06_batch_stl.py opencamlib-11.10-1/scripts/fiber/fiber_06_batch_stl.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_06_batch_stl.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_06_batch_stl.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def generateRange(zmin,zmax,zNmax): - dz = (float(zmax)-float(zmin))/(zNmax-1) - zvals=[] - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - return zvals - - -if __name__ == "__main__": - print ocl.revision() - - myscreen = camvtk.VTKScreen() - #stl = camvtk.STLSurf("../stl/demo.stl") - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - myscreen.addActor(stl) - #stl.SetWireframe() - stl.SetSurface() - stl.SetColor(camvtk.cyan) - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - bounds = s.getBounds() - print "STLSurf.Bounds()=", bounds - cutter = ocl.CylCutter(0.3,6) - #cutter = ocl.BallCutter(0.3,6) - - cutter.length = 4.0 - print cutter - xmin=-1 - xmax=15 - N=100 - ymin=-1 - ymax=15 - yvals = generateRange(ymin,ymax,N) - xvals = generateRange(xmin,xmax,N) - #print xvals - zmin = -0.1 - zmax = 2.75 - zNmax = 7 - zvals = generateRange(zmin,zmax,zNmax) - print " calculating waterlines at ", len(zvals)," different z-heights" - #print zvals - bpc_x = ocl.BatchPushCutter() - bpc_y = ocl.BatchPushCutter() - bpc_x.setXDirection() - bpc_y.setYDirection() - bpc_x.setSTL(s) - bpc_y.setSTL(s) - bpc_x.setCutter(cutter) - bpc_y.setCutter(cutter) - # create fibers - nfibers=0 - for zh in zvals: - for y in yvals: - f1 = ocl.Point(xmin,y,zh) # start point of fiber - f2 = ocl.Point(xmax,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_x.appendFiber(f) - - nfibers=nfibers+1 - for x in xvals: - f1 = ocl.Point(x,ymin,zh) # start point of fiber - f2 = ocl.Point(x,ymax,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_y.appendFiber(f) - - nfibers=nfibers+1 - # run - #t_before = time.time() - #bpc2.pushCutter2() - #t_after = time.time() - #push_calctime = t_after-t_before - #print " BPC done in ", push_calctime," s", bpc2.nCalls," push-calls" - #print (push_calctime/bpc2.nCalls)*1e6, " us/call" - - t_before = time.time() - bpc_x.run() - bpc_y.run() - t_after = time.time() - push_calctime = t_after-t_before - print " BPC 3 done in ", push_calctime," s", bpc_x.getCalls()," push-calls" - - - clpoints = bpc_x.getCLPoints() - clp2 = bpc_y.getCLPoints() - clpoints+=clp2 - print "got ", len(clpoints), " CL-points" - print "rendering raw CL-points." - - # draw the CL-points - camvtk.drawCLPointCloud(myscreen, clpoints) - for p in clpoints: - myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z),radius=0.02, color=camvtk.clColor( p.cc() ) ) ) - - - - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - - myscreen.render() - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_07_weave.py opencamlib-11.10-1/scripts/fiber/fiber_07_weave.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_07_weave.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_07_weave.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - a = ocl.Point(0,1,0.3) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b = ocl.Point(1,0.5,0.3) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c = ocl.Point(0,0,0.1) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - s = ocl.STLSurf() - s.addTriangle(t) # a one-triangle STLSurf - - cutter = ocl.CylCutter(0.3, 5) - #cutter = ocl.BallCutter(0.4, 5) - #cutter = ocl.BullCutter(0.4, 0.1, 5) - - print "fiber..." - range=4 - Nmax = 100 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - zmin = -0.1 - zmax = 0.5 - zNmax = 5 - dz = (zmax-zmin)/(zNmax-1) - zvals=[ 0.23] - #zvals.append(0.2) - #for n in xrange(0,zNmax): - # zvals.append(zmin+n*dz) - - bpc_x = ocl.BatchPushCutter() - bpc_y = ocl.BatchPushCutter() - bpc_x.setXDirection() - bpc_y.setYDirection() - bpc_x.setSTL(s) - bpc_y.setSTL(s) - bpc_x.setCutter(cutter) - bpc_y.setCutter(cutter) - # create fibers - for zh in zvals: - for y in yvals: - f1 = ocl.Point(-0.5,y,zh) # start point of fiber - f2 = ocl.Point(1.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_x.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,-0.5,zh) # start point of fiber - f2 = ocl.Point(x,1.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_y.appendFiber(f) - - # run - bpc_x.run() - bpc_y.run() - clpoints = bpc_x.getCLPoints() - clp2 = bpc_y.getCLPoints() - clpoints+=clp2 - xfibers = bpc_x.getFibers() - yfibers = bpc_y.getFibers() - fibers = xfibers+yfibers - print " got ",len(xfibers)," xfibers" - print " got ",len(yfibers)," yfibers" - print "rendering fibers and CL-points." - w = ocl.Weave() - print "push fibers to Weave...", - for f in fibers: - w.addFiber(f) - print "done." - print "Weave build()...", - w.build() - print "done" - print "face_traverse..." - w.face_traverse() - print "done." - w_clpts = w.getCLPoints() - w_ipts = w.getIPoints() - w_edges = w.getEdges() - w_loop = w.getLoops() - - print " weave: got ", len(w_clpts)," CL-points and ", len(w_ipts)," internal points" - - print " got: ", len(w_edges), " edges" - print " got: ", len(w_loop), " loop points" - #zoffset = 0.0 - #for p in w_clpts: - # myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z+zoffset), radius=0.0031, color=camvtk.red ) ) - - previous = 0 - # draw the loop as a yellow line - for loop in w_loop: - np = 0 - for p in loop: - #myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z+zoffset2), radius=0.006, color=camvtk.pink ) ) - if np is not 0: - myscreen.addActor( camvtk.Line( p1=(previous.x,previous.y, previous.z), - p2=(p.x,p.y,p.z), color=camvtk.yellow) ) - np=np+1 - previous = p - - # draw edges of weave - ne = 0 - zoffset=0.1 - dzoffset = 0.0005 - for e in w_edges: - p1 = e[0] - p2 = e[1] - myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z+zoffset+ne*dzoffset), p2=(p2.x,p2.y,p2.z+zoffset+ne*dzoffset) ) ) - ne = ne+1 - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_08_stl_weave.py opencamlib-11.10-1/scripts/fiber/fiber_08_stl_weave.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_08_stl_weave.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_08_stl_weave.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def generateRange(zmin,zmax,zNmax): - dz = (float(zmax)-float(zmin))/(zNmax-1) - zvals=[] - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - return zvals - - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - #stl = camvtk.STLSurf("../stl/demo.stl") - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - myscreen.addActor(stl) - stl.SetWireframe() - #stl.SetSurface() - stl.SetColor(camvtk.cyan) - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - bounds = s.getBounds() - print "STLSurf.Bounds()=", bounds - cutter = ocl.CylCutter(1.6,5) - #cutter = ocl.BallCutter(0.3,5) - - print cutter - xmin=-1 - xmax=15 - N=100 - ymin=-1 - ymax=15 - yvals = generateRange(ymin,ymax,N) - xvals = generateRange(xmin,xmax,N) - #print xvals - zmin = -0.1 - zmax = 2.75 - zNmax = 5 - zvals = generateRange(zmin,zmax,zNmax) - print " calculating waterlines at ", len(zvals)," different z-heights" - #print zvals - bpcx = ocl.BatchPushCutter() - bpcy = ocl.BatchPushCutter() - bpcx.setXDirection() - bpcy.setYDirection() - bpcx.setSTL(s) - bpcy.setSTL(s) - bpcx.setCutter(cutter) - bpcy.setCutter(cutter) - # create fibers - nfibers=0 - for zh in zvals: - for y in yvals: - f1 = ocl.Point(xmin,y,zh) # start point of fiber - f2 = ocl.Point(xmax,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpcx.appendFiber(f) - nfibers=nfibers+1 - for x in xvals: - f1 = ocl.Point(x,ymin,zh) # start point of fiber - f2 = ocl.Point(x,ymax,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpcy.appendFiber(f) - nfibers=nfibers+1 - - # run - t_before = time.time() - bpcx.run() - bpcy.run() - t_after = time.time() - push_calctime = t_after-t_before - - - - clpoints = bpcx.getCLPoints() - clp2=bpcy.getCLPoints() - clpoints+=clp2 - print "got ", len(clpoints), " CL-points" - print "rendering raw CL-points." - - # draw the CL-points - #camvtk.drawCLPointCloud(myscreen, clpoints) - #for p in clpoints: - # myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z),radius=0.02, color=camvtk.clColor( p.cc() ) ) ) - - - xfibers = bpcx.getFibers() - yfibers = bpcy.getFibers() - fibers=xfibers+yfibers - # sort fibers into different z-levels - sorted_fibers=[] - for zh in zvals: - zlevel_fibers=[] - for f in fibers: - if f.p1.z == zh: - zlevel_fibers.append(f) - sorted_fibers.append(zlevel_fibers) - print " found ",len(sorted_fibers)," z-levels" - - n=0 - loops = [] - t2_before = time.time() - for zlev_fibers in sorted_fibers: - print " z-level ",n," at z=", zvals[n], " has ", len(zlev_fibers), "fibers" - n=n+1 - w = ocl.Weave() - for f in zlev_fibers: - w.addFiber(f) - print " build()...", - w.build() - print "done" - print " split()...", - subw = w.get_components() - print " graph has ", len(subw)," sub-weaves" - m=0 - for sw in subw: - print m," face_traverse...", - t_before = time.time() - sw.face_traverse() - t_after = time.time() - calctime = t_after-t_before - print "done in ", calctime," s" - w_loop = sw.getLoops() - for lop in w_loop: - loops.append(lop) - m=m+1 - t2_after = time.time() - print " found", len(loops)," loops" - print " loop extraction took ", t2_after-t2_before," seconds" - # draw the loops - for lop in loops: - n = 0 - N = len(lop) - first_point=ocl.Point(-1,-1,5) - previous=ocl.Point(-1,-1,5) - for p in lop: - if n==0: # don't draw anything on the first iteration - previous=p - first_point = p - elif n== (N-1): # the last point - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) # the normal line - # and a line from p to the first point - myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=camvtk.yellow) ) - else: - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) - previous=p - n=n+1 - - t2 = camvtk.Text() - stltext = "%s\n%i triangles\n%i waterlines\n%i Fibers\n%i CL-points\n%i pushCutter() calls\n%0.1f seconds\n%0.3f us/call" \ - % ( str(cutter), s.size(), len(zvals), nfibers, len(clpoints), bpc.nCalls, push_calctime, 1e6* push_calctime/bpc.nCalls ) - t2.SetText(stltext) - t2.SetPos( (50, myscreen.height-200) ) - myscreen.addActor( t2) - - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - - myscreen.render() - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_09_ballcutter.py opencamlib-11.10-1/scripts/fiber/fiber_09_ballcutter.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_09_ballcutter.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_09_ballcutter.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,100 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math -def drawFiber(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) - # cutter circle - #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c1) - #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c2) - -if __name__ == "__main__": - print ocl.revision() - - myscreen = camvtk.VTKScreen() - - a = ocl.Point(0,1,0.3) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b = ocl.Point(1,0.5,0.3) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c = ocl.Point(0,0,0) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - s = ocl.STLSurf() - s.addTriangle(t) # a one-triangle STLSurf - length = 10 - #cutter = ocl.CylCutter(0.3, length) - cutter = ocl.BallCutter(0.3, length) - - print "fiber..." - range=4 - Nmax = 100 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - zmin = -0.1 - zmax = 0.5 - zNmax = 20 - dz = (zmax-zmin)/(zNmax-1) - zvals=[] - zvals.append(0.2) - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - - bpc = ocl.BatchPushCutter() - bpc.setSTL(s) - bpc.setCutter(cutter) - # create fibers - for zh in zvals: - for y in yvals: - f1 = ocl.Point(-0.5,y,zh) # start point of fiber - f2 = ocl.Point(1.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,-0.5,zh) # start point of fiber - f2 = ocl.Point(x,1.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc.appendFiber(f) - - # run - bpc.run() - clpoints = bpc.getCLPoints() - fibers = bpc.getFibers() - print " got ",len(fibers)," fibers from bpc" - print "rendering fibers and CL-points." - #camvtk.drawCLPointCloud(myscreen, clpoints) - for f in fibers: - drawFiber(myscreen, f, camvtk.red) - - #exit() - - - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - - myscreen.render() - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_10_offsets.py opencamlib-11.10-1/scripts/fiber/fiber_10_offsets.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_10_offsets.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_10_offsets.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def generateRange(zmin,zmax,zNmax): - if zNmax>1: - dz = (float(zmax)-float(zmin))/(zNmax-1) - else: - dz = 0 - zvals=[] - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - return zvals - -def waterline(cutter, s, zh, tol = 0.1 ): - bpc = ocl.BatchPushCutter() - bpc.setSTL(s) - bpc.setCutter(cutter) - bounds = s.getBounds() - xmin= bounds[0] - 2*cutter.radius() - xmax= bounds[1] + 2*cutter.radius() - ymin= bounds[2] - 2*cutter.radius() - ymax= bounds[3] + 2*cutter.radius() - Nx= int( (xmax-xmin)/tol ) - Ny= int( (ymax-ymin)/tol ) - xvals = generateRange(xmin,xmax,Nx) - yvals = generateRange(ymin,ymax,Ny) - for y in yvals: - f1 = ocl.Point(xmin,y,zh) # start point of fiber - f2 = ocl.Point(xmax,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,ymin,zh) # start point of fiber - f2 = ocl.Point(x,ymax,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc.appendFiber(f) - bpc.run() - fibers = bpc.getFibers() # get fibers - w = ocl.Weave() - for f in fibers: - w.addFiber(f) - - print " build()...", - w.build() - print "done" - print " split()...", - subw = w.get_components() - print "done. graph has", len(subw),"sub-weaves" - m=0 - loops = [] - for sw in subw: - print m," face_traverse...", - t_before = time.time() - sw.face_traverse() - t_after = time.time() - calctime = t_after-t_before - print "done in ", calctime," s." - sw_loops = sw.getLoops() - for lop in sw_loops: - loops.append(lop) - m=m+1 - return loops - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - #stl = camvtk.STLSurf("../stl/demo.stl") - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - myscreen.addActor(stl) - stl.SetWireframe() - #stl.SetSurface() - stl.SetColor(camvtk.cyan) - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - zh=1.9 - cutter_diams = generateRange(0.1, 6, 5) - loops = [] - length = 20 # cutter length - for diam in cutter_diams: - cutter = ocl.CylCutter( diam, length ) - cutter_loops = waterline(cutter, s, zh, 0.05 ) - for l in cutter_loops: - loops.append(l) - - print "All waterlines done. Got", len(loops)," loops in total." - # draw the loops - for lop in loops: - n = 0 - N = len(lop) - first_point=ocl.Point(-1,-1,5) - previous=ocl.Point(-1,-1,5) - for p in lop: - if n==0: # don't draw anything on the first iteration - previous=p - first_point = p - elif n== (N-1): # the last point - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) # the normal line - # and a line from p to the first point - myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=camvtk.yellow) ) - else: - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) - previous=p - n=n+1 - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_12_waterline_onetriangle.py opencamlib-11.10-1/scripts/fiber/fiber_12_waterline_onetriangle.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_12_waterline_onetriangle.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_12_waterline_onetriangle.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def loop_waterline(zh, cutter,s): - range=2 - Nmax = 200 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - bpc = ocl.BatchPushCutter() - bpc.setXDirection() - bpc.setSTL(s) - bpc.setCutter(cutter) - for y in yvals: - f1 = ocl.Point(-range,y,zh) # start point of fiber - f2 = ocl.Point(+range,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,-range,zh) # start point of fiber - f2 = ocl.Point(x,+range,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc.appendFiber(f) - bpc.run() - clpoints = bpc.getCLPoints() - fibers = bpc.getFibers() - w = ocl.Weave() - print "Weave...", - for f in fibers: - w.addFiber(f) - print "build()...", - w.build() - print "face_traverse()...", - w.face_traverse() - print "done." - return w.getLoops() - -def drawLoop(myscreen, w_loop): # draw the loop as a yellow line - previous = 0 - for loop in w_loop: - np = 0 - for p in loop: - if np is not 0: - myscreen.addActor( camvtk.Line( p1=(previous.x,previous.y, previous.z), - p2=(p.x,p.y,p.z), color=camvtk.yellow) ) - np=np+1 - previous = p - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - a = ocl.Point(0,1,0.3) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b = ocl.Point(1,0.5,0.3) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c = ocl.Point(0,0,0.1) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - s = ocl.STLSurf() - s.addTriangle(t) # a one-triangle STLSurf - diameter = 0.4 - angle = math.pi/4 - length = 5 - cutter = ocl.CylCutter(0.3, 5) - #cutter = ocl.BallCutter(0.4, 5) - #cutter = ocl.BullCutter(0.4, 0.1, 5) - #cutter = ocl.ConeCutter(diameter, angle, length) - print cutter - zstart = 0 - zend = 0.35 - zvals=[] - Nz = 7 - for n in xrange(0,Nz): - zvals.append( zstart + n*(zend-zstart)/float(Nz-1) ) - for zh in zvals: - print "zh=", zh - w_loop = loop_waterline(zh, cutter,s) - drawLoop( myscreen, w_loop ) - - print "done." - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - - myscreen.render() - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_13_onetri_cutter_comparison.py opencamlib-11.10-1/scripts/fiber/fiber_13_onetri_cutter_comparison.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_13_onetri_cutter_comparison.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_13_onetri_cutter_comparison.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawPoints(myscreen, clpoints, ccpoints): - c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) - c.SetPoints() - myscreen.addActor(c ) - -def drawFiber(myscreen, f, fibercolor): - inter = f.getInts() - print "fiber has ", len(inter) , " intervals" - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.lgreen ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.lgreen ) ) - # cutter circle - #c1 = camvtk.Circle(center=(ip1.x,ip1.y,ip1.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c1) - #c2 = camvtk.Circle(center=(ip2.x,ip2.y,ip2.z), radius = 0.3/2, color=fibercolor) - #myscreen.addActor(c2) - -def drawFiber_clpts(myscreen, f, clcolor): - inter = f.getInts() - #print "fiber has ", len(inter) , " intervals" - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - sphcolor = camvtk.clColor( i.lower_cc) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=sphcolor ) ) - sphcolor = camvtk.clColor( i.upper_cc) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=sphcolor ) ) - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) - -def yfiber(yvals,t,zh,myscreen,cutter,color): - for y in yvals: - f1 = ocl.Point(-0.5,y,zh) # start point of fiber - f2 = ocl.Point(1.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, color) - -def xfiber(xvals,t,zh,myscreen,cutter,color): - for x in xvals: - f1 = ocl.Point(x,-0.5,zh) # start point of fiber - f2 = ocl.Point(x,1.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - #cutter.vertexPush(f,i,t) - #cutter.facetPush(f,i,t) - #cutter.edgePush(f,i,t) - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, color) - -def oneCutterWaterline(myscreen, cutter, zh, color): - range=2 - Nmax = 100 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - yfiber(yvals,t,zh,myscreen,cutter, color) - xfiber(xvals,t,zh,myscreen,cutter, color) - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - - a = ocl.Point(0,1,0.2) - b = ocl.Point(1,0.5,0.0) - c = ocl.Point(0.1,0.1,0.0) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - angle = math.pi/4 - diameter=0.3 - length=5 - cutter1 = ocl.BallCutter(diameter, length) - cutter2 = ocl.CylCutter(diameter, length) - cutter3 = ocl.BullCutter(diameter, diameter/4, length) - cutter4 = ocl.ConeCutter(diameter, angle, length) - #cutter = cutter.offsetCutter( 0.1 ) - - - range=2 - Nmax = 50 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - zmin = -0.1 - zmax = 0.25 - zNmax =5 - dz = (zmax-zmin)/(zNmax-1) - zvals=[] - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - - for zh in zvals: - oneCutterWaterline(myscreen, cutter1, zh, camvtk.yellow) - oneCutterWaterline(myscreen, cutter2, zh, camvtk.cyan) - oneCutterWaterline(myscreen, cutter3, zh, camvtk.mag) - oneCutterWaterline(myscreen, cutter4, zh, camvtk.mag) - #yfiber(yvals,t,zh,myscreen) - #xfiber(xvals,t,zh,myscreen) - - print "done." - - myscreen.render() - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_14_z-levels_cc-colors.py opencamlib-11.10-1/scripts/fiber/fiber_14_z-levels_cc-colors.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_14_z-levels_cc-colors.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_14_z-levels_cc-colors.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - #print "fiber has ", len(inter) , " intervals" - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - ballradius = 0.002 - ballradius = 0.005 - #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=ballradius, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=ballradius, color=camvtk.clColor( i.upper_cc) ) ) - - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) - -# colors from camvtk.py: -# ocl.CCType.VERTEX: col = red -# ocl.CCType.EDGE_HORIZ: col = orange -# ocl.CCType.EDGE_SHAFT: col = mag - -def yfiber(yvals,t,zh,myscreen): - for y in yvals: - f1 = ocl.Point(-3.5,y,zh) # start point of fiber - f2 = ocl.Point(3.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.red) - -def xfiber(xvals,t,zh,myscreen): - for x in xvals: - f1 = ocl.Point(x,-15.5,zh) # start point of fiber - f2 = ocl.Point(x,55.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.lblue) - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - - ztri = 0.3 # this is the shallow case - #ztri = 0.8 # this produces the steep case where we hit the circular rim - - ztri_lo = 0.1 - a = ocl.Point(0,1,ztri) - b = ocl.Point(1,0.5,ztri) - c = ocl.Point(0.2,0.2,ztri_lo) - - a = ocl.Point(0,1,0.3) - b = ocl.Point(1,0.5,0.3) - c = ocl.Point(0,0,0) - - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - angle = math.pi/5 - diameter=0.6 - length=25 - cutter = ocl.BallCutter(diameter, length) - #cutter = ocl.CylCutter(diameter, length) - #cutter = ocl.BullCutter(diameter, diameter/4, length) - #cutter = ocl.ConeCutter(diameter, angle, length) - #cutter = cutter.offsetCutter( 0.1 ) - - #cutter = ocl.CompCylCutter(diameter, length) - #cutter = ocl.CompBallCutter(diameter, length) - - #cutter = ocl.CylConeCutter(diameter/float(3), diameter, math.pi/float(9)) - cutter = ocl.BallConeCutter(diameter/float(3), diameter, math.pi/float(5)) - - - print "cutter= ", cutter - print "length=", cutter.getLength() - print "fiber..." - fiberrange=5 - Nmax = 100 - yvals = [float(n-float(Nmax)/2)/Nmax*fiberrange for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*fiberrange for n in xrange(0,Nmax+1)] - """ - zmin = ztri_lo - 0.2 - zmax = ztri - zNmax = 20 - dz = (zmax-zmin)/(zNmax-1) - zvals=[] - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - """ - - zheights=[] - Nmax=30 - zmin=-0.85 - zmax= 0.3 - dz = (zmax-zmin)/float(Nmax-1) - z = zmin - for n in xrange(Nmax): - zheights.append(z) - z=z+dz - #zheights= [] - #zheights.append(-0.25) - - print len(zheights)," to do: ", - n=0 - for zh in zheights: - print n, - yfiber(yvals,t,zh,myscreen) - xfiber(xvals,t,zh,myscreen) - n=n+1 - print "done." - myscreen.camera.SetPosition(-1, -1, 3) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_15_conecutter_anim.py opencamlib-11.10-1/scripts/fiber/fiber_15_conecutter_anim.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_15_conecutter_anim.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_15_conecutter_anim.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,140 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math -import os - -def drawFiber_clpts(myscreen, f, fibercolor=camvtk.red): - inter = f.getInts() - #print "fiber has ", len(inter) , " intervals" - for i in inter: - if not i.empty(): - ip1 = f.point( i.lower ) - ip2 = f.point( i.upper ) - #myscreen.addActor( camvtk.Line(p1=(ip1.x,ip1.y,ip1.z),p2=(ip2.x,ip2.y,ip2.z), color=fibercolor) ) - myscreen.addActor( camvtk.Sphere(center=(ip1.x,ip1.y,ip1.z),radius=0.005, color=camvtk.clColor( i.lower_cc) ) ) - myscreen.addActor( camvtk.Sphere(center=(ip2.x,ip2.y,ip2.z),radius=0.005, color=camvtk.clColor( i.upper_cc) ) ) - #cc1 = i.lower_cc - #cc2 = i.upper_cc - #myscreen.addActor( camvtk.Sphere(center=(cc1.x,cc1.y,cc1.z),radius=0.005, color=camvtk.pink ) ) - #myscreen.addActor( camvtk.Sphere(center=(cc2.x,cc2.y,cc2.z),radius=0.005, color=camvtk.pink ) ) - -# colors from camvtk.py: -# ocl.CCType.VERTEX: col = red -# ocl.CCType.EDGE_HORIZ: col = orange -# ocl.CCType.EDGE_SHAFT: col = mag - -def yfiber(cutter,yvals,t,zh,myscreen): - for y in yvals: - f1 = ocl.Point(-5.5,y,zh) # start point of fiber - f2 = ocl.Point(5.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.red) - -def xfiber(cutter,xvals,t,zh,myscreen): - for x in xvals: - f1 = ocl.Point(x,-5.5,zh) # start point of fiber - f2 = ocl.Point(x,5.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - i = ocl.Interval() - cutter.pushCutter(f,i,t) - f.addInterval(i) - drawFiber_clpts(myscreen, f, camvtk.lblue) - -def drawScreen(a,b,c,filename,write_flag): - print ocl.revision() - myscreen = camvtk.VTKScreen() - z_hi = a.z - if b.z > z_hi: - z_hi = b.z - if c.z > z_hi: - z_hi = c.z - - z_lo = a.z - if b.z < z_lo: - z_lo = b.z - if c.z < z_lo: - z_lo = c.z - #z_hi = 0.3 # this is the shallow case - #ztri = 0.8 # this produces the steep case where we hit the circular rim - - #z_lo = 0.1 - #a = ocl.Point(0,1,ztri) - #b = ocl.Point(1,0.5,ztri) - #c = ocl.Point(0.2,0.2,ztri_lo) - - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - t = ocl.Triangle(b,c,a) - angle = math.pi/5 - diameter=0.3 - length=5 - #cutter = ocl.BallCutter(diameter, length) - #cutter = ocl.CylCutter(diameter, length) - #cutter = ocl.BullCutter(diameter, diameter/4, length) - cutter = ocl.ConeCutter(diameter, angle, length) - #cutter = cutter.offsetCutter( 0.1 ) - - print "cutter= ", cutter - print "length=", cutter.getLength() - print "fiber..." - range=2 - Nmax = 100 - yvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*range for n in xrange(0,Nmax+1)] - zmin = z_lo - 0.3 - zmax = z_hi - zNmax = 20 - dz = (zmax-zmin)/(zNmax-1) - zvals=[] - for n in xrange(0,zNmax): - zvals.append(zmin+n*dz) - for zh in zvals: - yfiber(cutter,yvals,t,zh,myscreen) - xfiber(cutter,xvals,t,zh,myscreen) - print "done." - myscreen.camera.SetPosition(-2, -1, 3) - myscreen.camera.SetFocalPoint(1.0, 0.0, -0.5) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName(filename) - if write_flag: - lwr.Write() - print "wrote ",filename - - #myscreen.iren.Start() - #raw_input("Press Enter to terminate") - -if __name__ == "__main__": - ztri = 0.3 # this is the shallow case - #ztri = 0.8 # this produces the steep case where we hit the circular rim - ztri_lo = 0.1 - Nmax = 300 - thetamax = 2*math.pi - for n in xrange(0,Nmax): - theta=thetamax/Nmax - a = ocl.Point(0,1,ztri) - a.xRotate(theta*n) - b = ocl.Point(1,0.0,0) - b.xRotate(theta*n) - c = ocl.Point(0.2,0.0,ztri) - c.xRotate(theta*n) - current_dir = os.getcwd() - filename = current_dir + "/frames/conecutter_"+ ('%05d' % n)+".png" - drawScreen(a,b,c,filename, 1) - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_15_weave2.py opencamlib-11.10-1/scripts/fiber/fiber_15_weave2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_15_weave2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_15_weave2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawVertices(myscreen, weave, vertexType, vertexRadius, vertexColor): - pts = weave.getVertices( vertexType ) - print " got ",len(pts)," of type ", vertexType - for p in pts: - myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z), radius=vertexRadius, color=vertexColor ) ) - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - a = ocl.Point(0,1,0.3) - #myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b = ocl.Point(1,0.5,0.3) - #myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c = ocl.Point(0,0,0.1) - #myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - #myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - #myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - #myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - - # a second triangle - offset=ocl.Point(0.51,0.51,0) - a2 = a+ offset - b2 = b+ offset - c2 = c+ offset - t2 = ocl.Triangle(b2,c2,a2) - - t = ocl.Triangle(b,c,a) - s = ocl.STLSurf() - s.addTriangle(t) # a one-triangle STLSurf - s.addTriangle(t2) - - cutter = ocl.CylCutter(0.3, 5) - #cutter = ocl.BallCutter(0.4, 5) - #cutter = ocl.BullCutter(0.4, 0.1, 5) - - print "fiber..." - fiber_range=7 - Nmax = 200 - yvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in xrange(0,Nmax+1)] - - zvals=[ 0.23] - - - bpc_x = ocl.BatchPushCutter() - bpc_y = ocl.BatchPushCutter() - bpc_x.setXDirection() - bpc_y.setYDirection() - bpc_x.setSTL(s) - bpc_y.setSTL(s) - bpc_x.setCutter(cutter) - bpc_y.setCutter(cutter) - # create fibers - for zh in zvals: - for y in yvals: - f1 = ocl.Point(-5.5,y,zh) # start point of fiber - f2 = ocl.Point(5.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_x.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,-5.5,zh) # start point of fiber - f2 = ocl.Point(x,5.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_y.appendFiber(f) - - # run - bpc_x.run() - bpc_y.run() - #clpoints = bpc_x.getCLPoints() - #clp2 = bpc_y.getCLPoints() - #clpoints+=clp2 - xfibers = bpc_x.getFibers() - yfibers = bpc_y.getFibers() - fibers = xfibers+yfibers - print " got ",len(xfibers)," xfibers" - print " got ",len(yfibers)," yfibers" - print "rendering fibers and CL-points." - w = ocl.Weave() - print "push fibers to Weave...", - for f in fibers: - w.addFiber(f) - print "done." - print "Weave build()...", - #w.build() - w.build() - print "done" - print "face_traverse..." - w.face_traverse() - print "done." - w_clpts = w.getCLVertices() - w_ipts = w.getINTVertices() - w_edges = w.getEdges() - w_loop = w.getLoops() - vertexRadius = 0.007 - drawVertices(myscreen, w, ocl.WeaveVertexType.CL, vertexRadius, camvtk.red) - drawVertices(myscreen, w, ocl.WeaveVertexType.INT, vertexRadius, camvtk.orange) - drawVertices(myscreen, w, ocl.WeaveVertexType.FULLINT, vertexRadius, camvtk.yellow) - drawVertices(myscreen, w, ocl.WeaveVertexType.ADJ, vertexRadius, camvtk.green) - drawVertices(myscreen, w, ocl.WeaveVertexType.TWOADJ, vertexRadius, camvtk.lblue) - - print " got: ", len(w_edges), " edges" - print " got: ", len(w_loop), " loop points" - - - previous = 0 - # draw the loop as a yellow line - for loop in w_loop: - np = 0 - for p in loop: - #myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z+zoffset2), radius=0.006, color=camvtk.pink ) ) - if np is not 0: - myscreen.addActor( camvtk.Line( p1=(previous.x,previous.y, previous.z), - p2=(p.x,p.y,p.z), color=camvtk.yellow) ) - np=np+1 - previous = p - - # draw edges of weave - ne = 0 - zoffset=0.0 # 1 - dzoffset = 0.000 # 5 - for e in w_edges: - p1 = e[0] - p2 = e[1] - myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z+zoffset+ne*dzoffset), p2=(p2.x,p2.y,p2.z+zoffset+ne*dzoffset) ) ) - ne = ne+1 - - print "done." - myscreen.camera.SetPosition(0.8051, 0.8051, 3.5) - myscreen.camera.SetFocalPoint(0.805, 0.805, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_16_weave2_RAMusage.py opencamlib-11.10-1/scripts/fiber/fiber_16_weave2_RAMusage.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_16_weave2_RAMusage.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_16_weave2_RAMusage.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math -import procmemory -import csv -import gc - -def drawVertices(myscreen, weave, vertexType, vertexRadius, vertexColor): - pts = weave.getVertices( vertexType ) - print " got ",len(pts)," of type ", vertexType - for p in pts: - myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z), radius=vertexRadius, color=vertexColor ) ) - -def getWeaveRAM(Nmax,weave2_flag): - #stl = camvtk.STLSurf("../stl/demo.stl") - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - cutter = ocl.CylCutter(0.3, 5) - fiber_range=30 - #Nmax = 400 - yvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in xrange(0,Nmax+1)] - zvals=[ 1.6523] - bpc_x = ocl.BatchPushCutter() - bpc_y = ocl.BatchPushCutter() - bpc_x.setXDirection() - bpc_y.setYDirection() - bpc_x.setSTL(s) - bpc_y.setSTL(s) - bpc_x.setCutter(cutter) - bpc_y.setCutter(cutter) - # create fibers - for zh in zvals: - for y in yvals: - f1 = ocl.Point(-15.5,y,zh) # start point of fiber - f2 = ocl.Point(15.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_x.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,-15.5,zh) # start point of fiber - f2 = ocl.Point(x,15.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_y.appendFiber(f) - - # run - bpc_x.run() - bpc_y.run() - xfibers = bpc_x.getFibers() - yfibers = bpc_y.getFibers() - fibers = xfibers+yfibers - print " got ",len(xfibers)," xfibers" - print " got ",len(yfibers)," yfibers" - fibercount = len(xfibers) + len(yfibers) - print "rendering fibers and CL-points." - w = ocl.Weave() - print "push fibers to Weave...", - for f in fibers: - w.addFiber(f) - print "done." - print "Weave build()...", - mem1 = procmemory.memory() - if weave2_flag==1: - w.build2() - else: - w.build() - mem2 = procmemory.memory() - #print "after ", float(mem2)/float(1024*1024), " MB" - megabytes = float(mem2-mem1)/float(1024*1024) - megabytes2 = float(mem2)/float(1024*1024) - verts = w.numVertices() - print " before: ", float(mem1)/float(1024*1024) - print " after: ", float(mem2)/float(1024*1024) - print " build() memory: ",megabytes," MB" - print "done" - print "face_traverse..." - w.face_traverse() - print "done." - w_clpts = w.getCLVertices() - w_ipts = w.getINTVertices() - w_edges = w.getEdges() - w_loop = w.getLoops() - - - print " got: ", len(w_edges), " edges" - print " got: ", len(w_loop), " loops" - out=[] - out.append(fibercount) - out.append(verts) - return out - -if __name__ == "__main__": - writer = csv.writer( open('weave2ram_6.csv','wb'), delimiter=',') - - #Nmax=400 - Nmaxlist = [100,200,400,800, 1600, 3200] - - for Nmax in Nmaxlist: - mb = getWeaveRAM(Nmax,0) - mb2 = getWeaveRAM(Nmax,1) - #print mb2 - print mb[0], " :=> ", mb[1], " MB" - writer.writerow(mb+mb2) - gc.collect() - - raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_16_weave2_STL.py opencamlib-11.10-1/scripts/fiber/fiber_16_weave2_STL.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/fiber/fiber_16_weave2_STL.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/fiber/fiber_16_weave2_STL.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,144 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math -import procmemory - -def drawVertices(myscreen, weave, vertexType, vertexRadius, vertexColor): - pts = weave.getVertices( vertexType ) - print " got ",len(pts)," of type ", vertexType - for p in pts: - myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z), radius=vertexRadius, color=vertexColor ) ) - -if __name__ == "__main__": - print ocl.revision() - myscreen = camvtk.VTKScreen() - #stl = camvtk.STLSurf("../stl/demo.stl") - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - myscreen.addActor(stl) - stl.SetWireframe() - #stl.SetSurface() - stl.SetColor(camvtk.grey) - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - - cutter = ocl.CylCutter(0.3, 5) - #cutter = ocl.BallCutter(0.4, 5) - #cutter = ocl.BullCutter(0.4, 0.1, 5) - - print "fiber..." - fiber_range=30 - Nmax = 400 - yvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in xrange(0,Nmax+1)] - xvals = [float(n-float(Nmax)/2)/Nmax*float(fiber_range) for n in xrange(0,Nmax+1)] - - zvals=[ 1.6523] - - - bpc_x = ocl.BatchPushCutter() - bpc_y = ocl.BatchPushCutter() - bpc_x.setXDirection() - bpc_y.setYDirection() - bpc_x.setSTL(s) - bpc_y.setSTL(s) - bpc_x.setCutter(cutter) - bpc_y.setCutter(cutter) - # create fibers - for zh in zvals: - for y in yvals: - f1 = ocl.Point(-15.5,y,zh) # start point of fiber - f2 = ocl.Point(15.5,y,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_x.appendFiber(f) - for x in xvals: - f1 = ocl.Point(x,-15.5,zh) # start point of fiber - f2 = ocl.Point(x,15.5,zh) # end point of fiber - f = ocl.Fiber( f1, f2) - bpc_y.appendFiber(f) - - # run - bpc_x.run() - bpc_y.run() - - xfibers = bpc_x.getFibers() - yfibers = bpc_y.getFibers() - fibers = xfibers+yfibers - print " got ",len(xfibers)," xfibers" - print " got ",len(yfibers)," yfibers" - print "rendering fibers and CL-points." - w = ocl.Weave() - print "push fibers to Weave...", - for f in fibers: - w.addFiber(f) - print "done." - print "Weave build()...", - mem1 = procmemory.resident() - print "before ", mem1 - w.build() - #w.build2() - mem2 = procmemory.resident() - print "after ", float(mem2)/float(1024*1024), " MB" - print " build() memory: ",float(mem2-mem1)/float(1024*1024)," MB" - print "done" - print "face_traverse..." - w.face_traverse() - print "done." - w_clpts = w.getCLVertices() - w_ipts = w.getINTVertices() - w_edges = w.getEdges() - w_loop = w.getLoops() - vertexRadius = 0.007 - drawVertices(myscreen, w, ocl.WeaveVertexType.CL, vertexRadius, camvtk.red) - drawVertices(myscreen, w, ocl.WeaveVertexType.INT, vertexRadius, camvtk.orange) - drawVertices(myscreen, w, ocl.WeaveVertexType.FULLINT, vertexRadius, camvtk.yellow) - drawVertices(myscreen, w, ocl.WeaveVertexType.ADJ, vertexRadius, camvtk.green) - drawVertices(myscreen, w, ocl.WeaveVertexType.TWOADJ, vertexRadius, camvtk.lblue) - - print " got: ", len(w_edges), " edges" - print " got: ", len(w_loop), " loops" - - # draw the loops - - nloop = 0 - for lop in w_loop: - n = 0 - N = len(lop) - first_point=ocl.Point(-1,-1,5) - previous=ocl.Point(-1,-1,5) - for p in lop: - if n==0: # don't draw anything on the first iteration - previous=p - first_point = p - elif n== (N-1): # the last point - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) # the normal line - # and a line from p to the first point - myscreen.addActor( camvtk.Line(p1=(p.x,p.y,p.z),p2=(first_point.x,first_point.y,first_point.z),color=camvtk.yellow) ) - else: - myscreen.addActor( camvtk.Line(p1=(previous.x,previous.y,previous.z),p2=(p.x,p.y,p.z),color=camvtk.yellow) ) - previous=p - n=n+1 - print "rendered loop ",nloop, " with ", len(lop), " points" - nloop = nloop+1 - - - # draw edges of weave - ne = 0 - zoffset=0.0 # 1 - dzoffset = 0.000 # 5 - for e in w_edges: - p1 = e[0] - p2 = e[1] - myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z+zoffset+ne*dzoffset), p2=(p2.x,p2.y,p2.z+zoffset+ne*dzoffset) ) ) - ne = ne+1 - - print "done." - myscreen.camera.SetPosition(0.8051, 0.8051, 3.5) - myscreen.camera.SetFocalPoint(0.805, 0.805, 0) - camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) - camvtk.drawOCLtext(myscreen) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/issues/issue08_bug2010-04-02.py opencamlib-11.10-1/scripts/issues/issue08_bug2010-04-02.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/issues/issue08_bug2010-04-02.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/issues/issue08_bug2010-04-02.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -import ocl - -# this illustrates issue 8 - -if __name__ == "__main__": - print ocl.revision() - cutter = ocl.CylCutter(3.0, 6) - path = ocl.Path() - path.append(ocl.Line(ocl.Point(-6.51, 0, 0), ocl.Point(6.51, 1.2, 0))) - s=ocl.STLSurf() - ocl.STLReader("../stl/sphere2.stl",s) - pdc = ocl.PathDropCutter() - pdc.setSTL(s) - pdc.setCutter(cutter) - pdc.setPath(path) - pdc.run() - clpts = pdc.getCLPoints() - for p in clpts: - print p diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/issues/issue20bug.py opencamlib-11.10-1/scripts/issues/issue20bug.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/issues/issue20bug.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/issues/issue20bug.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -import ocl -import camvtk -import issue20data - -if __name__ == "__main__": - s = ocl.STLSurf() - triangles = issue20data.trilist - - for t in triangles: - s.addTriangle(t) - - print ocl.revision() - # define a cutter - length = 10 - cutter = ocl.CylCutter(3, length) - #cutter = ocl.BallCutter(3, length) - #cutter = ocl.BullCutter(3,0.5, length) - - pdf = ocl.PathDropCutter() # create a pdf-object for the surface s - pdf.setSTL(s) - pdf.setCutter(cutter) # set the cutter - pdf.minimumZ = -1 # set the minimum Z-coordinate, or - # "floor" for drop-cutter - - path = ocl.Path() # create an empty path object - # add a line to the path - path.append(ocl.Line(ocl.Point(0, 0.098, 0), ocl.Point(4, 0.098, 0))) - - # set the path for pdf - pdf.setPath( path ) - - pdf.run() # run drop-cutter on the path - - clp = pdf.getCLPoints() # get the cl-points from pdf - - - print 'first point ', clp[0], ' ( z should be at z5 )' - - # visualize things with VTK - myscreen = camvtk.VTKScreen() - myscreen.addActor( camvtk.PointCloud( pointlist=clp ) ) - #myscreen.addActor( camvtk.PointCloud( pointlist=ccp, collist=ccp ) ) - su = camvtk.STLSurf(filename=None, triangleList=triangles ) - su.SetWireframe() - myscreen.addActor(su) - myscreen.render() - myscreen.iren.Start() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/issues/issue20data.py opencamlib-11.10-1/scripts/issues/issue20data.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/issues/issue20data.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/issues/issue20data.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -import ocl - -trilist = [] -trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), - ocl.Point(2.89783, -7.09741e-016, 4.07462), - ocl.Point(4, -9.79685e-016, 3))) -trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), - ocl.Point(4,0.673874, 2.92334), - ocl.Point(4, 1, 2.82843))) -trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), - ocl.Point(4,0.339111, 2.98077), - ocl.Point(4, 0.673874, 2.92334))) -trilist.append(ocl.Triangle(ocl.Point(2.91337, 1, 3.93857), ocl.Point(4, --9.79685e-016, 3), ocl.Point(4, 0.339111, 2.98077))) -trilist.append(ocl.Triangle(ocl.Point(1.53379, 1, 4.65268), -ocl.Point(1.521, -3.72525e-016, 4.76304), ocl.Point(2.89783, -7.09741e-016, -4.07462))) -trilist.append(ocl.Triangle(ocl.Point(1.53379, 1, 4.65268), -ocl.Point(2.89783, -7.09741e-016, 4.07462), ocl.Point(2.91337, 1, 3.93857))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.669179, 4.95502), -ocl.Point(1.53379, 1, 4.65268), ocl.Point(-1.19986e-015, 1, 4.89898))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.335345, 4.98874), -ocl.Point(1.53379, 1, 4.65268), ocl.Point(0, 0.669179, 4.95502))) -trilist.append(ocl.Triangle(ocl.Point(3.06152e-016, -7.4983e-032, 5), -ocl.Point(1.521, -3.72525e-016, 4.76304), ocl.Point(1.53379, 1, 4.65268))) -trilist.append(ocl.Triangle(ocl.Point(3.06152e-016, -7.4983e-032, 5), -ocl.Point(1.53379, 1, 4.65268), ocl.Point(0, 0.335345, 4.98874))) -trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(0, 1, -0), ocl.Point(-1.19986e-015, 1, 4.89898))) -trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), -ocl.Point(-1.19986e-015, 1, 4.89898), ocl.Point(1.53379, 1, 4.65268))) -trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(1.53379, -1, 4.65268), ocl.Point(2.91337, 1, 3.93857))) -trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(2.91337, -1, 3.93857), ocl.Point(4, 1, 2.82843))) -trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(4, 1, -2.82843), ocl.Point(4, 1, 0))) -trilist.append(ocl.Triangle(ocl.Point(2, 1, 2.44949), ocl.Point(4, 1, -0), ocl.Point(0, 1, 0))) -trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, --9.79685e-016, 3), ocl.Point(4, 0, 0))) -trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, 0, 0), -ocl.Point(4, 1, 0))) -trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, 1, 0), -ocl.Point(4, 1, 2.82843))) -trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, 1, -2.82843), ocl.Point(4, 0.673874, 2.92334))) -trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, -0.673874, 2.92334), ocl.Point(4, 0.339111, 2.98077))) -trilist.append(ocl.Triangle(ocl.Point(4, 0.5, 1.5), ocl.Point(4, -0.339111, 2.98077), ocl.Point(4, -9.79685e-016, 3))) -trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), -ocl.Point(3.06152e-016, -7.4983e-032, 5), ocl.Point(0, 0, 0))) -trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(4, --9.79685e-016, 3), ocl.Point(2.89783, -7.09741e-016, 4.07462))) -trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(2.89783, --7.09741e-016, 4.07462), ocl.Point(1.521, -3.72525e-016, 4.76304))) -trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(1.521, --3.72525e-016, 4.76304), ocl.Point(3.06152e-016, -7.4983e-032, 5))) -trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(4, 0, 0), -ocl.Point(4, -9.79685e-016, 3))) -trilist.append(ocl.Triangle(ocl.Point(2, 0, 2.5), ocl.Point(0, 0, 0), -ocl.Point(4, 0, 0))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), -ocl.Point(-1.19986e-015, 1, 4.89898), ocl.Point(0, 1, 0))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, -0.669179, 4.95502), ocl.Point(-1.19986e-015, 1, 4.89898))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, -0.335345, 4.98874), ocl.Point(0, 0.669179, 4.95502))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), -ocl.Point(3.06152e-016, -7.4983e-032, 5), ocl.Point(0, 0.335345, 4.98874))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, 0, 0), -ocl.Point(3.06152e-016, -7.4983e-032, 5))) -trilist.append(ocl.Triangle(ocl.Point(0, 0.5, 2.5), ocl.Point(0, 1, 0), -ocl.Point(0, 0, 0))) -trilist.append(ocl.Triangle(ocl.Point(4, 1, 0), ocl.Point(0, 0, 0), -ocl.Point(0, 1, 0))) -trilist.append(ocl.Triangle(ocl.Point(4, 1, 0), ocl.Point(4, 0, 0), -ocl.Point(0, 0, 0))) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_debug_0.py opencamlib-11.10-1/scripts/kdtree_debug_0.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_debug_0.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/kdtree_debug_0.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math -import datetime - - - - -def main(): - myscreen = camvtk.VTKScreen() - focal = cam.Point(5, 5, 0) - r = 30 - theta = (float(45)/360)*2*math.pi - fi=45 - - campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) - myscreen.camera.SetPosition(campos.x, campos.y, campos.z) - myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) - - t = camvtk.Text() - t.SetPos( (myscreen.width-450, myscreen.height-30) ) - - - myscreen.addActor( t) - t2 = camvtk.Text() - ytext = "kd-tree debug" #"Y: %3.3f" % (ycoord) - t2.SetText(ytext) - t2.SetPos( (50, myscreen.height-50) ) - myscreen.addActor( t2) - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - epos = cam.Epos() - epos.setS(0,1) - - t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - - #ycoord = 1.1 - - stl = camvtk.STLSurf(filename="../stl/demo.stl") - #stl = camvtk.STLSurf(filename="../stl/demo2.stl") - print "STL surface read" - #myscreen.addActor(stl) - #stl.SetWireframe() - #stl.SetColor((0.5,0.5,0.5)) - polydata = stl.src.GetOutput() - s= cam.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STLSurf with ", s.size(), " triangles" - - - myscreen.addActor( camvtk.Sphere( center=(0,0,0), radius=0.2, color = camvtk.yellow ) ) - - s.build_kdtree() - print "built kd-tree" - s.jump_kd_reset() - - tlist = s.get_kd_triangles() - - print "got", len(tlist), " triangles" - - while (s.jump_kd_hi()): - lotris = s.get_kd_triangles() - s.jump_kd_up() - cut = s.get_kd_cut() - s.jump_kd_lo() - hitris = s.get_kd_triangles() - lev = s.get_kd_level() - - print "l=", lev, " hi=", len(hitris), " lo=", len(lotris), " cut=", cut - - if ( cut[0] < 2 ): - print "x cut ", - if ( cut[0] == 0): - print "max" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) - #myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) - else: - print "y cut ", - if ( cut[0] == 2): - print "max" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) - - - slo = camvtk.STLSurf(triangleList=lotris) - slo.SetColor(camvtk.pink) - slo.SetWireframe() - shi = camvtk.STLSurf(triangleList=hitris) - shi.SetColor(camvtk.lgreen) - shi.SetWireframe() - myscreen.addActor(slo) - myscreen.addActor(shi) - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") - time.sleep(1) - myscreen.removeActor(slo) - myscreen.removeActor(shi) - - - - print "done." - myscreen.render() - #lwr.SetFileName(filename) - - #raw_input("Press Enter to terminate") - time.sleep(0.2) - lwr.Write() - myscreen.iren.Start() - - -if __name__ == "__main__": - main() - #raw_input("Press Enter to terminate") - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_debug_1.py opencamlib-11.10-1/scripts/kdtree_debug_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_debug_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/kdtree_debug_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math -import datetime - - - - -def main(): - myscreen = camvtk.VTKScreen() - focal = cam.Point(50, 0, 0) - r = 300 - theta = (float(45)/360)*2*math.pi - fi=45 - - campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) - myscreen.camera.SetPosition(campos.x, campos.y, campos.z) - myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) - - t = camvtk.Text() - t.SetPos( (myscreen.width-450, myscreen.height-30) ) - - - myscreen.addActor( t) - t2 = camvtk.Text() - ytext = "kd-tree debug" #"Y: %3.3f" % (ycoord) - t2.SetText(ytext) - t2.SetPos( (50, myscreen.height-50) ) - myscreen.addActor( t2) - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - epos = cam.Epos() - epos.setS(0,1) - - t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - - #ycoord = 1.1 - - stl = camvtk.STLSurf(filename="../stl/demo.stl") - #stl = camvtk.STLSurf(filename="../stl/demo2.stl") - print "STL surface read" - #myscreen.addActor(stl) - #stl.SetWireframe() - #stl.SetColor((0.5,0.5,0.5)) - polydata = stl.src.GetOutput() - s= cam.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STLSurf with ", s.size(), " triangles" - - - myscreen.addActor( camvtk.Sphere( center=(0,0,0), radius=0.2, color = camvtk.yellow ) ) - - s.build_kdtree() - print "built kd-tree" - s.jump_kd_reset() - - tlist = s.get_kd_triangles() - - print "got", len(tlist), " triangles" - - while (s.jump_kd_hi()): - lotris = s.get_kd_triangles() - s.jump_kd_up() - cut = s.get_kd_cut() - s.jump_kd_lo() - hitris = s.get_kd_triangles() - lev = s.get_kd_level() - - print "l=", lev, " hi=", len(hitris), " lo=", len(lotris), " cut=", cut - - if ( cut[0] < 2 ): - print "x cut ", - if ( cut[0] == 0): - print "max" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) - #myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) - else: - print "y cut ", - if ( cut[0] == 2): - print "max" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) - - - slo = camvtk.STLSurf(triangleList=lotris) - slo.SetColor(camvtk.pink) - slo.SetWireframe() - shi = camvtk.STLSurf(triangleList=hitris) - shi.SetColor(camvtk.lgreen) - shi.SetWireframe() - myscreen.addActor(slo) - myscreen.addActor(shi) - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") - time.sleep(1) - myscreen.removeActor(slo) - myscreen.removeActor(shi) - - - - print "done." - myscreen.render() - #lwr.SetFileName(filename) - - #raw_input("Press Enter to terminate") - time.sleep(0.2) - lwr.Write() - myscreen.iren.Start() - - -if __name__ == "__main__": - main() - #raw_input("Press Enter to terminate") - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_debug_3.py opencamlib-11.10-1/scripts/kdtree_debug_3.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_debug_3.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/kdtree_debug_3.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math -import datetime - - - -def kdtreesearch(myscreen, tlist, s, cutter, cl, depth): - #print "surface=", s.str() - #print "cutter=", cutter.str() - #print "cl=", cl.str() - myscreen.render() - #raw_input("Press Enter to terminate") - #time.sleep(1) - if (depth==1): # stop jumping and return all triangles - tris = s.get_kd_triangles() - for t in tris: - tlist.append(t) - return - - # jump high or low depending on search - cut = s.get_kd_cut() - print "cutvalues: ", cut - dim = cut[0] - cval = cut[1] - if dim == 0: # cut along xmax - - print cval, " < ", cl.x - cutter.radius, " ??" - if ( cval < ( cl.x - cutter.radius) ): - myscreen.addActor( camvtk.Line( p1=(cval,100,0), p2=(cval,-100,0), color = camvtk.green ) ) - s.jump_kd_lo() - trilist = s.get_kd_triangles() - drawtriangles(myscreen, trilist, camvtk.blue) - s.jump_kd_up() - print "xmax: jump ONLY hi" - s.jump_kd_hi() - print "search hi at level=", s.get_kd_level() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - print "len tlist=", len(tlist), " now level=", s.get_kd_level() - else: - #print "xmax: jump both hi and lo" - s.jump_kd_hi() - #print "search hi at level=", s.get_kd_level() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - #print "len tlist=", len(tlist), " now level=", s.get_kd_level() - s.jump_kd_up() - s.jump_kd_lo() - #print "search lo at level=", s.get_kd_level() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - #print "len tlist=", len(tlist), " now level=", s.get_kd_level() - if dim == 1: - - print cval, " > ", cl.x + cutter.radius, " ??" - if ( cval > ( cl.x + cutter.radius) ): - myscreen.addActor( camvtk.Line( p1=(cval,100,0), p2=(cval,-100,0), color = camvtk.lgreen ) ) - s.jump_kd_hi() - trilist = s.get_kd_triangles() - drawtriangles(myscreen, trilist, camvtk.blue) - s.jump_kd_up() - print "xmin: jump only lo" - s.jump_kd_lo() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - else: - #print "xmin: jump both hi and lo" - s.jump_kd_lo() - kdtreesearch(tlist, s, cutter, cl, depth-1) - s.jump_kd_up() - s.jump_kd_hi() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - if dim == 2: - print cval, " < ", cl.y - cutter.radius, " ??" - if ( cval < ( cl.y - cutter.radius) ): - myscreen.addActor( camvtk.Line( p1=(100,cval,0), p2=(-100,cval,0), color = camvtk.red ) ) - s.jump_kd_lo() - trilist = s.get_kd_triangles() - drawtriangles(myscreen, trilist, camvtk.yellow) - s.jump_kd_up() - - s.jump_kd_hi() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - else: - #print "ymax: jump both hi and lo" - s.jump_kd_lo() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - s.jump_kd_up() - s.jump_kd_hi() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - if dim == 3: # cut along ymin - - print cval, " > ", cl.y + cutter.radius, " ??" - if ( cval > ( cl.y + cutter.radius) ): - myscreen.addActor( camvtk.Line( p1=(100,cval,0), p2=(-100,cval,0), color = camvtk.pink ) ) - - s.jump_kd_hi() - trilist = s.get_kd_triangles() - drawtriangles(myscreen, trilist, camvtk.yellow) - s.jump_kd_up() - - print "ymin: jump ONLY lo" - s.jump_kd_lo() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - else: - #print "ymin: jump both hi and lo" - s.jump_kd_hi() - #print "search hi at level=", s.get_kd_level() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - #print "len tlist=", len(tlist), " now level=", s.get_kd_level() - s.jump_kd_up() - s.jump_kd_lo() - #print "search lo at level=", s.get_kd_level() - kdtreesearch(myscreen, tlist, s, cutter, cl, depth-1) - - return - -def drawtriangles(myscreen, trilist, color): - cpp = camvtk.STLSurf(triangleList=trilist) - cpp.SetColor(color) - cpp.SetWireframe() - myscreen.addActor(cpp) - -def drawcuts(myscreen, s): - cut = s.get_kd_cut() - if ( cut[0] < 2 ): - print "x cut ", - if ( cut[0] == 0): - print "max" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) - else: - print "y cut ", - if ( cut[0] == 2): - print "max" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) - - if (s.jump_kd_hi()): - drawcuts(myscreen, s) - s.jump_kd_up() - if (s.jump_kd_lo()): - drawcuts(myscreen, s) - s.jump_kd_up() - return - - - -def main(): - myscreen = camvtk.VTKScreen() - focal = cam.Point(50, 0, 0) - r = 300 - theta = (float(45)/360)*2*math.pi - fi=45 - - campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) - myscreen.camera.SetPosition(campos.x, campos.y, campos.z) - myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) - - t = camvtk.Text() - t.SetPos( (myscreen.width-450, myscreen.height-30) ) - - - myscreen.addActor( t) - t2 = camvtk.Text() - ytext = "kd-tree debug" #"Y: %3.3f" % (ycoord) - t2.SetText(ytext) - t2.SetPos( (50, myscreen.height-50) ) - myscreen.addActor( t2) - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - epos = cam.Epos() - epos.setS(0,1) - - t.SetText("OpenCAMLib 10.04-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - - #ycoord = 1.1 - - stl = camvtk.STLSurf(filename="../stl/carpet2.stl") - #stl = camvtk.STLSurf(filename="demo2.stl") - print "STL surface read" - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - polydata = stl.src.GetOutput() - s= cam.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STLSurf with ", s.size(), " triangles" - - cutterDiameter=7 - cutter = cam.CylCutter(cutterDiameter) - - cl = cam.Point(31, 42, 3) - - cutactor = camvtk.Cylinder(center=(cl.x,cl.y,cl.z), - radius=cutterDiameter/2, - height=2, - rotXYZ=(90,0,0), - color=camvtk.green) - myscreen.addActor( cutactor ) - - # sphere to see (0,0) - myscreen.addActor( camvtk.Sphere( center=(0,0,0), radius=0.2, color = camvtk.yellow ) ) - - s.build_kdtree() - print "built kd-tree" - s.jump_kd_reset() - - - cpp_tlist = s.getTrianglesUnderCutter(cl, cutter) - - py_tlist = [] - depth = 6 - kdtreesearch(myscreen, py_tlist, s, cutter, cl, depth) - - print "len(cpp_list) after search=", len(cpp_tlist) - print "len(py_list) after search=", len(py_tlist) - - cpp = camvtk.STLSurf(triangleList=cpp_tlist) - cpp.SetColor(camvtk.lgreen) - cpp.SetWireframe() - myscreen.addActor(cpp) - - py = camvtk.STLSurf(triangleList=py_tlist) - py.SetColor(camvtk.pink) - py.SetWireframe() - myscreen.addActor(py) - - - - #drawcuts(myscreen, s) - - myscreen.render() - myscreen.iren.Start() - time.sleep(2) - exit() - - tlist = s.get_kd_triangles() - - print "got", len(tlist), " triangles" - - while (s.jump_kd_hi()): - lotris = s.get_kd_triangles() - s.jump_kd_up() - cut = s.get_kd_cut() - s.jump_kd_lo() - hitris = s.get_kd_triangles() - lev = s.get_kd_level() - - print "l=", lev, " hi=", len(hitris), " lo=", len(lotris), " cut=", cut - - if ( cut[0] < 2 ): - print "x cut ", - if ( cut[0] == 0): - print "max" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.green ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(cut[1],100,0), p2=(cut[1],-100,0), color = camvtk.lgreen ) ) - else: - print "y cut ", - if ( cut[0] == 2): - print "max" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.red ) ) - else: - print "min" - myscreen.addActor( camvtk.Line( p1=(100,cut[1],0), p2=(-100,cut[1],0), color = camvtk.pink ) ) - - - slo = camvtk.STLSurf(triangleList=lotris) - slo.SetColor(camvtk.pink) - slo.SetWireframe() - shi = camvtk.STLSurf(triangleList=hitris) - shi.SetColor(camvtk.lgreen) - shi.SetWireframe() - myscreen.addActor(slo) - myscreen.addActor(shi) - myscreen.render() - #myscreen.iren.Start() - #raw_input("Press Enter to terminate") - time.sleep(1) - myscreen.removeActor(slo) - myscreen.removeActor(shi) - - - - print "done." - myscreen.render() - #lwr.SetFileName(filename) - - #raw_input("Press Enter to terminate") - time.sleep(0.2) - lwr.Write() - myscreen.iren.Start() - - -if __name__ == "__main__": - main() - #raw_input("Press Enter to terminate") - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_movie1.py opencamlib-11.10-1/scripts/kdtree_movie1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_movie1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/kdtree_movie1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,183 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import datetime - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - myscreen.setAmbient(20,20,20) - - #stl = camvtk.STLSurf(filename="demo.stl") - stl = camvtk.STLSurf(filename="demo2.stl") - print "STL surface read" - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - #stl.SetFlat() - polydata = stl.src.GetOutput() - s= cam.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STLSurf with ", s.size(), " triangles" - cutterDiameter=0.6 - cutter = cam.CylCutter(cutterDiameter) - #print cutter.str() - #print cc.type - minx=-20 - dx=1 - maxx=20 - - miny=-20 - dy=01 - maxy=20 - z=-0.2 - - bucketSize = 20 - - #pftp = cam.ParallelFinish() - #pftp.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) - #pftp.initSTLSurf(s, bucketSize) - #pftp.dropCutterSTL1(cutter) - #print " made ", pftp.dcCalls, " drop-cutter calls" - #exit - - pf2 = cam.ParallelFinish() - pf2.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) - pf2.initSTLSurf(s, bucketSize) - pf2.dropCutterSTL2(cutter) - print " made ", pf2.dcCalls, " drop-cutter calls" - - #clpoints = pftp.getCLPoints() - #ccpoints = pftp.getCCPoints() - - clpoints = pf2.getCLPoints() - ccpoints = pf2.getCCPoints() - - #CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - nv=0 - nn=0 - ne=0 - nf=0 - myscreen.camera.SetPosition(3, 100, 15) - myscreen.camera.SetFocalPoint(50, 50, 0) - t = camvtk.Text() - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - - myscreen.addActor( t) - - t2 = camvtk.Text() - t2.SetPos( (myscreen.width-200, 30) ) - myscreen.addActor( t2) - t3 = camvtk.Text() - t3.SetPos( (30, 30)) - myscreen.addActor( t3) - - t4 = camvtk.Text() - t4.SetPos( (30, myscreen.height-60)) - myscreen.addActor( t4) - - n=0 - precl = cam.Point() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName("tux1.png") - - for cl,cc in zip(clpoints,ccpoints): - - camEye = myscreen.camera.GetFocalPoint() - camPos = myscreen.camera.GetPosition() - postext = "(%3.3f, %3.3f, %3.3f)" % (camPos[0], camPos[1], camPos[2]) - eyetext = "(%3.3f, %3.3f, %3.3f)" % (camEye[0], camEye[1], camEye[2]) - camtext = "Camera LookAt: "+eyetext+"\nCamera Pos: "+ postext - t4.SetText(camtext) - - t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - xtext = "%3.3f" % cl.x - ytext = "%3.3f" % cl.y - ztext = "%3.3f" % cl.z - t2.SetText( "X: " + xtext + "\nY: " + ytext + "\nZ: " + ztext ) - if cc.type==cam.CCType.FACET: - nf+=1 - col = (0,1,1) - elif cc.type == cam.CCType.VERTEX: - nv+=1 - col = (0,1,0) - elif cc.type == cam.CCType.EDGE: - ne+=1 - col = (1,0,0) - elif cc.type == cam.CCType.NONE: - #print "type=NONE!" - nn+=1 - col = (1,1,1) - #if cl.isInside(t): - # col = (0, 1, 0) - #else: - # col = (1, 0, 0) - trilist = pf2.getTrianglesUnderCutter(cl, cutter) - #print "at cl=", cl.str() , " where len(trilist)=", len(trilist) - t3.SetText("Total Triangles: "+ str(s.size()) +"\nUnder Cutter (red): "+str(len(trilist))) - - stl2 = camvtk.STLSurf(filename=None, triangleList=trilist, color=(1,0,0)) # a new surface with only triangles under cutter - stl2.SetWireframe() - #stl2.SetFlat() - myscreen.addActor(stl2) - trilist=[] - - - cutactor = camvtk.Cylinder(center=(cl.x,cl.y,cl.z), radius=cutterDiameter/2, height=2, color=(0.7,1,1)) - myscreen.addActor( cutactor ) - - #myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=col) ) - - if n==0: - precl = cl - else: - d = cl-precl - if (d.norm() < 9): - myscreen.addActor( camvtk.Line( p1=(precl.x, precl.y, precl.z), p2=(cl.x, cl.y, cl.z), color=(0,1,1) ) ) - precl = cl - n=n+1 - #myscreen.addActor( camvtk.Point(center=(cl2.x,cl2.y,cl2.z+0.2) , color=(0.6,0.2,0.9)) ) - #myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z), color=col) ) - #print cc.type - myscreen.camera.Azimuth( 0.2 ) - #time.sleep(0.01) - myscreen.render() - w2if.Modified() - lwr.SetFileName("kdmov"+ ('%05d' % n)+".png") - #lwr.Write() - - - #raw_input("Press Enter to continue") - myscreen.removeActor(stl2) - myscreen.removeActor( cutactor ) - - print "none=",nn," vertex=",nv, " edge=",ne, " facet=",nf, " sum=", nn+nv+ne+nf - print len(clpoints), " cl points evaluated" - - - - - #lwr.Write() - - - - for n in range(1,36): - t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - myscreen.camera.Azimuth( 1 ) - time.sleep(0.01) - myscreen.render() - lwr.SetFileName("kd_frame"+ ('%03d' % n)+".png") - w2if.Modified() - #lwr.Write() - - - - - myscreen.iren.Start() - raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_movie2.py opencamlib-11.10-1/scripts/kdtree_movie2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/kdtree_movie2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/kdtree_movie2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import datetime - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - myscreen.setAmbient(20,20,20) - - myscreen.camera.SetPosition(20, 30, 50) - myscreen.camera.SetFocalPoint(5, 5, 0) - - stl = camvtk.STLSurf(filename="stl/demo.stl") - #stl = camvtk.STLSurf(filename="demo2.stl") - print "STL surface read" - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - #stl.SetFlat() - polydata = stl.src.GetOutput() - s= cam.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STLSurf with ", s.size(), " triangles" - cutterDiameter=1 - cutter = cam.CylCutter(cutterDiameter) - #print cutter.str() - #print cc.type - minx=0 - dx=1 - maxx=10 - - miny=0 - dy=1 - maxy=10 - z=-10 - - bucketSize = 20 - - #pftp = cam.ParallelFinish() - #pftp.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) - #pftp.initSTLSurf(s, bucketSize) - #pftp.dropCutterSTL1(cutter) - #print " made ", pftp.dcCalls, " drop-cutter calls" - #exit - - pf2 = cam.ParallelFinish() - pf2.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) - pf2.initSTLSurf(s, bucketSize) - pf2.dropCutterSTL2(cutter) - print " made ", pf2.dcCalls, " drop-cutter calls" - - #clpoints = pftp.getCLPoints() - #ccpoints = pftp.getCCPoints() - - clpoints = pf2.getCLPoints() - ccpoints = pf2.getCCPoints() - - #CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - nv=0 - nn=0 - ne=0 - nf=0 - - t = camvtk.Text() - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - - myscreen.addActor( t) - - t2 = camvtk.Text() - t2.SetPos( (myscreen.width-200, 30) ) - myscreen.addActor( t2) - t3 = camvtk.Text() - t3.SetPos( (30, 30)) - myscreen.addActor( t3) - - t4 = camvtk.Text() - t4.SetPos( (30, myscreen.height-60)) - myscreen.addActor( t4) - - n=0 - precl = cam.Point() - - #w2if = vtk.vtkWindowToImageFilter() - #w2if.SetInput(myscreen.renWin) - #lwr = vtk.vtkPNGWriter() - #lwr.SetInput( w2if.GetOutput() ) - #w2if.Modified() - #lwr.SetFileName("tux1.png") - - for cl,cc in zip(clpoints,ccpoints): - - camEye = myscreen.camera.GetFocalPoint() - camPos = myscreen.camera.GetPosition() - postext = "(%3.3f, %3.3f, %3.3f)" % (camPos[0], camPos[1], camPos[2]) - eyetext = "(%3.3f, %3.3f, %3.3f)" % (camEye[0], camEye[1], camEye[2]) - camtext = "Camera LookAt: "+eyetext+"\nCamera Pos: "+ postext - t4.SetText(camtext) - - t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - xtext = "%3.3f" % cl.x - ytext = "%3.3f" % cl.y - ztext = "%3.3f" % cl.z - t2.SetText( "X: " + xtext + "\nY: " + ytext + "\nZ: " + ztext ) - if cc.type==cam.CCType.FACET: - nf+=1 - col = (0,1,1) - elif cc.type == cam.CCType.VERTEX: - nv+=1 - col = (0,1,0) - elif cc.type == cam.CCType.EDGE: - ne+=1 - col = (1,0,0) - elif cc.type == cam.CCType.NONE: - #print "type=NONE!" - nn+=1 - col = (1,1,1) - #if cl.isInside(t): - # col = (0, 1, 0) - #else: - # col = (1, 0, 0) - trilist = pf2.getTrianglesUnderCutter(cl, cutter) - #print "at cl=", cl.str() , " where len(trilist)=", len(trilist) - t3.SetText("Total Triangles: "+ str(s.size()) +"\nUnder Cutter (red): "+str(len(trilist))) - - stl2 = camvtk.STLSurf(filename=None, triangleList=trilist, color=(1,0,0)) # a new surface with only triangles under cutter - stl2.SetWireframe() - #stl2.SetFlat() - myscreen.addActor(stl2) - trilist=[] - - - cutactor = camvtk.Cylinder(center=(cl.x,cl.y,cl.z), - radius=cutterDiameter/2, - height=20, - rotXYZ=(90,0,0), - color=(0.7,0,1)) - myscreen.addActor( cutactor ) - - myscreen.addActor( camvtk.Sphere(center=(cl.x,cl.y,cl.z) ,radius=0.03, color=col) ) - - """ - if n==0: - precl = cl - else: - d = cl-precl - if (d.norm() < 90): - myscreen.addActor( camvtk.Line( p1=(precl.x, precl.y, precl.z), p2=(cl.x, cl.y, cl.z), color=(0,1,1) ) ) - precl = cl - """ - - n=n+1 - #myscreen.addActor( camvtk.Point(center=(cl2.x,cl2.y,cl2.z+0.2) , color=(0.6,0.2,0.9)) ) - #myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z), color=col) ) - #print cc.type - #myscreen.camera.Azimuth( 0.2 ) - time.sleep(0.1) - myscreen.render() - #w2if.Modified() - #lwr.SetFileName("kdbig"+ ('%05d' % n)+".png") - #lwr.Write() - - - #raw_input("Press Enter to continue") - myscreen.removeActor(stl2) - myscreen.removeActor( cutactor ) - - print "none=",nn," vertex=",nv, " edge=",ne, " facet=",nf, " sum=", nn+nv+ne+nf - print len(clpoints), " cl points evaluated" - - - - - #lwr.Write() - - - - for n in range(1,36): - t.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - myscreen.camera.Azimuth( 1 ) - time.sleep(0.01) - myscreen.render() - #lwr.SetFileName("kd_frame"+ ('%03d' % n)+".png") - #w2if.Modified() - #lwr.Write() - - - - - myscreen.iren.Start() - raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/lineclfilter_test.py opencamlib-11.10-1/scripts/lineclfilter_test.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/lineclfilter_test.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/lineclfilter_test.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -import ocl - -print ocl.version() - -p0 = ocl.CLPoint(0,0,0) -p1 = ocl.CLPoint(1,2,3) -p2 = ocl.CLPoint(1.1,2.2,3.3) -clp=[] -clp.append(p0) -clp.append(p1) -clp.append(p2) - -f = ocl.LineCLFilter() -f.setTolerance(0.01) -for p in clp: - f.addCLPoint(p) - -f.run() -p2 = f.getCLPoints() -for p in p2: - print p diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/mov_kdtree.sh opencamlib-11.10-1/scripts/mov_kdtree.sh --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/mov_kdtree.sh 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/mov_kdtree.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -#!/bin/sh - -#first convert to JPEG -#mogrify -format jpg -quality 97 *.png - -# a script for encoding jpeg-frames into a video suitable for uploading to youtube or vimeo - -# oldest, not very good... -#mencoder mf://*.jpg -mf fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4 -ac copy -o output.avi -ffourcc DX50 - -# -aspect 16:9 -# -mf fps=25:type=png - -# better. -mencoder mf://*.png -mf type=png -of lavf -ovc lavc -lavcopts aglobal=1:vglobal=1:coder=0:vcodec=mpeg4:vbitrate=24000000 -vf scale=1280:720 -ofps 30000/1001 -o OUTPUTp_24long.mp4 - -# not so good. -#mencoder mf://*.jpg -mf w=800:h=600:fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output4.avi - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/mov.sh opencamlib-11.10-1/scripts/mov.sh --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/mov.sh 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/mov.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#!/bin/sh - -# a script for encoding jpeg-frames into a video suitable for uploading to youtube or vimeo - -# oldest, not very good... -#mencoder mf://*.jpg -mf fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4 -ac copy -o output.avi -ffourcc DX50 - -# better. -mencoder mf://frames/*.png -mf fps=3:type=png -aspect 16:9 -of lavf -ovc lavc -lavcopts aglobal=1:vglobal=1:coder=0:vcodec=mpeg4:vbitrate=4500 -vf scale=1280:720 -ofps 3000/1001 -o OUTPUT3.mp4 - -# not so good. -#mencoder mf://*.jpg -mf w=800:h=600:fps=25:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output4.avi - - -# joining two or more files: -# mencoder f1.mp4 f2.mp4 f3.mp4 f4.mp4 -mf fps=3 -oac copy -of lavf -ovc copy -lavcopts aglobal=1:vglobal=1:coder=0:vcodec=mpeg4:vbitrate=4500 -vf scale=1280:720 -o output.mp4 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_bounding-box.py opencamlib-11.10-1/scripts/ocl_bounding-box.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_bounding-box.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_bounding-box.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def drawBB(myscreen, bb): - lines=[] - # x-direction lines, red color - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.minpt.y, bb.minpt.z), color=camvtk.red) ) - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.maxpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.minpt.z), color=camvtk.red) ) - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.maxpt.z), p2=(bb.maxpt.x, bb.minpt.y, bb.maxpt.z), color=camvtk.red) ) - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.maxpt.y, bb.maxpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.red) ) - - # y-direction lines, green color - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.minpt.x, bb.maxpt.y, bb.minpt.z), color=camvtk.green) ) - lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.minpt.z), color=camvtk.green) ) - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.maxpt.z), p2=(bb.minpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.green) ) - lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.minpt.y, bb.maxpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.green) ) - - # z-direction lines, blue color - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.minpt.x, bb.minpt.y, bb.maxpt.z), color=camvtk.blue) ) - lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.minpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.minpt.y, bb.maxpt.z), color=camvtk.blue) ) - lines.append( camvtk.Line( p1=(bb.minpt.x, bb.maxpt.y, bb.minpt.z), p2=(bb.minpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.blue) ) - lines.append( camvtk.Line( p1=(bb.maxpt.x, bb.maxpt.y, bb.minpt.z), p2=(bb.maxpt.x, bb.maxpt.y, bb.maxpt.z), color=camvtk.blue) ) - - for l in lines: - myscreen.addActor(l) - -if __name__ == "__main__": - print ocl.revision() - - myscreen = camvtk.VTKScreen() - - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - #stl = camvtk.STLSurf("../stl/beet_mm.stl") - #stl = camvtk.STLSurf("../stl/Blade.stl") - myscreen.addActor(stl) - stl.SetWireframe() - stl.SetColor((0.5,0.5,0.5)) - - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read ", s.size(), " triangles" - - minimum_point = s.bb.minpt - maximum_point = s.bb.maxpt - print "min point =", minimum_point - print "max point =", maximum_point - print s.getBounds() - - # render the min and max points - myscreen.addActor( camvtk.Sphere( center=(minimum_point.x, minimum_point.y, minimum_point.z), radius=0.1, color=camvtk.red) ) - myscreen.addActor( camvtk.Sphere( center=(maximum_point.x, maximum_point.y, maximum_point.z), radius=0.1, color=camvtk.green) ) - - # render a bounding-box - drawBB( myscreen, s.bb ) - - myscreen.camera.SetPosition(3, 23, 15) - myscreen.camera.SetFocalPoint(4, 5, 0) - t = camvtk.Text() - t.SetText("OpenCAMLib") - t.SetPos( (myscreen.width-200, myscreen.height-30) ) - myscreen.addActor( t) - - myscreen.render() - myscreen.iren.Start() - raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_clpoint.py opencamlib-11.10-1/scripts/ocl_clpoint.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_clpoint.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_clpoint.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -import ocl - -print ocl.revision() - -p = ocl.Point(1,2,3) -print p -cc = ocl.CCPoint(4,5,6) -print cc -cl = ocl.CLPoint() -print cl -cl2 = ocl.CLPoint(7,8,9) -print cl2 -cl3 = ocl.CLPoint(10,11,12,cc) -print cl3 -cc.x=77 -print cl3 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_docstring_test.py opencamlib-11.10-1/scripts/ocl_docstring_test.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_docstring_test.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_docstring_test.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -import ocl -#help(ocl) - -# -c=ocl.BallCutter(1,2) -print c.__doc__ -print ocl.version() -help(ocl.BallCutter(4,5)) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_interval.py opencamlib-11.10-1/scripts/ocl_interval.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_interval.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_interval.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - - -if __name__ == "__main__": - print ocl.revision() - i = ocl.Interval() - print i - i = ocl.Interval(0.123, 0.456) - print i - cc = ocl.CCPoint(1,2,3) - cc.type = ocl.CCType.VERTEX - i.updateLower(-0.222,cc) - print i - i.updateLower(0,cc) - print i - i.updateUpper(0,cc) - print i - i.updateUpper(2,cc) - print i diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_offsetCutter_1.py opencamlib-11.10-1/scripts/ocl_offsetCutter_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_offsetCutter_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_offsetCutter_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -import ocl -import math - -print ocl.revision() - -# cylinder -c = ocl.CylCutter(2.345, 5) -d = c.offsetCutter(0.1) -print c -print "offset: ",d -print - -# ball -c = ocl.BallCutter(2.345, 6) -d = c.offsetCutter(0.1) -print c -print "offset: ",d -print - -# bull -c = ocl.BullCutter(2.345, 0.123, 6) -d = c.offsetCutter(0.1) -print c -print "offset: ",d -print - -# cone -c = ocl.ConeCutter(2.345, math.pi/6) -d = c.offsetCutter(0.1) -print c -print "offset: ",d - -# TODO: add compound-cutters here below. diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_stl2ocl_tst.py opencamlib-11.10-1/scripts/ocl_stl2ocl_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_stl2ocl_tst.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_stl2ocl_tst.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -import ocl -import camvtk -import time - -if __name__ == "__main__": - s= ocl.STLSurf() - print s - myscreen = camvtk.VTKScreen() - stl = camvtk.STLSurf("../stl/demo.stl") - print "STL surface read" - myscreen.addActor(stl) - stl.SetWireframe() - - polydata = stl.src.GetOutput() - camvtk.vtkPolyData2OCLSTL(polydata, s) - - print s - myscreen.render() - myscreen.iren.Start() - - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_stlsurf_polydata.py opencamlib-11.10-1/scripts/ocl_stlsurf_polydata.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_stlsurf_polydata.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_stlsurf_polydata.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -import ocl -import camvtk -import time - - -if __name__ == "__main__": - p = ocl.Point() - p.x=7 - p.y=8 - p.z=-3 - print p - q = ocl.Point(1,2,3) - r = p + q - t = ocl.Triangle(p,q,r) - print t - s= ocl.STLSurf() - print s - s.addTriangle(t) - s.addTriangle(t) - print s - print "end." - - myscreen = camvtk.VTKScreen() - print "screen created" - stl = camvtk.STLSurf("../stl/sphere.stl") - print "STL surface read" - myscreen.addActor(stl) - - b = stl.src.GetOutput() - print b - print "Verts:",b.GetNumberOfVerts() - print "Cells:",b.GetNumberOfCells() - print "Lines:",b.GetNumberOfLines() - print "Polys:",b.GetNumberOfPolys() - print "Strips:",b.GetNumberOfStrips() - c = b.GetCell(0) - print c - print "Points:",c.GetNumberOfPoints() - print "Edges:",c.GetNumberOfEdges() - print "Faces:",c.GetNumberOfFaces() - ps = c.GetPoints() - print ps - n=ps.GetNumberOfPoints() - print "Nr of Points:",n - for id in range(0,n): - print id,"=", - print ps.GetPoint(id) - myscreen.addActor( camvtk.Sphere(radius=0.5,center=ps.GetPoint(id)) ) - myscreen.render() - myscreen.iren.Start() - #raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_test0.py opencamlib-11.10-1/scripts/ocl_test0.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/ocl_test0.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/ocl_test0.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -import ocl - -if __name__ == "__main__": - p = ocl.Point() - p.x=7 - p.y=8 - p.z=-3 - - print p - q = ocl.Point(1,2,3) - print q - r = p + q - s = ocl.Point(66,66,66) - s += r - print r - print s - print "2*s=", (s*2) - print "s.norm=", s.norm() - print "normalizing" - s.normalize() - print "s.norm=", s.norm() - print "s dot r", s.dot(r) - print "s cross r", s.cross(r) - t = ocl.Triangle(p,q,r) - print t - s= ocl.STLSurf() - print s - s.addTriangle(t) - s.addTriangle(t) - print s - print "end." - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/octree_fig.py opencamlib-11.10-1/scripts/octree_fig.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/octree_fig.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/octree_fig.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import datetime -import vtk -import math -""" -This scripts draws a picture which enumerates the vertices, edges, and faces -of an octree node, as used in the octree cutting simulation and -marching-cubes. -""" -def main(): - print ocl.revision() - myscreen = camvtk.VTKScreen() - myscreen.camera.SetPosition(-8, -4, 25) - myscreen.camera.SetFocalPoint(0,0, 0) - arpos=-1.5 - camvtk.drawArrows(myscreen,center=(arpos,arpos,arpos)) - camvtk.drawOCLtext(myscreen) - octtext = camvtk.Text() - octtext.SetPos( (70, myscreen.height-600) ) - myscreen.addActor( octtext) - octtext.SetText("Octree") - vertex = [ ocl.Point( 1, 1,-1), #// 0 - ocl.Point(-1, 1,-1), #// 1 - ocl.Point(-1,-1,-1), #// 2 - ocl.Point( 1,-1,-1), #// 3 - ocl.Point( 1, 1, 1), #// 4 - ocl.Point(-1, 1, 1), #// 5 - ocl.Point(-1,-1, 1), #// 6 - ocl.Point( 1,-1, 1) #// 7 - ] - - n=0 - for v in vertex: - myscreen.addActor( camvtk.Sphere(center=(v.x,v.y,v.z), radius=0.1,color=camvtk.red)) - v=v - t = camvtk.Text3D(color=camvtk.red, center=(v.x+0.1,v.y+0.1,v.z), text=str(n), scale=0.2, camera=myscreen.camera) - myscreen.addActor(t) - n=n+1 - - edgeTable = [ [0,1] , - [1,2] , - [2,3] , - [3,0] , - [4,5] , - [5,6] , - [6,7] , - [7,4] , - [0,4] , - [1,5] , - [2,6] , - [3,7] , - ] - - # draw the edges as tubes - ne = 0 - for e in edgeTable: - - ep1 = vertex[ e[0] ] - ep2 = vertex[ e[1] ] - tu = camvtk.Tube( p1=(ep1.x,ep1.y,ep1.z), p2=(ep2.x,ep2.y,ep2.z), radius=0.051, color=camvtk.green ) - myscreen.addActor(tu) - mid = 0.5*(ep1 + ep2) - t = camvtk.Text3D(color=camvtk.green, center=(mid.x+0.1,mid.y+0.1,mid.z), text=str(ne), scale=0.2, camera=myscreen.camera) - myscreen.addActor(t) - ne=ne+1 - - # number the faces - face = [ [2,3,6,7] , - [0,3,4,7] , - [0,1,4,5] , - [1,2,5,6] , - [0,1,2,3] , - [4,5,6,7] , - ] - nf=0 - for f in face: - mid = ocl.Point() - for v in f: - mid = mid+vertex[v] - mid=0.25*mid - t = camvtk.Text3D(color=camvtk.blue, center=(mid.x,mid.y,mid.z), text=str(nf), scale=0.2, camera=myscreen.camera) - myscreen.addActor(t) - nf=nf+1 - myscreen.render() - print "All done." - myscreen.iren.Start() - -if __name__ == "__main__": - - main() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offsetCutter_test_2.py opencamlib-11.10-1/scripts/offsetCutter_test_2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offsetCutter_test_2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offsetCutter_test_2.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -def CLPointGrid(minx,dx,maxx,miny,dy,maxy,z): - plist = [] - xvalues = [round(minx+n*dx,2) for n in xrange(int(round((maxx-minx)/dx))+1) ] - yvalues = [round(miny+n*dy,2) for n in xrange(int(round((maxy-miny)/dy))+1) ] - for y in yvalues: - for x in xvalues: - plist.append( ocl.CLPoint(x,y,z) ) - return plist - -def drawPoints(myscreen, clpoints, ccpoints): - c=camvtk.PointCloud( pointlist=clpoints, collist=ccpoints) - c.SetPoints() - myscreen.addActor(c ) - - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - - a=ocl.Point(1,0.6,0.1) - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) - b=ocl.Point(0,1,0) - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))) - c=ocl.Point(0,0,0.0) - myscreen.addActor(camvtk.Point(center=(c.x,c.y,c.z), color=(1,0,1))) - - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(c.x,c.y,c.z)) ) - myscreen.addActor( camvtk.Line(p1=(c.x,c.y,c.z),p2=(b.x,b.y,b.z)) ) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - - t = ocl.Triangle(b,c,a) - radius1=1 - angle = math.pi/4 - length=10 - #cutter = ocl.ConeCutter(0.37, angle) - - cutter = ocl.BallCutter(0.532, length) - #cutter = ocl.CylCutter(0.3, length) - #cutter = ocl.BullCutter(0.7,0.1, length) - - # these cutters do not have offsets yet (?) - #cutter = ocl.CylConeCutter(0.2,0.5,math.pi/9) - #cutter = ocl.BallConeCutter(0.4,0.6,math.pi/9) - #cutter = ocl.BullConeCutter(0.4,0.1,0.7,math.pi/6) - #cutter = ocl.ConeConeCutter(0.4,math.pi/3,0.7,math.pi/6) - #cutter = ocl.ConeCutter(0.4, math.pi/3) - print cutter - offset=0.1 - c2 = cutter.offsetCutter(offset) - print c2 - - minx=-0.5 - dx=0.0051 - maxx=1.5 - miny=-0.7 - dy=dx - maxy=1.5 - z=-1.8 - clpoints = CLPointGrid(minx,dx,maxx,miny,dy,maxy,z) - print len(clpoints), "cl-points to evaluate" - n=0 - ccpoints=[] - cl2pts=[] - for p in clpoints: - cl2pts.append(ocl.CLPoint(p.x,p.y,p.z)) - - for (cl,cl2) in zip(clpoints,cl2pts): - - #cutter.vertexDrop(cl,t) - #cutter.edgeDrop(cl,t) - #cutter.facetDrop(cl,t) - #c2.vertexDrop(cl2,t) - cutter.dropCutter(cl,t) - c2.dropCutter(cl2,t) - n=n+1 - if (n % int(len(clpoints)/10)) == 0: - print n/int(len(clpoints)/10), " ", - - print "done." - - print "rendering..." - print " len(clpoints)=", len(clpoints) - print " len(ccl2pts)=", len(cl2pts) - print "rendering clpoints...", - camvtk.drawCLPointCloud(myscreen, clpoints) - print "done." - cl2ptsofs=[] - for p in cl2pts: - p.z = p.z + offset - cl2ptsofs.append(p) - print "rendering offset clpoints...", - camvtk.drawCLPointCloud(myscreen, cl2ptsofs) - print "done." - origo = camvtk.Sphere(center=(0,0,0) , radius=0.1, color=camvtk.blue) - origo.SetOpacity(0.2) - myscreen.addActor( origo ) - - myscreen.camera.SetPosition(0.5, 3, 2) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - myscreen.render() - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - t = camvtk.Text() - t.SetPos( (myscreen.width-350, myscreen.height-30) ) - myscreen.addActor(t) - myscreen.iren.Start() - #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/epos_test.py opencamlib-11.10-1/scripts/offset-ellipse/epos_test.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/epos_test.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offset-ellipse/epos_test.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -import ocl -import camvtk -import time -import vtk -import datetime -import math - -if __name__ == "__main__": - p = ocl.Epos() - print "initial Epos() is ",p, "with dia=",p.d - - for n in xrange(0,30): - print p.d," : ",p - p.d = p.d - 0.25 - p.setD() - - raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oeanim.py opencamlib-11.10-1/scripts/offset-ellipse/oeanim.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oeanim.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offset-ellipse/oeanim.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -import oellipse5_tst as oe -import math - -Nsteps = 500 -ystart = -0.2 -ystop = 2.2 - -ystep = (ystop-ystart)/(Nsteps-1) -fiangle = 55 - -def radian(deg): - return (float(deg)/360)*2*math.pi - -for n in xrange(0,Nsteps): - yc = ystart + n*ystep - fname = "frames/oet"+ ('%05d' % n)+".png" - oe.main(ycoord=yc, filename=fname, theta=70, fi=radian(fiangle)) - #fiangle = fiangle + 2 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse0_tst.py opencamlib-11.10-1/scripts/offset-ellipse/oellipse0_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse0_tst.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offset-ellipse/oellipse0_tst.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,219 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math - -red= (1,0,0) -green= (0,1,0) -blue= (0,0,1) -cyan= (0,1,1) -yellow= (1,1,0) -magenta =(float(255)/255,0,float(225)/255) -pink =(float(255)/255,float(193)/255,float(203)/255) - -def ccColor2(cc): - """ this function returns a different color depending on the type of - the CC-point. Useful for visualizing CL or CC points """ - if cc.type==cam.CCType.FACET: - col = (1,0,1) - elif cc.type == cam.CCType.VERTEX: - col = (1,1,0) - elif cc.type == cam.CCType.EDGE: - col = (0,1,1) - elif cc.type == cam.CCType.NONE: - col = (1,1,1) - elif cc.type == cam.CCType.ERROR: - col = (0,0.5,1) - return col - -class OffsetEllipse(): - """ - // (s, t) where: s^2 + t^2 = 1 - // point of ellipse is: ecen + j s + n t - // tangent at point is: -j t + n s - // normal at point is: j (s / eccen) + n (t * eccen) - // point on offset-ellipse: point on ellipse + offrad*normal - """ - def __init__(self, ecen, a, b, ofs): - self.a = a - self.b = b - self.ecen = ecen - self.ofs = ofs - - def ePoint(self,t,s): - # return a point on the ellipse - p = cam.Point() - p.x = self.ecen.x + self.a*s - p.y = self.ecen.y + self.b*t - return p - - def oePoint(self,t,s): - # return point on offset-ellipse - p = self.ePoint(t,s) - normal = cam.Point( self.b*s, self.a*t, 0) - normal.normalize() - p = p + self.ofs*normal - return p - - def teval(self, s, side): - ssq = s*s - tsq = 1 - ssq - if side == 1: - return 1 * math.sqrt(tsq) - else: - return -1* math.sqrt(tsq) - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - - a=cam.Point(3,2,-2) - b=cam.Point(-1,2,3) - - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); - #c=cam.Point(0,0,0.3) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - #t = cam.Triangle(a,b,c) - length = 5 - cutter = cam.BullCutter(1,0.2,length) - - - print cutter - - xar = camvtk.Arrow(color=red, rotXYZ=(0,0,0)) - myscreen.addActor(xar) - yar = camvtk.Arrow(color=green, rotXYZ=(0,0,90)) - myscreen.addActor(yar) - zar = camvtk.Arrow(color=blue, rotXYZ=(0,-90,0)) - myscreen.addActor(zar) - - cl = cam.Point(2.193, 1, 0) - radius1=1 - radius2=0.25 - - tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) - #tor.SetWireframe() - tor.SetSurface() - tor.SetOpacity(0.3) - myscreen.addActor(tor) - - cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), - rotXYZ=(90,0,0), resolution=50 ) - #myscreen.addActor(cyl) - - tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),radius=radius2, color=(1,1,0)) - tube.SetOpacity(0.1) - myscreen.addActor(tube) - - cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=yellow) - myscreen.addActor(cir) - - clp = camvtk.Sphere(radius=0.02, center=(cl.x,cl.y,cl.z), color=yellow) - myscreen.addActor(clp) - - # short axis of ellipse = radius2 - # long axis of ellipse = radius2/sin(theta) - # where theta is the slope of the line - dx = b.x - a.x - dz = b.z - a.z - print "dx=", dx - print "dz=", dz - theta = math.atan(dz/dx) - print "theta=",theta - a = abs( radius2/math.sin(theta) ) - print "a=", a, " = ", a/radius2,"* radius2" - # ellipse - #a=2 - b=radius2 - print "b= ", b - - - ecen_tmp=cam.Point(1.38,2,0) - resolution=50 - for n in xrange(0,resolution): - angle1= (float(n)/float(resolution))*2*math.pi - angle2= (float(n+1)/float(resolution))*2*math.pi - x=ecen_tmp.x + a*math.cos(angle1) - y=ecen_tmp.y + b*math.sin(angle1) - x2=ecen_tmp.x + a*math.cos(angle2) - y2=ecen_tmp.y + b*math.sin(angle2) - - #myscreen.addActor(camvtk.Point(center=(x,y,0), color=(1,0,1))) - #myscreen.addActor( camvtk.Line(p1=(x,y,0),p2=(x2,y2,0)) ) - - oe = cam.Ellipse(ecen_tmp, a, b, radius1) - - myscreen.camera.SetPosition(5, 7, 1) - myscreen.camera.SetFocalPoint(0.5, 0.5, 0) - - nmax=80 - dd = float(4.0)/nmax - diangles = [ n*dd for n in range(nmax) ] - epos1 = cam.EllipsePosition() - epos2 = cam.EllipsePosition() - for n in range(nmax): - #s = float(n)/float(nmax-1) * 2-1 - #t = oe.teval(s, 1) - #t2 = oe.teval(s, 0) - n2 = n+1 - if n2==nmax: - n2=0 - epos1.setDiangle( diangles[n] ) - epos2.setDiangle( diangles[n2] ) - - p1 = oe.ePoint( epos1 ) - p2 = oe.ePoint( epos2 ) - - p1o = oe.oePoint( epos1 ) - p2o = oe.oePoint( epos2 ) - #print "s=", s, "t=", t," epoint=", p1.str() - - myscreen.addActor( camvtk.Line(p1=(p1.x,p1.y,p1.z),p2=(p2.x,p2.y,p2.z), color=magenta) ) - - myscreen.addActor( camvtk.Line(p1=(p1o.x,p1o.y,p1o.z),p2=(p2o.x,p2o.y,p2o.z), color=pink) ) - #myscreen.addActor(camvtk.Point(center=(p1.x,p1.y,0), color=green)) - #myscreen.addActor(camvtk.Point(center=(p2.x,p2.y,0), color=red)) - - #myscreen.addActor(camvtk.Point(center=(p1o.x,p1o.y,0), color=green)) - #myscreen.addActor(camvtk.Point(center=(p2o.x,p2o.y,0), color=red)) - - # ellipse point, normal - #epos1.setDiangle(3.48) # approx solution - epos1.setDiangle(0) - ep = oe.ePoint( epos1 ) - oep = oe.oePoint( epos1 ) - myscreen.addActor( camvtk.Sphere(radius=0.02, center=(ep.x,ep.y,ep.z), color=magenta) ) - myscreen.addActor( camvtk.Sphere(radius=0.02, center=(oep.x,oep.y,oep.z), color=pink) ) - myscreen.addActor( camvtk.Line(p1=(ep.x,ep.y,ep.z),p2=(oep.x,oep.y,oep.z), color=red) ) - - myscreen.render() - #time.sleep(0.5) - - print "rendering...", - #for cl,cc in zip(clpoints,ccpoints): - # myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=ccColor(cc) ) ) - # if cc.type != cam.CCType.NONE: # only render interesting cc-points - # myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z) , color=ccColor2(cc) ) ) - - - print "done." - - - - - myscreen.render() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName("5_all.png") - #lwr.Write() - - - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse2_tst.py opencamlib-11.10-1/scripts/offset-ellipse/oellipse2_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse2_tst.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offset-ellipse/oellipse2_tst.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,386 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math -import datetime - -red= (1,0,0) -green= (0,1,0) -blue= (0,0,1) -cyan= (0,1,1) -yellow= (1,1,0) -pink = ( float(255)/255,float(192)/255,float(203)/255) -grey = ( float(127)/255,float(127)/255,float(127)/255) -orange = ( float(255)/255,float(165)/255,float(0)/255) - -def ccColor2(cc): - """ this function returns a different color depending on the type of - the CC-point. Useful for visualizing CL or CC points """ - if cc.type==cam.CCType.FACET: - col = (1,0,1) - elif cc.type == cam.CCType.VERTEX: - col = (1,1,0) - elif cc.type == cam.CCType.EDGE: - col = (0,1,1) - elif cc.type == cam.CCType.NONE: - col = (1,1,1) - elif cc.type == cam.CCType.ERROR: - col = (0,0.5,1) - return col - -class OffsetEllipse(): - """ - // (s, t) where: s^2 + t^2 = 1 - // point of ellipse is: ecen + j s + n t - // tangent at point is: -j t + n s - // normal at point is: j (s / eccen) + n (t * eccen) - // point on offset-ellipse: point on ellipse + offrad*normal - """ - def __init__(self, ecen, a, b, ofs): - self.a = a - self.b = b - self.ecen = ecen - self.ofs = ofs - - def ePoint(self,epos): - # return a point on the ellipse - p = cam.Point() - p.x = self.ecen.x + self.a*epos.s - p.y = self.ecen.y + self.b*epos.t - return p - - def oePoint(self,epos): - # return point on offset-ellipse - p = self.ePoint(epos) - normal = self.eNorm(epos) - p.x = p.x + self.ofs*normal.x - p.y = p.y + self.ofs*normal.y - return p - - def eNorm(self, epos): - normal = cam.Point( self.b*epos.s, self.a*epos.t, 0) - normal.normalize() - return normal - - def eTang(self, epos): - p = cam.Point(-self.a*epos.t, self.b*epos.s, 0) - p.normalize() - return p - - def error(self,epos,cl): - p1 = self.oePoint(epos) - p2 = cl - dx = p1.x - cl.x - dy = p1.y - cl.y - #return dx*dx+dy*dy - return dy - - - -class EPos(): - """ - // (s, t) where: s^2 + t^2 = 1 - // point of ellipse is: ecen + j s + n t - // tangent at point is: -j t + n s - // normal at point is: j (s / eccen) + n (t * eccen) - // point on offset-ellipse: point on ellipse + offrad*normal - """ - def __init__(self): - self.t = 1 - self.s = 0 - self.sett(self.t,1) - - def sets(self, s, side): - if s > 1.0: - s = 1.0 - if s < -1.0: - s = -1.0 - - self.s = s - ssq = s*s - tsq = 1 - ssq - if side == 1: - self.t = 1 * math.sqrt(tsq) - else: - self.t = -1 * math.sqrt(tsq) - - def sett(self, t, side): - if t > 1.0: - t = 1.0 - if t < -1.0: - t = -1.0 - - self.t = t - tsq = t*t - ssq = 1 - tsq - if side == 1: - self.s = 1 * math.sqrt(ssq) - else: - self.s = -1* math.sqrt(ssq) - - def stepTang(self, ellipse, delta): - tang = oe.eTang(self) - #print " epos= (", self.s," , ", self.t , " )" - #print "steptang tang=", tang.str() - if abs(tang.x) > abs(tang.y): - #print "s-dir step" - news = self.s + delta*tang.x - if self.t > 0: - self.sets(news,1) - else: - self.sets(news,0) - else: - #print "t-dir step" - newt = self.t + delta*tang.y - if self.s>0: - self.sett( newt,1) - else: - self.sett( newt,0) - - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - - myscreen.camera.SetPosition(5, 3, 2) - myscreen.camera.SetFocalPoint(1.38,1, 0) - - a=cam.Point(3,2,-2) - b=cam.Point(-1,2,3) - - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); - #c=cam.Point(0,0,0.3) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - #t = cam.Triangle(a,b,c) - - cutter = cam.BullCutter(1,0.2) - - - print cutter.str() - - xar = camvtk.Arrow(color=red, rotXYZ=(0,0,0)) - myscreen.addActor(xar) - yar = camvtk.Arrow(color=green, rotXYZ=(0,0,90)) - myscreen.addActor(yar) - zar = camvtk.Arrow(color=blue, rotXYZ=(0,-90,0)) - myscreen.addActor(zar) - - cl = cam.Point(2.193, 1, 0) - radius1=1 - radius2=0.25 - - tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) - #tor.SetWireframe() - #myscreen.addActor(tor) - - cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), - rotXYZ=(90,0,0), resolution=50 ) - #myscreen.addActor(cyl) - - tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),color=(1,1,0)) - tube.SetOpacity(0.2) - #myscreen.addActor(tube) - - cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=yellow) - myscreen.addActor(cir) - - clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) - myscreen.addActor(clp) - - # short axis of ellipse = radius2 - # long axis of ellipse = radius2/sin(theta) - # where theta is the slope of the line - dx = b.x - a.x - dz = b.z - a.z - #print "dx=", dx - #print "dz=", dz - theta = math.atan(dz/dx) - #print "theta=",theta - a = abs( radius2/math.sin(theta) ) - #print "a=", a, " = ", a/radius2,"* radius2" - # ellipse - #a=2 - b=radius2 - #print "b= ", b - - - ecen_tmp=cam.Point(1.38,2,0) - resolution=50 - for n in xrange(0,resolution): - angle1= (float(n)/float(resolution))*2*math.pi - angle2= (float(n+1)/float(resolution))*2*math.pi - x=ecen_tmp.x + a*math.cos(angle1) - y=ecen_tmp.y + b*math.sin(angle1) - x2=ecen_tmp.x + a*math.cos(angle2) - y2=ecen_tmp.y + b*math.sin(angle2) - - #myscreen.addActor(camvtk.Point(center=(x,y,0), color=(1,0,1))) - #myscreen.addActor( camvtk.Line(p1=(x,y,0),p2=(x2,y2,0)) ) - - oe = OffsetEllipse(ecen_tmp, a, b, radius1) - - - - nmax=20 - delta=0.05 - td = 1 - epos1 = EPos() - epos2 = EPos() - epos3 = EPos() - epos4 = EPos() - epos5 = EPos() - for n in xrange(0,nmax): - s = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) - t = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) - - epos1.sets(s,1) - epos2.sets(s,0) - epos3.sett(t,1) - epos4.sett(t,0) - - p1 = oe.ePoint(epos1) - p2 = oe.ePoint(epos2) - p3 = oe.ePoint(epos3) - p4 = oe.ePoint(epos4) - p5 = oe.ePoint(epos5) - - p1o = oe.oePoint(epos1) - p2o = oe.oePoint(epos2) - #print "s=", s, "t=", t," epoint=", p1.str() - myscreen.addActor(camvtk.Point(center=(p1.x,p1.y,0), color=green)) # green steps along s (side=1) - myscreen.addActor(camvtk.Point(center=(p2.x,p2.y,0), color=red)) # red steps along s (side=0) - myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) # orange steps along t (side=1) - myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) # pink steps along t (side=0) - - #myscreen.addActor(camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=red)) - #myscreen.addActor(camvtk.Point(center=(p1o.x,p1o.y,0), color=green)) - #myscreen.addActor(camvtk.Point(center=(p2o.x,p2o.y,0), color=red)) - - """ - tx = float(n)/float(nmax-1) * 2 - 1 - sx = oe.seval(tx, 1) - sx2 = oe.seval(tx, 0) - p3 = oe.ePoint(sx,tx) - p4 = oe.ePoint(sx2,tx) - #myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) - #myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) - - sd = oe.seval(td,1) - p5 = oe.ePoint(td,sd) - myscreen.addActor(camvtk.Point(center=(p5.x,p5.y,0), color=orange)) - """ - myscreen.render() - #time.sleep(0.05) - - t = camvtk.Text() - t.SetPos( (myscreen.width-450, myscreen.height-30) ) - - myscreen.addActor( t) - t2 = camvtk.Text() - t2.SetPos( (50, myscreen.height-150) ) - - myscreen.addActor( t2) - - epos5.sets(0.5,1) - Nsteps=10 - endcondition = 0 - n = 1 - NRStep=0.1 - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - - while not endcondition: - #for n in xrange(0,Nsteps): - t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - current_error = oe.error(epos5, cl) - - print "current error=", current_error - epos_tmp = EPos() - epos_tmp.s = epos5.s - epos_tmp.t = epos5.t - # take a small step, to determine rerivative: - dt = 0.2*NRStep - epos_tmp.stepTang(oe,dt) - new_error = oe.error(epos_tmp, cl) - print "new_error=", new_error - deriv = (new_error-current_error)/dt - print "derivative = ", deriv - paramtext = "(s, t) = (%3.3f, %3.3f)\n NR iteration # = %i \n error= %3.9f\n de=%3.3f" % (epos5.s, epos5.t, n, current_error,deriv) - t2.SetText(paramtext) - # take Newton rhapson step - NRStep = (-current_error/deriv) - print " step=", NRStep - #NRStep=0.05 # debug/demo - epos5.stepTang(oe, NRStep) - - p5 = oe.ePoint(epos5) - esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=red) - myscreen.addActor(esphere) - - p6 = oe.eTang(epos5) - p7 = oe.oePoint(epos5) - oesphere = camvtk.Sphere(center=(p7.x,p7.y,p7.z), radius=0.02, color=green) - tangline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p5.x+p6.x,p5.y+p6.y,p5.z+p6.z)) - normline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p7.x,p7.y,p7.z), color=yellow) - - myscreen.addActor( tangline ) - myscreen.addActor( normline ) - myscreen.addActor( oesphere ) - - - myscreen.render() - time.sleep(0.5) - - if abs(current_error) < 1e-8: - endcondition=1 - if n>125: - endcondition=1 - - if not endcondition: - myscreen.removeActor(esphere) - myscreen.removeActor(tangline) - myscreen.removeActor(normline) - myscreen.removeActor(oesphere) - - - w2if.Modified() - #lwr.SetFileName("5_all.png") - """ - for i in xrange(0,10): - lwr.SetFileName("frames/oe_nrx"+ ('%05d%02d' % (n,i))+".png") - lwr.Write() - """ - n=n+1 - - print "rendering...", - #for cl,cc in zip(clpoints,ccpoints): - # myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=ccColor(cc) ) ) - # if cc.type != cam.CCType.NONE: # only render interesting cc-points - # myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z) , color=ccColor2(cc) ) ) - - - print "done." - - - - - myscreen.render() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName("5_all.png") - #lwr.Write() - - - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse3_tst.py opencamlib-11.10-1/scripts/offset-ellipse/oellipse3_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse3_tst.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offset-ellipse/oellipse3_tst.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,454 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math -import datetime - -red= (1,0,0) -green= (0,1,0) -blue= (0,0,1) -cyan= (0,1,1) -yellow= (1,1,0) -pink = ( float(255)/255,float(192)/255,float(203)/255) -grey = ( float(127)/255,float(127)/255,float(127)/255) -orange = ( float(255)/255,float(165)/255,float(0)/255) - -def ccColor2(cc): - """ this function returns a different color depending on the type of - the CC-point. Useful for visualizing CL or CC points """ - if cc.type==cam.CCType.FACET: - col = (1,0,1) - elif cc.type == cam.CCType.VERTEX: - col = (1,1,0) - elif cc.type == cam.CCType.EDGE: - col = (0,1,1) - elif cc.type == cam.CCType.NONE: - col = (1,1,1) - elif cc.type == cam.CCType.ERROR: - col = (0,0.5,1) - return col - -class OffsetEllipse(): - """ - // (s, t) where: s^2 + t^2 = 1 - // point of ellipse is: ecen + j s + n t - // tangent at point is: -j t + n s - // normal at point is: j (s / eccen) + n (t * eccen) - // point on offset-ellipse: point on ellipse + offrad*normal - """ - def __init__(self, ecen, a, b, ofs): - self.a = a - self.b = b - self.ecen = ecen - self.ofs = ofs - - def ePoint(self,epos): - # return a point on the ellipse - p = cam.Point() - p.x = self.ecen.x + self.a*epos.s - p.y = self.ecen.y + self.b*epos.t - return p - - def oePoint(self,epos): - # return point on offset-ellipse - p = self.ePoint(epos) - normal = self.eNorm(epos) - p.x = p.x + self.ofs*normal.x - p.y = p.y + self.ofs*normal.y - return p - - def eNorm(self, epos): - normal = cam.Point( self.b*epos.s, self.a*epos.t, 0) - normal.normalize() - return normal - - def eTang(self, epos): - p = cam.Point(-self.a*epos.t, self.b*epos.s, 0) - p.normalize() - return p - - def error(self,epos,cl): - p1 = self.oePoint(epos) - p2 = cl - dx = p1.x - cl.x - dy = p1.y - cl.y - #return dx*dx+dy*dy - return dy - - - -class EPos(): - """ - // (s, t) where: s^2 + t^2 = 1 - // point of ellipse is: ecen + j s + n t - // tangent at point is: -j t + n s - // normal at point is: j (s / eccen) + n (t * eccen) - // point on offset-ellipse: point on ellipse + offrad*normal - """ - def __init__(self): - self.t = 1 - self.s = 0 - self.sett(self.t,1) - - def sets(self, s, side): - if s > 1.0: - s = 1.0 - if s < -1.0: - s = -1.0 - - self.s = s - ssq = s*s - tsq = 1 - ssq - if side == 1: - self.t = 1 * math.sqrt(tsq) - else: - self.t = -1 * math.sqrt(tsq) - - def sett(self, t, side): - if t > 1.0: - t = 1.0 - if t < -1.0: - t = -1.0 - - self.t = t - tsq = t*t - ssq = 1 - tsq - if side == 1: - self.s = 1 * math.sqrt(ssq) - else: - self.s = -1* math.sqrt(ssq) - - def stepTang(self, ellipse, delta): - tang = oe.eTang(self) - #print " epos= (", self.s," , ", self.t , " )" - #print "steptang tang=", tang.str() - if abs(tang.x) > abs(tang.y): - #print "s-dir step" - news = self.s + delta*tang.x - if self.t > 0: - self.sets(news,1) - else: - self.sets(news,0) - else: - #print "t-dir step" - newt = self.t + delta*tang.y - if self.s>0: - self.sett( newt,1) - else: - self.sett( newt,0) - -def solver(oe, epos, cl): - endcondition = 0 - NRStep = 0.1 - n=0 - while not endcondition: - current_error = oe.error(epos, cl) - #print "current error=", current_error - epos_tmp = EPos() - epos_tmp.s = epos.s - epos_tmp.t = epos.t - # take a small step, to determine rerivative: - dt = 0.2*NRStep - epos_tmp.stepTang(oe,dt) - new_error = oe.error(epos_tmp, cl) - #print "new_error=", new_error - deriv = (new_error-current_error)/dt - #print "derivative = ", deriv - # take Newton rhapson step - NRStep = (-current_error/deriv) - #print " NRstep=", NRStep - #NRStep=0.05 # debug/demo - epos5.stepTang(oe, NRStep) - - # check endcondition - if abs(current_error) < 1e-8: - endcondition=1 - if n>125: - endcondition=1 - n=n+1 - return n - -if __name__ == "__main__": - myscreen = camvtk.VTKScreen() - - myscreen.camera.SetPosition(5, 3, 2) - myscreen.camera.SetFocalPoint(1.38,1, 0) - - a=cam.Point(3,2,-2) - b=cam.Point(-1,2,3) - - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); - #c=cam.Point(0,0,0.3) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - #t = cam.Triangle(a,b,c) - - cutter = cam.BullCutter(1,0.2) - - - print cutter.str() - - xar = camvtk.Arrow(color=red, rotXYZ=(0,0,0)) - #xar.SetFlat() - myscreen.addActor(xar) - yar = camvtk.Arrow(color=green, rotXYZ=(0,0,90)) - #yar.SetGouraud() - myscreen.addActor(yar) - zar = camvtk.Arrow(color=blue, rotXYZ=(0,-90,0)) - #zar.SetPhong() - myscreen.addActor(zar) - - cl = cam.Point(2.193, 1, 0) - radius1=1 - radius2=0.25 - - tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) - #tor.SetWireframe() - #myscreen.addActor(tor) - - cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), - rotXYZ=(90,0,0), resolution=50 ) - #myscreen.addActor(cyl) - - tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),color=(1,1,0)) - tube.SetOpacity(0.2) - #myscreen.addActor(tube) - - cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=yellow) - myscreen.addActor(cir) - - clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) - myscreen.addActor(clp) - - # short axis of ellipse = radius2 - # long axis of ellipse = radius2/sin(theta) - # where theta is the slope of the line - dx = b.x - a.x - dz = b.z - a.z - #print "dx=", dx - #print "dz=", dz - theta = math.atan(dz/dx) - #print "theta=",theta - a = abs( radius2/math.sin(theta) ) - #print "a=", a, " = ", a/radius2,"* radius2" - # ellipse - #a=2 - b=radius2 - #print "b= ", b - - - ecen_tmp=cam.Point(1.38,2,0) - resolution=50 - """ - for n in xrange(0,resolution): - angle1= (float(n)/float(resolution))*2*math.pi - angle2= (float(n+1)/float(resolution))*2*math.pi - x=ecen_tmp.x + a*math.cos(angle1) - y=ecen_tmp.y + b*math.sin(angle1) - x2=ecen_tmp.x + a*math.cos(angle2) - y2=ecen_tmp.y + b*math.sin(angle2) - - #myscreen.addActor(camvtk.Point(center=(x,y,0), color=(1,0,1))) - #myscreen.addActor( camvtk.Line(p1=(x,y,0),p2=(x2,y2,0)) ) - """ - - oe = OffsetEllipse(ecen_tmp, a, b, radius1) - oe2 = OffsetEllipse(ecen_tmp, a, b, 0.05) - - - nmax=20 - delta=0.05 - td = 1 - epos1 = EPos() - epos2 = EPos() - epos3 = EPos() - epos4 = EPos() - epos5 = EPos() - """ - for n in xrange(0,nmax): - s = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) - t = float(n)/float(nmax-1) * float(2)/math.sqrt(2) - float(1)/math.sqrt(2) - - epos1.sets(s,1) - epos2.sets(s,0) - epos3.sett(t,1) - epos4.sett(t,0) - - p1 = oe.ePoint(epos1) - p2 = oe.ePoint(epos2) - p3 = oe.ePoint(epos3) - p4 = oe.ePoint(epos4) - p5 = oe.ePoint(epos5) - - p1o = oe.oePoint(epos1) - p2o = oe.oePoint(epos2) - #print "s=", s, "t=", t," epoint=", p1.str() - myscreen.addActor(camvtk.Point(center=(p1.x,p1.y,0), color=green)) # green steps along s (side=1) - myscreen.addActor(camvtk.Point(center=(p2.x,p2.y,0), color=red)) # red steps along s (side=0) - myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) # orange steps along t (side=1) - myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) # pink steps along t (side=0) - - #myscreen.addActor(camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=red)) - #myscreen.addActor(camvtk.Point(center=(p1o.x,p1o.y,0), color=green)) - #myscreen.addActor(camvtk.Point(center=(p2o.x,p2o.y,0), color=red)) - - - tx = float(n)/float(nmax-1) * 2 - 1 - sx = oe.seval(tx, 1) - sx2 = oe.seval(tx, 0) - p3 = oe.ePoint(sx,tx) - p4 = oe.ePoint(sx2,tx) - #myscreen.addActor(camvtk.Point(center=(p3.x,p3.y,0), color=orange)) - #myscreen.addActor(camvtk.Point(center=(p4.x,p4.y,0), color=pink)) - - sd = oe.seval(td,1) - p5 = oe.ePoint(td,sd) - myscreen.addActor(camvtk.Point(center=(p5.x,p5.y,0), color=orange)) - - myscreen.render() - #time.sleep(0.05) - """ - - t = camvtk.Text() - t.SetPos( (myscreen.width-450, myscreen.height-30) ) - - myscreen.addActor( t) - t2 = camvtk.Text() - t2.SetPos( (50, myscreen.height-150) ) - - myscreen.addActor( t2) - - #epos5.sets(0.5,1) - Nsteps=62 - endcondition = 0 - n = 1 - NRStep=0.1 - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - - epos5.sets(0,1) - epos1.sets(0,1) - #while not endcondition: - convlist=[] - for n in xrange(0,Nsteps): - t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - #current_error = oe.error(epos5, cl) - epos5.s=epos1.s - epos5.t=epos1.t - #print "current error=", current_error - #epos_tmp = EPos() - #epos_tmp.s = epos5.s - #epos_tmp.t = epos5.t - # take a small step, to determine rerivative: - #dt = 0.2*NRStep - #epos_tmp.stepTang(oe,dt) - #new_error = oe.error(epos_tmp, cl) - #print "new_error=", new_error - #deriv = (new_error-current_error)/dt - #print "derivative = ", deriv - #paramtext = "(s, t) = (%3.3f, %3.3f)\n NR iteration # = %i \n error= %3.9f\n de=%3.3f" % (epos5.s, epos5.t, n, current_error,deriv) - #t2.SetText(paramtext) - # take Newton rhapson step - #NRStep = (-current_error/deriv) - #print " step=", NRStep - #NRStep=0.05 # debug/demo - #epos5.stepTang(oe, NRStep) - - - - - #p6 = oe.eTang(epos5) - #p7 = oe.oePoint(epos5) - #oesphere = camvtk.Sphere(center=(p7.x,p7.y,p7.z), radius=0.02, color=green) - #tangline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p5.x+p6.x,p5.y+p6.y,p5.z+p6.z)) - #normline = camvtk.Line(p1=(p5.x,p5.y,p5.z),p2=(p7.x,p7.y,p7.z), color=yellow) - - #myscreen.addActor( tangline ) - #myscreen.addActor( normline ) - #myscreen.addActor( oesphere ) - p5 = oe.ePoint(epos5) - pt = oe2.oePoint(epos5) - #print "before= ", epos5.s, " , ", epos5.t - nsteps = solver(oe, epos5, cl) - print nsteps - convlist.append(nsteps) - - convtext = "%i" % (nsteps) - print (pt.x, pt.y, pt.z) - #center=(pt.x, pt.y, pt.z) - tst = camvtk.Text3D( color=(1,1,1), center=(pt.x, pt.y, 0) , - text=convtext, scale=0.02) - #tst.SetCamera(myscreen.camera) - myscreen.addActor(tst) - - colmax=11 - colmin=4 - nsteps = nsteps - colmin - colmax = colmax - colmin - convcolor=( float(nsteps*nsteps)/(colmax), float((colmax-nsteps))/colmax, 0 ) - esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.02, color=convcolor) - myscreen.addActor(esphere) - - - - - #print "after= ", epos5.s, " , ", epos5.t - epos1.stepTang(oe, 0.1) - #print "after= ", epos5.s, " , ", epos5.t - - myscreen.render() - #time.sleep(0.1) - #raw_input("Press Enter to terminate") - #if abs(current_error) < 1e-8: - # endcondition=1 - #if n>125: - # endcondition=1 - - #if not endcondition: - # myscreen.removeActor(esphere) - # myscreen.removeActor(tangline) - # myscreen.removeActor(normline) - # myscreen.removeActor(oesphere) - - - w2if.Modified() - #lwr.SetFileName("5_all.png") - """ - for i in xrange(0,10): - lwr.SetFileName("frames/oe_nrx"+ ('%05d%02d' % (n,i))+".png") - lwr.Write() - """ - n=n+1 - print convlist - #print "rendering...", - #for cl,cc in zip(clpoints,ccpoints): - # myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=ccColor(cc) ) ) - # if cc.type != cam.CCType.NONE: # only render interesting cc-points - # myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z) , color=ccColor2(cc) ) ) - - - print "done." - - - - - myscreen.render() - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - w2if.Modified() - lwr.SetFileName("5_all.png") - #lwr.Write() - - - - myscreen.iren.Start() - #raw_input("Press Enter to terminate") - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse4_tst.py opencamlib-11.10-1/scripts/offset-ellipse/oellipse4_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse4_tst.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offset-ellipse/oellipse4_tst.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,235 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math -import datetime - -def drawellipse(myscreen, ellcenter, a_axis, b_axis): - resolution=50 - for n in xrange(0,resolution): - angle1= (float(n)/float(resolution))*2*math.pi - angle2= (float(n+1)/float(resolution))*2*math.pi - x=ellcenter.x + a_axis*math.cos(angle1) - y=ellcenter.y + b_axis*math.sin(angle1) - z=ellcenter.z - x2=ellcenter.x + a_axis*math.cos(angle2) - y2=ellcenter.y + b_axis*math.sin(angle2) - myscreen.addActor( camvtk.Line(p1=(x,y,z),p2=(x2,y2,z), color=camvtk.grey) ) - -def main(ycoord=0.970, filename="test"): - myscreen = camvtk.VTKScreen() - - myscreen.camera.SetPosition(2, 5, 5) - myscreen.camera.SetFocalPoint(1.38,1, 0) - - #ycoord = 1.1 - - a=cam.Point(3,ycoord,-2) - b=cam.Point(-1,ycoord,3) - - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); - #c=cam.Point(0,0,0.3) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - #t = cam.Triangle(a,b,c) - - cutter = cam.BullCutter(1,0.2,20) - - print cutter - xar = camvtk.Arrow(color=camvtk.red, rotXYZ=(0,0,0)) - myscreen.addActor(xar) - yar = camvtk.Arrow(color=camvtk.green, rotXYZ=(0,0,90)) - myscreen.addActor(yar) - zar = camvtk.Arrow(color=camvtk.blue, rotXYZ=(0,-90,0)) - myscreen.addActor(zar) - - cl = cam.Point(2.1748, 1, 0) - radius1=1 - radius2=0.25 - - tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl.x, cl.y, cl.z),rotXYZ=(0,0,0)) - #tor.SetWireframe() - #myscreen.addActor(tor) - - cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), - rotXYZ=(90,0,0), resolution=50 ) - #myscreen.addActor(cyl) - - cl_line = camvtk.Line( p1=(cl.x,cl.y,-100),p2=(cl.x,cl.y,+100), color=camvtk.red ) - myscreen.addActor(cl_line) - - tube = camvtk.Tube(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z),color=(1,1,0)) - tube.SetOpacity(0.2) - myscreen.addActor(tube) - - # cylindrical-cutter circle at z=0 plane - #cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=camvtk.yellow) - #myscreen.addActor(cir) - - #clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) - #myscreen.addActor(clp) - - # short axis of ellipse = radius2 - # long axis of ellipse = radius2/sin(theta) - # where theta is the slope of the line - dx = b.x - a.x - dz = b.z - a.z - #print "dx=", dx - #print "dz=", dz - theta = math.atan(dz/dx) ## dx==0 is special case!! (i.e. vertical lines) - print "theta=",theta - a_axis = abs( radius2/math.sin(theta) ) - print "a=", a_axis - # ellipse - #a=2 - b_axis=radius2 - print "b= ", b_axis - - - # slice the tube with a plane at z=0 and find the ellipse center - # line is from Point a to b: - # a + t*(b-a) - # find t so that z-component is zero: - # a.z + t( b.z -a.z) = 0 - # t= a.z / (b.z - a.z) - # so point - tparam = -a.z / (b.z - a.z) # NOTE horizontal lines are a special case!! - ellcenter = a + tparam*(b-a) - print "ellcenter (z=0?) =", ellcenter - # center of the - # ecen_tmp=cam.Point(ellcenter,a.y,0) - - #drawellipse(myscreen, ellcenter, a_axis, b_axis) - - - - oe = cam.Ellipse(ellcenter, a_axis, b_axis, radius1) - - #oe2 = cam.Ellipse(ellcenter, a_axis, b_axis, 0.05) # to locate text on the outside of the ellipse - - - nmax=20 - #delta=0.05 - #td = 1 - - - - t = camvtk.Text() - t.SetPos( (myscreen.width-450, myscreen.height-30) ) - - - myscreen.addActor( t) - t2 = camvtk.Text() - ytext = "Y: %3.3f" % (ycoord) - t2.SetText(ytext) - t2.SetPos( (50, myscreen.height-150) ) - myscreen.addActor( t2) - - - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - epos = cam.Epos() - epos.setS(0,1) - #epos1.setS(0,1) - - t.SetText("OpenCAMLib 10.03-beta, " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - - #p5 = oe.ePoint(epos5) - #pt = oe2.oePoint(epos5) - #print "before= ", epos5.s, " , ", epos5.t - nsteps = cam.Ellipse.solver(oe, cl) - epos = oe.epos1 - cce = oe.ePoint(epos) - cle = oe.oePoint(epos) - #epos2 = cam.Epos() - #epos.s = epos.s - #epos.t = epos.t - #print nsteps - print "solution1 at: ", epos.s , " , ", epos.t - #print "solution2 at: ", epos2.s , " , ", epos2.t - print " cl =", cl - print " cle=", cle - - xoffset = cl.x - cle.x - print "xoffset= ", xoffset - # we slide xoffset along the x-axis from ellcenter - # to find the correct z-plane - # line is: a + t*(b-a) - # find t so that x-component is ellcenter.x + xoffset - # a.x + t(b.x-a.x) = ellcenter.x + xoffset - # t= (ellcenter.x + xoffset - a.x) / (b.x - a.x) - tparam2 = (ellcenter.x + xoffset - a.x) / (b.x - a.x) - slide = tparam2*(b-a) - print "sliding z-delta: ", slide.z - elc2 = a + tparam2*(b-a) - print "ellcenter2=", elc2 - #convlist.append(nsteps) - fe = cam.Ellipse(elc2, a_axis, b_axis, radius1) - fecen = camvtk.Sphere(center=(elc2.x,elc2.y,elc2.z), radius=0.01, color=camvtk.pink) - myscreen.addActor(fecen) - fccp = fe.ePoint(epos) - fclp = fe.oePoint(epos) - print "solver cl=", fclp, " == ", cl, " ??" - - fcir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,elc2.z), color=camvtk.yellow) - myscreen.addActor(fcir) - - fccpoint = camvtk.Sphere(center=(fccp.x,fccp.y,fccp.z), radius=0.01, color=camvtk.green) - myscreen.addActor(fccpoint) - - fclpoint = camvtk.Sphere(center=(fclp.x,fclp.y,fclp.z), radius=0.01, color=camvtk.blue) - myscreen.addActor(fclpoint) - - # line from ellipse center to fcc - myscreen.addActor(camvtk.Line( p1=(elc2.x,elc2.y,elc2.z),p2=(fccp.x,fccp.y,fccp.z), color=camvtk.cyan )) - # the offset normal - myscreen.addActor(camvtk.Line( p1=(fclp.x,fclp.y,fclp.z),p2=(fccp.x,fccp.y,fccp.z), color=camvtk.yellow )) - - drawellipse(myscreen, elc2, a_axis, b_axis) - #convtext = "%i" % (nsteps) - #print (pt.x, pt.y, pt.z) - #center=(pt.x, pt.y, pt.z) - #tst = camvtk.Text3D( color=(1,1,1), center=(pt.x, pt.y, 0) , - #text=convtext, scale=0.02) - #tst.SetCamera(myscreen.camera) - #myscreen.addActor(tst) - - colmax=11 - colmin=4 - nsteps = nsteps - colmin - colmax = colmax - colmin - convcolor=( float(nsteps*nsteps)/(colmax), float((colmax-nsteps))/colmax, 0 ) - #esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.01, color=convcolor) - end_sphere = camvtk.Sphere(center=(cce.x,cce.y,0), radius=0.01, color=camvtk.green) - cl_sphere = camvtk.Sphere(center=(cle.x,cle.y,0), radius=0.01, color=camvtk.pink) - cl_sphere.SetOpacity(0.4) - - clcir= camvtk.Circle(radius=radius1, center=(cle.x,cle.y,cle.z), color=camvtk.pink) - myscreen.addActor(clcir) - - #myscreen.addActor(esphere) - myscreen.addActor(end_sphere) - myscreen.addActor(cl_sphere) - #myscreen.render() - - print "done." - myscreen.render() - lwr.SetFileName(filename) - #lwr.Write() - #raw_input("Press Enter to terminate") - #time.sleep(0.5) - myscreen.iren.Start() - - -if __name__ == "__main__": - main() - #myscreen.iren.Start() - #raw_input("Press Enter to terminate") - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse5_tst.py opencamlib-11.10-1/scripts/offset-ellipse/oellipse5_tst.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/offset-ellipse/oellipse5_tst.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/offset-ellipse/oellipse5_tst.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,290 +0,0 @@ -import ocl as cam -import camvtk -import time -import vtk -import math -import datetime - -def drawellipse(myscreen, ellcenter, a_axis, b_axis): - resolution=50 - for n in xrange(0,resolution): - angle1= (float(n)/float(resolution))*2*math.pi - angle2= (float(n+1)/float(resolution))*2*math.pi - x=ellcenter.x + a_axis*math.cos(angle1) - y=ellcenter.y + b_axis*math.sin(angle1) - z=ellcenter.z - x2=ellcenter.x + a_axis*math.cos(angle2) - y2=ellcenter.y + b_axis*math.sin(angle2) - myscreen.addActor( camvtk.Line(p1=(x,y,z),p2=(x2,y2,z), color=camvtk.grey) ) - -def calcEcenter(oe,a,b,cl,sln): - pos = cam.Epos() - if sln == 1: - pos = oe.epos1 - if sln == 2: - pos = oe.epos2 - - cce = oe.ePoint(pos) - cle = oe.oePoint(pos) - print "solution at: ", pos - print " cce=", cce - print " cle=", cle - - xoffset = cl.x - cle.x - print " xoffset= ", xoffset - # we slide xoffset along the x-axis from ellcenter - # to find the correct z-plane - # line is: a + t*(b-a) - # find t so that x-component is ellcenter.x + xoffset - # a.x + t(b.x-a.x) = ellcenter.x + xoffset - # t= (ellcenter.x + xoffset - a.x) / (b.x - a.x) - tparam = (oe.center.x + xoffset - a.x) / (b.x - a.x) - return a + tparam*(b-a) - - - -def main(ycoord=1.2, filename="test", theta=60, fi=45): - myscreen = camvtk.VTKScreen() - focal = cam.Point(2.17, 1, 0) - r = 14 - theta = (float(theta)/360)*2*math.pi - - - campos = cam.Point( r*math.sin(theta)*math.cos(fi), r*math.sin(theta)*math.sin(fi), r*math.cos(theta) ) - myscreen.camera.SetPosition(campos.x, campos.y, campos.z) - myscreen.camera.SetFocalPoint(focal.x,focal.y, focal.z) - - #ycoord = 1.1 - - # the two points that define the edge - a=cam.Point( 3 , ycoord , 2.999999) - b=cam.Point( -1, ycoord , 3) - - myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))); - myscreen.addActor(camvtk.Point(center=(b.x,b.y,b.z), color=(1,0,1))); - #c=cam.Point(0,0,0.3) - myscreen.addActor( camvtk.Line(p1=(a.x,a.y,a.z),p2=(b.x,b.y,b.z)) ) - #t = cam.Triangle(a,b,c) - - cutter = cam.BullCutter(1,0.2) - - print cutter - xar = camvtk.Arrow(color=camvtk.red, rotXYZ=(0,0,0)) - myscreen.addActor(xar) - yar = camvtk.Arrow(color=camvtk.green, rotXYZ=(0,0,90)) - myscreen.addActor(yar) - zar = camvtk.Arrow(color=camvtk.blue, rotXYZ=(0,-90,0)) - myscreen.addActor(zar) - - cl = cam.Point(2.1748, 1, 0) - radius1=1 - radius2=0.25 - - - #tor.SetWireframe() - #myscreen.addActor(tor) - - cyl = camvtk.Cylinder(center=(cl.x,cl.y,cl.z) , radius=radius1, height=2, color=(0,1,1), - rotXYZ=(90,0,0), resolution=50 ) - #myscreen.addActor(cyl) - - cl_line = camvtk.Line( p1=(cl.x,cl.y,-100),p2=(cl.x,cl.y,+100), color=camvtk.red ) - myscreen.addActor(cl_line) - - cl_tube = camvtk.Tube(p1=(cl.x,cl.y,-100),p2=(cl.x,cl.y,+100),radius=radius1, color=camvtk.green) - cl_tube.SetOpacity(0.1) - myscreen.addActor(cl_tube) - - a_inf = a + (-100*(b-a)) - b_inf = a + (+100*(b-a)) - - tube = camvtk.Tube(p1=(a_inf.x,a_inf.y,a_inf.z),p2=(b_inf.x,b_inf.y,b_inf.z),radius=0.05*radius2, color=camvtk.red) - tube.SetOpacity(0.3) - myscreen.addActor(tube) - - # cylindrical-cutter circle at z=0 plane - #cir= camvtk.Circle(radius=radius1, center=(cl.x,cl.y,cl.z), color=camvtk.yellow) - #myscreen.addActor(cir) - - #clp = camvtk.Point(center=(cl.x,cl.y,cl.z)) - #myscreen.addActor(clp) - - # short axis of ellipse = radius2 - # long axis of ellipse = radius2/sin(theta) - # where theta is the slope of the line - dx = b.x - a.x - dz = b.z - a.z - #print "dx=", dx - #print "dz=", dz - theta = math.atan(dz/dx) ## dx==0 is special case!! (i.e. vertical lines) - print "theta=",theta - a_axis = abs( radius2/math.sin(theta) ) - print "a=", a_axis - # ellipse - #a=2 - b_axis=radius2 - print "b= ", b_axis - - - # slice the tube with a plane at z=0 and find the ellipse center - # line is from Point a to b: - # a + t*(b-a) - # find t so that z-component is zero: - # a.z + t( b.z -a.z) = 0 - # t= a.z / (b.z - a.z) - # so point - tparam = -a.z / (b.z - a.z) # NOTE horizontal lines are a special case!! - ellcenter = a + tparam*(b-a) - print "ellcenter (z=0?) =", ellcenter - # center of the - # ecen_tmp=cam.Point(ellcenter,a.y,0) - - #drawellipse(myscreen, ellcenter, a_axis, b_axis) - - oe = cam.Ellipse(ellcenter, a_axis, b_axis, radius1) - - #oe2 = cam.Ellipse(ellcenter, a_axis, b_axis, 0.05) # to locate text on the outside of the ellipse - - - nmax=20 - #delta=0.05 - #td = 1 - - - - t = camvtk.Text() - t.SetPos( (myscreen.width-450, myscreen.height-30) ) - t.SetText("OpenCAMLib " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - myscreen.addActor( t) - - t2 = camvtk.Text() - ytext = "Y: %3.3f" % (ycoord) - t2.SetText(ytext) - t2.SetPos( (50, myscreen.height-150) ) - myscreen.addActor( t2) - - - - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - epos = cam.Epos() - epos.setS(0,1) - - - - #p5 = oe.ePoint(epos5) - #pt = oe2.oePoint(epos5) - #print "before= ", epos5.s, " , ", epos5.t - - # RUN THE SOLVER! - nsteps = cam.Ellipse.solver(oe, cl) - - print "solver done. back to python:" - print "1st (s,t) solution=", oe.epos1 - print "2st (s,t) solution=", oe.epos2 - - elc1 = calcEcenter(oe,a,b, cl,1) - elc2 = calcEcenter(oe,a,b, cl,2) - print "elc1=", elc1 - print "elc2=", elc2 - #exit() - - #elc2 = elc2 - #epos = oe.epos2 - - fe1 = cam.Ellipse(elc1, a_axis, b_axis, radius1) - fe2 = cam.Ellipse(elc2, a_axis, b_axis, radius1) - - # draw ellipse-centers - myscreen.addActor( camvtk.Sphere(center=(elc1.x,elc1.y,elc1.z), radius=0.01, color=camvtk.lgreen) ) - myscreen.addActor( camvtk.Sphere(center=(elc2.x,elc2.y,elc2.z), radius=0.01, color=camvtk.pink) ) - - # cc-points on the ellipse - ccp1 = fe1.ePoint(oe.epos1) - ccp2 = fe2.ePoint(oe.epos2) - myscreen.addActor( camvtk.Sphere(center=(ccp1.x,ccp1.y,ccp1.z), radius=0.01, color=camvtk.lgreen) ) - myscreen.addActor( camvtk.Sphere(center=(ccp2.x,ccp2.y,ccp2.z), radius=0.01, color=camvtk.pink) ) - - cl1 = fe1.oePoint(oe.epos1) - cl2 = fe2.oePoint(oe.epos2) - - # circles - myscreen.addActor( camvtk.Circle(radius=radius1, center=(cl1.x,cl1.y,cl1.z), color=camvtk.green) ) - myscreen.addActor( camvtk.Circle(radius=radius1, center=(cl2.x,cl2.y,cl2.z), color=camvtk.pink) ) - - # torus - tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl1.x, cl1.y, cl1.z),rotXYZ=(0,0,0), color=camvtk.green) - tor.SetOpacity(0.4) - myscreen.addActor( tor) - tor = camvtk.Toroid(r1=radius1, r2=radius2, center=(cl2.x, cl2.y, cl2.z),rotXYZ=(0,0,0), color=camvtk.pink) - tor.SetOpacity(0.4) - myscreen.addActor( tor) - - # line: ellipse-center to cc-point - myscreen.addActor(camvtk.Line( p1=(elc1.x,elc1.y,elc1.z),p2=(ccp1.x,ccp1.y,ccp1.z), color=camvtk.cyan )) - myscreen.addActor(camvtk.Line( p1=(elc2.x,elc2.y,elc2.z),p2=(ccp2.x,ccp2.y,ccp2.z), color=camvtk.cyan )) - - # line: cc-point to cl-point - myscreen.addActor(camvtk.Line( p1=(cl1.x,cl1.y,cl1.z),p2=(ccp1.x,ccp1.y,ccp1.z), color=camvtk.yellow )) - myscreen.addActor(camvtk.Line( p1=(cl2.x,cl2.y,cl2.z),p2=(ccp2.x,ccp2.y,ccp2.z), color=camvtk.yellow )) - - # true cl - #clt = cc1. - - #fclpoint = camvtk.Sphere(center=(fclp.x,fclp.y,fclp.z), radius=0.01, color=camvtk.blue) - #myscreen.addActor(fclpoint) - - # line from ellipse center to fcc - # the offset normal - #myscreen.addActor(camvtk.Line( p1=(fclp.x,fclp.y,fclp.z),p2=(fccp.x,fccp.y,fccp.z), color=camvtk.yellow )) - - drawellipse(myscreen, elc1, a_axis, b_axis) - drawellipse(myscreen, elc2, a_axis, b_axis) - - #convtext = "%i" % (nsteps) - #print (pt.x, pt.y, pt.z) - #center=(pt.x, pt.y, pt.z) - #tst = camvtk.Text3D( color=(1,1,1), center=(pt.x, pt.y, 0) , - #text=convtext, scale=0.02) - #tst.SetCamera(myscreen.camera) - #myscreen.addActor(tst) - - #colmax=11 - #colmin=4 - #nsteps = nsteps - colmin - #colmax = colmax - colmin - #convcolor=( float(nsteps*nsteps)/(colmax), float((colmax-nsteps))/colmax, 0 ) - #esphere = camvtk.Sphere(center=(p5.x,p5.y,0), radius=0.01, color=convcolor) - #cce = oe.ePoint(epos) - #cle = oe.oePoint(epos) - #end_sphere = camvtk.Sphere(center=(cce.x,cce.y,0), radius=0.01, color=camvtk.green) - #cl_sphere = camvtk.Sphere(center=(cle.x,cle.y,0), radius=0.01, color=camvtk.pink) - #cl_sphere.SetOpacity(0.4) - - #clcir= camvtk.Circle(radius=radius1, center=(cle.x,cle.y,cle.z), color=camvtk.pink) - #myscreen.addActor(clcir) - - #myscreen.addActor(esphere) - #myscreen.addActor(end_sphere) - #myscreen.addActor(cl_sphere) - #myscreen.render() - - print "done." - myscreen.render() - lwr.SetFileName(filename) - - #raw_input("Press Enter to terminate") - time.sleep(0.5) - #lwr.Write() - myscreen.iren.Start() - - -if __name__ == "__main__": - main() - #myscreen.iren.Start() - #raw_input("Press Enter to terminate") - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/old/cutsim_test_tux_1.py opencamlib-11.10-1/scripts/old/cutsim_test_tux_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/scripts/old/cutsim_test_tux_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/scripts/old/cutsim_test_tux_1.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,248 +0,0 @@ -import ocl -import pyocl -import camvtk -import time -import datetime -import vtk - - - -def main(filename="frame/f.png"): - print ocl.revision() - - myscreen = camvtk.VTKScreen() - myscreen.camera.SetPosition(-15, -8, 15) - myscreen.camera.SetFocalPoint(5,5, 0) - # axis arrows - camvtk.drawArrows(myscreen,center=(-1,-1,0)) - - - # screenshot writer - w2if = vtk.vtkWindowToImageFilter() - w2if.SetInput(myscreen.renWin) - lwr = vtk.vtkPNGWriter() - lwr.SetInput( w2if.GetOutput() ) - - - - c = ocl.CylCutter(1,4) # cutter - c.length = 3 - print "cutter length=", c.length - - # generate CL-points - stl = camvtk.STLSurf("../stl/gnu_tux_mod.stl") - polydata = stl.src.GetOutput() - s = ocl.STLSurf() - camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" - print s.getBounds() - #exit() - minx=0 - dx=0.1 - maxx=9 - miny=0 - dy=0.4 - maxy=12 - z=-17 - # this generates a list of CL-points in a grid - clpoints = pyocl.CLPointGridZigZag(minx,dx,maxx,miny,dy,maxy,z) - print "generated grid with", len(clpoints)," CL-points" - # batchdropcutter - bdc = ocl.BatchDropCutter() - bdc.setSTL(s) - bdc.setCutter(c) - for p in clpoints: - bdc.appendPoint(p) - t_before = time.time() - print "threads=",bdc.getThreads() - bdc.run() - t_after = time.time() - calctime = t_after-t_before - print " done in ", calctime," s" - clpoints = bdc.getCLPoints() - - # filter - print "filtering. before filter we have", len(clpoints),"cl-points" - t_before = time.time() - f = ocl.LineCLFilter() - f.setTolerance(0.001) - for p in clpoints: - f.addCLPoint(p) - f.run() - clpts = f.getCLPoints() - calctime = time.time()-t_before - print "after filtering we have", len(clpts),"cl-points" - print " done in ", calctime," s" - - #exit() - - # stupid init code - ocode=ocl.Ocode() - tree_maxdepth=10 - ocode.set_depth(tree_maxdepth) # depth and scale set here. - ocode.set_scale(10) - - # cube - stockvol = ocl.BoxOCTVolume() - stockvol.corner = ocl.Point(0,0,-0.5) - stockvol.v1 = ocl.Point(9,0,0) - stockvol.v2 = ocl.Point(0,12,0) - stockvol.v3 = ocl.Point(0,0,3.5) - stockvol.calcBB() - - t_before = time.time() - stock = ocl.LinOCT() - stock.init(0) - stock.build( stockvol ) - calctime = time.time()-t_before - print " stock built in ", calctime," s, stock.size()=",stock.size() - - # draw initial octree - #tlist = pyocl.octree2trilist(stock) - #surf = camvtk.STLSurf(triangleList=tlist) - #myscreen.addActor(surf) - - # draw initial cutter - #startp = ocl.Point(0,0,0) - #cyl = camvtk.Cylinder(center=(startp.x,startp.y,startp.z), radius=c.radius, - # height=c.length, - # rotXYZ=(90,0,0), color=camvtk.grey) - #cyl.SetWireframe() - #myscreen.addActor(cyl) - - timetext = camvtk.Text() - timetext.SetPos( (myscreen.width-300, myscreen.height-30) ) - myscreen.addActor( timetext) - - ocltext = camvtk.Text() - ocltext.SetPos( (myscreen.width-300, myscreen.height-60) ) - myscreen.addActor( ocltext) - ocltext.SetText("OpenCAMLib") - - octtext = camvtk.Text() - octtext.SetPos( (myscreen.width-300, myscreen.height-90) ) - myscreen.addActor( octtext) - octtext.SetText("Octree cutting-simulation") - - infotext = camvtk.Text() - infotext.SetPos( (myscreen.width-300, myscreen.height-180) ) - myscreen.addActor( infotext) - - - Nmoves = len(clpts) - print Nmoves,"CL-points to process" - for n in xrange(0,Nmoves-1): - timetext.SetText(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - - #if n. + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -62,6 +64,8 @@ AdaptiveWaterline::~AdaptiveWaterline() { std::cout << "~AdaptiveWaterline(): subOp.size()= " << subOp.size() <<"\n"; + delete subOp[1]; + delete subOp[0]; subOp.clear(); } diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/adaptivewaterline.hpp opencamlib-11.10-1/src/algo/adaptivewaterline.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/adaptivewaterline.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/adaptivewaterline.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef ADAPTIVEWATERLINE_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/adaptivewaterline_py.hpp opencamlib-11.10-1/src/algo/adaptivewaterline_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/adaptivewaterline_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/adaptivewaterline_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef ADAPTIVEWATERLINE_PY_H -#define ADAPTIVEWATERLINE_PY_H - -#include "adaptivewaterline.hpp" -#include "fiber_py.hpp" - -namespace ocl -{ - -/// \brief python wrapper for AdaptiveWaterline -class AdaptiveWaterline_py : public AdaptiveWaterline { - public: - AdaptiveWaterline_py() : AdaptiveWaterline() {} - ~AdaptiveWaterline_py() { - std::cout << "~AdaptiveWaterline_py()\n"; - } - - /// return loop as a list of lists to python - boost::python::list py_getLoops() const { - boost::python::list loop_list; - BOOST_FOREACH( std::vector loop, this->loops ) { - boost::python::list point_list; - BOOST_FOREACH( Point p, loop ) { - point_list.append( p ); - } - loop_list.append(point_list); - } - return loop_list; - } - /// return a list of xfibers to python - boost::python::list getXFibers() const { - boost::python::list flist; - BOOST_FOREACH( Fiber f, xfibers ) { - if (!f.empty()) { - Fiber_py f2(f); - flist.append(f2); - } - } - return flist; - } - /// return a list of yfibers to python - boost::python::list getYFibers() const { - boost::python::list flist; - BOOST_FOREACH( Fiber f, yfibers ) { - if (!f.empty()){ - Fiber_py f2(f); - flist.append(f2); - } - } - return flist; - } -}; - -} // end namespace - -#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/batchpushcutter.cpp opencamlib-11.10-1/src/algo/batchpushcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/batchpushcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/batchpushcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -53,19 +55,19 @@ void BatchPushCutter::setSTL(const STLSurf &s) { surf = &s; - std::cout << "BPC::setSTL() Building kd-tree... bucketSize=" << bucketSize << ".."; + // std::cout << "BPC::setSTL() Building kd-tree... bucketSize=" << bucketSize << ".."; root->setBucketSize( bucketSize ); if (x_direction) root->setYZDimensions(); // we search for triangles in the XY plane, don't care about Z-coordinate else if (y_direction) root->setXZDimensions(); else { - std::cout << " ERROR: setXDirection() or setYDirection() must be called before setSTL() \n"; + std::cerr << "ERROR: setXDirection() or setYDirection() must be called before setSTL() \n"; assert(0); } - std::cout << "BPC::setSTL() root->build()..."; + // std::cout << "BPC::setSTL() root->build()..."; root->build(s.tris); - std::cout << "done.\n"; + // std::cout << "done.\n"; } void BatchPushCutter::appendFiber(Fiber& f) { @@ -79,8 +81,8 @@ /// very simple batch push-cutter /// each fiber is tested against all triangles of surface void BatchPushCutter::pushCutter1() { - std::cout << "BatchPushCutter1 with " << fibers->size() << - " fibers and " << surf->tris.size() << " triangles..." << std::endl; + // std::cout << "BatchPushCutter1 with " << fibers->size() << + // " fibers and " << surf->tris.size() << " triangles..." << std::endl; nCalls = 0; boost::progress_display show_progress( fibers->size() ); BOOST_FOREACH(Fiber& f, *fibers) { @@ -92,15 +94,15 @@ } ++show_progress; } - std::cout << "BatchPushCutter done." << std::endl; + // std::cout << "BatchPushCutter done." << std::endl; return; } /// push-cutter which uses KDNode2 kd-tree search to find triangles /// overlapping with the cutter. void BatchPushCutter::pushCutter2() { - std::cout << "BatchPushCutter2 with " << fibers->size() << - " fibers and " << surf->tris.size() << " triangles..." << std::endl; + // std::cout << "BatchPushCutter2 with " << fibers->size() << + // " fibers and " << surf->tris.size() << " triangles..." << std::endl; nCalls = 0; std::list* overlap_triangles; boost::progress_display show_progress( fibers->size() ); @@ -130,31 +132,33 @@ delete( overlap_triangles ); ++show_progress; } - std::cout << "BatchPushCutter2 done." << std::endl; + // std::cout << "BatchPushCutter2 done." << std::endl; return; } /// use kd-tree search to find overlapping triangles /// use OpenMP for multi-threading void BatchPushCutter::pushCutter3() { - std::cout << "BatchPushCutter3 with " << fibers->size() << - " fibers and " << surf->tris.size() << " triangles." << std::endl; - std::cout << " cutter = " << cutter->str() << "\n"; + // std::cout << "BatchPushCutter3 with " << fibers->size() << + // " fibers and " << surf->tris.size() << " triangles." << std::endl; + // std::cout << " cutter = " << cutter->str() << "\n"; nCalls = 0; boost::progress_display show_progress( fibers->size() ); #ifdef _OPENMP + std::cout << "OpenMP is enabled"; omp_set_num_threads(nthreads); //omp_set_nested(1); #endif - unsigned int Nmax = fibers->size(); // the number of fibers to process std::list::iterator it,it_end; // for looping over found triabgles Interval* i; std::list* tris; std::vector& fiberr = *fibers; #ifdef _WIN32 // OpenMP version 2 of VS2013 OpenMP need signed loop variable int n; // loop variable + int Nmax = fibers->size(); // the number of fibers to process #else unsigned int n; // loop variable + unsigned int Nmax = fibers->size(); // the number of fibers to process #endif unsigned int calls=0; @@ -194,7 +198,7 @@ } // OpenMP parallel region ends here this->nCalls = calls; - std::cout << "\nBatchPushCutter3 done." << std::endl; + // std::cout << "\nBatchPushCutter3 done." << std::endl; return; } diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/batchpushcutter.hpp opencamlib-11.10-1/src/algo/batchpushcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/batchpushcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/batchpushcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef BPC_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/batchpushcutter_py.hpp opencamlib-11.10-1/src/algo/batchpushcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/batchpushcutter_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/batchpushcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef BPC_PY_H -#define BPC_PY_H - -#include - -#include "batchpushcutter.hpp" - -#include "fiber_py.hpp" - -namespace ocl -{ -/// \brief python wrapper for batchpushcutter -class BatchPushCutter_py : public BatchPushCutter { - public: - BatchPushCutter_py() : BatchPushCutter() {} - /// return CL-points to Python - boost::python::list getCLPoints() const { - boost::python::list plist; - BOOST_FOREACH(Fiber f, *fibers) { - BOOST_FOREACH( Interval i, f.ints ) { - if ( !i.empty() ) { - Point tmp = f.point(i.lower); - CLPoint p1 = CLPoint( tmp.x, tmp.y, tmp.z ); - p1.cc = new CCPoint(i.lower_cc); - tmp = f.point(i.upper); - CLPoint p2 = CLPoint( tmp.x, tmp.y, tmp.z ); - p2.cc = new CCPoint(i.upper_cc); - plist.append(p1); - plist.append(p2); - } - } - - } - return plist; - }; - /// return triangles under cutter to Python. Not for CAM-algorithms, - /// more for visualization and demonstration. - boost::python::list getOverlapTriangles(Fiber& f) { - boost::python::list trilist; - std::list *overlap_triangles = new std::list(); - //int plane = 3; // XY-plane - //Bbox bb; //FIXME - //KDNode2::search_kdtree( overlap_triangles, bb, root, plane); - CLPoint cl; - if (x_direction) { - cl.x = 0; - cl.y = f.p1.y; - cl.z = f.p1.z; - } else if (y_direction) { - cl.x = f.p1.x; - cl.y = 0; - cl.z = f.p1.z; - } else { - assert(0); - } - overlap_triangles = root->search_cutter_overlap(cutter, &cl); - - BOOST_FOREACH(Triangle t, *overlap_triangles) { - trilist.append(t); - } - delete overlap_triangles; - return trilist; - }; - /// return list of Fibers to python - boost::python::list getFibers_py() const { - boost::python::list flist; - BOOST_FOREACH(Fiber f, *fibers) { - flist.append( Fiber_py(f) ); - } - return flist; - }; - -}; - -} // end namespace - -#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/clsurface.hpp opencamlib-11.10-1/src/algo/clsurface.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/clsurface.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/clsurface.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef CLSURFACE_H #define CLSURFACE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiber.cpp opencamlib-11.10-1/src/algo/fiber.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiber.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/fiber.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiber.hpp opencamlib-11.10-1/src/algo/fiber.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiber.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/fiber.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef FIBER_HPP #define FIBER_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiberpushcutter.cpp opencamlib-11.10-1/src/algo/fiberpushcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiberpushcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/fiberpushcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ -/* $Id: $ +/* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiberpushcutter.hpp opencamlib-11.10-1/src/algo/fiberpushcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiberpushcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/fiberpushcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ -/* $Id: $ +/* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef FIBERPUSHCUTTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiber_py.hpp opencamlib-11.10-1/src/algo/fiber_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/fiber_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/fiber_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ -#ifndef FIBER_PY_H -#define FIBER_PY_H - -#include -#include - -#include "fiber.hpp" - -namespace ocl -{ - -/// python wrapper for Fiber -class Fiber_py : public Fiber { - public: - Fiber_py() : Fiber () {}; - /// construct p1-p2 fiber - Fiber_py(const Point &p1, const Point &p2) : Fiber(p1, p2) {}; - /// copy constructor - Fiber_py(const Fiber& f) : Fiber(f) {}; - /// return a list of intervals to python - boost::python::list getInts() const { - boost::python::list l; - BOOST_FOREACH( Interval i, ints) { - l.append( i ); - } - return l; - }; -}; - -} // end namespace -#endif -// end file fiber_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/interval.cpp opencamlib-11.10-1/src/algo/interval.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/interval.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/interval.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/interval.hpp opencamlib-11.10-1/src/algo/interval.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/interval.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/interval.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef INTERVAL_HPP #define INTERVAL_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/operation.hpp opencamlib-11.10-1/src/algo/operation.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/operation.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/operation.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef OP_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/simple_weave.cpp opencamlib-11.10-1/src/algo/simple_weave.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/simple_weave.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/simple_weave.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -60,7 +62,7 @@ // if this connects points that are already connected, then remove old edge and // provide this "via" connection //int n_xfiber=0; - std::cout << " SimpleWeave::build()... \n"; + // std::cout << " SimpleWeave::build()... \n"; BOOST_FOREACH( Fiber& xf, xfibers) { assert( !xf.empty() ); // no empty fibers please BOOST_FOREACH( Interval& xi, xf.ints ) { @@ -177,9 +179,9 @@ Edge ye_lu_next, ye_lu_prev ; Edge ye_ul_next, ye_ul_prev ; Edge ye_lu, ye_ul; - - bool y_lu_edge = g.has_edge(y_l,y_u); // flag indicating existing y_l - y_u edge - // the case where y_l and y_u are alread already connected. + + bool y_lu_edge = g.has_edge(y_l,y_u); // flag indicating existing y_l - y_u edge + // the case where y_l and y_u are already connected. if ( y_lu_edge ) { assert( g.has_edge( y_u, y_l ) ); // twin must also exist diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/simple_weave.hpp opencamlib-11.10-1/src/algo/simple_weave.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/simple_weave.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/simple_weave.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef SIMPLE_WEAVE_HPP #define SIMPLE_WEAVE_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/smart_weave.cpp opencamlib-11.10-1/src/algo/smart_weave.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/smart_weave.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/smart_weave.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/smart_weave.hpp opencamlib-11.10-1/src/algo/smart_weave.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/smart_weave.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/smart_weave.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef SMART_WEAVE_HPP #define SMART_WEAVE_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/tsp.hpp opencamlib-11.10-1/src/algo/tsp.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/tsp.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/tsp.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #ifndef TSP_H #define TSP_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/waterline.cpp opencamlib-11.10-1/src/algo/waterline.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/waterline.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/waterline.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -53,7 +55,9 @@ } Waterline::~Waterline() { - std::cout << "~Waterline(): subOp.size()= " << subOp.size() <<"\n"; + // std::cout << "~Waterline(): subOp.size()= " << subOp.size() <<"\n"; + delete subOp[1]; + delete subOp[0]; subOp.clear(); } @@ -91,7 +95,7 @@ } void Waterline::weave_process() { - std::cout << "Weave...\n" << std::flush; + // std::cout << "Weave...\n" << std::flush; weave::SimpleWeave weave; BOOST_FOREACH( Fiber f, xfibers ) { weave.addFiber(f); @@ -102,19 +106,19 @@ //std::cout << "Weave::build()..." << std::flush; weave.build(); - std::cout << "done.\n"; + // std::cout << "done.\n"; - std::cout << "Weave::face traverse()..."; + // std::cout << "Weave::face traverse()..."; weave.face_traverse(); - std::cout << "done.\n"; + // std::cout << "done.\n"; - std::cout << "Weave::get_loops()..."; + // std::cout << "Weave::get_loops()..."; loops = weave.getLoops(); - std::cout << "done.\n"; + // std::cout << "done.\n"; } void Waterline::weave_process2() { - std::cout << "Weave...\n" << std::flush; + // std::cout << "Weave...\n" << std::flush; weave::SmartWeave weave; BOOST_FOREACH( Fiber f, xfibers ) { weave.addFiber(f); @@ -125,19 +129,19 @@ //std::cout << "Weave::build2()..." << std::flush; weave.build(); - std::cout << "done.\n"; + // std::cout << "done.\n"; - std::cout << "Weave::face traverse()..."; + // std::cout << "Weave::face traverse()..."; weave.face_traverse(); - std::cout << "done.\n"; + // std::cout << "done.\n"; - std::cout << "Weave::get_loops()..."; + // std::cout << "Weave::get_loops()..."; loops = weave.getLoops(); - std::cout << "done.\n"; + // std::cout << "done.\n"; } void Waterline::init_fibers() { - std::cout << " Waterline::init_fibers()\n"; + // std::cout << " Waterline::init_fibers()\n"; double minx = surf->bb.minpt.x - 2*cutter->getRadius(); double maxx = surf->bb.maxpt.x + 2*cutter->getRadius(); double miny = surf->bb.minpt.y - 2*cutter->getRadius(); @@ -158,7 +162,6 @@ Fiber f = Fiber( p1 , p2 ); subOp[1]->appendFiber( f ); } - } // return a double-vector [ start , ... , end ] with N elements diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/waterline.hpp opencamlib-11.10-1/src/algo/waterline.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/waterline.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/waterline.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef WATERLINE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/waterline_py.hpp opencamlib-11.10-1/src/algo/waterline_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/waterline_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/waterline_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef WATERLINE_PY_H -#define WATERLINE_PY_H - -#include -#include - -#include "waterline.hpp" - -namespace ocl -{ - -/// Python wrapper for Waterline -class Waterline_py : public Waterline { - public: - Waterline_py() : Waterline() {} - ~Waterline_py() { - std::cout << "~Waterline_py()\n"; - } - /// return loop as a list of lists to python - boost::python::list py_getLoops() const { - boost::python::list loop_list; - BOOST_FOREACH( std::vector loop, this->loops ) { - boost::python::list point_list; - BOOST_FOREACH( Point p, loop ) { - point_list.append( p ); - } - loop_list.append(point_list); - } - return loop_list; - } - /// return a list of yfibers to python - boost::python::list py_getXFibers() const { - boost::python::list flist; - std::vector xfibers = *( subOp[0]->getFibers() ); - BOOST_FOREACH( Fiber f, xfibers ) { - Fiber_py f2(f); - flist.append(f2); - } - return flist; - } - /// return a list of yfibers to python - boost::python::list py_getYFibers() const { - boost::python::list flist; - std::vector yfibers = *( subOp[1]->getFibers() ); - BOOST_FOREACH( Fiber f, yfibers ) { - Fiber_py f2(f); - flist.append(f2); - } - return flist; - } - -}; - -} // end namespace - -#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave.cpp opencamlib-11.10-1/src/algo/weave.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/weave.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -45,7 +47,7 @@ // traverse the graph putting loops of vertices into the loops variable // this figure illustrates next-pointers: http://www.anderswallin.net/wp-content/uploads/2011/05/weave2_zoom.png void Weave::face_traverse() { - std::cout << " traversing graph with " << clVertexSet.size() << " cl-points\n"; + // std::cout << " traversing graph with " << clVertexSet.size() << " cl-points\n"; while ( !clVertexSet.empty() ) { // while unprocessed cl-vertices remain std::vector loop; // start on a new loop Vertex current = *(clVertexSet.begin()); diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave.hpp opencamlib-11.10-1/src/algo/weave.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/weave.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef WEAVE_HPP #define WEAVE_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave_py.hpp opencamlib-11.10-1/src/algo/weave_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/weave_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ -#ifndef WEAVE_PY_H -#define WEAVE_PY_H - -#include "weave.hpp" - -namespace ocl -{ - -namespace weave { - -/// \brief python wrapper for VoronoiDiagram -/// -class Weave_py : public Weave { - public: - Weave_py() : Weave() {}; - - int numVertices() const { - return g.num_vertices(); - }; - boost::python::list getVertices(VertexType t) { - boost::python::list plist; - BOOST_FOREACH( Vertex v, g.vertices() ) { - if ( g[v].type == t ) - plist.append( g[v].position ); - } - return plist; - }; - - /// return CL-points to python - boost::python::list getCLVertices() { - return getVertices( CL ); - }; - /// return internal points to python - boost::python::list getINTVertices() { - return getVertices( INT ); - }; - /// return edges to python - /// format is [ [p1,p2] , [p3,p4] , ... ] - boost::python::list getEdges() { - boost::python::list edge_list; - BOOST_FOREACH(Edge e, g.edges() ) { - boost::python::list point_list; // the endpoints of each edge - Vertex v1 = g.source( e ); - Vertex v2 = g.target( e ); - point_list.append(g[v1].position); - point_list.append(g[v2].position); - edge_list.append(point_list); - } - return edge_list; - }; - /// return loops to python - boost::python::list py_getLoops() { - boost::python::list loop_list; - BOOST_FOREACH( std::vector loop, loops ) { - boost::python::list point_list; - BOOST_FOREACH( Vertex v, loop ) { - point_list.append( g[v].position ); - } - loop_list.append(point_list); - } - return loop_list; - }; - -}; - -} // end weave namespace - -} // end ocl namespace -#endif -// end weave_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave_typedef.hpp opencamlib-11.10-1/src/algo/weave_typedef.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/weave_typedef.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/weave_typedef.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef WEAVE_TYPEDEF_H #define WEAVE_TYPEDEF_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/zigzag.hpp opencamlib-11.10-1/src/algo/zigzag.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/algo/zigzag.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/algo/zigzag.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef ZIGZAG_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ball_cutter_tst_1.py opencamlib-11.10-1/src/attic/ball_cutter_tst_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ball_cutter_tst_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ball_cutter_tst_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -21,16 +21,16 @@ #cutter = ocl.CylCutter(0.5) #cutter = ocl.BallCutter(1.5) - print ocl.revision() - print cutter + print(ocl.revision()) + print(cutter) - print "rendering...", + print("rendering...",) # insert code here to actually do something... - print "done." + print("done.") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/bug20100329.py opencamlib-11.10-1/src/attic/bug20100329.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/bug20100329.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/bug20100329.py 2020-06-14 12:13:19.000000000 +0000 @@ -31,7 +31,7 @@ plist=[] zbase=-5 - #for n in xrange(0,3): + #for n in range(0,3): # plist.append( ocl.Point(1 + 0.01*n, 1.4, zbase) ) plist.append( ocl.Point(1.02, 1.4, zbase) ) @@ -54,12 +54,12 @@ myscreen.addActor( camvtk.Sphere(center=(cc.x,cc.y,cc.z) , radius=0.1, color=(0.2,0.3,0.4) ) ) myscreen.render() if p.z > 10: - print "cl-point is ", p.str() - print "cc-point is ", cc.str() - print "t=", t.str() + print("cl-point is ", p.str()) + print("cc-point is ", cc.str()) + print("t=", t.str()) tripoints = t.getPoints() #for pt in tripoints: - # print pt.x, " , ", pt.y, " , ", pt.z + # print(pt.x, " , ", pt.y, " , ", pt.z) break myscreen.removeActor(stl2) #time.sleep(0.01) @@ -67,12 +67,12 @@ #cutter.dropCutterSTL(p, cc, s) clpoints.append(p) ccpoints.append(cc) - print "drop-cutter done" + print("drop-cutter done") for (cl,cc) in zip(clpoints,ccpoints): myscreen.addActor( camvtk.Point(center=(cl.x,cl.y,cl.z) , color=camvtk.ccColor(cc) ) ) #myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z) , color=camvtk.yellow ) ) - print "adding point", cl.str() + print("adding point", cl.str()) trilist = pf.getTrianglesUnderCutter(p, cutter) stl2 = camvtk.STLSurf(filename=None, triangleList=trilist, color=camvtk.red ) stl2.SetSurface() @@ -85,7 +85,7 @@ #p = plist[2] #for t in s.tris: - # print t.str() + # print(t.str()) #cutter.vertexDrop(p) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_06.py opencamlib-11.10-1/src/attic/cutsim/cutsim_06.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_06.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim/cutsim_06.py 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ import math def main(): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(-15, -8, 15) myscreen.camera.SetFocalPoint(0,0, 0) @@ -51,30 +51,30 @@ mc = ocl.MarchingCubes() tris=[] while (n<=nmax): - print "diff...", + print("diff...",) t_before = time.time() t.diff_negative(s) t_after = time.time() build_time = t_after-t_before - print "done in ", build_time," s" + print("done in ", build_time," s") infotext= "Octree + Marching-Cubes test\nmax octree-depth:%i \ntriangles: %i \nbuild() time: %f ms" % (max_depth, len(tris), build_time*1e3 ) octtext.SetText(infotext) if n==nmax: t_before = time.time() - print "mc()...", + print("mc()...",) tris = mc.mc_tree(t) #.mc_triangles() t_after = time.time() mc_time = t_after-t_before - print "done in ", mc_time," s" - print " mc() got ", len(tris), " triangles" + print("done in ", mc_time," s") + print(" mc() got ", len(tris), " triangles") mc_surf = camvtk.STLSurf( triangleList=tris, color=camvtk.red ) mc_surf.SetWireframe() mc_surf.SetColor(camvtk.cyan) - print " STLSurf()...", + print(" STLSurf()...",) myscreen.addActor( mc_surf ) - print "done." + print("done.") #nodes = t.get_leaf_nodes() #allpoints=[] #for no in nodes: @@ -85,10 +85,10 @@ #print " PointCloud()...", #myscreen.addActor( oct_points ) #print "done." - print " render()...", + print(" render()...",) myscreen.render() - print "done." + print("done.") #lwr.SetFileName("frames/mc8_frame"+ ('%06d' % n)+".png") #myscreen.camera.Azimuth( 2 ) @@ -109,9 +109,9 @@ # move forward theta = n*dtheta s.center = ocl.Point( 1.5*math.cos(theta),0.3*math.sin(theta),0.01*theta) - print "center moved to", s.center + print("center moved to", s.center) n=n+1 - print "All done." + print("All done.") myscreen.iren.Start() if __name__ == "__main__": diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_07_circle.py opencamlib-11.10-1/src/attic/cutsim/cutsim_07_circle.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_07_circle.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim/cutsim_07_circle.py 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ import math def main(): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(-15, -8, 15) myscreen.camera.SetFocalPoint(0,0, 0) @@ -38,27 +38,27 @@ s.center = ocl.Point( 1.3*math.cos(theta),1.3*math.sin(theta),thetalift*theta) mc = ocl.MarchingCubes() while (n<=nmax): - print "diff...", + print("diff...",) t_before = time.time() t.diff_negative(s) t_after = time.time() build_time = t_after-t_before - print "done in ", build_time," s" + print("done in ", build_time," s") if n==nmax: t_before = time.time() - print "mc()...", + print("mc()...",) tris = mc.mc_tree(t) #.mc_triangles() t_after = time.time() mc_time = t_after-t_before - print "done in ", mc_time," s" - print " mc() got ", len(tris), " triangles" + print("done in ", mc_time," s") + print(" mc() got ", len(tris), " triangles") mc_surf = camvtk.STLSurf( triangleList=tris, color=camvtk.red ) #mc_surf.SetWireframe() mc_surf.SetColor(camvtk.cyan) - print " STLSurf()...", + print(" STLSurf()...",) myscreen.addActor( mc_surf ) - print "done." + print("done.") nodes = t.get_leaf_nodes() allpoints=[] #for no in nodes: @@ -66,13 +66,13 @@ # for v in verts: # allpoints.append(v) #oct_points = camvtk.PointCloud( allpoints ) - print " PointCloud()...", + print(" PointCloud()...",) #myscreen.addActor( oct_points ) - print "done." - print " render()...", + print("done.") + print(" render()...",) myscreen.render() - print "done." + print("done.") #lwr.SetFileName("frames/mc8_frame"+ ('%06d' % n)+".png") #myscreen.camera.Azimuth( 2 ) @@ -95,12 +95,12 @@ sp1 = ocl.Point(s.center) s.center = ocl.Point( 1.3*math.cos(theta),1.3*math.sin(theta),thetalift*theta) sp2 = ocl.Point(s.center) - print "line from ",sp1," to ",sp2 + print("line from ",sp1," to ",sp2) if n is not nmax: myscreen.addActor( camvtk.Line( p1=(sp1.x,sp1.y,sp1.z),p2=(sp2.x,sp2.y,sp2.z), color=camvtk.red ) ) - print "center moved to", s.center + print("center moved to", s.center) n=n+1 - print "All done." + print("All done.") myscreen.iren.Start() if __name__ == "__main__": diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_08_tux.py opencamlib-11.10-1/src/attic/cutsim/cutsim_08_tux.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_08_tux.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim/cutsim_08_tux.py 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ import math def main(): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(-8, -4, 25) myscreen.camera.SetFocalPoint(4.5,6, 0) @@ -32,7 +32,7 @@ polydata = stl.src.GetOutput() s = ocl.STLSurf() camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" + print("STL surface read,", s.size(), "triangles") #angle = math.pi/4 radius = 0.4 @@ -64,12 +64,12 @@ t_after = time.time() calctime = t_after-t_before - print " BDC4 done in ", calctime," s" + print(" BDC4 done in ", calctime," s") dropcutter_time = calctime clpoints = bdc.getCLPoints() #camvtk.drawCLPointCloud(myscreen, clpoints) - print " clpts= ", len(clpoints) + print(" clpts= ", len(clpoints)) myscreen.render() #myscreen.iren.Start() #exit() @@ -111,14 +111,14 @@ mc = ocl.MarchingCubes() - print "stock mc()...", + print("stock mc()...",) tris = mc.mc_tree(t) # t.mc_triangles() - print " mc() got ", len(tris), " triangles" + print(" mc() got ", len(tris), " triangles") mc_surf = camvtk.STLSurf( triangleList=tris, color=camvtk.red ) mc_surf.SetColor(camvtk.cyan) - print "stock STLSurf()...", + print("stock STLSurf()...",) myscreen.addActor( mc_surf ) - print "done." + print("done.") myscreen.render() #myscreen.iren.Start() @@ -130,7 +130,7 @@ cl = ocl.Point( clpoints[n].x, clpoints[n].y, clpoints[n].z ) s.setPos( cl ) #myscreen.addActor( camvtk.Point( center=(cl.x,cl.y,cl.z), color=camvtk.yellow)) - print n,": diff...", + print(n,": diff...",) t_before = time.time() t.diff_negative(s) t_after = time.time() @@ -146,29 +146,29 @@ cltext.SetText(postext) cactors = camvtk.drawBallCutter(myscreen, cutter, cl) - print cactors + print(cactors) t_before = time.time() - print "mc()...", + print("mc()...",) tris = mc.mc_tree(t) #.mc_triangles() t_after = time.time() mc_time = t_after-t_before - print "done in ", mc_time," s" - print " mc() got ", len(tris), " triangles" + print("done in ", mc_time," s") + print(" mc() got ", len(tris), " triangles") mc_surf = camvtk.STLSurf( triangleList=tris, color=camvtk.red ) #mc_surf.SetWireframe() mc_surf.SetColor(camvtk.cyan) - print " STLSurf()...", + print(" STLSurf()...",) myscreen.addActor( mc_surf ) - print "done." + print("done.") - print " render()...", + print(" render()...",) myscreen.render() myscreen.camera.Azimuth( 0.5 ) lwr.SetFileName("frames/cutsim_d9_frame"+ ('%06d' % n)+".png") w2if.Modified() lwr.Write() - print "done." + print("done.") myscreen.removeActor( mc_surf ) for c in cactors: myscreen.removeActor( c ) @@ -199,8 +199,8 @@ # myscreen.addActor( camvtk.Line( p1=(sp1.x,sp1.y,sp1.z),p2=(sp2.x,sp2.y,sp2.z), color=camvtk.red ) ) #print "center moved to", s.center - print " clpts= ", len(clpoints) - print "All done." + print(" clpts= ", len(clpoints)) + print("All done.") myscreen.iren.Start() if __name__ == "__main__": diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_09_tux_video.py opencamlib-11.10-1/src/attic/cutsim/cutsim_09_tux_video.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_09_tux_video.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim/cutsim_09_tux_video.py 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ import math def main(): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(-8, -4, 25) myscreen.camera.SetFocalPoint(4.5,6, 0) @@ -32,7 +32,7 @@ polydata = stl.src.GetOutput() s = ocl.STLSurf() camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STL surface read,", s.size(), "triangles" + print("STL surface read,", s.size(), "triangles") #angle = math.pi/4 radius = 0.4 @@ -65,12 +65,12 @@ bdc.run() t_after = time.time() calctime = t_after-t_before - print " BDC4 done in ", calctime," s" + print(" BDC4 done in ", calctime," s") dropcutter_time = calctime clpoints = bdc.getCLPoints() #camvtk.drawCLPointCloud(myscreen, clpoints) - print " clpts= ", len(clpoints) + print(" clpts= ", len(clpoints)) myscreen.render() #myscreen.iren.Start() #exit() @@ -112,14 +112,14 @@ mc = ocl.MarchingCubes() - print "mc()...", + print("mc()...",) tris = mc.mc_tree(t) #.mc_triangles() - print " mc() got ", len(tris), " triangles" + print(" mc() got ", len(tris), " triangles") mc_surf = camvtk.STLSurf( triangleList=tris, color=camvtk.red ) mc_surf.SetColor(camvtk.cyan) - print " STLSurf()...", + print(" STLSurf()...",) myscreen.addActor( mc_surf ) - print "done." + print("done.") cl = ocl.Point(0,0,5) cactors = camvtk.drawBallCutter(myscreen, cutter, cl) myscreen.render() @@ -148,12 +148,12 @@ cactors = camvtk.drawBallCutter(myscreen, cutter, cl) t_before = time.time() - print "mc()...", + print("mc()...",) tris = mc.mc_tree(t) #.mc_triangles() mc_time = time.time()-t_before - print "done in ", mc_time," s" - print " mc() got ", len(tris), " triangles" - print " STLSurf()...", + print("done in ", mc_time," s") + print(" mc() got ", len(tris), " triangles") + print(" STLSurf()...",) t_before = time.time() @@ -161,8 +161,8 @@ #mc_surf.SetWireframe() mc_surf.SetColor(camvtk.cyan) myscreen.addActor( mc_surf ) - print "done." - print " render()...", + print("done.") + print(" render()...",) myscreen.render() render_time = time.time()-t_before myscreen.camera.Azimuth( 0.1 ) @@ -170,7 +170,7 @@ w2if.Modified() call_ms = step_time/renderinterleave - print renderinterleave," diff() calls in", step_time, " = ", call_ms," ms/call" + print(renderinterleave," diff() calls in", step_time, " = ", call_ms," ms/call") infotext= "Octree max_depth=%i \nCL-point %i of %i \n%i CL-pts/frame\ndiff()-time: %1.3f s/CL-point\nmc()-time: %1.3f s/frame\nrender()-time: %1.3f s/frame\n%i Triangles" % (max_depth,n, len(clpoints), renderinterleave, call_ms, mc_time, render_time, len(tris)) octtext.SetText(infotext) @@ -179,7 +179,7 @@ #lwr.Write() # uncomment to actually write files to disk - print "done." + print("done.") step_time = 0 @@ -195,8 +195,8 @@ #print "done." - print " clpts= ", len(clpoints) - print "All done." + print(" clpts= ", len(clpoints)) + print("All done.") myscreen.iren.Start() if __name__ == "__main__": diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_10_side_tris.py opencamlib-11.10-1/src/attic/cutsim/cutsim_10_side_tris.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_10_side_tris.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim/cutsim_10_side_tris.py 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ import math def main(): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(2, 2, 5) myscreen.camera.SetFocalPoint(0.5,0, 1) @@ -41,9 +41,9 @@ t.init(2) n = 0 # the frame number - print "root_scale = ", t.root_scale() - print " max_depth = ", t.max_depth() - print " leaf_scale=", t.leaf_scale() + print("root_scale = ", t.root_scale()) + print(" max_depth = ", t.max_depth()) + print(" leaf_scale=", t.leaf_scale()) # X #stockbox = ocl.PlaneVolume( 1, 0, -0.9) @@ -68,9 +68,9 @@ mc = ocl.MarchingCubes() - print "mc()...", + print("mc()...",) tris = mc.mc_tree(t) # t.mc_triangles() - print " mc() got ", len(tris), " triangles" + print(" mc() got ", len(tris), " triangles") #tris2 = t.side_triangles() #print "appending" #for tr in tris2: @@ -84,10 +84,10 @@ #mc_surf.SetWireframe() #mc_surf.SetOpacity(0.3) - print " STLSurf()...", + print(" STLSurf()...",) myscreen.addActor( mc_surf ) #myscreen.addActor( s_surf ) - print "done." + print("done.") myscreen.render() @@ -157,12 +157,12 @@ #print "done." #time.sleep(0.4) - print n, " mc_tris=",len(tris) + print(n, " mc_tris=",len(tris)) #," side_tris=",len(tris2) n=n+1 #myscreen.camera.SetPosition(3*math.cos( 7*float(n)/(float(Nmax)) ), 3*math.sin( 7*float(n)/(float(Nmax)) ), 5) #myscreen.camera.Azimuth( math.sin( 5*float(n)/(float(Nmax)) ) ) - print "all done." + print("all done.") myscreen.iren.Start() exit() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_11.py opencamlib-11.10-1/src/attic/cutsim/cutsim_11.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_11.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim/cutsim_11.py 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ import math def main(): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(2, 2, 5) myscreen.camera.SetFocalPoint(0.5,0, 1) @@ -29,21 +29,21 @@ t = ocl.Octree(root_scale, max_depth, cp) t.init(2) n = 0 # the frame number - print "root_scale = ", t.root_scale() - print " max_depth = ", t.max_depth() - print " leaf_scale=", t.leaf_scale() + print("root_scale = ", t.root_scale()) + print(" max_depth = ", t.max_depth()) + print(" leaf_scale=", t.leaf_scale()) - print "mc()...", + print("mc()...",) mc = ocl.MarchingCubes() tris = mc.mc_tree(t) mc_surf = camvtk.STLSurf( triangleList=tris ) mc_surf.SetColor(camvtk.cyan) - print " STLSurf()...", + print(" STLSurf()...",) myscreen.addActor( mc_surf ) - print "done." + print("done.") myscreen.render() myscreen.removeActor( mc_surf ) @@ -77,10 +77,10 @@ t_after = time.time() render_time = t_after-t_before - print "%i: mc_tris=%i\t diff=%1.3f \t mc=%1.3f \t ren=%1.3f" % (n, len(tris), diff_time, mc_time, render_time) + print("%i: mc_tris=%i\t diff=%1.3f \t mc=%1.3f \t ren=%1.3f" % (n, len(tris), diff_time, mc_time, render_time)) n=n+1 - print "all done." + print("all done.") myscreen.iren.Start() exit() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_12.py opencamlib-11.10-1/src/attic/cutsim/cutsim_12.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim/cutsim_12.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim/cutsim_12.py 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ import math def main(): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(-15, -8, 15) myscreen.camera.SetFocalPoint(0,0, 0) @@ -54,34 +54,34 @@ while (n<=nmax): - print "diff...", + print("diff...",) t_before = time.time() t.diff_negative(s) t_after = time.time() build_time = t_after-t_before - print "done in ", build_time," s" + print("done in ", build_time," s") #infotext= "Octree + Marching-Cubes test\nmax octree-depth:%i \ntriangles: %i \nbuild() time: %f ms" % (max_depth, # len(tris), build_time*1e3 ) #octtext.SetText(infotext) if n==nmax: t_before = time.time() - print "mc()...", + print("mc()...",) tris = mc.mc_tree(t) t_after = time.time() mc_time = t_after-t_before - print "done in ", mc_time," s" - print " mc() got ", len(tris), " triangles" + print("done in ", mc_time," s") + print(" mc() got ", len(tris), " triangles") mc_surf = camvtk.STLSurf( triangleList=tris, color=camvtk.red ) mc_surf.SetWireframe() mc_surf.SetColor(camvtk.cyan) - print " STLSurf()...", + print(" STLSurf()...",) myscreen.addActor( mc_surf ) - print "done." - print " render()...", + print("done.") + print(" render()...",) myscreen.render() - print "done." + print("done.") #lwr.SetFileName("frames/mc8_frame"+ ('%06d' % n)+".png") #myscreen.camera.Azimuth( 2 ) @@ -102,9 +102,9 @@ # move forward theta = n*dtheta s.center = ocl.Point( 2*math.cos(theta),1*math.sin(theta),-0.1*theta) - print "center moved to", s.center + print("center moved to", s.center) n=n+1 - print "All done." + print("All done.") myscreen.iren.Start() if __name__ == "__main__": diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim2/cutsim.hpp opencamlib-11.10-1/src/attic/cutsim2/cutsim.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim2/cutsim.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim2/cutsim.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ -/* $Id: $ +/* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef CUTSIM_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim3/cutsim.h opencamlib-11.10-1/src/attic/cutsim3/cutsim.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/cutsim3/cutsim.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/cutsim3/cutsim.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ -/* $Id: $ +/* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef CUTSIM_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/gargantini.py opencamlib-11.10-1/src/attic/gargantini.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/gargantini.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/gargantini.py 2020-06-14 12:13:19.000000000 +0000 @@ -14,7 +14,7 @@ node = OCTNode( level, center = nodecenter , type = 1, childlist=None) flags = [] - for n in xrange(0,9): # test all points + for n in range(0,9): # test all points flags.append( volume.isInside( node.nodePoint(n) ) ) if (sum(flags) == 0): # nothing is inside @@ -34,7 +34,7 @@ # have to subdivide: childs = [] child_centers = [] - for n in xrange(1,9): + for n in range(1,9): child_center = node.childCenter(n) childs.append( buildOCTree( volume , nodecenter = child_center, level= level+1) ) node.setChildren(childs) @@ -74,7 +74,7 @@ if node.type == cam.OCType.GREY: return # don't draw intermediate nodes p = [] - for n in xrange(1,9): + for n in range(1,9): p1 = node.nodePoint(n) p.append(p1) @@ -114,12 +114,12 @@ if node.type == cam.OCType.GREY: return # don't draw intermediate nodes p = [] - for n in xrange(1,9): + for n in range(1,9): p1 = node.nodePoint(n) p.append(p1) lines = [] - for n in xrange(0,8): + for n in range(0,8): lines.append ( camvtk.Point(center=(p[n].x,p[n].y,p[n].z) ) ) if node.type == cam.OCType.WHITE: @@ -174,7 +174,7 @@ # scan code from left to right p = cam.Point(0,0,0) for digit in self.code: - print digit + print(digit) # set operations on linear octrees # o1 = o2 octant o1 is same as o2 @@ -196,7 +196,7 @@ ptr1 = 0 ptr2 = 0 - while( (ptr1 <= len(o1)) && (ptr2 <= len(o2)) ): + while( (ptr1 <= len(o1)) and (ptr2 <= len(o2)) ): if ( o1[ptr1].containedIn( o2[ptr2] ) ): # case1: containment of o1 node in o2 node int_ptr += 1 intersection[int_ptr] = o1[ptr1] @@ -205,7 +205,7 @@ add_to_queue( Q21, o1[ptr1] ) ptr1 +=1 # move to next in o1 - else if ( o2[ptr2].containedIn( o1[ptr1] ) ): # case2: containemnet of o2 node in o1 node + elif ( o2[ptr2].containedIn( o1[ptr1] ) ): # case2: containemnet of o2 node in o1 node int_ptr=int_ptr+1 intersection[int_ptr] = o2[ptr2] if ( Hold21 == 0): # difference queue 12 is empty @@ -213,7 +213,7 @@ add_to_queue( Q12, o2[ptr2] ) ptr2 +=1 # move to next in o2 - else if ( o1[ptr1].lessThan( o2[ptr2] ) ): # case3: node o1 precedes node of o2 + elif ( o1[ptr1].lessThan( o2[ptr2] ) ): # case3: node o1 precedes node of o2 union_ptr += 1 union[union_ptr] = o1[ptr1] if ( Hold12 == o1[ptr1] ): @@ -246,10 +246,10 @@ do_differences( Hold12, Q12, diff12, diff12_ptr ) Hold12 = 0 ptr3 += 1 - for i in xrange(ptr3, len(o1)): # difference + for i in range(ptr3, len(o1)): # difference diff12_ptr += 1 diff12[diff12_ptr] = o1[i] - for in in xrange(ptr1, len(o1)): # union + for i in range(ptr1, len(o1)): # union union_ptr +=1 union[union_ptr] = o1[i] @@ -259,10 +259,10 @@ do_differences(Hold21, Q21, diff21, diff21_ptr) Hold21=0 ptr3 +=1 - for i in xrange(ptr3, len(o2): + for i in range(ptr3, len(o2)): diff21_ptr +=1 diff21[diff21_ptr] = o2[i] - for i in xrange(ptr2, len(o2)): + for i in range(ptr2, len(o2)): union_ptr += 1 union[union_ptr] = o2[i] @@ -284,13 +284,13 @@ # expand(n) takes node and expands into eight suboctants, return deque in ascending order def do_differences( H, Q, D, Dptr): Q2 = expand(H) # create nodes representing suboctants of H - while ( Q2 not empty): - if ( Q not empty): + while Q2: + if Q: n = Hd(Q) if ( n==Hd(Q2) ): Q2 = Tl(Q2) Q = Tl(Q) - else if ( n.containedIn( Hd(Q2) ) ): + elif ( n.containedIn( Hd(Q2) ) ): Q2 = append( expand( Hd(Q2), Tl(Q2) ) ) else: Dptr +=1 @@ -316,19 +316,19 @@ #print oct.str() """ - print "max scale=", oct.get_max_scale() - for n in xrange(0,9): + print("max scale=", oct.get_max_scale()) + for n in range(0,9): p1 = oct.nodePoint(n) myscreen.addActor( camvtk.Sphere(center=(p1.x, p1.y, p1.z), radius=0.1, color=camvtk.red)) - print "id=%i" % (n), - print p1.str() + print("id=%i" % (n),) + print(p1.str()) - print "child centers:" - for n in xrange(1,9): + print("child centers:") + for n in range(1,9): p1 = oct.childCenter(n) myscreen.addActor( camvtk.Sphere(center=(p1.x, p1.y, p1.z), radius=0.1, color=camvtk.yellow)) - print "id=%i" % (n), - print p1.str() + print("id=%i" % (n),) + print(p1.str()) """ @@ -371,29 +371,29 @@ iters = oc2.prune_all() nlist = oc2.get_all_nodes() - print " oc2 got ", len(nlist), " nodes" + print(" oc2 got ", len(nlist), " nodes") nlist = oc2.get_white_nodes() - print " oc2 got ", len(nlist), " white nodes" + print(" oc2 got ", len(nlist), " white nodes") nlist = oc3.get_all_nodes() - print " oc3 got ", len(nlist), " nodes" + print(" oc3 got ", len(nlist), " nodes") - print "calling balance" + print("calling balance") oc2.balance(oc3) - print "after balance:" + print("after balance:") nlist = oc2.get_all_nodes() - print " oc2 got ", len(nlist), " nodes" + print(" oc2 got ", len(nlist), " nodes") nlist = oc2.get_white_nodes() - print " oc2 got ", len(nlist), " white nodes" - print "calling diff" + print(" oc2 got ", len(nlist), " white nodes") + print("calling diff") oc2.diff(oc3) - print "after diff:" + print("after diff:") nlist = oc2.get_all_nodes() - print " oc2 got ", len(nlist), " nodes" + print(" oc2 got ", len(nlist), " nodes") nlist = oc2.get_white_nodes() - print " oc2 got ", len(nlist), " white nodes" + print(" oc2 got ", len(nlist), " white nodes") drawOCT(myscreen, oc2, camvtk.green) #drawOCT(myscreen, oc3, camvtk.red, opacity=0.1) @@ -431,14 +431,14 @@ testvol = Volume() - print "building tree...", + print("building tree...",) tree = buildOCTree(testvol) - print "done." - print tree + print("done.") + print(tree) list =[] searchOCTree(tree, list) - print len(list), " nodes in tree" + print(len(list), " nodes in tree") w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(myscreen.renWin) @@ -464,7 +464,7 @@ t.SetText("OpenCAMLib 10.03-beta " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) myscreen.render() myscreen.camera.Azimuth( 3 ) - print "frame %i of %i" % (n, len(list)) + print("frame %i of %i" % (n, len(list))) w2if.Modified() lwr.SetFileName("frames/oct"+ ('%05d' % n)+".png") #lwr.Write() @@ -474,7 +474,7 @@ - print "done!" + print("done!") #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/halfedgediagram_old.hpp opencamlib-11.10-1/src/attic/halfedgediagram_old.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/halfedgediagram_old.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/halfedgediagram_old.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef HEDI_H #define HEDI_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree2.cpp opencamlib-11.10-1/src/attic/kdtree2.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree2.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/kdtree2.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree2.h opencamlib-11.10-1/src/attic/kdtree2.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree2.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/kdtree2.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef KDTREE2_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree.cpp opencamlib-11.10-1/src/attic/kdtree.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/kdtree.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ // this is mostly a translation to c++ of the earlier c# code diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree.h opencamlib-11.10-1/src/attic/kdtree.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/kdtree.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/kdtree.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef KDTREE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/cutsim_test_1.py opencamlib-11.10-1/src/attic/ocode/cutsim_test_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/cutsim_test_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode/cutsim_test_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -8,7 +8,7 @@ def main(filename="frame/f.png"): - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() myscreen.camera.SetPosition(20, 12, 20) @@ -27,7 +27,7 @@ c = ocl.CylCutter(1) # cutter c.length = 3 - print "cutter length=", c.length + print("cutter length=", c.length) p1 = ocl.CLPoint(-0.2,-0.2,0.2) # start of move p2 = ocl.CLPoint(-0.2,0.2,0.0) # end of move p3 = ocl.CLPoint(0.5,0.0,-0.5) @@ -56,10 +56,10 @@ myscreen.addActor(surf) Nmoves = len(clpoints) - print Nmoves,"CL-points to process" - for n in xrange(0,Nmoves-1): + print(Nmoves,"CL-points to process") + for n in range(0,Nmoves-1): #if n100): if ( (i % (nmax/10))==0): - print ".", + print(".",) i=i+1 #tlist.append(ocl.Triangle(p1,p2,p4)) @@ -73,19 +73,19 @@ #tlist.append(ocl.Triangle(p2,p3,p7)) #tlist.append(ocl.Triangle(p2,p7,p8)) #tlist.append(ocl.Triangle(p3,p7,p8)) - print ".actor.", + print(".actor.",) surf = camvtk.STLSurf(triangleList=tlist) surf.SetColor(color) surf.SetOpacity(opacity) - print ".add.", + print(".add.",) myscreen.addActor(surf) - print ".done." + print(".done.") def main(filename="frame/f.png",yc=6, n=0): - print ocl.revision() + print(ocl.revision()) f=ocl.Ocode() f.set_depth(7) @@ -126,7 +126,7 @@ #myscreen.iren.Start() #exit() - print " after init() t :", t.str() + print(" after init() t :", t.str()) #print " after init() t2 :", t2.str() # sphere @@ -157,7 +157,7 @@ c = ocl.CylCutter(1) c.length = 3 - print "cutter length=", c.length + print("cutter length=", c.length) p1 = ocl.Point(0.2,0.2,0) p2 = ocl.Point(1.5,1.5,-1) g1vol = ocl.CylMoveOCTVolume(c, p1, p2) @@ -187,25 +187,25 @@ #t.build( g1vol ) t.build( svol ) t_after = time.time() - print "build took ", t_after-t_before," s" + print("build took ", t_after-t_before," s") t_before = time.time() t2.build( cube1) t_after = time.time() - print "build took ", t_after-t_before," s" + print("build took ", t_after-t_before," s") #t.sort() #t2.sort() - print "calling diff()...", + print("calling diff()...",) t_before = time.time() #dt = t2.operation(1,t) t2.diff(t) t_after = time.time() - print "done." - print "diff took ", t_after-t_before," s" + print("done.") + print("diff took ", t_after-t_before," s") - print "diff has ", t2.size()," nodes" + print("diff has ", t2.size()," nodes") @@ -215,7 +215,7 @@ # original trees - print "drawing trees" + print("drawing trees") drawTree2(myscreen,t,opacity=1, color=camvtk.green) drawTree2(myscreen,t2,opacity=0.2, color=camvtk.cyan) drawTree2(myscreen,t2,opacity=1, color=camvtk.cyan, offset=(5,0,0)) @@ -243,7 +243,7 @@ ##camvtk.Cylinder(center=(pmin.x,pmin.y,pmin.z), radius=0.1, color=camvtk.pink) """ - for n in xrange(0,30): + for n in range(0,30): tp = ocl.Point(2.5,2.5,2-n*0.3) tpc = camvtk.black if (cylvol.isInside(tp)): @@ -312,9 +312,9 @@ #st4.SetPos( (50, 100) ) #myscreen.addActor( st4) - print " render()...", + print(" render()...",) myscreen.render() - print "done." + print("done.") lwr.SetFileName(filename) time.sleep(0.2) #lwr.Write() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_cylcutter_volume_4.py opencamlib-11.10-1/src/attic/ocode/ocode_cylcutter_volume_4.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_cylcutter_volume_4.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode/ocode_cylcutter_volume_4.py 2020-06-14 12:13:19.000000000 +0000 @@ -22,17 +22,17 @@ #cube.SetWireframe() myscreen.addActor( cube ) if (nmax>100): - print "i=", i - print "div=", (float(nmax)/10) + print("i=", i) + print("div=", (float(nmax)/10)) if ( (i % (float(nmax)/10))==0): - print ".", + print(".",) i=i+1 - print "done." + print("done.") def drawTree2(myscreen,t,color=camvtk.red,opacity=0.2, offset=(0,0,0)): nodes = t.get_nodes() nmax=len(nodes) - print "drawTree2: ", nmax," nodes", + print("drawTree2: ", nmax," nodes",) # make a list of triangles tlist = [] i=0 @@ -65,7 +65,7 @@ tlist.append(ocl.Triangle(p4,p6,p2)) if (nmax>100): if ( (i % (nmax/10))==0): - print ".", + print(".",) i=i+1 #tlist.append(ocl.Triangle(p1,p2,p4)) @@ -73,13 +73,13 @@ #tlist.append(ocl.Triangle(p2,p3,p7)) #tlist.append(ocl.Triangle(p2,p7,p8)) #tlist.append(ocl.Triangle(p3,p7,p8)) - print ".actor.", + print(".actor.",) surf = camvtk.STLSurf(triangleList=tlist) surf.SetColor(color) surf.SetOpacity(opacity) - print ".add.", + print(".add.",) myscreen.addActor(surf) - print ".done." + print(".done.") def drawCylCutter(myscreen, c, p): cyl = camvtk.Cylinder(center=(p.x,p.y,p.z), radius=c.radius, @@ -91,7 +91,7 @@ def main(filename="frame/f.png",yc=6, n=0): - print ocl.revision() + print(ocl.revision()) f=ocl.Ocode() f.set_depth(7) # depth and scale set here. @@ -128,12 +128,12 @@ t.init(5) t2.init(4) - print " after init() t :", t.str() - print " after init() t2 :", t2.str() + print(" after init() t :", t.str()) + print(" after init() t2 :", t2.str()) c = ocl.CylCutter(1) # cutter c.length = 3 - print "cutter length=", c.length + print("cutter length=", c.length) p1 = ocl.Point(-0.2,-0.2,0.2) # start of move p2 = ocl.Point(1.5,1.5,-1) # end of move @@ -186,29 +186,29 @@ t_before = time.time() t.build( g1vol ) t_after = time.time() - print "g1 build took ", t_after-t_before," s" + print("g1 build took ", t_after-t_before," s") # build cube t_before = time.time() t2.build( cube1 ) t_after = time.time() - print "cube build took ", t_after-t_before," s" + print("cube build took ", t_after-t_before," s") #t.sort() #t2.sort() - print "calling diff()...", + print("calling diff()...",) t_before = time.time() #dt = t2.operation(1,t) t2.diff(t) t_after = time.time() - print "done." - print "diff took ", t_after-t_before," s" + print("done.") + print("diff took ", t_after-t_before," s") - print "diff has ", t2.size()," nodes" + print("diff has ", t2.size()," nodes") # original trees - print "drawing trees" + print("drawing trees") drawTree2(myscreen,t,opacity=1, color=camvtk.green) drawTree2(myscreen,t2,opacity=0.2, color=camvtk.cyan) drawTree2(myscreen,t2,opacity=1, color=camvtk.cyan, offset=(5,0,0)) @@ -228,9 +228,9 @@ title.SetText("OpenCAMLib " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) myscreen.addActor(title) - print " render()...", + print(" render()...",) myscreen.render() - print "done." + print("done.") lwr.SetFileName(filename) time.sleep(0.2) #lwr.Write() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_cylcutter_volume.py opencamlib-11.10-1/src/attic/ocode/ocode_cylcutter_volume.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_cylcutter_volume.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode/ocode_cylcutter_volume.py 2020-06-14 12:13:19.000000000 +0000 @@ -24,14 +24,14 @@ #cube.SetWireframe() myscreen.addActor( cube ) if ( (i % (nmax/10))==0): - print ".", + print(".",) i=i+1 - print "done." + print("done.") def drawTree2(myscreen,t,color=camvtk.red,opacity=0.2, offset=(0,0,0)): nodes = t.get_nodes() nmax=len(nodes) - print "drawTree2: ", nmax," nodes", + print("drawTree2: ", nmax," nodes",) # make a list of triangles tlist = [] i=0 @@ -62,7 +62,7 @@ tlist.append(ocl.Triangle(p1,p2,p4)) # 1,2,4,6 tlist.append(ocl.Triangle(p4,p6,p2)) if ( (i % (nmax/10))==0): - print ".", + print(".",) i=i+1 #tlist.append(ocl.Triangle(p1,p2,p4)) @@ -70,7 +70,7 @@ #tlist.append(ocl.Triangle(p2,p3,p7)) #tlist.append(ocl.Triangle(p2,p7,p8)) #tlist.append(ocl.Triangle(p3,p7,p8)) - print "done" + print("done") surf = camvtk.STLSurf(triangleList=tlist) surf.SetColor(color) surf.SetOpacity(opacity) @@ -129,12 +129,12 @@ """ dl = myscreen.GetLights() - print "original default light:" - print dl - print "nextitem()" + print("original default light:") + print(dl) + print("nextitem()") l1 = dl.GetNextItem() - print " light:" - print l1 + print(" light:") + print(l1) #print myscreen.GetLights() lights = vtk.vtkLightCollection() @@ -152,16 +152,16 @@ #myscreen.SetLightCollection(lights) llist = myscreen.GetLights() li = llist.GetNextItem() - print " new list of lights:" - print li + print(" new list of lights:") + print(li) #for li in llist: - # print li - print " newly created light:" - print l + # print(li) + print(" newly created light:") + print(l) dl = myscreen.GetLights() - print "NEW light:" - print dl + print("NEW light:") + print(dl) """ t = ocl.LinOCT() @@ -174,8 +174,8 @@ #myscreen.iren.Start() #exit() - print " after init() t :", t.str() - print " after init() t2 :", t2.str() + print(" after init() t :", t.str()) + print(" after init() t2 :", t2.str()) # sphere svol = ocl.SphereOCTVolume() @@ -205,7 +205,7 @@ c = ocl.CylCutter(2) c.length = 3 - print "cutter length=", c.length + print("cutter length=", c.length) p1 = ocl.Point(-1,-2,0) p2 = ocl.Point(1,2.0,0) g1vol = ocl.CylMoveOCTVolume(c, p1, p2) @@ -232,9 +232,9 @@ t.build( g1vol ) t2.build( cube1) - print "calling diff()...", + print("calling diff()...",) dt = t2.operation(1,t) - print "done." + print("done.") # set Cylinde bounding-box """ @@ -262,7 +262,7 @@ drawTree2(myscreen,dt,opacity=1, color=camvtk.cyan, offset=(5,0,0)) """ - for n in xrange(0,30): + for n in range(0,30): tp = ocl.Point(2.5,2.5,2-n*0.3) tpc = camvtk.black if (cylvol.isInside(tp)): @@ -331,9 +331,9 @@ #st4.SetPos( (50, 100) ) #myscreen.addActor( st4) - print " render()...", + print(" render()...",) myscreen.render() - print "done." + print("done.") lwr.SetFileName(filename) time.sleep(0.2) #lwr.Write() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_movie1.py opencamlib-11.10-1/src/attic/ocode/ocode_movie1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_movie1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode/ocode_movie1.py 2020-06-14 12:13:19.000000000 +0000 @@ -31,7 +31,7 @@ #black = black+1 #print black," black nodes" """ - for m in xrange(0,9): + for m in range(0,9): cen = n.corner(m) sph = camvtk.Sphere( center=(cen.x, cen.y, cen.z), radius=0.5, color=camvtk.green) myscreen.addActor(sph) @@ -67,8 +67,8 @@ t.init(3) t2.init(3) - print " after init() t :", t.str() - print " after init() t2 :", t2.str() + print(" after init() t :", t.str()) + print(" after init() t2 :", t2.str()) svol = ocl.SphereOCTVolume() svol.radius=3 @@ -82,44 +82,44 @@ cube2.center = ocl.Point(1,2,0) cube2.side = 30 - print "t build()" + print("t build()" ) t.build(svol) - print " t after build() ", t.size() + print(" t after build() ", t.size()) t.condense() - print " t after condense() ", t.size() + print(" t after condense() ", t.size()) - print "t2 build()" + print("t2 build()" ) t2.build(cube1) - print " t2 after build() ", t2.size() + print(" t2 after build() ", t2.size()) t2.condense() - print " t2 after condense() ", t2.size() + print(" t2 after condense() ", t2.size() ) # original trees drawTree(myscreen,t,opacity=1, color=camvtk.green) drawTree(myscreen,t2,opacity=1, color=camvtk.red) - print " diff12()...", + print(" diff12()...",) t3 = t2.operation(1,t) - print "done." + print("done.") - print " diff21()...", + print(" diff21()...",) t4 = t2.operation(2,t) - print "done." + print("done.") - print " intersection()...", + print(" intersection()...",) t5 = t2.operation(3,t) - print "done." + print("done.") - print " sum()...", + print(" sum()...",) t6 = t2.operation(4,t) - print "done." + print("done.") - print " difference 1-2 t3 (blue) =", t3.size() - print " difference 2-1 t4 (yellow)=", t4.size() - print " intersection t5 (pink) =", t5.size() - print " union t6 (grey) =", t6.size() + print(" difference 1-2 t3 (blue) =", t3.size()) + print(" difference 2-1 t4 (yellow)=", t4.size()) + print(" intersection t5 (pink) =", t5.size()) + print(" union t6 (grey) =", t6.size()) drawTree(myscreen,t3,opacity=1, color=camvtk.blue, offset=(0,15,0)) drawTree(myscreen,t4,opacity=1, color=camvtk.yellow,offset=(0,-15,0)) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_test1.py opencamlib-11.10-1/src/attic/ocode/ocode_test1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_test1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode/ocode_test1.py 2020-06-14 12:13:19.000000000 +0000 @@ -5,7 +5,7 @@ def printNodes(t): nodes = t.get_nodes() for n in nodes: - print n.str(), " c=",n.color + print(n.str(), " c=",n.color) def drawTree(myscreen,t,color=camvtk.red,opacity=0.2): nodes = t.get_nodes() @@ -30,9 +30,9 @@ cube.SetOpacity(opacity) myscreen.addActor( cube ) #black = black+1 - print black," black nodes" + print(black," black nodes") """ - for m in xrange(0,9): + for m in range(0,9): cen = n.corner(m) sph = camvtk.Sphere( center=(cen.x, cen.y, cen.z), radius=0.5, color=camvtk.green) myscreen.addActor(sph) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_test2.py opencamlib-11.10-1/src/attic/ocode/ocode_test2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_test2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode/ocode_test2.py 2020-06-14 12:13:19.000000000 +0000 @@ -5,7 +5,7 @@ def printNodes(t): nodes = t.get_nodes() for n in nodes: - print n.str() + print(n.str()) def drawTree(myscreen,t,color=camvtk.red,opacity=0.2, offset=(0,0,0)): nodes = t.get_nodes() @@ -32,7 +32,7 @@ #black = black+1 #print black," black nodes" """ - for m in xrange(0,9): + for m in range(0,9): cen = n.corner(m) sph = camvtk.Sphere( center=(cen.x, cen.y, cen.z), radius=0.5, color=camvtk.green) myscreen.addActor(sph) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_test3.py opencamlib-11.10-1/src/attic/ocode/ocode_test3.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode/ocode_test3.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode/ocode_test3.py 2020-06-14 12:13:19.000000000 +0000 @@ -5,7 +5,7 @@ def printNodes(t): nodes = t.get_nodes() for n in nodes: - print n.str() + print(n.str()) def drawTree(myscreen,t,color=camvtk.red,opacity=0.2, offset=(0,0,0)): nodes = t.get_nodes() @@ -32,7 +32,7 @@ #black = black+1 #print black," black nodes" """ - for m in xrange(0,9): + for m in range(0,9): cen = n.corner(m) sph = camvtk.Sphere( center=(cen.x, cen.y, cen.z), radius=0.5, color=camvtk.green) myscreen.addActor(sph) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode.cpp opencamlib-11.10-1/src/attic/ocode.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/ocode.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/ocode.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -275,7 +276,7 @@ /* - * /// return correspinding number + * /// return corresponding number unsigned long Ocode::number() const { unsigned long n=0; for (int m=0;m. + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef OCODE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/octree.cpp opencamlib-11.10-1/src/attic/octree.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/octree.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/octree.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/octree.h opencamlib-11.10-1/src/attic/octree.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/octree.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/octree.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef OCTREE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/oct_test1.py opencamlib-11.10-1/src/attic/oct_test1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/oct_test1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/oct_test1.py 2020-06-14 12:13:19.000000000 +0000 @@ -24,7 +24,7 @@ node = OCTNode( level, center = nodecenter , type = 1, childlist=None) flags = [] - for n in xrange(0,9): # test all points + for n in range(0,9): # test all points flags.append( volume.isInside( node.nodePoint(n) ) ) if (sum(flags) == 0): # nothing is inside @@ -44,7 +44,7 @@ # have to subdivide: childs = [] child_centers = [] - for n in xrange(1,9): + for n in range(1,9): child_center = node.childCenter(n) childs.append( buildOCTree( volume , nodecenter = child_center, level= level+1) ) node.setChildren(childs) @@ -121,7 +121,7 @@ return # don't draw intermediate nodes p = [] - for n in xrange(1,9): + for n in range(1,9): p1 = oct.nodePoint(n) p.append(p1) @@ -172,14 +172,14 @@ testvol = Volume() - print "building tree...", + print("building tree...",) tree = buildOCTree(testvol) - print "done." - print tree + print("done.") + print(tree) list =[] searchOCTree(tree, list) - print len(list), " nodes in tree" + print(len(list), " nodes in tree") w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(myscreen.renWin) @@ -205,7 +205,7 @@ t.SetText("OpenCAMLib 10.03-beta " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) myscreen.render() myscreen.camera.Azimuth( 3 ) - print "frame %i of %i" % (n, len(list)) + print("frame %i of %i" % (n, len(list))) w2if.Modified() lwr.SetFileName("frames/oct"+ ('%05d' % n)+".png") #lwr.Write() @@ -215,7 +215,7 @@ - print "done!" + print("done!") myscreen.render() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/oct_test2.py opencamlib-11.10-1/src/attic/oct_test2.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/oct_test2.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/oct_test2.py 2020-06-14 12:13:19.000000000 +0000 @@ -24,7 +24,7 @@ node = OCTNode( level, center = nodecenter , type = 1, childlist=None) flags = [] - for n in xrange(0,9): # test all points + for n in range(0,9): # test all points flags.append( volume.isInside( node.nodePoint(n) ) ) if (sum(flags) == 0): # nothing is inside @@ -44,7 +44,7 @@ # have to subdivide: childs = [] child_centers = [] - for n in xrange(1,9): + for n in range(1,9): child_center = node.childCenter(n) childs.append( buildOCTree( volume , nodecenter = child_center, level= level+1) ) node.setChildren(childs) @@ -83,7 +83,7 @@ return # don't draw intermediate nodes p = [] - for n in xrange(1,9): + for n in range(1,9): p1 = oct.nodePoint(n) p.append(p1) @@ -125,21 +125,21 @@ myscreen.camera.SetPosition(5, 3, 2) myscreen.camera.SetFocalPoint(0,0, 0) - print oct.str() + print(oct.str()) """ - print "max scale=", oct.get_max_scale() - for n in xrange(0,9): + print("max scale=", oct.get_max_scale()) + for n in range(0,9): p1 = oct.nodePoint(n) myscreen.addActor( camvtk.Sphere(center=(p1.x, p1.y, p1.z), radius=0.1, color=camvtk.red)) - print "id=%i" % (n), - print p1.str() + print("id=%i" % (n),) + print(p1.str()) - print "child centers:" - for n in xrange(1,9): + print("child centers:") + for n in range(1,9): p1 = oct.childCenter(n) myscreen.addActor( camvtk.Sphere(center=(p1.x, p1.y, p1.z), radius=0.1, color=camvtk.yellow)) - print "id=%i" % (n), - print p1.str() + print("id=%i" % (n),) + print(p1.str()) """ @@ -155,10 +155,10 @@ nlist = oc2.get_all_nodes() - print "got ", len(nlist), " nodes" + print("got ", len(nlist), " nodes") for node in nlist: - print node.str() + print(node.str()) if node.type == cam.OCType.WHITE: sph_color = camvtk.white if node.type == cam.OCType.BLACK: @@ -173,14 +173,14 @@ testvol = Volume() - print "building tree...", + print("building tree...",) tree = buildOCTree(testvol) - print "done." - print tree + print("done.") + print(tree) list =[] searchOCTree(tree, list) - print len(list), " nodes in tree" + print(len(list), " nodes in tree") w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(myscreen.renWin) @@ -206,7 +206,7 @@ t.SetText("OpenCAMLib 10.03-beta " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) myscreen.render() myscreen.camera.Azimuth( 3 ) - print "frame %i of %i" % (n, len(list)) + print("frame %i of %i" % (n, len(list))) w2if.Modified() lwr.SetFileName("frames/oct"+ ('%05d' % n)+".png") #lwr.Write() @@ -216,7 +216,7 @@ - print "done!" + print("done!") #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/oct_test3.py opencamlib-11.10-1/src/attic/oct_test3.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/oct_test3.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/oct_test3.py 2020-06-14 12:13:19.000000000 +0000 @@ -24,7 +24,7 @@ node = OCTNode( level, center = nodecenter , type = 1, childlist=None) flags = [] - for n in xrange(0,9): # test all points + for n in range(0,9): # test all points flags.append( volume.isInside( node.nodePoint(n) ) ) if (sum(flags) == 0): # nothing is inside @@ -44,7 +44,7 @@ # have to subdivide: childs = [] child_centers = [] - for n in xrange(1,9): + for n in range(1,9): child_center = node.childCenter(n) childs.append( buildOCTree( volume , nodecenter = child_center, level= level+1) ) node.setChildren(childs) @@ -84,7 +84,7 @@ if node.type == cam.OCType.GREY: return # don't draw intermediate nodes p = [] - for n in xrange(1,9): + for n in range(1,9): p1 = node.nodePoint(n) p.append(p1) @@ -124,12 +124,12 @@ if node.type == cam.OCType.GREY: return # don't draw intermediate nodes p = [] - for n in xrange(1,9): + for n in range(1,9): p1 = node.nodePoint(n) p.append(p1) lines = [] - for n in xrange(0,8): + for n in range(0,8): lines.append ( camvtk.Point(center=(p[n].x,p[n].y,p[n].z) ) ) if node.type == cam.OCType.WHITE: @@ -185,19 +185,19 @@ #print oct.str() """ - print "max scale=", oct.get_max_scale() - for n in xrange(0,9): + print("max scale=", oct.get_max_scale()) + for n in range(0,9): p1 = oct.nodePoint(n) myscreen.addActor( camvtk.Sphere(center=(p1.x, p1.y, p1.z), radius=0.1, color=camvtk.red)) - print "id=%i" % (n), - print p1.str() + print("id=%i" % (n),) + print(p1.str()) - print "child centers:" - for n in xrange(1,9): + print("child centers:") + for n in range(1,9): p1 = oct.childCenter(n) myscreen.addActor( camvtk.Sphere(center=(p1.x, p1.y, p1.z), radius=0.1, color=camvtk.yellow)) - print "id=%i" % (n), - print p1.str() + print("id=%i" % (n),) + print(p1.str()) """ @@ -240,29 +240,29 @@ iters = oc2.prune_all() nlist = oc2.get_all_nodes() - print " oc2 got ", len(nlist), " nodes" + print(" oc2 got ", len(nlist), " nodes") nlist = oc2.get_white_nodes() - print " oc2 got ", len(nlist), " white nodes" + print(" oc2 got ", len(nlist), " white nodes") nlist = oc3.get_all_nodes() - print " oc3 got ", len(nlist), " nodes" + print(" oc3 got ", len(nlist), " nodes") - print "calling balance" + print("calling balance") oc2.balance(oc3) - print "after balance:" + print("after balance:") nlist = oc2.get_all_nodes() - print " oc2 got ", len(nlist), " nodes" + print(" oc2 got ", len(nlist), " nodes") nlist = oc2.get_white_nodes() - print " oc2 got ", len(nlist), " white nodes" - print "calling diff" + print(" oc2 got ", len(nlist), " white nodes") + print("calling diff") oc2.diff(oc3) - print "after diff:" + print("after diff:") nlist = oc2.get_all_nodes() - print " oc2 got ", len(nlist), " nodes" + print(" oc2 got ", len(nlist), " nodes") nlist = oc2.get_white_nodes() - print " oc2 got ", len(nlist), " white nodes" + print(" oc2 got ", len(nlist), " white nodes") drawOCT(myscreen, oc2, camvtk.green) #drawOCT(myscreen, oc3, camvtk.red, opacity=0.1) @@ -300,14 +300,14 @@ testvol = Volume() - print "building tree...", + print("building tree...",) tree = buildOCTree(testvol) - print "done." - print tree + print("done.") + print(tree) list =[] searchOCTree(tree, list) - print len(list), " nodes in tree" + print(len(list), " nodes in tree") w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(myscreen.renWin) @@ -333,7 +333,7 @@ t.SetText("OpenCAMLib 10.03-beta " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) myscreen.render() myscreen.camera.Azimuth( 3 ) - print "frame %i of %i" % (n, len(list)) + print("frame %i of %i" % (n, len(list))) w2if.Modified() lwr.SetFileName("frames/oct"+ ('%05d' % n)+".png") #lwr.Write() @@ -343,7 +343,7 @@ - print "done!" + print("done!") #raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pfinish.cpp opencamlib-11.10-1/src/attic/pfinish.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pfinish.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/pfinish.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,19 +1,22 @@ -/* Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pfinish.h opencamlib-11.10-1/src/attic/pfinish.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pfinish.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/pfinish.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,19 +1,22 @@ -/* Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef PFINISH_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pfinish_tst_1.py opencamlib-11.10-1/src/attic/pfinish_tst_1.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pfinish_tst_1.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/pfinish_tst_1.py 2020-06-14 12:13:19.000000000 +0000 @@ -8,7 +8,7 @@ myscreen = camvtk.VTKScreen() stl = camvtk.STLSurf("../stl/demo.stl") - print "STL surface read" + print("STL surface read") myscreen.addActor(stl) stl.SetWireframe() stl.SetColor((0.5,0.5,0.5)) @@ -16,7 +16,7 @@ polydata = stl.src.GetOutput() s= ocl.STLSurf() camvtk.vtkPolyData2OCLSTL(polydata, s) - print "STLSurf with ", s.size(), " triangles" + print("STLSurf with ", s.size(), " triangles") cutter = ocl.CylCutter(0.6) #print cutter.str() @@ -40,12 +40,12 @@ pftp = cam.ParallelFinish() pftp.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) pftp.dropCutterSTL1(cutter, s) - print " made ", pftp.dcCalls, " drop-cutter calls" + print(" made ", pftp.dcCalls, " drop-cutter calls") pf2 = cam.ParallelFinish() pf2.initCLPoints(minx,dx,maxx,miny,dy,maxy,z) pf2.dropCutterSTL2(cutter, s) - print " made ", pf2.dcCalls, " drop-cutter calls" + print(" made ", pf2.dcCalls, " drop-cutter calls") clpoints = pftp.getCLPoints() ccpoints = pftp.getCCPoints() @@ -89,8 +89,8 @@ #myscreen.addActor( camvtk.Point(center=(cc.x,cc.y,cc.z), color=col) ) #print cc.type - print "none=",nn," vertex=",nv, " edge=",ne, " facet=",nf, " sum=", nn+nv+ne+nf - print len(clpoints), " cl points evaluated" + print("none=",nn," vertex=",nv, " edge=",ne, " facet=",nf, " sum=", nn+nv+ne+nf) + print(len(clpoints), " cl points evaluated") myscreen.camera.SetPosition(3, 23, 15) myscreen.camera.SetFocalPoint(5, 5, 0) myscreen.render() diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pft_visitor.h opencamlib-11.10-1/src/attic/pft_visitor.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/pft_visitor.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/pft_visitor.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef PFT_VISITOR_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/waterline_4_weave.py opencamlib-11.10-1/src/attic/waterline_4_weave.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/waterline_4_weave.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/waterline_4_weave.py 2020-06-14 12:13:19.000000000 +0000 @@ -6,7 +6,7 @@ import math if __name__ == "__main__": - print ocl.revision() + print(ocl.revision()) myscreen = camvtk.VTKScreen() a = ocl.Point(0,1,0.3) myscreen.addActor(camvtk.Point(center=(a.x,a.y,a.z), color=(1,0,1))) @@ -25,7 +25,7 @@ #cutter = ocl.BallCutter(0.4, 5) cutter = ocl.BullCutter(0.4, 0.1, 5) - print "fiber..." + print("fiber...") zh = 0.23 @@ -42,7 +42,7 @@ awl.run() t_after = time.time() calctime = t_after-t_before - print " AdaptiveWaterline done in ", calctime," s" + print(" AdaptiveWaterline done in ", calctime," s") xfibers = awl.getXFibers() #print " got ", len(xf)," x-fibers" yfibers = awl.getYFibers() @@ -50,29 +50,29 @@ fibers = xfibers+yfibers - print " got ",len(xfibers)," xfibers" - print " got ",len(yfibers)," yfibers" - print "rendering fibers and CL-points." + print(" got ",len(xfibers)," xfibers") + print(" got ",len(yfibers)," yfibers") + print("rendering fibers and CL-points.") w = ocl.Weave() - print "push fibers to Weave...", + print("push fibers to Weave...",) for f in fibers: w.addFiber(f) - print "done." - print "Weave build()...", + print("done.") + print("Weave build()...",) w.build() - print "done" - print "face_traverse..." + print("done") + print("face_traverse...") w.face_traverse() - print "done." + print("done.") w_clpts = w.getCLPoints() w_ipts = w.getIPoints() w_edges = w.getEdges() w_loop = w.getLoops() - print " weave: got ", len(w_clpts)," CL-points and ", len(w_ipts)," internal points" + print(" weave: got ", len(w_clpts)," CL-points and ", len(w_ipts)," internal points") - print " got: ", len(w_edges), " edges" - print " got: ", len(w_loop), " loop points" + print(" got: ", len(w_edges), " edges") + print(" got: ", len(w_loop), " loop points") #zoffset = 0.0 #for p in w_clpts: # myscreen.addActor( camvtk.Sphere(center=(p.x,p.y,p.z+zoffset), radius=0.0031, color=camvtk.red ) ) @@ -105,7 +105,7 @@ myscreen.addActor( camvtk.Line( p1=( p1.x,p1.y,p1.z+zoffset+ne*dzoffset2), p2=(p2.x,p2.y,p2.z+zoffset+ne*dzoffset2) ) ) ne = ne+1 - print "done." + print("done.") myscreen.camera.SetPosition(0.5, 3, 2) myscreen.camera.SetFocalPoint(0.5, 0.5, 0) camvtk.drawArrows(myscreen,center=(-0.5,-0.5,-0.5)) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave.cpp opencamlib-11.10-1/src/attic/weave.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/weave.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave.h opencamlib-11.10-1/src/attic/weave.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/weave.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef WEAVE_H #define WEAVE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave_py.h opencamlib-11.10-1/src/attic/weave_py.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave_py.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/weave_py.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ -#ifndef WEAVE_PY_H -#define WEAVE_PY_H - -#include // for py -#include // for py - -#include "weave.h" - -namespace ocl -{ - -/// Python wrapper for Weave -class Weave_py : public Weave { - public: - Weave_py() : Weave() {}; - // PYTHON - /// return graph components to python - boost::python::list get_components() { - boost::python::list wlist; - std::vector weaves = split_components(); - BOOST_FOREACH( Weave w, weaves ) { - wlist.append( w ); - } - return wlist; - }; - /// return CL-points to python - boost::python::list getCLPoints() const { - boost::python::list plist; - VertexIterator it_begin, it_end, itr; - boost::tie( it_begin, it_end ) = boost::vertices( g ); - for ( itr=it_begin ; itr != it_end ; ++itr ) { - if ( g[*itr].type == CL ) - plist.append( g[*itr].position ); - } - return plist; - }; - /// return internal points to python - boost::python::list getIPoints() const { - boost::python::list plist; - VertexIterator it_begin, it_end, itr; - boost::tie( it_begin, it_end ) = boost::vertices( g ); - for ( itr=it_begin ; itr != it_end ; ++itr ) { - if ( g[*itr].type == INT ) - plist.append( g[*itr].position ); - } - return plist; - }; - /// return edges to python - /// format is [ [p1,p2] , [p3,p4] , ... ] - boost::python::list getEdges() const { - boost::python::list edge_list; - EdgeIterator it_begin, it_end, itr; - boost::tie( it_begin, it_end ) = boost::edges( g ); - for ( itr=it_begin ; itr != it_end ; ++itr ) { // loop through each edge - if ( ! boost::get( boost::edge_color, g, *itr ) ) { - boost::python::list point_list; // the endpoints of each edge - WeaveVertex v1 = boost::source( *itr, g ); - WeaveVertex v2 = boost::target( *itr, g ); - point_list.append(g[v1].position); - point_list.append(g[v2].position); - edge_list.append(point_list); - } - } - return edge_list; - }; - /// return loops to python - boost::python::list py_getLoops() const { - boost::python::list loop_list; - BOOST_FOREACH( std::vector loop, loops ) { - boost::python::list point_list; - BOOST_FOREACH( WeaveVertex v, loop ) { - point_list.append( g[v].position ); - } - loop_list.append(point_list); - } - return loop_list; - }; -}; - -} // end namespace -#endif -// end file weave_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave_typedef.h opencamlib-11.10-1/src/attic/weave_typedef.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/attic/weave_typedef.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/attic/weave_typedef.h 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef WEAVE_TYPEDEF_H #define WEAVE_TYPEDEF_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/CMakeLists.txt opencamlib-11.10-1/src/CMakeLists.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/CMakeLists.txt 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/CMakeLists.txt 2020-06-14 12:13:19.000000000 +0000 @@ -1,18 +1,32 @@ project(OpenCamLib) -cmake_minimum_required(VERSION 2.4) +cmake_minimum_required(VERSION 3.9) #set( CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR} ) +set(CMAKE_VERBOSE_MAKEFILE ON) if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) + cmake_policy(SET CMP0025 NEW) endif(COMMAND cmake_policy) +#set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") +if (CMAKE_VERSION VERSION_LESS "3.1") + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") + endif () +else () + set (CMAKE_CXX_STANDARD 11) +endif () + # some options to set what is built: option(BUILD_CXX_LIB "Build/install the pure c++ libocl library? " ON) option(BUILD_PY_LIB - "Build/install the python ocl library? " ON) + "Build/install the python ocl library? " OFF) + +option(BUILD_NODEJS_LIB + "Build/install the node.js ocl library? " OFF) option(BUILD_DOC "Build/install the ocl documentation? " ON) @@ -20,6 +34,12 @@ option(USE_OPENMP "Use OpenMP for parallel computation" ON) +option(VERSION_STRING + "Set version string" OFF) + +option(USE_PY_3 + "Use Python V3" OFF) + if (NOT BUILD_CXX_LIB) message(STATUS " Note: will NOT build pure c++ library") endif(NOT BUILD_CXX_LIB) @@ -28,6 +48,10 @@ message(STATUS " Note: will NOT build python library") endif(NOT BUILD_PY_LIB) +if (NOT BUILD_EMSCRIPTEN_LIB) + message(STATUS " Note: will NOT build emscripten library") +endif(NOT BUILD_EMSCRIPTEN_LIB) + if (NOT BUILD_DOC) message(STATUS " Note: will NOT build ocl documentation") endif(NOT BUILD_DOC) @@ -36,65 +60,6 @@ include(gcc_version.cmake) # -# Figure out how to build and where to install the Python modules -# - -find_program(PYTHON_EXECUTABLE NAMES python2) - -if (APPLE) - # Ask Python to tell us it's include directory, if nobody else has - if(NOT DEFINED PYTHON_INCLUDE_DIRS) - execute_process(COMMAND ${PYTHON_EXECUTABLE} -c - "from distutils.sysconfig import get_python_inc;print get_python_inc()" - OUTPUT_VARIABLE PYTHON_INCLUDE_DIRS - RESULT_VARIABLE PYTHON_INCLUDE_DIR_RESULT ERROR_QUIET) - if(NOT PYTHON_INCLUDE_DIR_RESULT MATCHES 0) - message(SEND_ERROR "Failed to determine PYTHON_INCLUDE_DIR") - endif(NOT PYTHON_INCLUDE_DIR_RESULT MATCHES 0) - endif(NOT DEFINED PYTHON_INCLUDE_DIRS) - - # Similar for the Python library - if(NOT DEFINED PYTHON_LIBRARY) - # Get the library path - execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c - "from distutils import sysconfig;print sysconfig.get_config_var('LIBDIR')" - OUTPUT_VARIABLE PYTHON_LIBRARY_DIR - RESULT_VARIABLE PYTHON_LIBRARY_DIR_RESULT ERROR_QUIET) - string(STRIP ${PYTHON_LIBRARY_DIR} PYTHON_LIBRARY_DIR) - if(NOT PYTHON_LIBRARY_DIR_RESULT MATCHES 0) - message(SEND_ERROR "Failed to determine PYTHON_LIBRARY") - endif(NOT PYTHON_LIBRARY_DIR_RESULT MATCHES 0) - - # Get library filename - might not be safe to assume .dylib extension? - execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c - "import sys;print 'libpython%d.%d.dylib'%sys.version_info[0:2]" - OUTPUT_VARIABLE PYTHON_LIBRARY_FILE - RESULT_VARIABLE PYTHON_LIBRARY_FILE_RESULT ERROR_QUIET) - string(STRIP ${PYTHON_LIBRARY_FILE} PYTHON_LIBRARY_FILE) - if(NOT PYTHON_LIBRARY_FILE_RESULT MATCHES 0) - message(SEND_ERROR "Failed to determine PYTHON_LIBRARY") - endif(NOT PYTHON_LIBRARY_FILE_RESULT MATCHES 0) - - set(PYTHON_LIBRARY "${PYTHON_LIBRARY_DIR}/${PYTHON_LIBRARY_FILE}") - endif(NOT DEFINED PYTHON_LIBRARY) -endif (APPLE) - -execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(0,0,\"/usr/local\")" - OUTPUT_VARIABLE Python_site_packages - OUTPUT_STRIP_TRAILING_WHITESPACE - ) # on Ubuntu 11.10 this outputs: /usr/local/lib/python2.7/dist-packages - -execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(plat_specific=1,standard_lib=0,prefix=\"/usr/local\")" - OUTPUT_VARIABLE Python_arch_packages - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - -find_package (PythonLibs 2 REQUIRED) -include_directories(${PYTHON_INCLUDE_DIRS} ) - -# # Turn compiler warnings up to 11, at least with gcc. I don't know how to # do this with other compilers we might support and I'm leaving it up to # the relevant platform maintainers... @@ -111,38 +76,27 @@ endif(GCC_4_6) endif (UNIX) -option(BUILD_TYPE - "Build type: Release=ON/Debug=OFF " ON) +# option(BUILD_TYPE +# "Build type: Release=ON/Debug=OFF " ON) -if (BUILD_TYPE) - message(STATUS " CMAKE_BUILD_TYPE = Release") - set(CMAKE_BUILD_TYPE Release) -endif(BUILD_TYPE) - -if (NOT BUILD_TYPE) - message(STATUS " CMAKE_BUILD_TYPE = Debug") - set(CMAKE_BUILD_TYPE Debug) -endif(NOT BUILD_TYPE) +# if (BUILD_TYPE) +# message(STATUS " CMAKE_BUILD_TYPE = Release") +# set(CMAKE_BUILD_TYPE Release) +# endif(BUILD_TYPE) + +# if (NOT BUILD_TYPE) +# message(STATUS " CMAKE_BUILD_TYPE = Debug") +# set(CMAKE_BUILD_TYPE Debug) +# endif(NOT BUILD_TYPE) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -# find BOOST and boost-python -find_package( Boost COMPONENTS python REQUIRED) -if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS}) - message(STATUS "found Boost: " ${Boost_LIB_VERSION}) - message(STATUS "boost-incude dirs are: " ${Boost_INCLUDE_DIRS}) - message(STATUS "boost-python lib is: " ${Boost_PYTHON_LIBRARY}) - message(STATUS "boost_LIBRARY_DIRS is: " ${Boost_LIBRARY_DIRS}) - message(STATUS "Boost_LIBRARIES is: " ${Boost_LIBRARIES}) -endif() - if(USE_OPENMP) if(APPLE) # OpenMP does not work with the default Apple llvm/clang++ # Install a more recent version using Homebrew: # "brew install llvm" - set(OpenMP_CXX_FLAGS "-fopenmp=libomp") + # set(OpenMP_CXX_FLAGS "-fopenmp=libomp") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") else() find_package( OpenMP REQUIRED ) @@ -167,13 +121,24 @@ ################ create version_string.hpp, http://stackoverflow.com/questions/3780667 # include the output directory, where the version_string.hpp file is generated include_directories(${CMAKE_CURRENT_BINARY_DIR}) - include(version_string.cmake) - # now parse the git commit id: - STRING(REGEX REPLACE "([0-9][0-9]).*" "\\1" GIT_MAJOR_VERSION "${GIT_COMMIT_ID}" ) - STRING(REGEX REPLACE "[0-9][0-9].([0-9][0-9])-.*" "\\1" GIT_MINOR_VERSION "${GIT_COMMIT_ID}" ) - STRING(REGEX REPLACE "[0-9][0-9].[0-9][0-9]-(.*)-.*" "\\1" GIT_PATCH_VERSION "${GIT_COMMIT_ID}" ) - SET(MY_VERSION "${GIT_MAJOR_VERSION}.${GIT_MINOR_VERSION}.${GIT_PATCH_VERSION}" CACHE STRING "name") - SET(version_string ${CMAKE_CURRENT_BINARY_DIR}/version_string.hpp) + if (VERSION_STRING) + set( vstring "//version_string.hpp - written by cmake. changes will be lost!\n" + "#ifndef VERSION_STRING\n" + "#define VERSION_STRING \"${VERSION_STRING}\"\n" + "#endif\n" + ) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version_string.hpp ${vstring} ) + set(MY_VERSION ${VERSION_STRING}) + set(version_string ${VERSION_STRING}) + else() + include(version_string.cmake) + # now parse the git commit id: + STRING(REGEX REPLACE "([0-9]+).*" "\\1" GIT_MAJOR_VERSION "${GIT_COMMIT_ID}" ) + STRING(REGEX REPLACE "[0-9]+.([0-9]+)-.*" "\\1" GIT_MINOR_VERSION "${GIT_COMMIT_ID}" ) + STRING(REGEX REPLACE "[0-9]+.[0-9]+-(.*)-.*" "\\1" GIT_PATCH_VERSION "${GIT_COMMIT_ID}" ) + SET(MY_VERSION "${GIT_MAJOR_VERSION}.${GIT_MINOR_VERSION}.${GIT_PATCH_VERSION}" CACHE STRING "name") + SET(version_string ${CMAKE_CURRENT_BINARY_DIR}/version_string.hpp) + endif() ENDIF(EXISTS ${OpenCamLib_SOURCE_DIR}/version_string.hpp) message(STATUS "OpenCamLib version: ${MY_VERSION}") @@ -275,100 +240,31 @@ ${OpenCamLib_SOURCE_DIR}/algo/smart_weave.hpp ${OpenCamLib_SOURCE_DIR}/algo/weave_typedef.hpp ${OpenCamLib_SOURCE_DIR}/algo/tsp.hpp - - ${version_string} - ) - # this branches into the dirs and compiles stuff there -ADD_SUBDIRECTORY( ${OpenCamLib_SOURCE_DIR}/cutters ) -ADD_SUBDIRECTORY( ${OpenCamLib_SOURCE_DIR}/geo ) -ADD_SUBDIRECTORY( ${OpenCamLib_SOURCE_DIR}/algo ) -ADD_SUBDIRECTORY( ${OpenCamLib_SOURCE_DIR}/dropcutter ) -ADD_SUBDIRECTORY( ${OpenCamLib_SOURCE_DIR}/common ) - -# include dirs -include_directories( ${OpenCamLib_SOURCE_DIR}/cutters ) -include_directories( ${OpenCamLib_SOURCE_DIR}/geo ) -include_directories( ${OpenCamLib_SOURCE_DIR}/algo ) -include_directories( ${OpenCamLib_SOURCE_DIR}/dropcutter ) -include_directories( ${OpenCamLib_SOURCE_DIR}/common ) -include_directories( ${OpenCamLib_SOURCE_DIR} ) - -# strip away /usr/local/ because that is what CMAKE_INSTALL_PREFIX is set to -# also, since there is no leading "/", it makes ${Python_site_packages} a relative path. -STRING(REGEX REPLACE "/usr/local/(.*)$" "\\1" Python_site_packages "${Python_site_packages}" ) -STRING(REGEX REPLACE "/usr/local/(.*)$" "\\1" Python_arch_packages "${Python_arch_packages}" ) - -message(STATUS "CMAKE_INSTALL_PREFIX is : " ${CMAKE_INSTALL_PREFIX}) -message(STATUS "Python modules will be installed to: " ${Python_site_packages}) -message(STATUS "Python libraries will be installed to: " ${Python_arch_packages}) +add_subdirectory( ${OpenCamLib_SOURCE_DIR}/cutters ) +add_subdirectory( ${OpenCamLib_SOURCE_DIR}/geo ) +add_subdirectory( ${OpenCamLib_SOURCE_DIR}/algo ) +add_subdirectory( ${OpenCamLib_SOURCE_DIR}/dropcutter ) +add_subdirectory( ${OpenCamLib_SOURCE_DIR}/common ) + +if (BUILD_NODEJS_LIB) + include(${CMAKE_CURRENT_SOURCE_DIR}/nodejslib/nodejslib.cmake) +endif (BUILD_NODEJS_LIB) if (BUILD_PY_LIB) - # this makes the ocl Python module - add_library( - ocl - MODULE - ocl_cutters.cpp - ocl_geometry.cpp - ocl_algo.cpp - ocl_dropcutter.cpp - ocl.cpp - - ) - - message(STATUS "linking python binary ocl.so with boost: " ${Boost_PYTHON_LIBRARY}) - target_link_libraries(ocl ocl_common ocl_dropcutter ocl_cutters ocl_geo ocl_algo ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} -lboost_python -lboost_system) - # - # this makes the lib name ocl.so and not libocl.so - set_target_properties(ocl PROPERTIES PREFIX "") - if (WIN32) - set_target_properties(ocl PROPERTIES VERSION ${MY_VERSION}) - endif (WIN32) - - install( - TARGETS ocl - LIBRARY DESTINATION ${Python_arch_packages} - ) - # these are the python helper lib-files such as camvtk.py - install( - DIRECTORY lib/ - DESTINATION ${Python_site_packages} - # PATTERN .svn EXCLUDE - ) + include(${CMAKE_CURRENT_SOURCE_DIR}/pythonlib/pythonlib.cmake) endif (BUILD_PY_LIB) - # this is the C++ shared library if (BUILD_CXX_LIB) - add_library( - libocl - SHARED - ${OCL_GEO_SRC} - ${OCL_CUTTER_SRC} - ${OCL_ALGO_SRC} - ${OCL_DROPCUTTER_SRC} - ${OCL_COMMON_SRC} - ) - set_target_properties(libocl PROPERTIES PREFIX "") - set_target_properties(libocl PROPERTIES VERSION ${MY_VERSION}) - install( - TARGETS libocl - LIBRARY - DESTINATION lib/opencamlib - ARCHIVE DESTINATION lib/opencamlib - PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - ) - - # this installs the c++ include headers - install( - FILES ${OCL_INCLUDE_FILES} - DESTINATION include/opencamlib - PERMISSIONS OWNER_READ GROUP_READ WORLD_READ - ) + include(${CMAKE_CURRENT_SOURCE_DIR}/cxxlib/cxxlib.cmake) endif (BUILD_CXX_LIB) +if (BUILD_EMSCRIPTEN_LIB) + include(${CMAKE_CURRENT_SOURCE_DIR}/emscriptenlib/emscriptenlib.cmake) +endif (BUILD_EMSCRIPTEN_LIB) # # this installs the examples diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/brent_zero.hpp opencamlib-11.10-1/src/common/brent_zero.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/brent_zero.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/brent_zero.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #ifndef BRENT_ZERO_H #define BRENT_ZERO_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/clfilter.hpp opencamlib-11.10-1/src/common/clfilter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/clfilter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/clfilter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef CLFILTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/halfedgediagram.hpp opencamlib-11.10-1/src/common/halfedgediagram.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/halfedgediagram.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/halfedgediagram.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef HALFEDGEDIAGRAM_HPP #define HALFEDGEDIAGRAM_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/kdnode.hpp opencamlib-11.10-1/src/common/kdnode.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/kdnode.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/kdnode.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #ifndef KDNODE_H #define KDNODE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/kdtree.hpp opencamlib-11.10-1/src/common/kdtree.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/kdtree.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/kdtree.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef KDTREE_H @@ -72,10 +74,12 @@ template class KDTree { public: - KDTree() {}; + KDTree() { + root = nullptr; + } virtual ~KDTree() { - // std::cout << " ~KDTree()\n"; - delete root; + // std::cout << " ~KDTree()" << std::endl; + delete root; } /// set the bucket-size void setBucketSize(int b){ @@ -112,7 +116,8 @@ /// build the kd-tree based on a list of input objects void build(const std::list& list){ //std::cout << "KDTree::build() list.size()= " << list.size() << " \n"; - root = build_node( &list, 0, NULL ); + delete root; + root = build_node( &list, 0, NULL ); } /// search for overlap with input Bbox bb, return found objects std::list* search( const Bbox& bb ){ diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/lineclfilter.cpp opencamlib-11.10-1/src/common/lineclfilter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/lineclfilter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/lineclfilter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include "lineclfilter.hpp" diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/lineclfilter.hpp opencamlib-11.10-1/src/common/lineclfilter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/lineclfilter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/lineclfilter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef LINE_CL_FILTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/lineclfilter_py.hpp opencamlib-11.10-1/src/common/lineclfilter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/lineclfilter_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/lineclfilter_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef LINE_CL_FILTER_PY_H -#define LINE_CL_FILTER_PY_H - -#include - -#include "lineclfilter.hpp" - -namespace ocl -{ -/// python wrapper for lineclfilter -class LineCLFilter_py : public LineCLFilter { - public: - LineCLFilter_py() : LineCLFilter() {}; - /// return a list of CL-points to python - boost::python::list getCLPoints() { - // return points to python - boost::python::list plist; - BOOST_FOREACH(CLPoint p, clpoints) { - plist.append(p); - } - return plist; - }; -}; - -} // end namespace -#endif -// end file lineclfilter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/numeric.cpp opencamlib-11.10-1/src/common/numeric.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/numeric.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/numeric.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include #include // for fabs() #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/numeric.hpp opencamlib-11.10-1/src/common/numeric.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/common/numeric.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/common/numeric.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef NUMERIC_H #define NUMERIC_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ballcutter.cpp opencamlib-11.10-1/src/cutters/ballcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ballcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/ballcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ballcutter.hpp opencamlib-11.10-1/src/cutters/ballcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ballcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/ballcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #ifndef BALL_CUTTER_H #define BALL_CUTTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/bullcutter.cpp opencamlib-11.10-1/src/cutters/bullcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/bullcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/bullcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include #include #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/bullcutter.hpp opencamlib-11.10-1/src/cutters/bullcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/bullcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/bullcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef BULL_CUTTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/compositecutter.cpp opencamlib-11.10-1/src/cutters/compositecutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/compositecutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/compositecutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,22 +1,23 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. +/* $Id$ * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * - * OpenCAMlib is distributed in the hope that it will be useful, + * 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. + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with OpenCAMlib. If not, see . + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include #include #include @@ -59,7 +60,7 @@ return cutter[idx]->height(r) + zoffset[idx]; } -// return the width of the cutter at height h. +// return the width of the cutter at height h. double CompositeCutter::width(double h) const { unsigned int idx = height_to_index(h); // std::cout << "CompositeCutter::width( " << h << " ) idx=" << idx << " zoffset= " << zoffset[idx] << "\n"; @@ -90,7 +91,7 @@ } bool CompositeCutter::ccValidRadius(unsigned int n, CLPoint& cl) const { - if (cl.cc->type == NONE) + if (cl.cc.load()->type == NONE) return false; double d = cl.xyDistance(*cl.cc); double lolimit; @@ -207,7 +208,7 @@ contacts.push_back( std::pair(ci.lower, ci.lower_cc) ); } } - + for( unsigned int n=0; n(ci.lower, ci.lower_cc) ); } } - + for( unsigned int n=0; n(ci.lower, ci.lower_cc) ); } } - + for( unsigned int n=0; n. + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef COMPOSITE_CUTTER_H @@ -47,7 +49,7 @@ MillingCutter* offsetCutter(double d) const; - /// CompositeCutter can not use the base-class facetDrop, intstead we here + /// CompositeCutter can not use the base-class facetDrop, instead we here /// call facetDrop() on each cutter in turn, and pick the valid CC/CL point /// as the result for the CompositeCutter bool facetDrop(CLPoint &cl, const Triangle &t) const; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/conecutter.cpp opencamlib-11.10-1/src/cutters/conecutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/conecutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/conecutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/conecutter.hpp opencamlib-11.10-1/src/cutters/conecutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/conecutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/conecutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,22 +1,23 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #ifndef CONE_CUTTER_HPP #define CONE_CUTTER_HPP diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/cylcutter.cpp opencamlib-11.10-1/src/cutters/cylcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/cylcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/cylcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -32,7 +33,7 @@ { CylCutter::CylCutter() { - std::cout << " usage: CylCutter( double diameter, double length ) \n"; + // std::cout << " usage: CylCutter( double diameter, double length ) \n"; assert(0); } diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/cylcutter.hpp opencamlib-11.10-1/src/cutters/cylcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/cylcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/cylcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef CYL_CUTTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipse.cpp opencamlib-11.10-1/src/cutters/ellipse.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipse.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/ellipse.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipse.hpp opencamlib-11.10-1/src/cutters/ellipse.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipse.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/ellipse.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef ELLIPSE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipseposition.cpp opencamlib-11.10-1/src/cutters/ellipseposition.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipseposition.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/ellipseposition.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -38,7 +39,7 @@ } void EllipsePosition::setDiangle(double dia) { - assert( !isnan(dia) ); + assert( !std::isnan(dia) ); diangle = dia; setD(); } @@ -50,7 +51,7 @@ // return P2( (a < 2 ? 1-a : a-3), // (a < 3 ? ((a > 1) ? 2-a : a) : a-4) double d = diangle; - assert( !isnan(d) ); + assert( !std::isnan(d) ); while ( d > 4.0 ) // make d a diangle in [0,4] d -= 4.0; while ( d < 0.0) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipseposition.hpp opencamlib-11.10-1/src/cutters/ellipseposition.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/ellipseposition.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/ellipseposition.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef ELLIPSEPOSITION_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/millingcutter.cpp opencamlib-11.10-1/src/cutters/millingcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/millingcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/millingcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/millingcutter.hpp opencamlib-11.10-1/src/cutters/millingcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/millingcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/millingcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef MILLING_CUTTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/millingcutter_py.hpp opencamlib-11.10-1/src/cutters/millingcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cutters/millingcutter_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/cutters/millingcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef MILLING_CUTTER_PY_H -#define MILLING_CUTTER_PY_H - -#include - -#include "millingcutter.hpp" - -namespace ocl -{ - -/* required wrapper class for virtual functions in boost-python */ -/// \brief a wrapper required for boost-python -// see documentation: -// http://www.boost.org/doc/libs/1_43_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.inheritance -class MillingCutter_py : public MillingCutter, public boost::python::wrapper -{ - public: - // vertex - bool vertexDrop(CLPoint &cl, const Triangle &t) const { - if ( boost::python::override ovr_vertexDrop = this->get_override("vertexDrop")) - return ovr_vertexDrop(cl, t); - return MillingCutter::vertexDrop(cl, t); - } - /// python-wrapper boilerplate... - bool default_vertexDrop(CLPoint &cl, const Triangle &t) const { - return this->MillingCutter::vertexDrop(cl,t); - } - - // facet - bool facetDrop(CLPoint &cl, const Triangle &t) const { - if ( boost::python::override ovr_facetDrop = this->get_override("facetDrop")) - return ovr_facetDrop(cl, t); - return MillingCutter::facetDrop(cl, t); - } - /// python-wrapper boilerplate... - bool default_facetDrop(CLPoint &cl, const Triangle &t) const { - return this->MillingCutter::facetDrop(cl,t); - } - - - // edge - bool edgeDrop(CLPoint &cl, const Triangle &t) const { - if ( boost::python::override ovr_edgeDrop = this->get_override("edgeDrop")) - return ovr_edgeDrop(cl, t); - return MillingCutter::edgeDrop(cl, t); - } - /// python-wrapper boilerplate... - bool default_edgeDrop(CLPoint &cl, const Triangle &t) const { - return this->MillingCutter::edgeDrop(cl,t); - } - - MillingCutter* offsetCutter(double d) const { - if ( boost::python::override ovr_offsetCutter = this->get_override("offsetCutter") ) - return ovr_offsetCutter(d); - return MillingCutter::offsetCutter(d); - } - /// python-wrapper boilerplate... - MillingCutter* default_offsetCutter(double d) const { - return this->MillingCutter::offsetCutter(d); - } - - std::string str() const { - if ( boost::python::override ovr_str = this->get_override("str")) { - return ovr_str(); - } - return MillingCutter::str(); - } - /// python-wrapper boilerplate... - std::string default_str() const { - return this->MillingCutter::str(); - } -}; - -} // end namespace -#endif -// end file millingcutter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cxxlib/cxxlib.cmake opencamlib-11.10-1/src/cxxlib/cxxlib.cmake --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/cxxlib/cxxlib.cmake 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/cxxlib/cxxlib.cmake 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,36 @@ +find_package(Boost) +include_directories(${Boost_INCLUDE_DIRS}) + +# include dirs +include_directories( ${OpenCamLib_SOURCE_DIR}/cutters ) +include_directories( ${OpenCamLib_SOURCE_DIR}/geo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/algo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/dropcutter ) +include_directories( ${OpenCamLib_SOURCE_DIR}/common ) +include_directories( ${OpenCamLib_SOURCE_DIR} ) + +add_library( + libocl + SHARED + ${OCL_GEO_SRC} + ${OCL_CUTTER_SRC} + ${OCL_ALGO_SRC} + ${OCL_DROPCUTTER_SRC} + ${OCL_COMMON_SRC} + ) +set_target_properties(libocl PROPERTIES PREFIX "") +set_target_properties(libocl PROPERTIES VERSION ${MY_VERSION}) +install( + TARGETS libocl + LIBRARY + DESTINATION lib/opencamlib + ARCHIVE DESTINATION lib/opencamlib + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + ) + +# this installs the c++ include headers +install( + FILES ${OCL_INCLUDE_FILES} + DESTINATION include/opencamlib + PERMISSIONS OWNER_READ GROUP_READ WORLD_READ + ) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/deb/debian_copyright.txt opencamlib-11.10-1/src/deb/debian_copyright.txt --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/deb/debian_copyright.txt 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/deb/debian_copyright.txt 2020-06-14 12:13:19.000000000 +0000 @@ -17,17 +17,17 @@ License: This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2.1 of the License, or (at your option) any later version. - - This package is distributed in the hope that it will be useful, + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . -On Debian systems, the complete text of the GNU General -Public License version 3 can be found in `/usr/share/common-licenses/GPL-3'. +On Debian systems, the complete text of the GNU Lesser General +Public License version 2.1 can be found in `/usr/share/common-licenses/LGPL-2.1'. diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/deb/DebSourcePPA.cmake opencamlib-11.10-1/src/deb/DebSourcePPA.cmake --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/deb/DebSourcePPA.cmake 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/deb/DebSourcePPA.cmake 2020-06-14 12:13:19.000000000 +0000 @@ -90,7 +90,7 @@ # remove unnecessary folders foreach(REMOVE_DIR ${CPACK_DEBIAN_PACKAGE_REMOVE_SOURCE_FILES}) - MESSAGE(STATUS "Removing direcotry from source-orig-dir. " ${REMOVE_DIR}) + MESSAGE(STATUS "Removing directory from source-orig-dir. " ${REMOVE_DIR}) file(REMOVE_RECURSE ${DEBIAN_SOURCE_ORIG_DIR}.orig/${REMOVE_DIR}) endforeach() @@ -169,7 +169,7 @@ ############################################################################## # debian/copyright - MESSAGE(STATUS " creating debian/coyright.") + MESSAGE(STATUS " creating debian/copyright.") set(DEBIAN_COPYRIGHT ${DEBIAN_SOURCE_DIR}/debian/copyright) execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_RESOURCE_FILE_LICENSE} ${DEBIAN_COPYRIGHT} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/Doxyfile opencamlib-11.10-1/src/Doxyfile --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/Doxyfile 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/Doxyfile 2020-06-14 12:13:19.000000000 +0000 @@ -1134,7 +1134,8 @@ # generate an XML file that captures the structure of # the code including all documentation. -GENERATE_XML = NO +# 2018-08: generate XML, for breathe -> sphinx -> readthedocs +GENERATE_XML = YES # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/adaptivepathdropcutter.cpp opencamlib-11.10-1/src/dropcutter/adaptivepathdropcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/adaptivepathdropcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/adaptivepathdropcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -31,6 +32,7 @@ //******** ********************** */ AdaptivePathDropCutter::AdaptivePathDropCutter() { + // std::cout << " AdaptivePathDropCutter() " << std::endl; cutter = NULL; surf = NULL; path = NULL; @@ -43,8 +45,9 @@ } AdaptivePathDropCutter::~AdaptivePathDropCutter() { - //std::cout << " ~AdaptivePathDropCutter() \n"; + // std::cout << " ~AdaptivePathDropCutter() " << std::endl; delete subOp[0]; + subOp.clear(); } void AdaptivePathDropCutter::run() { diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/adaptivepathdropcutter.hpp opencamlib-11.10-1/src/dropcutter/adaptivepathdropcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/adaptivepathdropcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/adaptivepathdropcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef ADAPTIVEPATHDROPCUTTER_H @@ -69,7 +70,12 @@ subOp[0]->clearCLPoints(); } - protected: + std::vector getPoints() const + { + return clpoints; + } + + protected: /// run adaptive sample on the given Span between t-values of start_t and stop_t void adaptive_sample(const Span* span, double start_t, double stop_t, CLPoint start_cl, CLPoint stop_cl); /// flatness predicate for adaptive sampling diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/adaptivepathdropcutter_py.hpp opencamlib-11.10-1/src/dropcutter/adaptivepathdropcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/adaptivepathdropcutter_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/adaptivepathdropcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef ADAPTIVEPATHDROPCUTTER_PY_H -#define ADAPTIVEPATHDROPCUTTER_PY_H - -#include - -#include "adaptivepathdropcutter.hpp" - -namespace ocl -{ - -/// Python wrapper for PathDropCutter -class AdaptivePathDropCutter_py : public AdaptivePathDropCutter { - public: - AdaptivePathDropCutter_py() : AdaptivePathDropCutter() {} - virtual ~AdaptivePathDropCutter_py() {} - /// return a list of CL-points to python - boost::python::list getCLPoints_py() { - //std::cout << " apdc_py::getCLPoints_py()..."; - boost::python::list plist; - BOOST_FOREACH(CLPoint p, clpoints) { - plist.append(p); - } - //std::cout << " DONE.\n"; - return plist; - } -}; - -} // end namespace -#endif -// end file adaptivepathdropcutter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/batchdropcutter.cpp opencamlib-11.10-1/src/dropcutter/batchdropcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/batchdropcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/batchdropcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,20 +1,22 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -138,10 +140,11 @@ std::list* tris; #ifdef _WIN32 // OpenMP version 2 of VS2013 OpenMP need signed loop variable int n; // loop variable + int Nmax = clpoints->size(); #else unsigned int n; // loop variable -#endif unsigned int Nmax = clpoints->size(); +#endif std::vector& clref = *clpoints; int nloop=0; #ifdef _OPENMP @@ -159,7 +162,7 @@ #endif nloop++; tris = root->search_cutter_overlap( cutter, &clref[n] ); - assert( tris->size() <= ntriangles ); // can't possibly find more triangles than in the STLSurf + // assert( tris->size() <= ntriangles ); // can't possibly find more triangles than in the STLSurf for( it=tris->begin(); it!=tris->end() ; ++it) { // loop over found triangles if ( cutter->overlaps(clref[n],*it) ) { // cutter overlap triangle? check if (clref[n].below(*it)) { @@ -199,11 +202,12 @@ long int ntris = 0; std::list* tris; #ifdef _WIN32 // OpenMP version 2 of VS2013 OpenMP need signed loop variable + int Nmax = clpoints->size(); int n; // loop variable #else + unsigned int Nmax = clpoints->size(); unsigned int n; // loop variable #endif - unsigned int Nmax = clpoints->size(); std::vector& clref = *clpoints; int nloop=0; @@ -223,7 +227,7 @@ nloop++; tris = root->search_cutter_overlap( cutter, &clref[n] ); assert( tris ); - assert( tris->size() <= ntriangles ); // can't possibly find more triangles than in the STLSurf + // assert( tris->size() <= ntriangles ); // can't possibly find more triangles than in the STLSurf for( it=tris->begin(); it!=tris->end() ; ++it) { // loop over found triangles if ( cutter->overlaps(clref[n],*it) ) { // cutter overlap triangle? check if (clref[n].below(*it)) { diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/batchdropcutter.hpp opencamlib-11.10-1/src/dropcutter/batchdropcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/batchdropcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/batchdropcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef BDC_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/batchdropcutter_py.hpp opencamlib-11.10-1/src/dropcutter/batchdropcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/batchdropcutter_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/batchdropcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef BDC_PY_H -#define BDC_PY_H - -#include -#include - -#include "batchdropcutter.hpp" - -namespace ocl -{ - -/// Python wrapper for BatchDropCutter -class BatchDropCutter_py : public BatchDropCutter { - public: - BatchDropCutter_py() : BatchDropCutter() {}; - /// return CL-points to Python - boost::python::list getCLPoints_py() { - boost::python::list plist; - BOOST_FOREACH(CLPoint p, *clpoints) { - plist.append(p); - } - return plist; - }; - /// return triangles under cutter to Python. Not for CAM-algorithms, - /// more for visualization and demonstration. - boost::python::list getTrianglesUnderCutter(CLPoint& cl, MillingCutter& cutter) { - boost::python::list trilist; - std::list *triangles_under_cutter = new std::list(); - triangles_under_cutter = root->search_cutter_overlap( &cutter , &cl); - BOOST_FOREACH(Triangle t, *triangles_under_cutter) { - trilist.append(t); - } - delete triangles_under_cutter; - return trilist; - }; -}; - -} // end namespace - -#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pathdropcutter.cpp opencamlib-11.10-1/src/dropcutter/pathdropcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pathdropcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/pathdropcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -41,6 +42,7 @@ PathDropCutter::~PathDropCutter() { delete subOp[0]; + subOp.clear(); } void PathDropCutter::setPath(const Path *p) { diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pathdropcutter.hpp opencamlib-11.10-1/src/dropcutter/pathdropcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pathdropcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/pathdropcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef PATHDROPCUTTER_H @@ -54,10 +55,14 @@ double getZ() const { return minimumZ; } + std::vector getPoints() const + { + return clpoints; + } /// run drop-cutter on the whole Path virtual void run(); - - protected: + + protected: /// the path to follow const Path* path; /// the lowest z height, used when no triangles are touched, default is minimumZ = 0.0 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pathdropcutter_py.hpp opencamlib-11.10-1/src/dropcutter/pathdropcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pathdropcutter_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/pathdropcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#ifndef PATHDROPCUTTER_PY_H -#define PATHDROPCUTTER_PY_H - -#include -#include - -#include "pathdropcutter.hpp" - -namespace ocl -{ - -/// Python wrapper for PathDropCutter -class PathDropCutter_py : public PathDropCutter { - public: - PathDropCutter_py() : PathDropCutter() {}; - /// return a list of CL-points to python - boost::python::list getCLPoints_py() { - boost::python::list plist; - BOOST_FOREACH(CLPoint p, clpoints) { - plist.append(p); - } - return plist; - }; -}; - -} // end namespace -#endif -// end file pathdropcutter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pointdropcutter.cpp opencamlib-11.10-1/src/dropcutter/pointdropcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pointdropcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/pointdropcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pointdropcutter.hpp opencamlib-11.10-1/src/dropcutter/pointdropcutter.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/dropcutter/pointdropcutter.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/dropcutter/pointdropcutter.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #ifndef POINTDROPCUTTER_H #define POINTDROPCUTTER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/build.sh opencamlib-11.10-1/src/emscriptenlib/build.sh --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/build.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/build.sh 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,16 @@ +#!/bin/sh + +rm -rf ../../buildemscripten || true +mkdir ../../buildemscripten +cd ../../buildemscripten +emcmake cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_CPP_LIB="OFF" \ + -DBUILD_EMSCRIPTEN_LIB="ON" \ + -DUSE_OPENMP="OFF" \ + -DBoost_INCLUDE_DIR="/usr/local/Cellar/boost/1.68.0/include" +emmake make -j4 +cp src/opencamlib.* ../src/emscriptenlib +cd ../src/emscriptenlib +./node_modules/.bin/browserify test.src.js > test.js +./node_modules/.bin/browserify index.js > pkg/index.js diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/emscriptenlib.cmake opencamlib-11.10-1/src/emscriptenlib/emscriptenlib.cmake --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/emscriptenlib.cmake 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/emscriptenlib.cmake 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,34 @@ +message(STATUS "Will build emscripten js library") + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g4 -O0") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --bind -s MODULARIZE=1 -s SINGLE_FILE=1 -s ALLOW_MEMORY_GROWTH=1") + +find_package(Boost) +include_directories(${Boost_INCLUDE_DIRS}) + +# include dirs +include_directories( ${OpenCamLib_SOURCE_DIR}/cutters ) +include_directories( ${OpenCamLib_SOURCE_DIR}/geo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/algo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/dropcutter ) +include_directories( ${OpenCamLib_SOURCE_DIR}/common ) +include_directories( ${OpenCamLib_SOURCE_DIR} ) + +include_directories(${OpenCamLib_SOURCE_DIR}/emscriptenlib) + +add_executable(opencamlib + # SHARED + ${OCL_GEO_SRC} + ${OCL_CUTTER_SRC} + ${OCL_DROPCUTTER_SRC} + ${OCL_ALGO_SRC} + ${OCL_COMMON_SRC} + ${OpenCamLib_SOURCE_DIR}/emscriptenlib/emscriptenlib.cpp +) + +target_link_libraries( + opencamlib + ${Boost_LIBRARIES} +) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/emscriptenlib.cpp opencamlib-11.10-1/src/emscriptenlib/emscriptenlib.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/emscriptenlib.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/emscriptenlib.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,376 @@ +#include +#include + +// GEOMETRY +#include "point.hpp" +#include "ccpoint.hpp" +#include "clpoint.hpp" +#include "triangle.hpp" +#include "bbox.hpp" +#include "path.hpp" +#include "line.hpp" +#include "ellipse.hpp" +#include "ellipseposition.hpp" + +// STL +#include "stlsurf.hpp" +#include "stlreader.hpp" + +// ALGO +#include "operation.hpp" +#include "waterline.hpp" +#include "adaptivepathdropcutter.hpp" +#include "adaptivewaterline.hpp" +// #include "zigzag.hpp" +#include "weave.hpp" +#include "lineclfilter.hpp" +// #include "clsurface.hpp" + +// CUTTERS +#include "millingcutter.hpp" +#include "cylcutter.hpp" +#include "ballcutter.hpp" +#include "bullcutter.hpp" +#include "conecutter.hpp" + +using namespace emscripten; +using namespace ocl; + +EMSCRIPTEN_BINDINGS(opencamlib) +{ + ////////////// + // GEOMETRY // + ////////////// + class_("Point") + .constructor() + .constructor() + .constructor() + .constructor() + .function("norm", &Point::norm) + .function("xyNorm", &Point::xyNorm) + .function("normalize", &Point::normalize) + .function("dot", &Point::dot) + .function("cross", &Point::cross) + .function("xRotate", &Point::xRotate) + .function("yRotate", &Point::yRotate) + .function("zRotate", &Point::zRotate) + .function("isRight", &Point::isRight) + //.function("isInside", &Point::isInside) + //.function("isInsidePoints", &Point::isInside) + .function("xyDistance", &Point::xyDistance) + .function("__str__", &Point::str) + .property("x", &Point::x) + .property("y", &Point::y) + .property("z", &Point::z); + + class_>("CLPoint") + .constructor() + .constructor() + .constructor() + .function("__str__", &CLPoint::str) + .function("cc", &CLPoint::getCC) + .function("getCC", &CLPoint::getCC); + + class_>("CCPoint") + .constructor() + .constructor() + .function("__str__", &CCPoint::str); + // .property("type", &CCPoint::type) // @todo figure out the problem + + class_("Triangle") + .constructor() + .constructor(); + + enum_("CCType") + .value("NONE", NONE) + .value("VERTEX", VERTEX) + .value("VERTEX_CYL", VERTEX_CYL) + .value("EDGE", EDGE) + .value("EDGE_SHAFT", EDGE_SHAFT) + .value("EDGE_HORIZ", EDGE_HORIZ) + .value("EDGE_CYL", EDGE_CYL) + .value("EDGE_BALL", EDGE_BALL) + .value("EDGE_CONE", EDGE_CONE) + .value("EDGE_CONE_BASE", EDGE_CONE_BASE) + .value("EDGE_HORIZ_CYL", EDGE_HORIZ_CYL) + .value("EDGE_HORIZ_TOR", EDGE_HORIZ_TOR) + .value("EDGE_POS", EDGE_POS) + .value("EDGE_NEG", EDGE_NEG) + .value("FACET", FACET) + .value("FACET_TIP", FACET_TIP) + .value("FACET_CYL", FACET_CYL) + .value("ERROR", ERROR); + + class_("STLReader") + .constructor(); + + class_("STLSurf") + .constructor() + .function("addTriangle", &STLSurf::addTriangle) + .function("size", &STLSurf::size); + + class_("Bbox") + .function("isInside", &Bbox::isInside) + .property("maxpt", &Bbox::maxpt) + .property("minpt", &Bbox::minpt); + + // Epos and the Ellipse are used for the toroidal tool edge-tests + class_("EllipsePosition") + .property("s", &EllipsePosition::s) + .property("t", &EllipsePosition::t) + .function("setDiangle", &EllipsePosition::setDiangle) + .function("__str__", &EllipsePosition::str); + + // class_("Ellipse") + // .constructor() + // .function("ePoint", &Ellipse::ePoint) + // .function("oePoint", &Ellipse::oePoint) + // .function("normal", &Ellipse::normal); + + class_("Line") + .constructor() + .constructor() + .property("p1", &Line::p1) + .property("p2", &Line::p2); + + class_("Arc") + .constructor() + .constructor() + .property("p1", &Arc::p1) + .property("p2", &Arc::p2) + .property("c", &Arc::c) + .property("dir", &Arc::dir); + + enum_("SpanType") + .value("LineSpanType", LineSpanType) + .value("ArcSpanType", ArcSpanType); + + class_("Path") + .constructor() + .constructor() + .function("appendLine", static_cast(&Path::append)) + .function("appendArc", static_cast(&Path::append)); + + ////////// + // ALGO // + ////////// + class_("Operation") + .function("setCutter", &Operation::setCutter, allow_raw_pointers()) + .function("getCLPoints", &Operation::getCLPoints) + .function("setSTL", &Operation::setSTL, allow_raw_pointers()) + .function("setSampling", &Operation::setSampling); + + class_>("BatchDropCutter") + .constructor() + .function("run", &BatchDropCutter::run); + // .function("setSTL", &BatchDropCutter::setSTL) + // .function("setCutter", &BatchDropCutter::setCutter) + // .function("setThreads", &BatchDropCutter::setThreads) + // .function("getThreads", &BatchDropCutter::getThreads) + // .function("appendPoint", &BatchDropCutter::appendPoint) + // .function("getTrianglesUnderCutter", &BatchDropCutter::getTrianglesUnderCutter) + // .function("getCalls", &BatchDropCutter::getCalls) + // .function("getBucketSize", &BatchDropCutter::getBucketSize) + // .function("setBucketSize", &BatchDropCutter::setBucketSize); + + class_>("PathDropCutter") + .constructor() + .function("run", &PathDropCutter::run) + // .function("setCutter", &PathDropCutter::setCutter) + // .function("setSTL", &PathDropCutter::setSTL) + // .function("setSampling", &PathDropCutter::setSampling) + .function("setPath", &PathDropCutter::setPath, allow_raw_pointers()) + .function("getZ", &PathDropCutter::getZ) + .function("setZ", &PathDropCutter::setZ) + .function("getPoints", &PathDropCutter::getPoints); + + class_>("AdaptivePathDropCutter") + .constructor() + .function("run", &AdaptivePathDropCutter::run) + // .function("setCutter", &AdaptivePathDropCutter::setCutter) + // .function("setSTL", &AdaptivePathDropCutter::setSTL) + // .function("setSampling", &AdaptivePathDropCutter::setSampling) + .function("setMinSampling", &AdaptivePathDropCutter::setMinSampling) + .function("setCosLimit", &AdaptivePathDropCutter::setCosLimit) + // .function("getSampling", &AdaptivePathDropCutter::getSampling) + .function("setPath", &AdaptivePathDropCutter::setPath, allow_raw_pointers()) + .function("getZ", &AdaptivePathDropCutter::getZ) + .function("setZ", &AdaptivePathDropCutter::setZ) + .function("getPoints", &AdaptivePathDropCutter::getPoints); + + // class_("ZigZag") + // .function("run", &ZigZag::run) + // .function("setDirection", &ZigZag::setDirection) + // .function("setOrigin", &ZigZag::setOrigin) + // .function("setStepOver", &ZigZag::setStepOver) + // .function("addPoint", &ZigZag::addPoint) + // .function("getOutput", &ZigZag::getOutput) + // .function("__str__", &ZigZag::str); + + class_("BatchPushCutter") + .constructor(); + // class_>("BatchPushCutter") + // .function("run", &BatchPushCutter::run) + // .function("setSTL", &BatchPushCutter::setSTL) + // .function("setCutter", &BatchPushCutter::setCutter) + // .function("setThreads", &BatchPushCutter::setThreads) + // .function("appendFiber", &BatchPushCutter::appendFiber) + // .function("getOverlapTriangles", &BatchPushCutter::getOverlapTriangles) + // .function("getCLPoints", &BatchPushCutter::getCLPoints) + // .function("getFibers", &BatchPushCutter::getFibers) + // .function("getCalls", &BatchPushCutter::getCalls) + // .function("setThreads", &BatchPushCutter::setThreads) + // .function("getThreads", &BatchPushCutter::getThreads) + // .function("setBucketSize", &BatchPushCutter::setBucketSize) + // .function("getBucketSize", &BatchPushCutter::getBucketSize) + // .function("setXDirection", &BatchPushCutter::setXDirection) + // .function("setYDirection", &BatchPushCutter::setYDirection); + + class_("Interval") + .constructor() + .property("upper", &Interval::upper) + .property("lower", &Interval::lower) + .property("lower_cc", &Interval::lower_cc) + .property("upper_cc", &Interval::upper_cc) + .function("updateUpper", &Interval::updateUpper) + .function("updateLower", &Interval::updateLower) + .function("empty", &Interval::empty) + .function("__str__", &Interval::str); + + class_("Fiber") + .constructor(); + + // class_>("Fiber") + // .constructor() + // .property("p1", &Fiber::p1) + // .property("p2", &Fiber::p2) + // .property("dir", &Fiber::dir) + // .function("addInterval", &Fiber::addInterval) + // .function("point", &Fiber::point) + // .function("printInts", &Fiber::printInts) + // .function("getInts", &Fiber::getInts); + + register_vector("std::vector"); + register_vector("std::vector"); + register_vector>("std::vector>"); + + class_>("Waterline") + .constructor() + .function("setZ", &Waterline::setZ) + .function("run", &Waterline::run) + .function("getLoops", &Waterline::getLoops); + + // class_>("Waterline") + // .function("setCutter", &Waterline::setCutter) + // .function("setSTL", &Waterline::setSTL) + // .function("setZ", &Waterline::setZ) + // .function("setSampling", &Waterline::setSampling) + // .function("run", &Waterline::run) + // .function("run2", &Waterline::run2) + // .function("reset", &Waterline::reset) + // .function("getLoops", &Waterline::py_getLoops) + // .function("setThreads", &Waterline::setThreads) + // .function("getThreads", &Waterline::getThreads) + // .function("getXFibers", &Waterline::py_getXFibers) + // .function("getYFibers", &Waterline::py_getYFibers); + + class_>("AdaptiveWaterline") + .constructor() + // .function("setZ", &AdaptiveWaterline::setZ) + .function("setMinSampling", &AdaptiveWaterline::setMinSampling); + // .function("run", &AdaptiveWaterline::run); + // class_>("AdaptiveWaterline") + // .function("setCutter", &AdaptiveWaterline::setCutter) + // .function("setSTL", &AdaptiveWaterline::setSTL) + // .function("setZ", &AdaptiveWaterline::setZ) + // .function("setSampling", &AdaptiveWaterline::setSampling) + // .function("setMinSampling", &AdaptiveWaterline::setMinSampling) + // .function("run", &AdaptiveWaterline::run) + // .function("run2", &AdaptiveWaterline::run2) + // .function("reset", &AdaptiveWaterline::reset) + // //.function("run2", &AdaptiveWaterline::run2) // uses Weave::build2() + // .function("getLoops", &AdaptiveWaterline::py_getLoops) + // .function("setThreads", &AdaptiveWaterline::setThreads) + // .function("getThreads", &AdaptiveWaterline::getThreads) + // .function("getXFibers", &AdaptiveWaterline::getXFibers) + // .function("getYFibers", &AdaptiveWaterline::getYFibers); + + enum_("WeaveVertexType") + .value("CL", weave::CL) + .value("CL_DONE", weave::CL_DONE) + .value("ADJ", weave::ADJ) + .value("TWOADJ", weave::TWOADJ) + .value("INT", weave::INT) + .value("FULLINT", weave::FULLINT); + + class_("LineCLFilter") + .constructor(); + // class_>("LineCLFilter") + // .function("addCLPoint", &LineCLFilter::addCLPoint) + // .function("setTolerance", &LineCLFilter::setTolerance) + // .function("run", &LineCLFilter::run) + // .function("getCLPoints", &LineCLFilter::getCLPoints); + + // some strange problem with hedi::face_edges()... let's not compile for now.. + // class_("CutterLocationSurface") + // .constructor() + // .function("run", &clsurf::CutterLocationSurface::run) + // .function("setMinSampling", &clsurf::CutterLocationSurface::setMinSampling) + // .function("setSampling", &clsurf::CutterLocationSurface::setSampling) + // .function("setSTL", &clsurf::CutterLocationSurface::setSTL) + // .function("setCutter", &clsurf::CutterLocationSurface::setCutter) + // .function("getVertices", &clsurf::CutterLocationSurface::getVertices) + // .function("getEdges", &clsurf::CutterLocationSurface::getEdges) + // .function("__str__", &clsurf::CutterLocationSurface::str); + /* + class_< tsp::TSPSolver >("TSPSolver") + .function("addPoint", &tsp::TSPSolver::addPoint) + .function("run", &tsp::TSPSolver::run) + .function("getOutput", &tsp::TSPSolver::getOutput) + .function("getLength", &tsp::TSPSolver::getLength) + .function("reset", &tsp::TSPSolver::reset) + ; + */ + + ///////////// + // CUTTERS // + ///////////// + class_("MillingCutter"); + // .function("vertexDrop", &MillingCutter::vertexDrop) + // .function("facetDrop", &MillingCutter::facetDrop) + // .function("edgeDrop", &MillingCutter::edgeDrop) + // .function("dropCutter", &MillingCutter::dropCutter) + // .function("pushCutter", &MillingCutter::pushCutter) + // .function("offsetCutter", &MillingCutter::offsetCutter) + // .function("__str__", &MillingCutter::str) + // .function("getRadius", &MillingCutter::getRadius) + // .function("getLength", &MillingCutter::getLength) + // .function("getDiameter", &MillingCutter::getDiameter); + + class_>("CylCutter") + .constructor(); + // .function("dropCutterSTL", &CylCutter::dropCutterSTL); + + class_>("BallCutter") + .constructor(); + // .function("dropCutterSTL", &BallCutter::dropCutterSTL); + + class_>("BullCutter") + .constructor(); + class_>("ConeCutter") + .constructor(); + + // class_>("CompCylCutter") + // .constructor(); + // class_>("CompBallCutter") + // .constructor(); + + // class_>("CylConeCutter") + // .constructor(); + // class_>("BallConeCutter") + // .constructor(); + // class_>("BullConeCutter") + // .constructor(); + // class_>("ConeConeCutter") + // .constructor(); +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/index.html opencamlib-11.10-1/src/emscriptenlib/index.html --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/index.html 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/index.html 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,12 @@ + + + + + + + OpenCAMLib + + + + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/index.js opencamlib-11.10-1/src/emscriptenlib/index.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/index.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/index.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,5 @@ +if (typeof window !== 'undefined') { + window.ocl = require('./opencamlib')() +} + +module.exports = require('./opencamlib')() \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/opencamlib.js opencamlib-11.10-1/src/emscriptenlib/opencamlib.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/opencamlib.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/opencamlib.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,24 @@ + +var Module = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + return ( +function(Module) { + Module = Module || {}; + +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",abort);Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var tempRet0=0;var setTempRet0=(function(value){tempRet0=value});var getTempRet0=(function(){return tempRet0});var GLOBAL_BASE=1024;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NONE=3;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var WASM_PAGE_SIZE=65536;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE=1024,STACK_BASE=46624,DYNAMIC_BASE=5289504,DYNAMICTOP_PTR=46368;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){var PAGE_MULTIPLE=65536;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY>2]=DYNAMIC_BASE;function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmBinaryFile="opencamlib.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted.push(thrown);return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_uncaught_exception(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}function ___gxx_personality_v0(){}function ___lock(){}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function ___map_file(pathname,size){___setErrNo(1);return-1}var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={"1024":flags["O_APPEND"],"64":flags["O_CREAT"],"128":flags["O_EXCL"],"0":flags["O_RDONLY"],"2":flags["O_RDWR"],"4096":flags["O_SYNC"],"512":flags["O_TRUNC"],"1":flags["O_WRONLY"]}}),bufferFrom:(function(arrayBuffer){return Buffer.alloc?Buffer.from(arrayBuffer):new Buffer(arrayBuffer)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsForNode:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),write:(function(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(40)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(40)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 13}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 13}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 13}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return 13;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return 17}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return 20}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 16}}else{if(FS.isDir(node.mode)){return 21}}return 0}),mayOpen:(function(node,flags){if(!node){return 2}if(FS.isLink(node.mode)){return 40}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 21}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(24)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(29)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(16)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(16)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(20)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(22)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(22)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(1)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=UTF8ToString(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21509:case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21524:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___unlock(){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])}),destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}});clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function runDestructor(handle){var $$=handle.$$;if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}this.$$.count.value-=1;var toDelete=0===this.$$.count.value;if(toDelete){runDestructor(this)}if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=(function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)});proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register((function(){clonedHandle["delete"]()})));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return Object.create(prototype,{$$:{value:record}})}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}var destructors=[];var args=new Array(argCount);args[0]=rawConstructor;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>1])});case 2:return(function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])});default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":(function(c){return this.constructor.values[c]}),"toWireType":(function(destructors,c){return c.value}),"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,(function(){}))}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var endChar=HEAPU8[value+4+length];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAPU8[value+4+length]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0){var stringSegment=UTF8ToString(decodeStartPtr);if(str===undefined)str=stringSegment;else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}if(endCharSwap!=0)HEAPU8[value+4+length]=endCharSwap}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){Module["abort"]()}var ENV={};function _getenv(name){if(name===0)return 0;name=UTF8ToString(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLVM_SAVEDSTACKS[p];self.LLVM_SAVEDSTACKS.splice(p,1);stackRestore(ret)}function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDSTACKS){self.LLVM_SAVEDSTACKS=[]}self.LLVM_SAVEDSTACKS.push(stackSave());return self.LLVM_SAVEDSTACKS.length-1}function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _pthread_cond_wait(){return 0}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":(function(date){return WEEKDAYS[date.tm_wday].substring(0,3)}),"%A":(function(date){return WEEKDAYS[date.tm_wday]}),"%b":(function(date){return MONTHS[date.tm_mon].substring(0,3)}),"%B":(function(date){return MONTHS[date.tm_mon]}),"%C":(function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)}),"%d":(function(date){return leadingNulls(date.tm_mday,2)}),"%e":(function(date){return leadingSomething(date.tm_mday,2," ")}),"%g":(function(date){return getWeekBasedYear(date).toString().substring(2)}),"%G":(function(date){return getWeekBasedYear(date)}),"%H":(function(date){return leadingNulls(date.tm_hour,2)}),"%I":(function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)}),"%j":(function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)}),"%m":(function(date){return leadingNulls(date.tm_mon+1,2)}),"%M":(function(date){return leadingNulls(date.tm_min,2)}),"%n":(function(){return"\n"}),"%p":(function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}}),"%S":(function(date){return leadingNulls(date.tm_sec,2)}),"%t":(function(){return"\t"}),"%u":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7}),"%U":(function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"}),"%V":(function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)}),"%Z":(function(date){return date.tm_zone}),"%%":(function(){return"%"})};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=1398;Module["wasmMaxTableSize"]=1398;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"setTempRet0":setTempRet0,"getTempRet0":getTempRet0,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"ClassHandle":ClassHandle,"ClassHandle_clone":ClassHandle_clone,"ClassHandle_delete":ClassHandle_delete,"ClassHandle_deleteLater":ClassHandle_deleteLater,"ClassHandle_isAliasOf":ClassHandle_isAliasOf,"ClassHandle_isDeleted":ClassHandle_isDeleted,"RegisteredClass":RegisteredClass,"RegisteredPointer":RegisteredPointer,"RegisteredPointer_deleteObject":RegisteredPointer_deleteObject,"RegisteredPointer_destructor":RegisteredPointer_destructor,"RegisteredPointer_fromWireType":RegisteredPointer_fromWireType,"RegisteredPointer_getPointee":RegisteredPointer_getPointee,"___cxa_allocate_exception":___cxa_allocate_exception,"___cxa_begin_catch":___cxa_begin_catch,"___cxa_find_matching_catch":___cxa_find_matching_catch,"___cxa_pure_virtual":___cxa_pure_virtual,"___cxa_throw":___cxa_throw,"___cxa_uncaught_exception":___cxa_uncaught_exception,"___gxx_personality_v0":___gxx_personality_v0,"___lock":___lock,"___map_file":___map_file,"___resumeException":___resumeException,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall145":___syscall145,"___syscall146":___syscall146,"___syscall221":___syscall221,"___syscall5":___syscall5,"___syscall54":___syscall54,"___syscall6":___syscall6,"___syscall91":___syscall91,"___unlock":___unlock,"__addDays":__addDays,"__arraySum":__arraySum,"__embind_register_bool":__embind_register_bool,"__embind_register_class":__embind_register_class,"__embind_register_class_constructor":__embind_register_class_constructor,"__embind_register_class_function":__embind_register_class_function,"__embind_register_class_property":__embind_register_class_property,"__embind_register_emval":__embind_register_emval,"__embind_register_enum":__embind_register_enum,"__embind_register_enum_value":__embind_register_enum_value,"__embind_register_float":__embind_register_float,"__embind_register_integer":__embind_register_integer,"__embind_register_memory_view":__embind_register_memory_view,"__embind_register_std_string":__embind_register_std_string,"__embind_register_std_wstring":__embind_register_std_wstring,"__embind_register_void":__embind_register_void,"__emval_decref":__emval_decref,"__emval_incref":__emval_incref,"__emval_register":__emval_register,"__emval_take_value":__emval_take_value,"__isLeapYear":__isLeapYear,"_abort":_abort,"_embind_repr":_embind_repr,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_getenv":_getenv,"_llvm_stackrestore":_llvm_stackrestore,"_llvm_stacksave":_llvm_stacksave,"_llvm_trap":_llvm_trap,"_pthread_cond_wait":_pthread_cond_wait,"_pthread_getspecific":_pthread_getspecific,"_pthread_key_create":_pthread_key_create,"_pthread_once":_pthread_once,"_pthread_setspecific":_pthread_setspecific,"_strftime":_strftime,"_strftime_l":_strftime_l,"constNoSmartPtrRawPointerToWireType":constNoSmartPtrRawPointerToWireType,"count_emval_handles":count_emval_handles,"craftInvokerFunction":craftInvokerFunction,"createNamedFunction":createNamedFunction,"downcastPointer":downcastPointer,"embind__requireFunction":embind__requireFunction,"embind_init_charCodes":embind_init_charCodes,"ensureOverloadTable":ensureOverloadTable,"enumReadValueFromPointer":enumReadValueFromPointer,"exposePublicSymbol":exposePublicSymbol,"extendError":extendError,"floatReadValueFromPointer":floatReadValueFromPointer,"flushPendingDeletes":flushPendingDeletes,"genericPointerToWireType":genericPointerToWireType,"getBasestPointer":getBasestPointer,"getInheritedInstance":getInheritedInstance,"getInheritedInstanceCount":getInheritedInstanceCount,"getLiveInheritedInstances":getLiveInheritedInstances,"getShiftFromSize":getShiftFromSize,"getTypeName":getTypeName,"get_first_emval":get_first_emval,"heap32VectorToArray":heap32VectorToArray,"init_ClassHandle":init_ClassHandle,"init_RegisteredPointer":init_RegisteredPointer,"init_embind":init_embind,"init_emval":init_emval,"integerReadValueFromPointer":integerReadValueFromPointer,"makeClassHandle":makeClassHandle,"makeLegalFunctionName":makeLegalFunctionName,"new_":new_,"nonConstNoSmartPtrRawPointerToWireType":nonConstNoSmartPtrRawPointerToWireType,"readLatin1String":readLatin1String,"registerType":registerType,"replacePublicSymbol":replacePublicSymbol,"requireRegisteredType":requireRegisteredType,"runDestructor":runDestructor,"runDestructors":runDestructors,"setDelayFunction":setDelayFunction,"shallowCopyInternalPointer":shallowCopyInternalPointer,"simpleReadValueFromPointer":simpleReadValueFromPointer,"throwBindingError":throwBindingError,"throwInstanceAlreadyDeleted":throwInstanceAlreadyDeleted,"throwInternalError":throwInternalError,"throwUnboundTypeError":throwUnboundTypeError,"upcastPointer":upcastPointer,"validateThis":validateThis,"whenDependentTypesAreResolved":whenDependentTypesAreResolved,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var __GLOBAL__I_000101=Module["__GLOBAL__I_000101"]=(function(){return Module["asm"]["__GLOBAL__I_000101"].apply(null,arguments)});var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_bind_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_emscriptenlib_cpp=Module["__GLOBAL__sub_I_emscriptenlib_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_emscriptenlib_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_iostream_cpp=Module["__GLOBAL__sub_I_iostream_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_iostream_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_stlreader_cpp=Module["__GLOBAL__sub_I_stlreader_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_stlreader_cpp"].apply(null,arguments)});var __ZSt18uncaught_exceptionv=Module["__ZSt18uncaught_exceptionv"]=(function(){return Module["asm"]["__ZSt18uncaught_exceptionv"].apply(null,arguments)});var ___cxa_can_catch=Module["___cxa_can_catch"]=(function(){return Module["asm"]["___cxa_can_catch"].apply(null,arguments)});var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=(function(){return Module["asm"]["___cxa_is_pointer_type"].apply(null,arguments)});var ___errno_location=Module["___errno_location"]=(function(){return Module["asm"]["___errno_location"].apply(null,arguments)});var ___getTypeName=Module["___getTypeName"]=(function(){return Module["asm"]["___getTypeName"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=(function(){return Module["asm"]["_llvm_bswap_i32"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _memcpy=Module["_memcpy"]=(function(){return Module["asm"]["_memcpy"].apply(null,arguments)});var _memmove=Module["_memmove"]=(function(){return Module["asm"]["_memmove"].apply(null,arguments)});var _memset=Module["_memset"]=(function(){return Module["asm"]["_memset"].apply(null,arguments)});var _pthread_cond_broadcast=Module["_pthread_cond_broadcast"]=(function(){return Module["asm"]["_pthread_cond_broadcast"].apply(null,arguments)});var _pthread_mutex_lock=Module["_pthread_mutex_lock"]=(function(){return Module["asm"]["_pthread_mutex_lock"].apply(null,arguments)});var _pthread_mutex_unlock=Module["_pthread_mutex_unlock"]=(function(){return Module["asm"]["_pthread_mutex_unlock"].apply(null,arguments)});var _sbrk=Module["_sbrk"]=(function(){return Module["asm"]["_sbrk"].apply(null,arguments)});var establishStackSpace=Module["establishStackSpace"]=(function(){return Module["asm"]["establishStackSpace"].apply(null,arguments)});var setThrew=Module["setThrew"]=(function(){return Module["asm"]["setThrew"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_di=Module["dynCall_di"]=(function(){return Module["asm"]["dynCall_di"].apply(null,arguments)});var dynCall_did=Module["dynCall_did"]=(function(){return Module["asm"]["dynCall_did"].apply(null,arguments)});var dynCall_dii=Module["dynCall_dii"]=(function(){return Module["asm"]["dynCall_dii"].apply(null,arguments)});var dynCall_diii=Module["dynCall_diii"]=(function(){return Module["asm"]["dynCall_diii"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["dynCall_i"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iid=Module["dynCall_iid"]=(function(){return Module["asm"]["dynCall_iid"].apply(null,arguments)});var dynCall_iidd=Module["dynCall_iidd"]=(function(){return Module["asm"]["dynCall_iidd"].apply(null,arguments)});var dynCall_iiddd=Module["dynCall_iiddd"]=(function(){return Module["asm"]["dynCall_iiddd"].apply(null,arguments)});var dynCall_iidddi=Module["dynCall_iidddi"]=(function(){return Module["asm"]["dynCall_iidddi"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiid=Module["dynCall_iiiiid"]=(function(){return Module["asm"]["dynCall_iiiiid"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiid=Module["dynCall_iiiiiid"]=(function(){return Module["asm"]["dynCall_iiiiiid"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiij=Module["dynCall_iiiiij"]=(function(){return Module["asm"]["dynCall_iiiiij"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["dynCall_v"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vid=Module["dynCall_vid"]=(function(){return Module["asm"]["dynCall_vid"].apply(null,arguments)});var dynCall_vidi=Module["dynCall_vidi"]=(function(){return Module["asm"]["dynCall_vidi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viid=Module["dynCall_viid"]=(function(){return Module["asm"]["dynCall_viid"].apply(null,arguments)});var dynCall_viidi=Module["dynCall_viidi"]=(function(){return Module["asm"]["dynCall_viidi"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viijii=Module["dynCall_viijii"]=(function(){return Module["asm"]["dynCall_viijii"].apply(null,arguments)});Module["asm"]=asm;Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + + + + return Module; +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Module; + else if (typeof define === 'function' && define['amd']) + define([], function() { return Module; }); + else if (typeof exports === 'object') + exports["Module"] = Module; + \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/package.json opencamlib-11.10-1/src/emscriptenlib/package.json --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/package.json 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/package.json 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,19 @@ +{ + "name": "emscriptenlib", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "isomorphic-fetch": "^2.2.1", + "stl": "^1.1.1" + }, + "devDependencies": { + "brfs": "^2.0.1", + "browserify": "^16.2.3" + } +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/package-lock.json opencamlib-11.10-1/src/emscriptenlib/package-lock.json --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/package-lock.json 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/package-lock.json 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,1666 @@ +{ + "name": "emscriptenlib", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "acorn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "acorn-node": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", + "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", + "dev": true, + "requires": { + "acorn": "6.0.5", + "acorn-dynamic-import": "4.0.0", + "acorn-walk": "6.1.1", + "xtend": "4.0.1" + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "brfs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.1.tgz", + "integrity": "sha512-SU42sZeG85CE8EaZfnAANWxTqYpgrup0Nq5TgA+x9a0szxki+kH0X0DDyr7czQ8KhKKKdpxrQqXHN6zX96r62w==", + "dev": true, + "requires": { + "quote-stream": "1.0.2", + "resolve": "1.9.0", + "static-module": "3.0.0", + "through2": "2.0.5" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "1.3.5", + "combine-source-map": "0.8.0", + "defined": "1.0.0", + "safe-buffer": "5.1.2", + "through2": "2.0.5", + "umd": "3.0.3" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dev": true, + "requires": { + "JSONStream": "1.3.5", + "assert": "1.4.1", + "browser-pack": "6.1.0", + "browser-resolve": "1.11.3", + "browserify-zlib": "0.2.0", + "buffer": "5.2.1", + "cached-path-relative": "1.0.2", + "concat-stream": "1.6.2", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "defined": "1.0.0", + "deps-sort": "2.0.0", + "domain-browser": "1.2.0", + "duplexer2": "0.1.4", + "events": "2.1.0", + "glob": "7.1.3", + "has": "1.0.3", + "htmlescape": "1.1.1", + "https-browserify": "1.0.0", + "inherits": "2.0.3", + "insert-module-globals": "7.2.0", + "labeled-stream-splicer": "2.0.1", + "mkdirp": "0.5.1", + "module-deps": "6.2.0", + "os-browserify": "0.3.0", + "parents": "1.0.1", + "path-browserify": "0.0.1", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "2.0.0", + "readable-stream": "2.3.6", + "resolve": "1.9.0", + "shasum": "1.0.2", + "shell-quote": "1.6.1", + "stream-browserify": "2.0.1", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "subarg": "1.0.0", + "syntax-error": "1.4.0", + "through2": "2.0.5", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.1", + "url": "0.11.0", + "util": "0.10.4", + "vm-browserify": "1.1.0", + "xtend": "4.0.1" + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.1", + "inherits": "2.0.3", + "parse-asn1": "5.1.3" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.8" + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.12" + } + }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.6.2", + "lodash.memoize": "3.0.4", + "source-map": "0.5.7" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.5", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.17", + "public-encrypt": "4.0.3", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.47" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "dev": true, + "requires": { + "JSONStream": "1.3.5", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "2.0.5" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "detective": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", + "dev": true, + "requires": { + "acorn-node": "1.6.2", + "defined": "1.0.0", + "minimist": "1.2.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.7", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "es5-ext": { + "version": "0.10.47", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", + "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.47", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.47", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.47", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.47" + } + }, + "escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.47" + } + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.5", + "safe-buffer": "5.1.2" + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.7", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dev": true, + "requires": { + "JSONStream": "1.3.5", + "acorn-node": "1.6.2", + "combine-source-map": "0.8.0", + "concat-stream": "1.6.2", + "is-buffer": "1.1.6", + "path-is-absolute": "1.0.1", + "process": "0.11.10", + "through2": "2.0.5", + "undeclared-identifiers": "1.1.2", + "xtend": "4.0.1" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "3.0.0" + } + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "labeled-stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", + "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "isarray": "2.0.4", + "stream-splicer": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", + "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", + "dev": true + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "module-deps": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", + "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", + "dev": true, + "requires": { + "JSONStream": "1.3.5", + "browser-resolve": "1.11.3", + "cached-path-relative": "1.0.2", + "concat-stream": "1.6.2", + "defined": "1.0.0", + "detective": "5.1.0", + "duplexer2": "0.1.4", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "2.3.6", + "resolve": "1.9.0", + "stream-combiner2": "1.1.1", + "subarg": "1.0.0", + "through2": "2.0.5", + "xtend": "4.0.1" + } + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "object-inspect": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", + "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "pako": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", + "dev": true + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.17", + "safe-buffer": "5.1.2" + } + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.3", + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "minimist": "1.2.0", + "through2": "2.0.5" + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "1.0.6" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scope-analyzer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.0.5.tgz", + "integrity": "sha512-+U5H0417mnTEstCD5VwOYO7V4vYuSqwqjFap40ythe67bhMFL5C3UgPwyBv7KDJsqUBIKafOD57xMlh1rN7eaw==", + "dev": true, + "requires": { + "array-from": "2.1.1", + "es6-map": "0.1.5", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "estree-is-function": "1.0.0", + "get-assigned-identifiers": "1.2.0" + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "0.0.1", + "sha.js": "2.4.11" + } + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "requires": { + "through": "2.3.8" + } + }, + "static-eval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz", + "integrity": "sha512-6flshd3F1Gwm+Ksxq463LtFd1liC77N/PX1FVVc3OzL3hAmo2fwHFbuArkcfi7s9rTNsLEhcRmXGFZhlgy40uw==", + "dev": true, + "requires": { + "escodegen": "1.9.1" + } + }, + "static-module": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.0.tgz", + "integrity": "sha512-SM757x+T52ye+QNDo80F53rNpir/ZyyFL0NjPXHRXb1hT1eC2Tzq+LV5P2X12UzHJH5SfD248I5/jzUoSey89Q==", + "dev": true, + "requires": { + "acorn-node": "1.6.2", + "concat-stream": "1.6.2", + "convert-source-map": "1.6.0", + "duplexer2": "0.1.4", + "escodegen": "1.9.1", + "has": "1.0.3", + "magic-string": "0.22.5", + "merge-source-map": "1.0.4", + "object-inspect": "1.4.1", + "readable-stream": "2.3.6", + "scope-analyzer": "2.0.5", + "shallow-copy": "0.0.1", + "static-eval": "2.0.0", + "through2": "2.0.5" + } + }, + "stl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stl/-/stl-1.1.1.tgz", + "integrity": "sha1-0q8fjfs8Z0UPxpC7d+hTqlhQoCs=", + "requires": { + "split": "0.3.3", + "stream-fsm": "0.3.1", + "triangle-normal": "0.0.0" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "0.1.4", + "readable-stream": "2.3.6" + } + }, + "stream-fsm": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-fsm/-/stream-fsm-0.3.1.tgz", + "integrity": "sha1-AeJPo0FmvxSTofJq79SDzxw0MQo=", + "requires": { + "through": "2.1.0" + }, + "dependencies": { + "through": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.1.0.tgz", + "integrity": "sha1-68rkh0X/2giK1rii/iDvPOjuG80=" + } + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "1.6.2" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "0.11.10" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "triangle-normal": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/triangle-normal/-/triangle-normal-0.0.0.tgz", + "integrity": "sha1-tnx6fIeleDR8HZcBMyb1oIKwaTc=" + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "undeclared-identifiers": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", + "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", + "dev": true, + "requires": { + "acorn-node": "1.6.2", + "get-assigned-identifiers": "1.2.0", + "simple-concat": "1.0.0", + "xtend": "4.0.1" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/pkg/index.js opencamlib-11.10-1/src/emscriptenlib/pkg/index.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/pkg/index.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/pkg/index.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,22740 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i> 6]; + var primitive = (tag & 0x20) === 0; + + // Multi-octet tag - load + if ((tag & 0x1f) === 0x1f) { + var oct = tag; + tag = 0; + while ((oct & 0x80) === 0x80) { + oct = buf.readUInt8(fail); + if (buf.isError(oct)) + return oct; + + tag <<= 7; + tag |= oct & 0x7f; + } + } else { + tag &= 0x1f; + } + var tagStr = der.tag[tag]; + + return { + cls: cls, + primitive: primitive, + tag: tag, + tagStr: tagStr + }; +} + +function derDecodeLen(buf, primitive, fail) { + var len = buf.readUInt8(fail); + if (buf.isError(len)) + return len; + + // Indefinite form + if (!primitive && len === 0x80) + return null; + + // Definite form + if ((len & 0x80) === 0) { + // Short form + return len; + } + + // Long form + var num = len & 0x7f; + if (num > 4) + return buf.error('length octect is too long'); + + len = 0; + for (var i = 0; i < num; i++) { + len <<= 8; + var j = buf.readUInt8(fail); + if (buf.isError(j)) + return j; + len |= j; + } + + return len; +} + +},{"../../asn1":2,"inherits":101}],11:[function(require,module,exports){ +var decoders = exports; + +decoders.der = require('./der'); +decoders.pem = require('./pem'); + +},{"./der":10,"./pem":12}],12:[function(require,module,exports){ +var inherits = require('inherits'); +var Buffer = require('buffer').Buffer; + +var DERDecoder = require('./der'); + +function PEMDecoder(entity) { + DERDecoder.call(this, entity); + this.enc = 'pem'; +}; +inherits(PEMDecoder, DERDecoder); +module.exports = PEMDecoder; + +PEMDecoder.prototype.decode = function decode(data, options) { + var lines = data.toString().split(/[\r\n]+/g); + + var label = options.label.toUpperCase(); + + var re = /^-----(BEGIN|END) ([^-]+)-----$/; + var start = -1; + var end = -1; + for (var i = 0; i < lines.length; i++) { + var match = lines[i].match(re); + if (match === null) + continue; + + if (match[2] !== label) + continue; + + if (start === -1) { + if (match[1] !== 'BEGIN') + break; + start = i; + } else { + if (match[1] !== 'END') + break; + end = i; + break; + } + } + if (start === -1 || end === -1) + throw new Error('PEM section not found for: ' + label); + + var base64 = lines.slice(start + 1, end).join(''); + // Remove excessive symbols + base64.replace(/[^a-z0-9\+\/=]+/gi, ''); + + var input = new Buffer(base64, 'base64'); + return DERDecoder.prototype.decode.call(this, input, options); +}; + +},{"./der":10,"buffer":49,"inherits":101}],13:[function(require,module,exports){ +var inherits = require('inherits'); +var Buffer = require('buffer').Buffer; + +var asn1 = require('../../asn1'); +var base = asn1.base; + +// Import DER constants +var der = asn1.constants.der; + +function DEREncoder(entity) { + this.enc = 'der'; + this.name = entity.name; + this.entity = entity; + + // Construct base tree + this.tree = new DERNode(); + this.tree._init(entity.body); +}; +module.exports = DEREncoder; + +DEREncoder.prototype.encode = function encode(data, reporter) { + return this.tree._encode(data, reporter).join(); +}; + +// Tree methods + +function DERNode(parent) { + base.Node.call(this, 'der', parent); +} +inherits(DERNode, base.Node); + +DERNode.prototype._encodeComposite = function encodeComposite(tag, + primitive, + cls, + content) { + var encodedTag = encodeTag(tag, primitive, cls, this.reporter); + + // Short form + if (content.length < 0x80) { + var header = new Buffer(2); + header[0] = encodedTag; + header[1] = content.length; + return this._createEncoderBuffer([ header, content ]); + } + + // Long form + // Count octets required to store length + var lenOctets = 1; + for (var i = content.length; i >= 0x100; i >>= 8) + lenOctets++; + + var header = new Buffer(1 + 1 + lenOctets); + header[0] = encodedTag; + header[1] = 0x80 | lenOctets; + + for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) + header[i] = j & 0xff; + + return this._createEncoderBuffer([ header, content ]); +}; + +DERNode.prototype._encodeStr = function encodeStr(str, tag) { + if (tag === 'bitstr') { + return this._createEncoderBuffer([ str.unused | 0, str.data ]); + } else if (tag === 'bmpstr') { + var buf = new Buffer(str.length * 2); + for (var i = 0; i < str.length; i++) { + buf.writeUInt16BE(str.charCodeAt(i), i * 2); + } + return this._createEncoderBuffer(buf); + } else if (tag === 'numstr') { + if (!this._isNumstr(str)) { + return this.reporter.error('Encoding of string type: numstr supports ' + + 'only digits and space'); + } + return this._createEncoderBuffer(str); + } else if (tag === 'printstr') { + if (!this._isPrintstr(str)) { + return this.reporter.error('Encoding of string type: printstr supports ' + + 'only latin upper and lower case letters, ' + + 'digits, space, apostrophe, left and rigth ' + + 'parenthesis, plus sign, comma, hyphen, ' + + 'dot, slash, colon, equal sign, ' + + 'question mark'); + } + return this._createEncoderBuffer(str); + } else if (/str$/.test(tag)) { + return this._createEncoderBuffer(str); + } else if (tag === 'objDesc') { + return this._createEncoderBuffer(str); + } else { + return this.reporter.error('Encoding of string type: ' + tag + + ' unsupported'); + } +}; + +DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { + if (typeof id === 'string') { + if (!values) + return this.reporter.error('string objid given, but no values map found'); + if (!values.hasOwnProperty(id)) + return this.reporter.error('objid not found in values map'); + id = values[id].split(/[\s\.]+/g); + for (var i = 0; i < id.length; i++) + id[i] |= 0; + } else if (Array.isArray(id)) { + id = id.slice(); + for (var i = 0; i < id.length; i++) + id[i] |= 0; + } + + if (!Array.isArray(id)) { + return this.reporter.error('objid() should be either array or string, ' + + 'got: ' + JSON.stringify(id)); + } + + if (!relative) { + if (id[1] >= 40) + return this.reporter.error('Second objid identifier OOB'); + id.splice(0, 2, id[0] * 40 + id[1]); + } + + // Count number of octets + var size = 0; + for (var i = 0; i < id.length; i++) { + var ident = id[i]; + for (size++; ident >= 0x80; ident >>= 7) + size++; + } + + var objid = new Buffer(size); + var offset = objid.length - 1; + for (var i = id.length - 1; i >= 0; i--) { + var ident = id[i]; + objid[offset--] = ident & 0x7f; + while ((ident >>= 7) > 0) + objid[offset--] = 0x80 | (ident & 0x7f); + } + + return this._createEncoderBuffer(objid); +}; + +function two(num) { + if (num < 10) + return '0' + num; + else + return num; +} + +DERNode.prototype._encodeTime = function encodeTime(time, tag) { + var str; + var date = new Date(time); + + if (tag === 'gentime') { + str = [ + two(date.getFullYear()), + two(date.getUTCMonth() + 1), + two(date.getUTCDate()), + two(date.getUTCHours()), + two(date.getUTCMinutes()), + two(date.getUTCSeconds()), + 'Z' + ].join(''); + } else if (tag === 'utctime') { + str = [ + two(date.getFullYear() % 100), + two(date.getUTCMonth() + 1), + two(date.getUTCDate()), + two(date.getUTCHours()), + two(date.getUTCMinutes()), + two(date.getUTCSeconds()), + 'Z' + ].join(''); + } else { + this.reporter.error('Encoding ' + tag + ' time is not supported yet'); + } + + return this._encodeStr(str, 'octstr'); +}; + +DERNode.prototype._encodeNull = function encodeNull() { + return this._createEncoderBuffer(''); +}; + +DERNode.prototype._encodeInt = function encodeInt(num, values) { + if (typeof num === 'string') { + if (!values) + return this.reporter.error('String int or enum given, but no values map'); + if (!values.hasOwnProperty(num)) { + return this.reporter.error('Values map doesn\'t contain: ' + + JSON.stringify(num)); + } + num = values[num]; + } + + // Bignum, assume big endian + if (typeof num !== 'number' && !Buffer.isBuffer(num)) { + var numArray = num.toArray(); + if (!num.sign && numArray[0] & 0x80) { + numArray.unshift(0); + } + num = new Buffer(numArray); + } + + if (Buffer.isBuffer(num)) { + var size = num.length; + if (num.length === 0) + size++; + + var out = new Buffer(size); + num.copy(out); + if (num.length === 0) + out[0] = 0 + return this._createEncoderBuffer(out); + } + + if (num < 0x80) + return this._createEncoderBuffer(num); + + if (num < 0x100) + return this._createEncoderBuffer([0, num]); + + var size = 1; + for (var i = num; i >= 0x100; i >>= 8) + size++; + + var out = new Array(size); + for (var i = out.length - 1; i >= 0; i--) { + out[i] = num & 0xff; + num >>= 8; + } + if(out[0] & 0x80) { + out.unshift(0); + } + + return this._createEncoderBuffer(new Buffer(out)); +}; + +DERNode.prototype._encodeBool = function encodeBool(value) { + return this._createEncoderBuffer(value ? 0xff : 0); +}; + +DERNode.prototype._use = function use(entity, obj) { + if (typeof entity === 'function') + entity = entity(obj); + return entity._getEncoder('der').tree; +}; + +DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) { + var state = this._baseState; + var i; + if (state['default'] === null) + return false; + + var data = dataBuffer.join(); + if (state.defaultBuffer === undefined) + state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join(); + + if (data.length !== state.defaultBuffer.length) + return false; + + for (i=0; i < data.length; i++) + if (data[i] !== state.defaultBuffer[i]) + return false; + + return true; +}; + +// Utility methods + +function encodeTag(tag, primitive, cls, reporter) { + var res; + + if (tag === 'seqof') + tag = 'seq'; + else if (tag === 'setof') + tag = 'set'; + + if (der.tagByName.hasOwnProperty(tag)) + res = der.tagByName[tag]; + else if (typeof tag === 'number' && (tag | 0) === tag) + res = tag; + else + return reporter.error('Unknown tag: ' + tag); + + if (res >= 0x1f) + return reporter.error('Multi-octet tag encoding unsupported'); + + if (!primitive) + res |= 0x20; + + res |= (der.tagClassByName[cls || 'universal'] << 6); + + return res; +} + +},{"../../asn1":2,"buffer":49,"inherits":101}],14:[function(require,module,exports){ +var encoders = exports; + +encoders.der = require('./der'); +encoders.pem = require('./pem'); + +},{"./der":13,"./pem":15}],15:[function(require,module,exports){ +var inherits = require('inherits'); + +var DEREncoder = require('./der'); + +function PEMEncoder(entity) { + DEREncoder.call(this, entity); + this.enc = 'pem'; +}; +inherits(PEMEncoder, DEREncoder); +module.exports = PEMEncoder; + +PEMEncoder.prototype.encode = function encode(data, options) { + var buf = DEREncoder.prototype.encode.call(this, data); + + var p = buf.toString('base64'); + var out = [ '-----BEGIN ' + options.label + '-----' ]; + for (var i = 0; i < p.length; i += 64) + out.push(p.slice(i, i + 64)); + out.push('-----END ' + options.label + '-----'); + return out.join('\n'); +}; + +},{"./der":13,"inherits":101}],16:[function(require,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function getLens (b64) { + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + for (var i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],17:[function(require,module,exports){ +(function (module, exports) { + 'use strict'; + + // Utils + function assert (val, msg) { + if (!val) throw new Error(msg || 'Assertion failed'); + } + + // Could use `inherits` module, but don't want to move from single file + // architecture yet. + function inherits (ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + + // BN + + function BN (number, base, endian) { + if (BN.isBN(number)) { + return number; + } + + this.negative = 0; + this.words = null; + this.length = 0; + + // Reduction context + this.red = null; + + if (number !== null) { + if (base === 'le' || base === 'be') { + endian = base; + base = 10; + } + + this._init(number || 0, base || 10, endian || 'be'); + } + } + if (typeof module === 'object') { + module.exports = BN; + } else { + exports.BN = BN; + } + + BN.BN = BN; + BN.wordSize = 26; + + var Buffer; + try { + Buffer = require('buffer').Buffer; + } catch (e) { + } + + BN.isBN = function isBN (num) { + if (num instanceof BN) { + return true; + } + + return num !== null && typeof num === 'object' && + num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + + BN.max = function max (left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + + BN.min = function min (left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + + BN.prototype._init = function init (number, base, endian) { + if (typeof number === 'number') { + return this._initNumber(number, base, endian); + } + + if (typeof number === 'object') { + return this._initArray(number, base, endian); + } + + if (base === 'hex') { + base = 16; + } + assert(base === (base | 0) && base >= 2 && base <= 36); + + number = number.toString().replace(/\s+/g, ''); + var start = 0; + if (number[0] === '-') { + start++; + } + + if (base === 16) { + this._parseHex(number, start); + } else { + this._parseBase(number, base, start); + } + + if (number[0] === '-') { + this.negative = 1; + } + + this.strip(); + + if (endian !== 'le') return; + + this._initArray(this.toArray(), base, endian); + }; + + BN.prototype._initNumber = function _initNumber (number, base, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 0x4000000) { + this.words = [ number & 0x3ffffff ]; + this.length = 1; + } else if (number < 0x10000000000000) { + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff + ]; + this.length = 2; + } else { + assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff, + 1 + ]; + this.length = 3; + } + + if (endian !== 'le') return; + + // Reverse the bytes + this._initArray(this.toArray(), base, endian); + }; + + BN.prototype._initArray = function _initArray (number, base, endian) { + // Perhaps a Uint8Array + assert(typeof number.length === 'number'); + if (number.length <= 0) { + this.words = [ 0 ]; + this.length = 1; + return this; + } + + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + + var j, w; + var off = 0; + if (endian === 'be') { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === 'le') { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + + function parseHex (str, start, end) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + + r <<= 4; + + // 'a' - 'f' + if (c >= 49 && c <= 54) { + r |= c - 49 + 0xa; + + // 'A' - 'F' + } else if (c >= 17 && c <= 22) { + r |= c - 17 + 0xa; + + // '0' - '9' + } else { + r |= c & 0xf; + } + } + return r; + } + + BN.prototype._parseHex = function _parseHex (number, start) { + // Create possibly bigger array to ensure that it fits the number + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + + var j, w; + // Scan 24-bit chunks and add them to the number + var off = 0; + for (i = number.length - 6, j = 0; i >= start; i -= 6) { + w = parseHex(number, i, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + if (i + 6 !== start) { + w = parseHex(number, start, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + } + this.strip(); + }; + + function parseBase (str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + + r *= mul; + + // 'a' + if (c >= 49) { + r += c - 49 + 0xa; + + // 'A' + } else if (c >= 17) { + r += c - 17 + 0xa; + + // '0' - '9' + } else { + r += c; + } + } + return r; + } + + BN.prototype._parseBase = function _parseBase (number, base, start) { + // Initialize as zero + this.words = [ 0 ]; + this.length = 1; + + // Find length of limb in base + for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { + limbLen++; + } + limbLen--; + limbPow = (limbPow / base) | 0; + + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base); + + this.imuln(limbPow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + + if (mod !== 0) { + var pow = 1; + word = parseBase(number, i, number.length, base); + + for (i = 0; i < mod; i++) { + pow *= base; + } + + this.imuln(pow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + }; + + BN.prototype.copy = function copy (dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + + BN.prototype.clone = function clone () { + var r = new BN(null); + this.copy(r); + return r; + }; + + BN.prototype._expand = function _expand (size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + + // Remove leading `0` from `this` + BN.prototype.strip = function strip () { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + + BN.prototype._normSign = function _normSign () { + // -0 = 0 + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + + BN.prototype.inspect = function inspect () { + return (this.red ? ''; + }; + + /* + + var zeros = []; + var groupSizes = []; + var groupBases = []; + + var s = ''; + var i = -1; + while (++i < BN.wordSize) { + zeros[i] = s; + s += '0'; + } + groupSizes[0] = 0; + groupSizes[1] = 0; + groupBases[0] = 0; + groupBases[1] = 0; + var base = 2 - 1; + while (++base < 36 + 1) { + var groupSize = 0; + var groupBase = 1; + while (groupBase < (1 << BN.wordSize) / base) { + groupBase *= base; + groupSize += 1; + } + groupSizes[base] = groupSize; + groupBases[base] = groupBase; + } + + */ + + var zeros = [ + '', + '0', + '00', + '000', + '0000', + '00000', + '000000', + '0000000', + '00000000', + '000000000', + '0000000000', + '00000000000', + '000000000000', + '0000000000000', + '00000000000000', + '000000000000000', + '0000000000000000', + '00000000000000000', + '000000000000000000', + '0000000000000000000', + '00000000000000000000', + '000000000000000000000', + '0000000000000000000000', + '00000000000000000000000', + '000000000000000000000000', + '0000000000000000000000000' + ]; + + var groupSizes = [ + 0, 0, + 25, 16, 12, 11, 10, 9, 8, + 8, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 5, 5, + 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5 + ]; + + var groupBases = [ + 0, 0, + 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, + 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, + 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, + 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, + 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 + ]; + + BN.prototype.toString = function toString (base, padding) { + base = base || 10; + padding = padding | 0 || 1; + + var out; + if (base === 16 || base === 'hex') { + out = ''; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = (((w << off) | carry) & 0xffffff).toString(16); + carry = (w >>> (24 - off)) & 0xffffff; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } + + if (base === (base | 0) && base >= 2 && base <= 36) { + // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); + var groupSize = groupSizes[base]; + // var groupBase = Math.pow(base, groupSize); + var groupBase = groupBases[base]; + out = ''; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base); + c = c.idivn(groupBase); + + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = '0' + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } + + assert(false, 'Base should be between 2 and 36'); + }; + + BN.prototype.toNumber = function toNumber () { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 0x4000000; + } else if (this.length === 3 && this.words[2] === 0x01) { + // NOTE: at this stage it is known that the top bit is set + ret += 0x10000000000000 + (this.words[1] * 0x4000000); + } else if (this.length > 2) { + assert(false, 'Number can only safely store up to 53 bits'); + } + return (this.negative !== 0) ? -ret : ret; + }; + + BN.prototype.toJSON = function toJSON () { + return this.toString(16); + }; + + BN.prototype.toBuffer = function toBuffer (endian, length) { + assert(typeof Buffer !== 'undefined'); + return this.toArrayLike(Buffer, endian, length); + }; + + BN.prototype.toArray = function toArray (endian, length) { + return this.toArrayLike(Array, endian, length); + }; + + BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert(byteLength <= reqLength, 'byte array longer than desired length'); + assert(reqLength > 0, 'Requested array length <= 0'); + + this.strip(); + var littleEndian = endian === 'le'; + var res = new ArrayType(reqLength); + + var b, i; + var q = this.clone(); + if (!littleEndian) { + // Assume big-endian + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); + + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); + + res[i] = b; + } + + for (; i < reqLength; i++) { + res[i] = 0; + } + } + + return res; + }; + + if (Math.clz32) { + BN.prototype._countBits = function _countBits (w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits (w) { + var t = w; + var r = 0; + if (t >= 0x1000) { + r += 13; + t >>>= 13; + } + if (t >= 0x40) { + r += 7; + t >>>= 7; + } + if (t >= 0x8) { + r += 4; + t >>>= 4; + } + if (t >= 0x02) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + + BN.prototype._zeroBits = function _zeroBits (w) { + // Short-cut + if (w === 0) return 26; + + var t = w; + var r = 0; + if ((t & 0x1fff) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 0x7f) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 0xf) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 0x3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 0x1) === 0) { + r++; + } + return r; + }; + + // Return number of used bits in a BN + BN.prototype.bitLength = function bitLength () { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + + function toBitArray (num) { + var w = new Array(num.bitLength()); + + for (var bit = 0; bit < w.length; bit++) { + var off = (bit / 26) | 0; + var wbit = bit % 26; + + w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; + } + + return w; + } + + // Number of trailing zero bits + BN.prototype.zeroBits = function zeroBits () { + if (this.isZero()) return 0; + + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + + BN.prototype.byteLength = function byteLength () { + return Math.ceil(this.bitLength() / 8); + }; + + BN.prototype.toTwos = function toTwos (width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + + BN.prototype.fromTwos = function fromTwos (width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + + BN.prototype.isNeg = function isNeg () { + return this.negative !== 0; + }; + + // Return negative clone of `this` + BN.prototype.neg = function neg () { + return this.clone().ineg(); + }; + + BN.prototype.ineg = function ineg () { + if (!this.isZero()) { + this.negative ^= 1; + } + + return this; + }; + + // Or `num` with `this` in-place + BN.prototype.iuor = function iuor (num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + + return this.strip(); + }; + + BN.prototype.ior = function ior (num) { + assert((this.negative | num.negative) === 0); + return this.iuor(num); + }; + + // Or `num` with `this` + BN.prototype.or = function or (num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + + BN.prototype.uor = function uor (num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + + // And `num` with `this` in-place + BN.prototype.iuand = function iuand (num) { + // b = min-length(num, this) + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + + this.length = b.length; + + return this.strip(); + }; + + BN.prototype.iand = function iand (num) { + assert((this.negative | num.negative) === 0); + return this.iuand(num); + }; + + // And `num` with `this` + BN.prototype.and = function and (num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + + BN.prototype.uand = function uand (num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + + // Xor `num` with `this` in-place + BN.prototype.iuxor = function iuxor (num) { + // a.length > b.length + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + this.length = a.length; + + return this.strip(); + }; + + BN.prototype.ixor = function ixor (num) { + assert((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + + // Xor `num` with `this` + BN.prototype.xor = function xor (num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + + BN.prototype.uxor = function uxor (num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + + // Not ``this`` with ``width`` bitwidth + BN.prototype.inotn = function inotn (width) { + assert(typeof width === 'number' && width >= 0); + + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + + // Extend the buffer with leading zeroes + this._expand(bytesNeeded); + + if (bitsLeft > 0) { + bytesNeeded--; + } + + // Handle complete words + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 0x3ffffff; + } + + // Handle the residue + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); + } + + // And remove leading zeroes + return this.strip(); + }; + + BN.prototype.notn = function notn (width) { + return this.clone().inotn(width); + }; + + // Set `bit` of `this` + BN.prototype.setn = function setn (bit, val) { + assert(typeof bit === 'number' && bit >= 0); + + var off = (bit / 26) | 0; + var wbit = bit % 26; + + this._expand(off + 1); + + if (val) { + this.words[off] = this.words[off] | (1 << wbit); + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + + return this.strip(); + }; + + // Add `num` to `this` in-place + BN.prototype.iadd = function iadd (num) { + var r; + + // negative + positive + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + + // positive + negative + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + + // a.length > b.length + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 0x3ffffff; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 0x3ffffff; + carry = r >>> 26; + } + + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + // Copy the rest of the words + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + return this; + }; + + // Add `num` to `this` + BN.prototype.add = function add (num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + + if (this.length > num.length) return this.clone().iadd(num); + + return num.clone().iadd(this); + }; + + // Subtract `num` from `this` in-place + BN.prototype.isub = function isub (num) { + // this - (-num) = this + num + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + + // -this - num = -(this + num) + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + + // At this point both numbers are positive + var cmp = this.cmp(num); + + // Optimization - zeroify + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + + // a > b + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 0x3ffffff; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 0x3ffffff; + } + + // Copy rest of the words + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + this.length = Math.max(this.length, i); + + if (a !== this) { + this.negative = 1; + } + + return this.strip(); + }; + + // Subtract `num` from `this` + BN.prototype.sub = function sub (num) { + return this.clone().isub(num); + }; + + function smallMulTo (self, num, out) { + out.negative = num.negative ^ self.negative; + var len = (self.length + num.length) | 0; + out.length = len; + len = (len - 1) | 0; + + // Peel one iteration (compiler can't do it, because of code complexity) + var a = self.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + + var lo = r & 0x3ffffff; + var carry = (r / 0x4000000) | 0; + out.words[0] = lo; + + for (var k = 1; k < len; k++) { + // Sum all words with the same `i + j = k` and accumulate `ncarry`, + // note that ncarry could be >= 0x3ffffff + var ncarry = carry >>> 26; + var rword = carry & 0x3ffffff; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { + var i = (k - j) | 0; + a = self.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += (r / 0x4000000) | 0; + rword = r & 0x3ffffff; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + + return out.strip(); + } + + // TODO(indutny): it may be reasonable to omit it for users who don't need + // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit + // multiplication (like elliptic secp256k1). + var comb10MulTo = function comb10MulTo (self, num, out) { + var a = self.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 0x1fff; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 0x1fff; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 0x1fff; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 0x1fff; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 0x1fff; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 0x1fff; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 0x1fff; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 0x1fff; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 0x1fff; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 0x1fff; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 0x1fff; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 0x1fff; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 0x1fff; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 0x1fff; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 0x1fff; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 0x1fff; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 0x1fff; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 0x1fff; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 0x1fff; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 0x1fff; + var bh9 = b9 >>> 13; + + out.negative = self.negative ^ num.negative; + out.length = 19; + /* k = 0 */ + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = (mid + Math.imul(ah0, bl0)) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0; + w0 &= 0x3ffffff; + /* k = 1 */ + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = (mid + Math.imul(ah1, bl0)) | 0; + hi = Math.imul(ah1, bh0); + lo = (lo + Math.imul(al0, bl1)) | 0; + mid = (mid + Math.imul(al0, bh1)) | 0; + mid = (mid + Math.imul(ah0, bl1)) | 0; + hi = (hi + Math.imul(ah0, bh1)) | 0; + var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0; + w1 &= 0x3ffffff; + /* k = 2 */ + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = (mid + Math.imul(ah2, bl0)) | 0; + hi = Math.imul(ah2, bh0); + lo = (lo + Math.imul(al1, bl1)) | 0; + mid = (mid + Math.imul(al1, bh1)) | 0; + mid = (mid + Math.imul(ah1, bl1)) | 0; + hi = (hi + Math.imul(ah1, bh1)) | 0; + lo = (lo + Math.imul(al0, bl2)) | 0; + mid = (mid + Math.imul(al0, bh2)) | 0; + mid = (mid + Math.imul(ah0, bl2)) | 0; + hi = (hi + Math.imul(ah0, bh2)) | 0; + var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0; + w2 &= 0x3ffffff; + /* k = 3 */ + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = (mid + Math.imul(ah3, bl0)) | 0; + hi = Math.imul(ah3, bh0); + lo = (lo + Math.imul(al2, bl1)) | 0; + mid = (mid + Math.imul(al2, bh1)) | 0; + mid = (mid + Math.imul(ah2, bl1)) | 0; + hi = (hi + Math.imul(ah2, bh1)) | 0; + lo = (lo + Math.imul(al1, bl2)) | 0; + mid = (mid + Math.imul(al1, bh2)) | 0; + mid = (mid + Math.imul(ah1, bl2)) | 0; + hi = (hi + Math.imul(ah1, bh2)) | 0; + lo = (lo + Math.imul(al0, bl3)) | 0; + mid = (mid + Math.imul(al0, bh3)) | 0; + mid = (mid + Math.imul(ah0, bl3)) | 0; + hi = (hi + Math.imul(ah0, bh3)) | 0; + var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0; + w3 &= 0x3ffffff; + /* k = 4 */ + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = (mid + Math.imul(ah4, bl0)) | 0; + hi = Math.imul(ah4, bh0); + lo = (lo + Math.imul(al3, bl1)) | 0; + mid = (mid + Math.imul(al3, bh1)) | 0; + mid = (mid + Math.imul(ah3, bl1)) | 0; + hi = (hi + Math.imul(ah3, bh1)) | 0; + lo = (lo + Math.imul(al2, bl2)) | 0; + mid = (mid + Math.imul(al2, bh2)) | 0; + mid = (mid + Math.imul(ah2, bl2)) | 0; + hi = (hi + Math.imul(ah2, bh2)) | 0; + lo = (lo + Math.imul(al1, bl3)) | 0; + mid = (mid + Math.imul(al1, bh3)) | 0; + mid = (mid + Math.imul(ah1, bl3)) | 0; + hi = (hi + Math.imul(ah1, bh3)) | 0; + lo = (lo + Math.imul(al0, bl4)) | 0; + mid = (mid + Math.imul(al0, bh4)) | 0; + mid = (mid + Math.imul(ah0, bl4)) | 0; + hi = (hi + Math.imul(ah0, bh4)) | 0; + var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0; + w4 &= 0x3ffffff; + /* k = 5 */ + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = (mid + Math.imul(ah5, bl0)) | 0; + hi = Math.imul(ah5, bh0); + lo = (lo + Math.imul(al4, bl1)) | 0; + mid = (mid + Math.imul(al4, bh1)) | 0; + mid = (mid + Math.imul(ah4, bl1)) | 0; + hi = (hi + Math.imul(ah4, bh1)) | 0; + lo = (lo + Math.imul(al3, bl2)) | 0; + mid = (mid + Math.imul(al3, bh2)) | 0; + mid = (mid + Math.imul(ah3, bl2)) | 0; + hi = (hi + Math.imul(ah3, bh2)) | 0; + lo = (lo + Math.imul(al2, bl3)) | 0; + mid = (mid + Math.imul(al2, bh3)) | 0; + mid = (mid + Math.imul(ah2, bl3)) | 0; + hi = (hi + Math.imul(ah2, bh3)) | 0; + lo = (lo + Math.imul(al1, bl4)) | 0; + mid = (mid + Math.imul(al1, bh4)) | 0; + mid = (mid + Math.imul(ah1, bl4)) | 0; + hi = (hi + Math.imul(ah1, bh4)) | 0; + lo = (lo + Math.imul(al0, bl5)) | 0; + mid = (mid + Math.imul(al0, bh5)) | 0; + mid = (mid + Math.imul(ah0, bl5)) | 0; + hi = (hi + Math.imul(ah0, bh5)) | 0; + var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0; + w5 &= 0x3ffffff; + /* k = 6 */ + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = (mid + Math.imul(ah6, bl0)) | 0; + hi = Math.imul(ah6, bh0); + lo = (lo + Math.imul(al5, bl1)) | 0; + mid = (mid + Math.imul(al5, bh1)) | 0; + mid = (mid + Math.imul(ah5, bl1)) | 0; + hi = (hi + Math.imul(ah5, bh1)) | 0; + lo = (lo + Math.imul(al4, bl2)) | 0; + mid = (mid + Math.imul(al4, bh2)) | 0; + mid = (mid + Math.imul(ah4, bl2)) | 0; + hi = (hi + Math.imul(ah4, bh2)) | 0; + lo = (lo + Math.imul(al3, bl3)) | 0; + mid = (mid + Math.imul(al3, bh3)) | 0; + mid = (mid + Math.imul(ah3, bl3)) | 0; + hi = (hi + Math.imul(ah3, bh3)) | 0; + lo = (lo + Math.imul(al2, bl4)) | 0; + mid = (mid + Math.imul(al2, bh4)) | 0; + mid = (mid + Math.imul(ah2, bl4)) | 0; + hi = (hi + Math.imul(ah2, bh4)) | 0; + lo = (lo + Math.imul(al1, bl5)) | 0; + mid = (mid + Math.imul(al1, bh5)) | 0; + mid = (mid + Math.imul(ah1, bl5)) | 0; + hi = (hi + Math.imul(ah1, bh5)) | 0; + lo = (lo + Math.imul(al0, bl6)) | 0; + mid = (mid + Math.imul(al0, bh6)) | 0; + mid = (mid + Math.imul(ah0, bl6)) | 0; + hi = (hi + Math.imul(ah0, bh6)) | 0; + var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0; + w6 &= 0x3ffffff; + /* k = 7 */ + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = (mid + Math.imul(ah7, bl0)) | 0; + hi = Math.imul(ah7, bh0); + lo = (lo + Math.imul(al6, bl1)) | 0; + mid = (mid + Math.imul(al6, bh1)) | 0; + mid = (mid + Math.imul(ah6, bl1)) | 0; + hi = (hi + Math.imul(ah6, bh1)) | 0; + lo = (lo + Math.imul(al5, bl2)) | 0; + mid = (mid + Math.imul(al5, bh2)) | 0; + mid = (mid + Math.imul(ah5, bl2)) | 0; + hi = (hi + Math.imul(ah5, bh2)) | 0; + lo = (lo + Math.imul(al4, bl3)) | 0; + mid = (mid + Math.imul(al4, bh3)) | 0; + mid = (mid + Math.imul(ah4, bl3)) | 0; + hi = (hi + Math.imul(ah4, bh3)) | 0; + lo = (lo + Math.imul(al3, bl4)) | 0; + mid = (mid + Math.imul(al3, bh4)) | 0; + mid = (mid + Math.imul(ah3, bl4)) | 0; + hi = (hi + Math.imul(ah3, bh4)) | 0; + lo = (lo + Math.imul(al2, bl5)) | 0; + mid = (mid + Math.imul(al2, bh5)) | 0; + mid = (mid + Math.imul(ah2, bl5)) | 0; + hi = (hi + Math.imul(ah2, bh5)) | 0; + lo = (lo + Math.imul(al1, bl6)) | 0; + mid = (mid + Math.imul(al1, bh6)) | 0; + mid = (mid + Math.imul(ah1, bl6)) | 0; + hi = (hi + Math.imul(ah1, bh6)) | 0; + lo = (lo + Math.imul(al0, bl7)) | 0; + mid = (mid + Math.imul(al0, bh7)) | 0; + mid = (mid + Math.imul(ah0, bl7)) | 0; + hi = (hi + Math.imul(ah0, bh7)) | 0; + var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0; + w7 &= 0x3ffffff; + /* k = 8 */ + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = (mid + Math.imul(ah8, bl0)) | 0; + hi = Math.imul(ah8, bh0); + lo = (lo + Math.imul(al7, bl1)) | 0; + mid = (mid + Math.imul(al7, bh1)) | 0; + mid = (mid + Math.imul(ah7, bl1)) | 0; + hi = (hi + Math.imul(ah7, bh1)) | 0; + lo = (lo + Math.imul(al6, bl2)) | 0; + mid = (mid + Math.imul(al6, bh2)) | 0; + mid = (mid + Math.imul(ah6, bl2)) | 0; + hi = (hi + Math.imul(ah6, bh2)) | 0; + lo = (lo + Math.imul(al5, bl3)) | 0; + mid = (mid + Math.imul(al5, bh3)) | 0; + mid = (mid + Math.imul(ah5, bl3)) | 0; + hi = (hi + Math.imul(ah5, bh3)) | 0; + lo = (lo + Math.imul(al4, bl4)) | 0; + mid = (mid + Math.imul(al4, bh4)) | 0; + mid = (mid + Math.imul(ah4, bl4)) | 0; + hi = (hi + Math.imul(ah4, bh4)) | 0; + lo = (lo + Math.imul(al3, bl5)) | 0; + mid = (mid + Math.imul(al3, bh5)) | 0; + mid = (mid + Math.imul(ah3, bl5)) | 0; + hi = (hi + Math.imul(ah3, bh5)) | 0; + lo = (lo + Math.imul(al2, bl6)) | 0; + mid = (mid + Math.imul(al2, bh6)) | 0; + mid = (mid + Math.imul(ah2, bl6)) | 0; + hi = (hi + Math.imul(ah2, bh6)) | 0; + lo = (lo + Math.imul(al1, bl7)) | 0; + mid = (mid + Math.imul(al1, bh7)) | 0; + mid = (mid + Math.imul(ah1, bl7)) | 0; + hi = (hi + Math.imul(ah1, bh7)) | 0; + lo = (lo + Math.imul(al0, bl8)) | 0; + mid = (mid + Math.imul(al0, bh8)) | 0; + mid = (mid + Math.imul(ah0, bl8)) | 0; + hi = (hi + Math.imul(ah0, bh8)) | 0; + var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0; + w8 &= 0x3ffffff; + /* k = 9 */ + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = (mid + Math.imul(ah9, bl0)) | 0; + hi = Math.imul(ah9, bh0); + lo = (lo + Math.imul(al8, bl1)) | 0; + mid = (mid + Math.imul(al8, bh1)) | 0; + mid = (mid + Math.imul(ah8, bl1)) | 0; + hi = (hi + Math.imul(ah8, bh1)) | 0; + lo = (lo + Math.imul(al7, bl2)) | 0; + mid = (mid + Math.imul(al7, bh2)) | 0; + mid = (mid + Math.imul(ah7, bl2)) | 0; + hi = (hi + Math.imul(ah7, bh2)) | 0; + lo = (lo + Math.imul(al6, bl3)) | 0; + mid = (mid + Math.imul(al6, bh3)) | 0; + mid = (mid + Math.imul(ah6, bl3)) | 0; + hi = (hi + Math.imul(ah6, bh3)) | 0; + lo = (lo + Math.imul(al5, bl4)) | 0; + mid = (mid + Math.imul(al5, bh4)) | 0; + mid = (mid + Math.imul(ah5, bl4)) | 0; + hi = (hi + Math.imul(ah5, bh4)) | 0; + lo = (lo + Math.imul(al4, bl5)) | 0; + mid = (mid + Math.imul(al4, bh5)) | 0; + mid = (mid + Math.imul(ah4, bl5)) | 0; + hi = (hi + Math.imul(ah4, bh5)) | 0; + lo = (lo + Math.imul(al3, bl6)) | 0; + mid = (mid + Math.imul(al3, bh6)) | 0; + mid = (mid + Math.imul(ah3, bl6)) | 0; + hi = (hi + Math.imul(ah3, bh6)) | 0; + lo = (lo + Math.imul(al2, bl7)) | 0; + mid = (mid + Math.imul(al2, bh7)) | 0; + mid = (mid + Math.imul(ah2, bl7)) | 0; + hi = (hi + Math.imul(ah2, bh7)) | 0; + lo = (lo + Math.imul(al1, bl8)) | 0; + mid = (mid + Math.imul(al1, bh8)) | 0; + mid = (mid + Math.imul(ah1, bl8)) | 0; + hi = (hi + Math.imul(ah1, bh8)) | 0; + lo = (lo + Math.imul(al0, bl9)) | 0; + mid = (mid + Math.imul(al0, bh9)) | 0; + mid = (mid + Math.imul(ah0, bl9)) | 0; + hi = (hi + Math.imul(ah0, bh9)) | 0; + var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0; + w9 &= 0x3ffffff; + /* k = 10 */ + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = (mid + Math.imul(ah9, bl1)) | 0; + hi = Math.imul(ah9, bh1); + lo = (lo + Math.imul(al8, bl2)) | 0; + mid = (mid + Math.imul(al8, bh2)) | 0; + mid = (mid + Math.imul(ah8, bl2)) | 0; + hi = (hi + Math.imul(ah8, bh2)) | 0; + lo = (lo + Math.imul(al7, bl3)) | 0; + mid = (mid + Math.imul(al7, bh3)) | 0; + mid = (mid + Math.imul(ah7, bl3)) | 0; + hi = (hi + Math.imul(ah7, bh3)) | 0; + lo = (lo + Math.imul(al6, bl4)) | 0; + mid = (mid + Math.imul(al6, bh4)) | 0; + mid = (mid + Math.imul(ah6, bl4)) | 0; + hi = (hi + Math.imul(ah6, bh4)) | 0; + lo = (lo + Math.imul(al5, bl5)) | 0; + mid = (mid + Math.imul(al5, bh5)) | 0; + mid = (mid + Math.imul(ah5, bl5)) | 0; + hi = (hi + Math.imul(ah5, bh5)) | 0; + lo = (lo + Math.imul(al4, bl6)) | 0; + mid = (mid + Math.imul(al4, bh6)) | 0; + mid = (mid + Math.imul(ah4, bl6)) | 0; + hi = (hi + Math.imul(ah4, bh6)) | 0; + lo = (lo + Math.imul(al3, bl7)) | 0; + mid = (mid + Math.imul(al3, bh7)) | 0; + mid = (mid + Math.imul(ah3, bl7)) | 0; + hi = (hi + Math.imul(ah3, bh7)) | 0; + lo = (lo + Math.imul(al2, bl8)) | 0; + mid = (mid + Math.imul(al2, bh8)) | 0; + mid = (mid + Math.imul(ah2, bl8)) | 0; + hi = (hi + Math.imul(ah2, bh8)) | 0; + lo = (lo + Math.imul(al1, bl9)) | 0; + mid = (mid + Math.imul(al1, bh9)) | 0; + mid = (mid + Math.imul(ah1, bl9)) | 0; + hi = (hi + Math.imul(ah1, bh9)) | 0; + var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0; + w10 &= 0x3ffffff; + /* k = 11 */ + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = (mid + Math.imul(ah9, bl2)) | 0; + hi = Math.imul(ah9, bh2); + lo = (lo + Math.imul(al8, bl3)) | 0; + mid = (mid + Math.imul(al8, bh3)) | 0; + mid = (mid + Math.imul(ah8, bl3)) | 0; + hi = (hi + Math.imul(ah8, bh3)) | 0; + lo = (lo + Math.imul(al7, bl4)) | 0; + mid = (mid + Math.imul(al7, bh4)) | 0; + mid = (mid + Math.imul(ah7, bl4)) | 0; + hi = (hi + Math.imul(ah7, bh4)) | 0; + lo = (lo + Math.imul(al6, bl5)) | 0; + mid = (mid + Math.imul(al6, bh5)) | 0; + mid = (mid + Math.imul(ah6, bl5)) | 0; + hi = (hi + Math.imul(ah6, bh5)) | 0; + lo = (lo + Math.imul(al5, bl6)) | 0; + mid = (mid + Math.imul(al5, bh6)) | 0; + mid = (mid + Math.imul(ah5, bl6)) | 0; + hi = (hi + Math.imul(ah5, bh6)) | 0; + lo = (lo + Math.imul(al4, bl7)) | 0; + mid = (mid + Math.imul(al4, bh7)) | 0; + mid = (mid + Math.imul(ah4, bl7)) | 0; + hi = (hi + Math.imul(ah4, bh7)) | 0; + lo = (lo + Math.imul(al3, bl8)) | 0; + mid = (mid + Math.imul(al3, bh8)) | 0; + mid = (mid + Math.imul(ah3, bl8)) | 0; + hi = (hi + Math.imul(ah3, bh8)) | 0; + lo = (lo + Math.imul(al2, bl9)) | 0; + mid = (mid + Math.imul(al2, bh9)) | 0; + mid = (mid + Math.imul(ah2, bl9)) | 0; + hi = (hi + Math.imul(ah2, bh9)) | 0; + var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0; + w11 &= 0x3ffffff; + /* k = 12 */ + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = (mid + Math.imul(ah9, bl3)) | 0; + hi = Math.imul(ah9, bh3); + lo = (lo + Math.imul(al8, bl4)) | 0; + mid = (mid + Math.imul(al8, bh4)) | 0; + mid = (mid + Math.imul(ah8, bl4)) | 0; + hi = (hi + Math.imul(ah8, bh4)) | 0; + lo = (lo + Math.imul(al7, bl5)) | 0; + mid = (mid + Math.imul(al7, bh5)) | 0; + mid = (mid + Math.imul(ah7, bl5)) | 0; + hi = (hi + Math.imul(ah7, bh5)) | 0; + lo = (lo + Math.imul(al6, bl6)) | 0; + mid = (mid + Math.imul(al6, bh6)) | 0; + mid = (mid + Math.imul(ah6, bl6)) | 0; + hi = (hi + Math.imul(ah6, bh6)) | 0; + lo = (lo + Math.imul(al5, bl7)) | 0; + mid = (mid + Math.imul(al5, bh7)) | 0; + mid = (mid + Math.imul(ah5, bl7)) | 0; + hi = (hi + Math.imul(ah5, bh7)) | 0; + lo = (lo + Math.imul(al4, bl8)) | 0; + mid = (mid + Math.imul(al4, bh8)) | 0; + mid = (mid + Math.imul(ah4, bl8)) | 0; + hi = (hi + Math.imul(ah4, bh8)) | 0; + lo = (lo + Math.imul(al3, bl9)) | 0; + mid = (mid + Math.imul(al3, bh9)) | 0; + mid = (mid + Math.imul(ah3, bl9)) | 0; + hi = (hi + Math.imul(ah3, bh9)) | 0; + var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0; + w12 &= 0x3ffffff; + /* k = 13 */ + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = (mid + Math.imul(ah9, bl4)) | 0; + hi = Math.imul(ah9, bh4); + lo = (lo + Math.imul(al8, bl5)) | 0; + mid = (mid + Math.imul(al8, bh5)) | 0; + mid = (mid + Math.imul(ah8, bl5)) | 0; + hi = (hi + Math.imul(ah8, bh5)) | 0; + lo = (lo + Math.imul(al7, bl6)) | 0; + mid = (mid + Math.imul(al7, bh6)) | 0; + mid = (mid + Math.imul(ah7, bl6)) | 0; + hi = (hi + Math.imul(ah7, bh6)) | 0; + lo = (lo + Math.imul(al6, bl7)) | 0; + mid = (mid + Math.imul(al6, bh7)) | 0; + mid = (mid + Math.imul(ah6, bl7)) | 0; + hi = (hi + Math.imul(ah6, bh7)) | 0; + lo = (lo + Math.imul(al5, bl8)) | 0; + mid = (mid + Math.imul(al5, bh8)) | 0; + mid = (mid + Math.imul(ah5, bl8)) | 0; + hi = (hi + Math.imul(ah5, bh8)) | 0; + lo = (lo + Math.imul(al4, bl9)) | 0; + mid = (mid + Math.imul(al4, bh9)) | 0; + mid = (mid + Math.imul(ah4, bl9)) | 0; + hi = (hi + Math.imul(ah4, bh9)) | 0; + var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0; + w13 &= 0x3ffffff; + /* k = 14 */ + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = (mid + Math.imul(ah9, bl5)) | 0; + hi = Math.imul(ah9, bh5); + lo = (lo + Math.imul(al8, bl6)) | 0; + mid = (mid + Math.imul(al8, bh6)) | 0; + mid = (mid + Math.imul(ah8, bl6)) | 0; + hi = (hi + Math.imul(ah8, bh6)) | 0; + lo = (lo + Math.imul(al7, bl7)) | 0; + mid = (mid + Math.imul(al7, bh7)) | 0; + mid = (mid + Math.imul(ah7, bl7)) | 0; + hi = (hi + Math.imul(ah7, bh7)) | 0; + lo = (lo + Math.imul(al6, bl8)) | 0; + mid = (mid + Math.imul(al6, bh8)) | 0; + mid = (mid + Math.imul(ah6, bl8)) | 0; + hi = (hi + Math.imul(ah6, bh8)) | 0; + lo = (lo + Math.imul(al5, bl9)) | 0; + mid = (mid + Math.imul(al5, bh9)) | 0; + mid = (mid + Math.imul(ah5, bl9)) | 0; + hi = (hi + Math.imul(ah5, bh9)) | 0; + var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0; + w14 &= 0x3ffffff; + /* k = 15 */ + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = (mid + Math.imul(ah9, bl6)) | 0; + hi = Math.imul(ah9, bh6); + lo = (lo + Math.imul(al8, bl7)) | 0; + mid = (mid + Math.imul(al8, bh7)) | 0; + mid = (mid + Math.imul(ah8, bl7)) | 0; + hi = (hi + Math.imul(ah8, bh7)) | 0; + lo = (lo + Math.imul(al7, bl8)) | 0; + mid = (mid + Math.imul(al7, bh8)) | 0; + mid = (mid + Math.imul(ah7, bl8)) | 0; + hi = (hi + Math.imul(ah7, bh8)) | 0; + lo = (lo + Math.imul(al6, bl9)) | 0; + mid = (mid + Math.imul(al6, bh9)) | 0; + mid = (mid + Math.imul(ah6, bl9)) | 0; + hi = (hi + Math.imul(ah6, bh9)) | 0; + var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0; + w15 &= 0x3ffffff; + /* k = 16 */ + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = (mid + Math.imul(ah9, bl7)) | 0; + hi = Math.imul(ah9, bh7); + lo = (lo + Math.imul(al8, bl8)) | 0; + mid = (mid + Math.imul(al8, bh8)) | 0; + mid = (mid + Math.imul(ah8, bl8)) | 0; + hi = (hi + Math.imul(ah8, bh8)) | 0; + lo = (lo + Math.imul(al7, bl9)) | 0; + mid = (mid + Math.imul(al7, bh9)) | 0; + mid = (mid + Math.imul(ah7, bl9)) | 0; + hi = (hi + Math.imul(ah7, bh9)) | 0; + var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0; + w16 &= 0x3ffffff; + /* k = 17 */ + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = (mid + Math.imul(ah9, bl8)) | 0; + hi = Math.imul(ah9, bh8); + lo = (lo + Math.imul(al8, bl9)) | 0; + mid = (mid + Math.imul(al8, bh9)) | 0; + mid = (mid + Math.imul(ah8, bl9)) | 0; + hi = (hi + Math.imul(ah8, bh9)) | 0; + var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0; + w17 &= 0x3ffffff; + /* k = 18 */ + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = (mid + Math.imul(ah9, bl9)) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0; + w18 &= 0x3ffffff; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + + // Polyfill comb + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + + function bigMulTo (self, num, out) { + out.negative = num.negative ^ self.negative; + out.length = self.length + num.length; + + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + // Sum all words with the same `i + j = k` and accumulate `ncarry`, + // note that ncarry could be >= 0x3ffffff + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 0x3ffffff; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + + var lo = r & 0x3ffffff; + ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; + lo = (lo + rword) | 0; + rword = lo & 0x3ffffff; + ncarry = (ncarry + (lo >>> 26)) | 0; + + hncarry += ncarry >>> 26; + ncarry &= 0x3ffffff; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + + return out.strip(); + } + + function jumboMulTo (self, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self, num, out); + } + + BN.prototype.mulTo = function mulTo (num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + + return res; + }; + + // Cooley-Tukey algorithm for FFT + // slightly revisited to rely on looping instead of recursion + + function FFTM (x, y) { + this.x = x; + this.y = y; + } + + FFTM.prototype.makeRBT = function makeRBT (N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + + return t; + }; + + // Returns binary-reversed representation of `x` + FFTM.prototype.revBin = function revBin (x, l, N) { + if (x === 0 || x === N - 1) return x; + + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << (l - i - 1); + x >>= 1; + } + + return rb; + }; + + // Performs "tweedling" phase, therefore 'emulating' + // behaviour of the recursive algorithm + FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + + FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + + for (var j = 0; j < s; j++) { + var re = rtws[p + j]; + var ie = itws[p + j]; + + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + + var rx = rtwdf_ * ro - itwdf_ * io; + + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + + rtws[p + j] = re + ro; + itws[p + j] = ie + io; + + rtws[p + j + s] = re - ro; + itws[p + j + s] = ie - io; + + /* jshint maxdepth : false */ + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + + FFTM.prototype.guessLen13b = function guessLen13b (n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + + return 1 << i + 1 + odd; + }; + + FFTM.prototype.conjugate = function conjugate (rws, iws, N) { + if (N <= 1) return; + + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + + t = iws[i]; + + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + + FFTM.prototype.normalize13b = function normalize13b (ws, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + + Math.round(ws[2 * i] / N) + + carry; + + ws[i] = w & 0x3ffffff; + + if (w < 0x4000000) { + carry = 0; + } else { + carry = w / 0x4000000 | 0; + } + } + + return ws; + }; + + FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws[i] | 0); + + rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; + rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; + } + + // Pad with zeroes + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + + assert(carry === 0); + assert((carry & ~0x1fff) === 0); + }; + + FFTM.prototype.stub = function stub (N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + + return ph; + }; + + FFTM.prototype.mulp = function mulp (x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + + var rbt = this.makeRBT(N); + + var _ = this.stub(N); + + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + + var rmws = out.words; + rmws.length = N; + + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + + // Multiply `this` by `num` + BN.prototype.mul = function mul (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + + // Multiply employing FFT + BN.prototype.mulf = function mulf (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + + // In-place Multiplication + BN.prototype.imul = function imul (num) { + return this.clone().mulTo(num, this); + }; + + BN.prototype.imuln = function imuln (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + + // Carry + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); + carry >>= 26; + carry += (w / 0x4000000) | 0; + // NOTE: lo is 27bit maximum + carry += lo >>> 26; + this.words[i] = lo & 0x3ffffff; + } + + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + + return this; + }; + + BN.prototype.muln = function muln (num) { + return this.clone().imuln(num); + }; + + // `this` * `this` + BN.prototype.sqr = function sqr () { + return this.mul(this); + }; + + // `this` * `this` in-place + BN.prototype.isqr = function isqr () { + return this.imul(this.clone()); + }; + + // Math.pow(`this`, `num`) + BN.prototype.pow = function pow (num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + + // Skip leading zeroes + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + + res = res.mul(q); + } + } + + return res; + }; + + // Shift-left in-place + BN.prototype.iushln = function iushln (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); + var i; + + if (r !== 0) { + var carry = 0; + + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = ((this.words[i] | 0) - newCarry) << r; + this.words[i] = c | carry; + carry = newCarry >>> (26 - r); + } + + if (carry) { + this.words[i] = carry; + this.length++; + } + } + + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + + this.length += s; + } + + return this.strip(); + }; + + BN.prototype.ishln = function ishln (bits) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushln(bits); + }; + + // Shift-right in-place + // NOTE: `hint` is a lowest bit before trailing zeroes + // NOTE: if `extended` is present - it will be filled with destroyed bits + BN.prototype.iushrn = function iushrn (bits, hint, extended) { + assert(typeof bits === 'number' && bits >= 0); + var h; + if (hint) { + h = (hint - (hint % 26)) / 26; + } else { + h = 0; + } + + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + var maskedWords = extended; + + h -= s; + h = Math.max(0, h); + + // Extended mode, copy masked part + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + + if (s === 0) { + // No-op, we should not move anything at all + } else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = (carry << (26 - r)) | (word >>> r); + carry = word & mask; + } + + // Push carried bits as a mask + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + + return this.strip(); + }; + + BN.prototype.ishrn = function ishrn (bits, hint, extended) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + + // Shift-left + BN.prototype.shln = function shln (bits) { + return this.clone().ishln(bits); + }; + + BN.prototype.ushln = function ushln (bits) { + return this.clone().iushln(bits); + }; + + // Shift-right + BN.prototype.shrn = function shrn (bits) { + return this.clone().ishrn(bits); + }; + + BN.prototype.ushrn = function ushrn (bits) { + return this.clone().iushrn(bits); + }; + + // Test if n bit is set + BN.prototype.testn = function testn (bit) { + assert(typeof bit === 'number' && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) return false; + + // Check bit and return + var w = this.words[s]; + + return !!(w & q); + }; + + // Return only lowers bits of number (in-place) + BN.prototype.imaskn = function imaskn (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + + assert(this.negative === 0, 'imaskn works only with positive numbers'); + + if (this.length <= s) { + return this; + } + + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + + if (r !== 0) { + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + this.words[this.length - 1] &= mask; + } + + return this.strip(); + }; + + // Return only lowers bits of number + BN.prototype.maskn = function maskn (bits) { + return this.clone().imaskn(bits); + }; + + // Add plain number `num` to `this` + BN.prototype.iaddn = function iaddn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.isubn(-num); + + // Possible sign change + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + + // Add without checks + return this._iaddn(num); + }; + + BN.prototype._iaddn = function _iaddn (num) { + this.words[0] += num; + + // Carry + for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { + this.words[i] -= 0x4000000; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + + return this; + }; + + // Subtract plain number `num` from `this` + BN.prototype.isubn = function isubn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.iaddn(-num); + + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + + this.words[0] -= num; + + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + // Carry + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 0x4000000; + this.words[i + 1] -= 1; + } + } + + return this.strip(); + }; + + BN.prototype.addn = function addn (num) { + return this.clone().iaddn(num); + }; + + BN.prototype.subn = function subn (num) { + return this.clone().isubn(num); + }; + + BN.prototype.iabs = function iabs () { + this.negative = 0; + + return this; + }; + + BN.prototype.abs = function abs () { + return this.clone().iabs(); + }; + + BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { + var len = num.length + shift; + var i; + + this._expand(len); + + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 0x3ffffff; + carry = (w >> 26) - ((right / 0x4000000) | 0); + this.words[i + shift] = w & 0x3ffffff; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 0x3ffffff; + } + + if (carry === 0) return this.strip(); + + // Subtraction overflow + assert(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 0x3ffffff; + } + this.negative = 1; + + return this.strip(); + }; + + BN.prototype._wordDiv = function _wordDiv (num, mode) { + var shift = this.length - num.length; + + var a = this.clone(); + var b = num; + + // Normalize + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + + // Initialize quotient + var m = a.length - b.length; + var q; + + if (mode !== 'mod') { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + + var diff = a.clone()._ishlnsubmul(b, 1, m); + if (diff.negative === 0) { + a = diff; + if (q) { + q.words[m] = 1; + } + } + + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 0x4000000 + + (a.words[b.length + j - 1] | 0); + + // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max + // (0x7ffffff) + qj = Math.min((qj / bhi) | 0, 0x3ffffff); + + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + + // Denormalize + if (mode !== 'div' && shift !== 0) { + a.iushrn(shift); + } + + return { + div: q || null, + mod: a + }; + }; + + // NOTE: 1) `mode` can be set to `mod` to request mod only, + // to `div` to request div only, or be absent to + // request both div & mod + // 2) `positive` is true if unsigned mod is requested + BN.prototype.divmod = function divmod (num, mode, positive) { + assert(!num.isZero()); + + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + + return { + div: div, + mod: mod + }; + } + + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + return { + div: div, + mod: res.mod + }; + } + + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + + return { + div: res.div, + mod: mod + }; + } + + // Both numbers are positive at this point + + // Strip both numbers to approximate shift value + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + + // Very short reduction + if (num.length === 1) { + if (mode === 'div') { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + + if (mode === 'mod') { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + + return this._wordDiv(num, mode); + }; + + // Find `this` / `num` + BN.prototype.div = function div (num) { + return this.divmod(num, 'div', false).div; + }; + + // Find `this` % `num` + BN.prototype.mod = function mod (num) { + return this.divmod(num, 'mod', false).mod; + }; + + BN.prototype.umod = function umod (num) { + return this.divmod(num, 'mod', true).mod; + }; + + // Find Round(`this` / `num`) + BN.prototype.divRound = function divRound (num) { + var dm = this.divmod(num); + + // Fast case - exact division + if (dm.mod.isZero()) return dm.div; + + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + + // Round down + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + + // Round up + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + + BN.prototype.modn = function modn (num) { + assert(num <= 0x3ffffff); + var p = (1 << 26) % num; + + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + + return acc; + }; + + // In-place division by number + BN.prototype.idivn = function idivn (num) { + assert(num <= 0x3ffffff); + + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 0x4000000; + this.words[i] = (w / num) | 0; + carry = w % num; + } + + return this.strip(); + }; + + BN.prototype.divn = function divn (num) { + return this.clone().idivn(num); + }; + + BN.prototype.egcd = function egcd (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var x = this; + var y = p.clone(); + + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + + // A * x + B * y = x + var A = new BN(1); + var B = new BN(0); + + // C * x + D * y = y + var C = new BN(0); + var D = new BN(1); + + var g = 0; + + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + + var yp = y.clone(); + var xp = x.clone(); + + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + + A.iushrn(1); + B.iushrn(1); + } + } + + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + + C.iushrn(1); + D.iushrn(1); + } + } + + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + + // This is reduced incarnation of the binary EEA + // above, designated to invert members of the + // _prime_ fields F(p) at a maximal speed + BN.prototype._invmp = function _invmp (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var a = this; + var b = p.clone(); + + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + + var x1 = new BN(1); + var x2 = new BN(0); + + var delta = b.clone(); + + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + + x1.iushrn(1); + } + } + + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + + x2.iushrn(1); + } + } + + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + + if (res.cmpn(0) < 0) { + res.iadd(p); + } + + return res; + }; + + BN.prototype.gcd = function gcd (num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + + // Remove common factor of two + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + + var r = a.cmp(b); + if (r < 0) { + // Swap `a` and `b` to make `a` always bigger than `b` + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + + a.isub(b); + } while (true); + + return b.iushln(shift); + }; + + // Invert number in the field F(num) + BN.prototype.invm = function invm (num) { + return this.egcd(num).a.umod(num); + }; + + BN.prototype.isEven = function isEven () { + return (this.words[0] & 1) === 0; + }; + + BN.prototype.isOdd = function isOdd () { + return (this.words[0] & 1) === 1; + }; + + // And first word and num + BN.prototype.andln = function andln (num) { + return this.words[0] & num; + }; + + // Increment at the bit position in-line + BN.prototype.bincn = function bincn (bit) { + assert(typeof bit === 'number'); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + + // Add bit and propagate, if needed + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 0x3ffffff; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + + BN.prototype.isZero = function isZero () { + return this.length === 1 && this.words[0] === 0; + }; + + BN.prototype.cmpn = function cmpn (num) { + var negative = num < 0; + + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + + this.strip(); + + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + + assert(num <= 0x3ffffff, 'Number is too big'); + + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Compare two numbers and return: + // 1 - if `this` > `num` + // 0 - if `this` == `num` + // -1 - if `this` < `num` + BN.prototype.cmp = function cmp (num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Unsigned comparison + BN.prototype.ucmp = function ucmp (num) { + // At this point both numbers have the same sign + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + + BN.prototype.gtn = function gtn (num) { + return this.cmpn(num) === 1; + }; + + BN.prototype.gt = function gt (num) { + return this.cmp(num) === 1; + }; + + BN.prototype.gten = function gten (num) { + return this.cmpn(num) >= 0; + }; + + BN.prototype.gte = function gte (num) { + return this.cmp(num) >= 0; + }; + + BN.prototype.ltn = function ltn (num) { + return this.cmpn(num) === -1; + }; + + BN.prototype.lt = function lt (num) { + return this.cmp(num) === -1; + }; + + BN.prototype.lten = function lten (num) { + return this.cmpn(num) <= 0; + }; + + BN.prototype.lte = function lte (num) { + return this.cmp(num) <= 0; + }; + + BN.prototype.eqn = function eqn (num) { + return this.cmpn(num) === 0; + }; + + BN.prototype.eq = function eq (num) { + return this.cmp(num) === 0; + }; + + // + // A reduce context, could be using montgomery or something better, depending + // on the `m` itself. + // + BN.red = function red (num) { + return new Red(num); + }; + + BN.prototype.toRed = function toRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + assert(this.negative === 0, 'red works only with positives'); + return ctx.convertTo(this)._forceRed(ctx); + }; + + BN.prototype.fromRed = function fromRed () { + assert(this.red, 'fromRed works only with numbers in reduction context'); + return this.red.convertFrom(this); + }; + + BN.prototype._forceRed = function _forceRed (ctx) { + this.red = ctx; + return this; + }; + + BN.prototype.forceRed = function forceRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + return this._forceRed(ctx); + }; + + BN.prototype.redAdd = function redAdd (num) { + assert(this.red, 'redAdd works only with red numbers'); + return this.red.add(this, num); + }; + + BN.prototype.redIAdd = function redIAdd (num) { + assert(this.red, 'redIAdd works only with red numbers'); + return this.red.iadd(this, num); + }; + + BN.prototype.redSub = function redSub (num) { + assert(this.red, 'redSub works only with red numbers'); + return this.red.sub(this, num); + }; + + BN.prototype.redISub = function redISub (num) { + assert(this.red, 'redISub works only with red numbers'); + return this.red.isub(this, num); + }; + + BN.prototype.redShl = function redShl (num) { + assert(this.red, 'redShl works only with red numbers'); + return this.red.shl(this, num); + }; + + BN.prototype.redMul = function redMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + + BN.prototype.redIMul = function redIMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + + BN.prototype.redSqr = function redSqr () { + assert(this.red, 'redSqr works only with red numbers'); + this.red._verify1(this); + return this.red.sqr(this); + }; + + BN.prototype.redISqr = function redISqr () { + assert(this.red, 'redISqr works only with red numbers'); + this.red._verify1(this); + return this.red.isqr(this); + }; + + // Square root over p + BN.prototype.redSqrt = function redSqrt () { + assert(this.red, 'redSqrt works only with red numbers'); + this.red._verify1(this); + return this.red.sqrt(this); + }; + + BN.prototype.redInvm = function redInvm () { + assert(this.red, 'redInvm works only with red numbers'); + this.red._verify1(this); + return this.red.invm(this); + }; + + // Return negative clone of `this` % `red modulo` + BN.prototype.redNeg = function redNeg () { + assert(this.red, 'redNeg works only with red numbers'); + this.red._verify1(this); + return this.red.neg(this); + }; + + BN.prototype.redPow = function redPow (num) { + assert(this.red && !num.red, 'redPow(normalNum)'); + this.red._verify1(this); + return this.red.pow(this, num); + }; + + // Prime numbers with efficient reduction + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + + // Pseudo-Mersenne prime + function MPrime (name, p) { + // P = 2 ^ N - K + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + + this.tmp = this._tmp(); + } + + MPrime.prototype._tmp = function _tmp () { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + + MPrime.prototype.ireduce = function ireduce (num) { + // Assumes that `num` is less than `P^2` + // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) + var r = num; + var rlen; + + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + r.strip(); + } + + return r; + }; + + MPrime.prototype.split = function split (input, out) { + input.iushrn(this.n, 0, out); + }; + + MPrime.prototype.imulK = function imulK (num) { + return num.imul(this.k); + }; + + function K256 () { + MPrime.call( + this, + 'k256', + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); + } + inherits(K256, MPrime); + + K256.prototype.split = function split (input, output) { + // 256 = 9 * 26 + 22 + var mask = 0x3fffff; + + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + + // Shift by 9 limbs + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + + K256.prototype.imulK = function imulK (num) { + // K = 0x1000003d1 = [ 0x40, 0x3d1 ] + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + + // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 0x3d1; + num.words[i] = lo & 0x3ffffff; + lo = w * 0x40 + ((lo / 0x4000000) | 0); + } + + // Fast length reduction + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + + function P224 () { + MPrime.call( + this, + 'p224', + 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); + } + inherits(P224, MPrime); + + function P192 () { + MPrime.call( + this, + 'p192', + 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); + } + inherits(P192, MPrime); + + function P25519 () { + // 2 ^ 255 - 19 + MPrime.call( + this, + '25519', + '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); + } + inherits(P25519, MPrime); + + P25519.prototype.imulK = function imulK (num) { + // K = 0x13 + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 0x13 + carry; + var lo = hi & 0x3ffffff; + hi >>>= 26; + + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + + // Exported mostly for testing purposes, use plain name instead + BN._prime = function prime (name) { + // Cached version of prime + if (primes[name]) return primes[name]; + + var prime; + if (name === 'k256') { + prime = new K256(); + } else if (name === 'p224') { + prime = new P224(); + } else if (name === 'p192') { + prime = new P192(); + } else if (name === 'p25519') { + prime = new P25519(); + } else { + throw new Error('Unknown prime ' + name); + } + primes[name] = prime; + + return prime; + }; + + // + // Base reduction engine + // + function Red (m) { + if (typeof m === 'string') { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert(m.gtn(1), 'modulus must be greater than 1'); + this.m = m; + this.prime = null; + } + } + + Red.prototype._verify1 = function _verify1 (a) { + assert(a.negative === 0, 'red works only with positives'); + assert(a.red, 'red works only with red numbers'); + }; + + Red.prototype._verify2 = function _verify2 (a, b) { + assert((a.negative | b.negative) === 0, 'red works only with positives'); + assert(a.red && a.red === b.red, + 'red works only with red numbers'); + }; + + Red.prototype.imod = function imod (a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + + Red.prototype.neg = function neg (a) { + if (a.isZero()) { + return a.clone(); + } + + return this.m.sub(a)._forceRed(this); + }; + + Red.prototype.add = function add (a, b) { + this._verify2(a, b); + + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.iadd = function iadd (a, b) { + this._verify2(a, b); + + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + + Red.prototype.sub = function sub (a, b) { + this._verify2(a, b); + + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.isub = function isub (a, b) { + this._verify2(a, b); + + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + + Red.prototype.shl = function shl (a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + + Red.prototype.imul = function imul (a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + + Red.prototype.mul = function mul (a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + + Red.prototype.isqr = function isqr (a) { + return this.imul(a, a.clone()); + }; + + Red.prototype.sqr = function sqr (a) { + return this.mul(a, a); + }; + + Red.prototype.sqrt = function sqrt (a) { + if (a.isZero()) return a.clone(); + + var mod3 = this.m.andln(3); + assert(mod3 % 2 === 1); + + // Fast case + if (mod3 === 3) { + var pow = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow); + } + + // Tonelli-Shanks algorithm (Totally unoptimized and slow) + // + // Find Q and S, that Q * 2 ^ S = (P - 1) + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert(!q.isZero()); + + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + + // Find quadratic non-residue + // NOTE: Max is such because of generalized Riemann hypothesis. + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + + return r; + }; + + Red.prototype.invm = function invm (a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + + Red.prototype.pow = function pow (a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + + var res = wnd[0]; + var current = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = (word >> j) & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + + if (bit === 0 && current === 0) { + currentLen = 0; + continue; + } + + current <<= 1; + current |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + + res = this.mul(res, wnd[current]); + currentLen = 0; + current = 0; + } + start = 26; + } + + return res; + }; + + Red.prototype.convertTo = function convertTo (num) { + var r = num.umod(this.m); + + return r === num ? r.clone() : r; + }; + + Red.prototype.convertFrom = function convertFrom (num) { + var res = num.clone(); + res.red = null; + return res; + }; + + // + // Montgomery method engine + // + + BN.mont = function mont (num) { + return new Mont(num); + }; + + function Mont (m) { + Red.call(this, m); + + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - (this.shift % 26); + } + + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + + Mont.prototype.convertTo = function convertTo (num) { + return this.imod(num.ushln(this.shift)); + }; + + Mont.prototype.convertFrom = function convertFrom (num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + + Mont.prototype.imul = function imul (a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + + return res._forceRed(this); + }; + + Mont.prototype.mul = function mul (a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + + return res._forceRed(this); + }; + + Mont.prototype.invm = function invm (a) { + // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; +})(typeof module === 'undefined' || module, this); + +},{"buffer":19}],18:[function(require,module,exports){ +var r; + +module.exports = function rand(len) { + if (!r) + r = new Rand(null); + + return r.generate(len); +}; + +function Rand(rand) { + this.rand = rand; +} +module.exports.Rand = Rand; + +Rand.prototype.generate = function generate(len) { + return this._rand(len); +}; + +// Emulate crypto API using randy +Rand.prototype._rand = function _rand(n) { + if (this.rand.getBytes) + return this.rand.getBytes(n); + + var res = new Uint8Array(n); + for (var i = 0; i < res.length; i++) + res[i] = this.rand.getByte(); + return res; +}; + +if (typeof self === 'object') { + if (self.crypto && self.crypto.getRandomValues) { + // Modern browsers + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.crypto.getRandomValues(arr); + return arr; + }; + } else if (self.msCrypto && self.msCrypto.getRandomValues) { + // IE + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.msCrypto.getRandomValues(arr); + return arr; + }; + + // Safari's WebWorkers do not have `crypto` + } else if (typeof window === 'object') { + // Old junk + Rand.prototype._rand = function() { + throw new Error('Not implemented yet'); + }; + } +} else { + // Node.js or Web worker with no crypto support + try { + var crypto = require('crypto'); + if (typeof crypto.randomBytes !== 'function') + throw new Error('Not supported'); + + Rand.prototype._rand = function _rand(n) { + return crypto.randomBytes(n); + }; + } catch (e) { + } +} + +},{"crypto":19}],19:[function(require,module,exports){ + +},{}],20:[function(require,module,exports){ +// based on the aes implimentation in triple sec +// https://github.com/keybase/triplesec +// which is in turn based on the one from crypto-js +// https://code.google.com/p/crypto-js/ + +var Buffer = require('safe-buffer').Buffer + +function asUInt32Array (buf) { + if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf) + + var len = (buf.length / 4) | 0 + var out = new Array(len) + + for (var i = 0; i < len; i++) { + out[i] = buf.readUInt32BE(i * 4) + } + + return out +} + +function scrubVec (v) { + for (var i = 0; i < v.length; v++) { + v[i] = 0 + } +} + +function cryptBlock (M, keySchedule, SUB_MIX, SBOX, nRounds) { + var SUB_MIX0 = SUB_MIX[0] + var SUB_MIX1 = SUB_MIX[1] + var SUB_MIX2 = SUB_MIX[2] + var SUB_MIX3 = SUB_MIX[3] + + var s0 = M[0] ^ keySchedule[0] + var s1 = M[1] ^ keySchedule[1] + var s2 = M[2] ^ keySchedule[2] + var s3 = M[3] ^ keySchedule[3] + var t0, t1, t2, t3 + var ksRow = 4 + + for (var round = 1; round < nRounds; round++) { + t0 = SUB_MIX0[s0 >>> 24] ^ SUB_MIX1[(s1 >>> 16) & 0xff] ^ SUB_MIX2[(s2 >>> 8) & 0xff] ^ SUB_MIX3[s3 & 0xff] ^ keySchedule[ksRow++] + t1 = SUB_MIX0[s1 >>> 24] ^ SUB_MIX1[(s2 >>> 16) & 0xff] ^ SUB_MIX2[(s3 >>> 8) & 0xff] ^ SUB_MIX3[s0 & 0xff] ^ keySchedule[ksRow++] + t2 = SUB_MIX0[s2 >>> 24] ^ SUB_MIX1[(s3 >>> 16) & 0xff] ^ SUB_MIX2[(s0 >>> 8) & 0xff] ^ SUB_MIX3[s1 & 0xff] ^ keySchedule[ksRow++] + t3 = SUB_MIX0[s3 >>> 24] ^ SUB_MIX1[(s0 >>> 16) & 0xff] ^ SUB_MIX2[(s1 >>> 8) & 0xff] ^ SUB_MIX3[s2 & 0xff] ^ keySchedule[ksRow++] + s0 = t0 + s1 = t1 + s2 = t2 + s3 = t3 + } + + t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++] + t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++] + t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++] + t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++] + t0 = t0 >>> 0 + t1 = t1 >>> 0 + t2 = t2 >>> 0 + t3 = t3 >>> 0 + + return [t0, t1, t2, t3] +} + +// AES constants +var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36] +var G = (function () { + // Compute double table + var d = new Array(256) + for (var j = 0; j < 256; j++) { + if (j < 128) { + d[j] = j << 1 + } else { + d[j] = (j << 1) ^ 0x11b + } + } + + var SBOX = [] + var INV_SBOX = [] + var SUB_MIX = [[], [], [], []] + var INV_SUB_MIX = [[], [], [], []] + + // Walk GF(2^8) + var x = 0 + var xi = 0 + for (var i = 0; i < 256; ++i) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4) + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63 + SBOX[x] = sx + INV_SBOX[sx] = x + + // Compute multiplication + var x2 = d[x] + var x4 = d[x2] + var x8 = d[x4] + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100) + SUB_MIX[0][x] = (t << 24) | (t >>> 8) + SUB_MIX[1][x] = (t << 16) | (t >>> 16) + SUB_MIX[2][x] = (t << 8) | (t >>> 24) + SUB_MIX[3][x] = t + + // Compute inv sub bytes, inv mix columns tables + t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100) + INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8) + INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16) + INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24) + INV_SUB_MIX[3][sx] = t + + if (x === 0) { + x = xi = 1 + } else { + x = x2 ^ d[d[d[x8 ^ x2]]] + xi ^= d[d[xi]] + } + } + + return { + SBOX: SBOX, + INV_SBOX: INV_SBOX, + SUB_MIX: SUB_MIX, + INV_SUB_MIX: INV_SUB_MIX + } +})() + +function AES (key) { + this._key = asUInt32Array(key) + this._reset() +} + +AES.blockSize = 4 * 4 +AES.keySize = 256 / 8 +AES.prototype.blockSize = AES.blockSize +AES.prototype.keySize = AES.keySize +AES.prototype._reset = function () { + var keyWords = this._key + var keySize = keyWords.length + var nRounds = keySize + 6 + var ksRows = (nRounds + 1) * 4 + + var keySchedule = [] + for (var k = 0; k < keySize; k++) { + keySchedule[k] = keyWords[k] + } + + for (k = keySize; k < ksRows; k++) { + var t = keySchedule[k - 1] + + if (k % keySize === 0) { + t = (t << 8) | (t >>> 24) + t = + (G.SBOX[t >>> 24] << 24) | + (G.SBOX[(t >>> 16) & 0xff] << 16) | + (G.SBOX[(t >>> 8) & 0xff] << 8) | + (G.SBOX[t & 0xff]) + + t ^= RCON[(k / keySize) | 0] << 24 + } else if (keySize > 6 && k % keySize === 4) { + t = + (G.SBOX[t >>> 24] << 24) | + (G.SBOX[(t >>> 16) & 0xff] << 16) | + (G.SBOX[(t >>> 8) & 0xff] << 8) | + (G.SBOX[t & 0xff]) + } + + keySchedule[k] = keySchedule[k - keySize] ^ t + } + + var invKeySchedule = [] + for (var ik = 0; ik < ksRows; ik++) { + var ksR = ksRows - ik + var tt = keySchedule[ksR - (ik % 4 ? 0 : 4)] + + if (ik < 4 || ksR <= 4) { + invKeySchedule[ik] = tt + } else { + invKeySchedule[ik] = + G.INV_SUB_MIX[0][G.SBOX[tt >>> 24]] ^ + G.INV_SUB_MIX[1][G.SBOX[(tt >>> 16) & 0xff]] ^ + G.INV_SUB_MIX[2][G.SBOX[(tt >>> 8) & 0xff]] ^ + G.INV_SUB_MIX[3][G.SBOX[tt & 0xff]] + } + } + + this._nRounds = nRounds + this._keySchedule = keySchedule + this._invKeySchedule = invKeySchedule +} + +AES.prototype.encryptBlockRaw = function (M) { + M = asUInt32Array(M) + return cryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX, this._nRounds) +} + +AES.prototype.encryptBlock = function (M) { + var out = this.encryptBlockRaw(M) + var buf = Buffer.allocUnsafe(16) + buf.writeUInt32BE(out[0], 0) + buf.writeUInt32BE(out[1], 4) + buf.writeUInt32BE(out[2], 8) + buf.writeUInt32BE(out[3], 12) + return buf +} + +AES.prototype.decryptBlock = function (M) { + M = asUInt32Array(M) + + // swap + var m1 = M[1] + M[1] = M[3] + M[3] = m1 + + var out = cryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX, this._nRounds) + var buf = Buffer.allocUnsafe(16) + buf.writeUInt32BE(out[0], 0) + buf.writeUInt32BE(out[3], 4) + buf.writeUInt32BE(out[2], 8) + buf.writeUInt32BE(out[1], 12) + return buf +} + +AES.prototype.scrub = function () { + scrubVec(this._keySchedule) + scrubVec(this._invKeySchedule) + scrubVec(this._key) +} + +module.exports.AES = AES + +},{"safe-buffer":143}],21:[function(require,module,exports){ +var aes = require('./aes') +var Buffer = require('safe-buffer').Buffer +var Transform = require('cipher-base') +var inherits = require('inherits') +var GHASH = require('./ghash') +var xor = require('buffer-xor') +var incr32 = require('./incr32') + +function xorTest (a, b) { + var out = 0 + if (a.length !== b.length) out++ + + var len = Math.min(a.length, b.length) + for (var i = 0; i < len; ++i) { + out += (a[i] ^ b[i]) + } + + return out +} + +function calcIv (self, iv, ck) { + if (iv.length === 12) { + self._finID = Buffer.concat([iv, Buffer.from([0, 0, 0, 1])]) + return Buffer.concat([iv, Buffer.from([0, 0, 0, 2])]) + } + var ghash = new GHASH(ck) + var len = iv.length + var toPad = len % 16 + ghash.update(iv) + if (toPad) { + toPad = 16 - toPad + ghash.update(Buffer.alloc(toPad, 0)) + } + ghash.update(Buffer.alloc(8, 0)) + var ivBits = len * 8 + var tail = Buffer.alloc(8) + tail.writeUIntBE(ivBits, 0, 8) + ghash.update(tail) + self._finID = ghash.state + var out = Buffer.from(self._finID) + incr32(out) + return out +} +function StreamCipher (mode, key, iv, decrypt) { + Transform.call(this) + + var h = Buffer.alloc(4, 0) + + this._cipher = new aes.AES(key) + var ck = this._cipher.encryptBlock(h) + this._ghash = new GHASH(ck) + iv = calcIv(this, iv, ck) + + this._prev = Buffer.from(iv) + this._cache = Buffer.allocUnsafe(0) + this._secCache = Buffer.allocUnsafe(0) + this._decrypt = decrypt + this._alen = 0 + this._len = 0 + this._mode = mode + + this._authTag = null + this._called = false +} + +inherits(StreamCipher, Transform) + +StreamCipher.prototype._update = function (chunk) { + if (!this._called && this._alen) { + var rump = 16 - (this._alen % 16) + if (rump < 16) { + rump = Buffer.alloc(rump, 0) + this._ghash.update(rump) + } + } + + this._called = true + var out = this._mode.encrypt(this, chunk) + if (this._decrypt) { + this._ghash.update(chunk) + } else { + this._ghash.update(out) + } + this._len += chunk.length + return out +} + +StreamCipher.prototype._final = function () { + if (this._decrypt && !this._authTag) throw new Error('Unsupported state or unable to authenticate data') + + var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID)) + if (this._decrypt && xorTest(tag, this._authTag)) throw new Error('Unsupported state or unable to authenticate data') + + this._authTag = tag + this._cipher.scrub() +} + +StreamCipher.prototype.getAuthTag = function getAuthTag () { + if (this._decrypt || !Buffer.isBuffer(this._authTag)) throw new Error('Attempting to get auth tag in unsupported state') + + return this._authTag +} + +StreamCipher.prototype.setAuthTag = function setAuthTag (tag) { + if (!this._decrypt) throw new Error('Attempting to set auth tag in unsupported state') + + this._authTag = tag +} + +StreamCipher.prototype.setAAD = function setAAD (buf) { + if (this._called) throw new Error('Attempting to set AAD in unsupported state') + + this._ghash.update(buf) + this._alen += buf.length +} + +module.exports = StreamCipher + +},{"./aes":20,"./ghash":25,"./incr32":26,"buffer-xor":48,"cipher-base":50,"inherits":101,"safe-buffer":143}],22:[function(require,module,exports){ +var ciphers = require('./encrypter') +var deciphers = require('./decrypter') +var modes = require('./modes/list.json') + +function getCiphers () { + return Object.keys(modes) +} + +exports.createCipher = exports.Cipher = ciphers.createCipher +exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv +exports.createDecipher = exports.Decipher = deciphers.createDecipher +exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv +exports.listCiphers = exports.getCiphers = getCiphers + +},{"./decrypter":23,"./encrypter":24,"./modes/list.json":34}],23:[function(require,module,exports){ +var AuthCipher = require('./authCipher') +var Buffer = require('safe-buffer').Buffer +var MODES = require('./modes') +var StreamCipher = require('./streamCipher') +var Transform = require('cipher-base') +var aes = require('./aes') +var ebtk = require('evp_bytestokey') +var inherits = require('inherits') + +function Decipher (mode, key, iv) { + Transform.call(this) + + this._cache = new Splitter() + this._last = void 0 + this._cipher = new aes.AES(key) + this._prev = Buffer.from(iv) + this._mode = mode + this._autopadding = true +} + +inherits(Decipher, Transform) + +Decipher.prototype._update = function (data) { + this._cache.add(data) + var chunk + var thing + var out = [] + while ((chunk = this._cache.get(this._autopadding))) { + thing = this._mode.decrypt(this, chunk) + out.push(thing) + } + return Buffer.concat(out) +} + +Decipher.prototype._final = function () { + var chunk = this._cache.flush() + if (this._autopadding) { + return unpad(this._mode.decrypt(this, chunk)) + } else if (chunk) { + throw new Error('data not multiple of block length') + } +} + +Decipher.prototype.setAutoPadding = function (setTo) { + this._autopadding = !!setTo + return this +} + +function Splitter () { + this.cache = Buffer.allocUnsafe(0) +} + +Splitter.prototype.add = function (data) { + this.cache = Buffer.concat([this.cache, data]) +} + +Splitter.prototype.get = function (autoPadding) { + var out + if (autoPadding) { + if (this.cache.length > 16) { + out = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + return out + } + } else { + if (this.cache.length >= 16) { + out = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + return out + } + } + + return null +} + +Splitter.prototype.flush = function () { + if (this.cache.length) return this.cache +} + +function unpad (last) { + var padded = last[15] + if (padded < 1 || padded > 16) { + throw new Error('unable to decrypt data') + } + var i = -1 + while (++i < padded) { + if (last[(i + (16 - padded))] !== padded) { + throw new Error('unable to decrypt data') + } + } + if (padded === 16) return + + return last.slice(0, 16 - padded) +} + +function createDecipheriv (suite, password, iv) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + if (typeof iv === 'string') iv = Buffer.from(iv) + if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) + + if (typeof password === 'string') password = Buffer.from(password) + if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) + + if (config.type === 'stream') { + return new StreamCipher(config.module, password, iv, true) + } else if (config.type === 'auth') { + return new AuthCipher(config.module, password, iv, true) + } + + return new Decipher(config.module, password, iv) +} + +function createDecipher (suite, password) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + var keys = ebtk(password, false, config.key, config.iv) + return createDecipheriv(suite, keys.key, keys.iv) +} + +exports.createDecipher = createDecipher +exports.createDecipheriv = createDecipheriv + +},{"./aes":20,"./authCipher":21,"./modes":33,"./streamCipher":36,"cipher-base":50,"evp_bytestokey":85,"inherits":101,"safe-buffer":143}],24:[function(require,module,exports){ +var MODES = require('./modes') +var AuthCipher = require('./authCipher') +var Buffer = require('safe-buffer').Buffer +var StreamCipher = require('./streamCipher') +var Transform = require('cipher-base') +var aes = require('./aes') +var ebtk = require('evp_bytestokey') +var inherits = require('inherits') + +function Cipher (mode, key, iv) { + Transform.call(this) + + this._cache = new Splitter() + this._cipher = new aes.AES(key) + this._prev = Buffer.from(iv) + this._mode = mode + this._autopadding = true +} + +inherits(Cipher, Transform) + +Cipher.prototype._update = function (data) { + this._cache.add(data) + var chunk + var thing + var out = [] + + while ((chunk = this._cache.get())) { + thing = this._mode.encrypt(this, chunk) + out.push(thing) + } + + return Buffer.concat(out) +} + +var PADDING = Buffer.alloc(16, 0x10) + +Cipher.prototype._final = function () { + var chunk = this._cache.flush() + if (this._autopadding) { + chunk = this._mode.encrypt(this, chunk) + this._cipher.scrub() + return chunk + } + + if (!chunk.equals(PADDING)) { + this._cipher.scrub() + throw new Error('data not multiple of block length') + } +} + +Cipher.prototype.setAutoPadding = function (setTo) { + this._autopadding = !!setTo + return this +} + +function Splitter () { + this.cache = Buffer.allocUnsafe(0) +} + +Splitter.prototype.add = function (data) { + this.cache = Buffer.concat([this.cache, data]) +} + +Splitter.prototype.get = function () { + if (this.cache.length > 15) { + var out = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + return out + } + return null +} + +Splitter.prototype.flush = function () { + var len = 16 - this.cache.length + var padBuff = Buffer.allocUnsafe(len) + + var i = -1 + while (++i < len) { + padBuff.writeUInt8(len, i) + } + + return Buffer.concat([this.cache, padBuff]) +} + +function createCipheriv (suite, password, iv) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + if (typeof password === 'string') password = Buffer.from(password) + if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) + + if (typeof iv === 'string') iv = Buffer.from(iv) + if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) + + if (config.type === 'stream') { + return new StreamCipher(config.module, password, iv) + } else if (config.type === 'auth') { + return new AuthCipher(config.module, password, iv) + } + + return new Cipher(config.module, password, iv) +} + +function createCipher (suite, password) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + var keys = ebtk(password, false, config.key, config.iv) + return createCipheriv(suite, keys.key, keys.iv) +} + +exports.createCipheriv = createCipheriv +exports.createCipher = createCipher + +},{"./aes":20,"./authCipher":21,"./modes":33,"./streamCipher":36,"cipher-base":50,"evp_bytestokey":85,"inherits":101,"safe-buffer":143}],25:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var ZEROES = Buffer.alloc(16, 0) + +function toArray (buf) { + return [ + buf.readUInt32BE(0), + buf.readUInt32BE(4), + buf.readUInt32BE(8), + buf.readUInt32BE(12) + ] +} + +function fromArray (out) { + var buf = Buffer.allocUnsafe(16) + buf.writeUInt32BE(out[0] >>> 0, 0) + buf.writeUInt32BE(out[1] >>> 0, 4) + buf.writeUInt32BE(out[2] >>> 0, 8) + buf.writeUInt32BE(out[3] >>> 0, 12) + return buf +} + +function GHASH (key) { + this.h = key + this.state = Buffer.alloc(16, 0) + this.cache = Buffer.allocUnsafe(0) +} + +// from http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_gcm.js.html +// by Juho Vähä-Herttua +GHASH.prototype.ghash = function (block) { + var i = -1 + while (++i < block.length) { + this.state[i] ^= block[i] + } + this._multiply() +} + +GHASH.prototype._multiply = function () { + var Vi = toArray(this.h) + var Zi = [0, 0, 0, 0] + var j, xi, lsbVi + var i = -1 + while (++i < 128) { + xi = (this.state[~~(i / 8)] & (1 << (7 - (i % 8)))) !== 0 + if (xi) { + // Z_i+1 = Z_i ^ V_i + Zi[0] ^= Vi[0] + Zi[1] ^= Vi[1] + Zi[2] ^= Vi[2] + Zi[3] ^= Vi[3] + } + + // Store the value of LSB(V_i) + lsbVi = (Vi[3] & 1) !== 0 + + // V_i+1 = V_i >> 1 + for (j = 3; j > 0; j--) { + Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31) + } + Vi[0] = Vi[0] >>> 1 + + // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R + if (lsbVi) { + Vi[0] = Vi[0] ^ (0xe1 << 24) + } + } + this.state = fromArray(Zi) +} + +GHASH.prototype.update = function (buf) { + this.cache = Buffer.concat([this.cache, buf]) + var chunk + while (this.cache.length >= 16) { + chunk = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + this.ghash(chunk) + } +} + +GHASH.prototype.final = function (abl, bl) { + if (this.cache.length) { + this.ghash(Buffer.concat([this.cache, ZEROES], 16)) + } + + this.ghash(fromArray([0, abl, 0, bl])) + return this.state +} + +module.exports = GHASH + +},{"safe-buffer":143}],26:[function(require,module,exports){ +function incr32 (iv) { + var len = iv.length + var item + while (len--) { + item = iv.readUInt8(len) + if (item === 255) { + iv.writeUInt8(0, len) + } else { + item++ + iv.writeUInt8(item, len) + break + } + } +} +module.exports = incr32 + +},{}],27:[function(require,module,exports){ +var xor = require('buffer-xor') + +exports.encrypt = function (self, block) { + var data = xor(block, self._prev) + + self._prev = self._cipher.encryptBlock(data) + return self._prev +} + +exports.decrypt = function (self, block) { + var pad = self._prev + + self._prev = block + var out = self._cipher.decryptBlock(block) + + return xor(out, pad) +} + +},{"buffer-xor":48}],28:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var xor = require('buffer-xor') + +function encryptStart (self, data, decrypt) { + var len = data.length + var out = xor(data, self._cache) + self._cache = self._cache.slice(len) + self._prev = Buffer.concat([self._prev, decrypt ? data : out]) + return out +} + +exports.encrypt = function (self, data, decrypt) { + var out = Buffer.allocUnsafe(0) + var len + + while (data.length) { + if (self._cache.length === 0) { + self._cache = self._cipher.encryptBlock(self._prev) + self._prev = Buffer.allocUnsafe(0) + } + + if (self._cache.length <= data.length) { + len = self._cache.length + out = Buffer.concat([out, encryptStart(self, data.slice(0, len), decrypt)]) + data = data.slice(len) + } else { + out = Buffer.concat([out, encryptStart(self, data, decrypt)]) + break + } + } + + return out +} + +},{"buffer-xor":48,"safe-buffer":143}],29:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer + +function encryptByte (self, byteParam, decrypt) { + var pad + var i = -1 + var len = 8 + var out = 0 + var bit, value + while (++i < len) { + pad = self._cipher.encryptBlock(self._prev) + bit = (byteParam & (1 << (7 - i))) ? 0x80 : 0 + value = pad[0] ^ bit + out += ((value & 0x80) >> (i % 8)) + self._prev = shiftIn(self._prev, decrypt ? bit : value) + } + return out +} + +function shiftIn (buffer, value) { + var len = buffer.length + var i = -1 + var out = Buffer.allocUnsafe(buffer.length) + buffer = Buffer.concat([buffer, Buffer.from([value])]) + + while (++i < len) { + out[i] = buffer[i] << 1 | buffer[i + 1] >> (7) + } + + return out +} + +exports.encrypt = function (self, chunk, decrypt) { + var len = chunk.length + var out = Buffer.allocUnsafe(len) + var i = -1 + + while (++i < len) { + out[i] = encryptByte(self, chunk[i], decrypt) + } + + return out +} + +},{"safe-buffer":143}],30:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer + +function encryptByte (self, byteParam, decrypt) { + var pad = self._cipher.encryptBlock(self._prev) + var out = pad[0] ^ byteParam + + self._prev = Buffer.concat([ + self._prev.slice(1), + Buffer.from([decrypt ? byteParam : out]) + ]) + + return out +} + +exports.encrypt = function (self, chunk, decrypt) { + var len = chunk.length + var out = Buffer.allocUnsafe(len) + var i = -1 + + while (++i < len) { + out[i] = encryptByte(self, chunk[i], decrypt) + } + + return out +} + +},{"safe-buffer":143}],31:[function(require,module,exports){ +var xor = require('buffer-xor') +var Buffer = require('safe-buffer').Buffer +var incr32 = require('../incr32') + +function getBlock (self) { + var out = self._cipher.encryptBlockRaw(self._prev) + incr32(self._prev) + return out +} + +var blockSize = 16 +exports.encrypt = function (self, chunk) { + var chunkNum = Math.ceil(chunk.length / blockSize) + var start = self._cache.length + self._cache = Buffer.concat([ + self._cache, + Buffer.allocUnsafe(chunkNum * blockSize) + ]) + for (var i = 0; i < chunkNum; i++) { + var out = getBlock(self) + var offset = start + i * blockSize + self._cache.writeUInt32BE(out[0], offset + 0) + self._cache.writeUInt32BE(out[1], offset + 4) + self._cache.writeUInt32BE(out[2], offset + 8) + self._cache.writeUInt32BE(out[3], offset + 12) + } + var pad = self._cache.slice(0, chunk.length) + self._cache = self._cache.slice(chunk.length) + return xor(chunk, pad) +} + +},{"../incr32":26,"buffer-xor":48,"safe-buffer":143}],32:[function(require,module,exports){ +exports.encrypt = function (self, block) { + return self._cipher.encryptBlock(block) +} + +exports.decrypt = function (self, block) { + return self._cipher.decryptBlock(block) +} + +},{}],33:[function(require,module,exports){ +var modeModules = { + ECB: require('./ecb'), + CBC: require('./cbc'), + CFB: require('./cfb'), + CFB8: require('./cfb8'), + CFB1: require('./cfb1'), + OFB: require('./ofb'), + CTR: require('./ctr'), + GCM: require('./ctr') +} + +var modes = require('./list.json') + +for (var key in modes) { + modes[key].module = modeModules[modes[key].mode] +} + +module.exports = modes + +},{"./cbc":27,"./cfb":28,"./cfb1":29,"./cfb8":30,"./ctr":31,"./ecb":32,"./list.json":34,"./ofb":35}],34:[function(require,module,exports){ +module.exports={ + "aes-128-ecb": { + "cipher": "AES", + "key": 128, + "iv": 0, + "mode": "ECB", + "type": "block" + }, + "aes-192-ecb": { + "cipher": "AES", + "key": 192, + "iv": 0, + "mode": "ECB", + "type": "block" + }, + "aes-256-ecb": { + "cipher": "AES", + "key": 256, + "iv": 0, + "mode": "ECB", + "type": "block" + }, + "aes-128-cbc": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes-192-cbc": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes-256-cbc": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes128": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes192": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes256": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes-128-cfb": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CFB", + "type": "stream" + }, + "aes-192-cfb": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CFB", + "type": "stream" + }, + "aes-256-cfb": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CFB", + "type": "stream" + }, + "aes-128-cfb8": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CFB8", + "type": "stream" + }, + "aes-192-cfb8": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CFB8", + "type": "stream" + }, + "aes-256-cfb8": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CFB8", + "type": "stream" + }, + "aes-128-cfb1": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CFB1", + "type": "stream" + }, + "aes-192-cfb1": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CFB1", + "type": "stream" + }, + "aes-256-cfb1": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CFB1", + "type": "stream" + }, + "aes-128-ofb": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "OFB", + "type": "stream" + }, + "aes-192-ofb": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "OFB", + "type": "stream" + }, + "aes-256-ofb": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "OFB", + "type": "stream" + }, + "aes-128-ctr": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CTR", + "type": "stream" + }, + "aes-192-ctr": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CTR", + "type": "stream" + }, + "aes-256-ctr": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CTR", + "type": "stream" + }, + "aes-128-gcm": { + "cipher": "AES", + "key": 128, + "iv": 12, + "mode": "GCM", + "type": "auth" + }, + "aes-192-gcm": { + "cipher": "AES", + "key": 192, + "iv": 12, + "mode": "GCM", + "type": "auth" + }, + "aes-256-gcm": { + "cipher": "AES", + "key": 256, + "iv": 12, + "mode": "GCM", + "type": "auth" + } +} + +},{}],35:[function(require,module,exports){ +(function (Buffer){ +var xor = require('buffer-xor') + +function getBlock (self) { + self._prev = self._cipher.encryptBlock(self._prev) + return self._prev +} + +exports.encrypt = function (self, chunk) { + while (self._cache.length < chunk.length) { + self._cache = Buffer.concat([self._cache, getBlock(self)]) + } + + var pad = self._cache.slice(0, chunk.length) + self._cache = self._cache.slice(chunk.length) + return xor(chunk, pad) +} + +}).call(this,require("buffer").Buffer) +},{"buffer":49,"buffer-xor":48}],36:[function(require,module,exports){ +var aes = require('./aes') +var Buffer = require('safe-buffer').Buffer +var Transform = require('cipher-base') +var inherits = require('inherits') + +function StreamCipher (mode, key, iv, decrypt) { + Transform.call(this) + + this._cipher = new aes.AES(key) + this._prev = Buffer.from(iv) + this._cache = Buffer.allocUnsafe(0) + this._secCache = Buffer.allocUnsafe(0) + this._decrypt = decrypt + this._mode = mode +} + +inherits(StreamCipher, Transform) + +StreamCipher.prototype._update = function (chunk) { + return this._mode.encrypt(this, chunk, this._decrypt) +} + +StreamCipher.prototype._final = function () { + this._cipher.scrub() +} + +module.exports = StreamCipher + +},{"./aes":20,"cipher-base":50,"inherits":101,"safe-buffer":143}],37:[function(require,module,exports){ +var DES = require('browserify-des') +var aes = require('browserify-aes/browser') +var aesModes = require('browserify-aes/modes') +var desModes = require('browserify-des/modes') +var ebtk = require('evp_bytestokey') + +function createCipher (suite, password) { + suite = suite.toLowerCase() + + var keyLen, ivLen + if (aesModes[suite]) { + keyLen = aesModes[suite].key + ivLen = aesModes[suite].iv + } else if (desModes[suite]) { + keyLen = desModes[suite].key * 8 + ivLen = desModes[suite].iv + } else { + throw new TypeError('invalid suite type') + } + + var keys = ebtk(password, false, keyLen, ivLen) + return createCipheriv(suite, keys.key, keys.iv) +} + +function createDecipher (suite, password) { + suite = suite.toLowerCase() + + var keyLen, ivLen + if (aesModes[suite]) { + keyLen = aesModes[suite].key + ivLen = aesModes[suite].iv + } else if (desModes[suite]) { + keyLen = desModes[suite].key * 8 + ivLen = desModes[suite].iv + } else { + throw new TypeError('invalid suite type') + } + + var keys = ebtk(password, false, keyLen, ivLen) + return createDecipheriv(suite, keys.key, keys.iv) +} + +function createCipheriv (suite, key, iv) { + suite = suite.toLowerCase() + if (aesModes[suite]) return aes.createCipheriv(suite, key, iv) + if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite }) + + throw new TypeError('invalid suite type') +} + +function createDecipheriv (suite, key, iv) { + suite = suite.toLowerCase() + if (aesModes[suite]) return aes.createDecipheriv(suite, key, iv) + if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite, decrypt: true }) + + throw new TypeError('invalid suite type') +} + +function getCiphers () { + return Object.keys(desModes).concat(aes.getCiphers()) +} + +exports.createCipher = exports.Cipher = createCipher +exports.createCipheriv = exports.Cipheriv = createCipheriv +exports.createDecipher = exports.Decipher = createDecipher +exports.createDecipheriv = exports.Decipheriv = createDecipheriv +exports.listCiphers = exports.getCiphers = getCiphers + +},{"browserify-aes/browser":22,"browserify-aes/modes":33,"browserify-des":38,"browserify-des/modes":39,"evp_bytestokey":85}],38:[function(require,module,exports){ +var CipherBase = require('cipher-base') +var des = require('des.js') +var inherits = require('inherits') +var Buffer = require('safe-buffer').Buffer + +var modes = { + 'des-ede3-cbc': des.CBC.instantiate(des.EDE), + 'des-ede3': des.EDE, + 'des-ede-cbc': des.CBC.instantiate(des.EDE), + 'des-ede': des.EDE, + 'des-cbc': des.CBC.instantiate(des.DES), + 'des-ecb': des.DES +} +modes.des = modes['des-cbc'] +modes.des3 = modes['des-ede3-cbc'] +module.exports = DES +inherits(DES, CipherBase) +function DES (opts) { + CipherBase.call(this) + var modeName = opts.mode.toLowerCase() + var mode = modes[modeName] + var type + if (opts.decrypt) { + type = 'decrypt' + } else { + type = 'encrypt' + } + var key = opts.key + if (!Buffer.isBuffer(key)) { + key = Buffer.from(key) + } + if (modeName === 'des-ede' || modeName === 'des-ede-cbc') { + key = Buffer.concat([key, key.slice(0, 8)]) + } + var iv = opts.iv + if (!Buffer.isBuffer(iv)) { + iv = Buffer.from(iv) + } + this._des = mode.create({ + key: key, + iv: iv, + type: type + }) +} +DES.prototype._update = function (data) { + return Buffer.from(this._des.update(data)) +} +DES.prototype._final = function () { + return Buffer.from(this._des.final()) +} + +},{"cipher-base":50,"des.js":58,"inherits":101,"safe-buffer":143}],39:[function(require,module,exports){ +exports['des-ecb'] = { + key: 8, + iv: 0 +} +exports['des-cbc'] = exports.des = { + key: 8, + iv: 8 +} +exports['des-ede3-cbc'] = exports.des3 = { + key: 24, + iv: 8 +} +exports['des-ede3'] = { + key: 24, + iv: 0 +} +exports['des-ede-cbc'] = { + key: 16, + iv: 8 +} +exports['des-ede'] = { + key: 16, + iv: 0 +} + +},{}],40:[function(require,module,exports){ +(function (Buffer){ +var bn = require('bn.js'); +var randomBytes = require('randombytes'); +module.exports = crt; +function blind(priv) { + var r = getr(priv); + var blinder = r.toRed(bn.mont(priv.modulus)) + .redPow(new bn(priv.publicExponent)).fromRed(); + return { + blinder: blinder, + unblinder:r.invm(priv.modulus) + }; +} +function crt(msg, priv) { + var blinds = blind(priv); + var len = priv.modulus.byteLength(); + var mod = bn.mont(priv.modulus); + var blinded = new bn(msg).mul(blinds.blinder).umod(priv.modulus); + var c1 = blinded.toRed(bn.mont(priv.prime1)); + var c2 = blinded.toRed(bn.mont(priv.prime2)); + var qinv = priv.coefficient; + var p = priv.prime1; + var q = priv.prime2; + var m1 = c1.redPow(priv.exponent1); + var m2 = c2.redPow(priv.exponent2); + m1 = m1.fromRed(); + m2 = m2.fromRed(); + var h = m1.isub(m2).imul(qinv).umod(p); + h.imul(q); + m2.iadd(h); + return new Buffer(m2.imul(blinds.unblinder).umod(priv.modulus).toArray(false, len)); +} +crt.getr = getr; +function getr(priv) { + var len = priv.modulus.byteLength(); + var r = new bn(randomBytes(len)); + while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)) { + r = new bn(randomBytes(len)); + } + return r; +} + +}).call(this,require("buffer").Buffer) +},{"bn.js":17,"buffer":49,"randombytes":127}],41:[function(require,module,exports){ +module.exports = require('./browser/algorithms.json') + +},{"./browser/algorithms.json":42}],42:[function(require,module,exports){ +module.exports={ + "sha224WithRSAEncryption": { + "sign": "rsa", + "hash": "sha224", + "id": "302d300d06096086480165030402040500041c" + }, + "RSA-SHA224": { + "sign": "ecdsa/rsa", + "hash": "sha224", + "id": "302d300d06096086480165030402040500041c" + }, + "sha256WithRSAEncryption": { + "sign": "rsa", + "hash": "sha256", + "id": "3031300d060960864801650304020105000420" + }, + "RSA-SHA256": { + "sign": "ecdsa/rsa", + "hash": "sha256", + "id": "3031300d060960864801650304020105000420" + }, + "sha384WithRSAEncryption": { + "sign": "rsa", + "hash": "sha384", + "id": "3041300d060960864801650304020205000430" + }, + "RSA-SHA384": { + "sign": "ecdsa/rsa", + "hash": "sha384", + "id": "3041300d060960864801650304020205000430" + }, + "sha512WithRSAEncryption": { + "sign": "rsa", + "hash": "sha512", + "id": "3051300d060960864801650304020305000440" + }, + "RSA-SHA512": { + "sign": "ecdsa/rsa", + "hash": "sha512", + "id": "3051300d060960864801650304020305000440" + }, + "RSA-SHA1": { + "sign": "rsa", + "hash": "sha1", + "id": "3021300906052b0e03021a05000414" + }, + "ecdsa-with-SHA1": { + "sign": "ecdsa", + "hash": "sha1", + "id": "" + }, + "sha256": { + "sign": "ecdsa", + "hash": "sha256", + "id": "" + }, + "sha224": { + "sign": "ecdsa", + "hash": "sha224", + "id": "" + }, + "sha384": { + "sign": "ecdsa", + "hash": "sha384", + "id": "" + }, + "sha512": { + "sign": "ecdsa", + "hash": "sha512", + "id": "" + }, + "DSA-SHA": { + "sign": "dsa", + "hash": "sha1", + "id": "" + }, + "DSA-SHA1": { + "sign": "dsa", + "hash": "sha1", + "id": "" + }, + "DSA": { + "sign": "dsa", + "hash": "sha1", + "id": "" + }, + "DSA-WITH-SHA224": { + "sign": "dsa", + "hash": "sha224", + "id": "" + }, + "DSA-SHA224": { + "sign": "dsa", + "hash": "sha224", + "id": "" + }, + "DSA-WITH-SHA256": { + "sign": "dsa", + "hash": "sha256", + "id": "" + }, + "DSA-SHA256": { + "sign": "dsa", + "hash": "sha256", + "id": "" + }, + "DSA-WITH-SHA384": { + "sign": "dsa", + "hash": "sha384", + "id": "" + }, + "DSA-SHA384": { + "sign": "dsa", + "hash": "sha384", + "id": "" + }, + "DSA-WITH-SHA512": { + "sign": "dsa", + "hash": "sha512", + "id": "" + }, + "DSA-SHA512": { + "sign": "dsa", + "hash": "sha512", + "id": "" + }, + "DSA-RIPEMD160": { + "sign": "dsa", + "hash": "rmd160", + "id": "" + }, + "ripemd160WithRSA": { + "sign": "rsa", + "hash": "rmd160", + "id": "3021300906052b2403020105000414" + }, + "RSA-RIPEMD160": { + "sign": "rsa", + "hash": "rmd160", + "id": "3021300906052b2403020105000414" + }, + "md5WithRSAEncryption": { + "sign": "rsa", + "hash": "md5", + "id": "3020300c06082a864886f70d020505000410" + }, + "RSA-MD5": { + "sign": "rsa", + "hash": "md5", + "id": "3020300c06082a864886f70d020505000410" + } +} + +},{}],43:[function(require,module,exports){ +module.exports={ + "1.3.132.0.10": "secp256k1", + "1.3.132.0.33": "p224", + "1.2.840.10045.3.1.1": "p192", + "1.2.840.10045.3.1.7": "p256", + "1.3.132.0.34": "p384", + "1.3.132.0.35": "p521" +} + +},{}],44:[function(require,module,exports){ +(function (Buffer){ +var createHash = require('create-hash') +var stream = require('stream') +var inherits = require('inherits') +var sign = require('./sign') +var verify = require('./verify') + +var algorithms = require('./algorithms.json') +Object.keys(algorithms).forEach(function (key) { + algorithms[key].id = new Buffer(algorithms[key].id, 'hex') + algorithms[key.toLowerCase()] = algorithms[key] +}) + +function Sign (algorithm) { + stream.Writable.call(this) + + var data = algorithms[algorithm] + if (!data) throw new Error('Unknown message digest') + + this._hashType = data.hash + this._hash = createHash(data.hash) + this._tag = data.id + this._signType = data.sign +} +inherits(Sign, stream.Writable) + +Sign.prototype._write = function _write (data, _, done) { + this._hash.update(data) + done() +} + +Sign.prototype.update = function update (data, enc) { + if (typeof data === 'string') data = new Buffer(data, enc) + + this._hash.update(data) + return this +} + +Sign.prototype.sign = function signMethod (key, enc) { + this.end() + var hash = this._hash.digest() + var sig = sign(hash, key, this._hashType, this._signType, this._tag) + + return enc ? sig.toString(enc) : sig +} + +function Verify (algorithm) { + stream.Writable.call(this) + + var data = algorithms[algorithm] + if (!data) throw new Error('Unknown message digest') + + this._hash = createHash(data.hash) + this._tag = data.id + this._signType = data.sign +} +inherits(Verify, stream.Writable) + +Verify.prototype._write = function _write (data, _, done) { + this._hash.update(data) + done() +} + +Verify.prototype.update = function update (data, enc) { + if (typeof data === 'string') data = new Buffer(data, enc) + + this._hash.update(data) + return this +} + +Verify.prototype.verify = function verifyMethod (key, sig, enc) { + if (typeof sig === 'string') sig = new Buffer(sig, enc) + + this.end() + var hash = this._hash.digest() + return verify(sig, hash, key, this._signType, this._tag) +} + +function createSign (algorithm) { + return new Sign(algorithm) +} + +function createVerify (algorithm) { + return new Verify(algorithm) +} + +module.exports = { + Sign: createSign, + Verify: createVerify, + createSign: createSign, + createVerify: createVerify +} + +}).call(this,require("buffer").Buffer) +},{"./algorithms.json":42,"./sign":45,"./verify":46,"buffer":49,"create-hash":53,"inherits":101,"stream":152}],45:[function(require,module,exports){ +(function (Buffer){ +// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js +var createHmac = require('create-hmac') +var crt = require('browserify-rsa') +var EC = require('elliptic').ec +var BN = require('bn.js') +var parseKeys = require('parse-asn1') +var curves = require('./curves.json') + +function sign (hash, key, hashType, signType, tag) { + var priv = parseKeys(key) + if (priv.curve) { + // rsa keys can be interpreted as ecdsa ones in openssl + if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') + return ecSign(hash, priv) + } else if (priv.type === 'dsa') { + if (signType !== 'dsa') throw new Error('wrong private key type') + return dsaSign(hash, priv, hashType) + } else { + if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') + } + hash = Buffer.concat([tag, hash]) + var len = priv.modulus.byteLength() + var pad = [ 0, 1 ] + while (hash.length + pad.length + 1 < len) pad.push(0xff) + pad.push(0x00) + var i = -1 + while (++i < hash.length) pad.push(hash[i]) + + var out = crt(pad, priv) + return out +} + +function ecSign (hash, priv) { + var curveId = curves[priv.curve.join('.')] + if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.')) + + var curve = new EC(curveId) + var key = curve.keyFromPrivate(priv.privateKey) + var out = key.sign(hash) + + return new Buffer(out.toDER()) +} + +function dsaSign (hash, priv, algo) { + var x = priv.params.priv_key + var p = priv.params.p + var q = priv.params.q + var g = priv.params.g + var r = new BN(0) + var k + var H = bits2int(hash, q).mod(q) + var s = false + var kv = getKey(x, q, hash, algo) + while (s === false) { + k = makeKey(q, kv, algo) + r = makeR(g, k, p, q) + s = k.invm(q).imul(H.add(x.mul(r))).mod(q) + if (s.cmpn(0) === 0) { + s = false + r = new BN(0) + } + } + return toDER(r, s) +} + +function toDER (r, s) { + r = r.toArray() + s = s.toArray() + + // Pad values + if (r[0] & 0x80) r = [ 0 ].concat(r) + if (s[0] & 0x80) s = [ 0 ].concat(s) + + var total = r.length + s.length + 4 + var res = [ 0x30, total, 0x02, r.length ] + res = res.concat(r, [ 0x02, s.length ], s) + return new Buffer(res) +} + +function getKey (x, q, hash, algo) { + x = new Buffer(x.toArray()) + if (x.length < q.byteLength()) { + var zeros = new Buffer(q.byteLength() - x.length) + zeros.fill(0) + x = Buffer.concat([ zeros, x ]) + } + var hlen = hash.length + var hbits = bits2octets(hash, q) + var v = new Buffer(hlen) + v.fill(1) + var k = new Buffer(hlen) + k.fill(0) + k = createHmac(algo, k).update(v).update(new Buffer([ 0 ])).update(x).update(hbits).digest() + v = createHmac(algo, k).update(v).digest() + k = createHmac(algo, k).update(v).update(new Buffer([ 1 ])).update(x).update(hbits).digest() + v = createHmac(algo, k).update(v).digest() + return { k: k, v: v } +} + +function bits2int (obits, q) { + var bits = new BN(obits) + var shift = (obits.length << 3) - q.bitLength() + if (shift > 0) bits.ishrn(shift) + return bits +} + +function bits2octets (bits, q) { + bits = bits2int(bits, q) + bits = bits.mod(q) + var out = new Buffer(bits.toArray()) + if (out.length < q.byteLength()) { + var zeros = new Buffer(q.byteLength() - out.length) + zeros.fill(0) + out = Buffer.concat([ zeros, out ]) + } + return out +} + +function makeKey (q, kv, algo) { + var t + var k + + do { + t = new Buffer(0) + + while (t.length * 8 < q.bitLength()) { + kv.v = createHmac(algo, kv.k).update(kv.v).digest() + t = Buffer.concat([ t, kv.v ]) + } + + k = bits2int(t, q) + kv.k = createHmac(algo, kv.k).update(kv.v).update(new Buffer([ 0 ])).digest() + kv.v = createHmac(algo, kv.k).update(kv.v).digest() + } while (k.cmp(q) !== -1) + + return k +} + +function makeR (g, k, p, q) { + return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q) +} + +module.exports = sign +module.exports.getKey = getKey +module.exports.makeKey = makeKey + +}).call(this,require("buffer").Buffer) +},{"./curves.json":43,"bn.js":17,"browserify-rsa":40,"buffer":49,"create-hmac":55,"elliptic":68,"parse-asn1":112}],46:[function(require,module,exports){ +(function (Buffer){ +// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js +var BN = require('bn.js') +var EC = require('elliptic').ec +var parseKeys = require('parse-asn1') +var curves = require('./curves.json') + +function verify (sig, hash, key, signType, tag) { + var pub = parseKeys(key) + if (pub.type === 'ec') { + // rsa keys can be interpreted as ecdsa ones in openssl + if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') + return ecVerify(sig, hash, pub) + } else if (pub.type === 'dsa') { + if (signType !== 'dsa') throw new Error('wrong public key type') + return dsaVerify(sig, hash, pub) + } else { + if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') + } + hash = Buffer.concat([tag, hash]) + var len = pub.modulus.byteLength() + var pad = [ 1 ] + var padNum = 0 + while (hash.length + pad.length + 2 < len) { + pad.push(0xff) + padNum++ + } + pad.push(0x00) + var i = -1 + while (++i < hash.length) { + pad.push(hash[i]) + } + pad = new Buffer(pad) + var red = BN.mont(pub.modulus) + sig = new BN(sig).toRed(red) + + sig = sig.redPow(new BN(pub.publicExponent)) + sig = new Buffer(sig.fromRed().toArray()) + var out = padNum < 8 ? 1 : 0 + len = Math.min(sig.length, pad.length) + if (sig.length !== pad.length) out = 1 + + i = -1 + while (++i < len) out |= sig[i] ^ pad[i] + return out === 0 +} + +function ecVerify (sig, hash, pub) { + var curveId = curves[pub.data.algorithm.curve.join('.')] + if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.')) + + var curve = new EC(curveId) + var pubkey = pub.data.subjectPrivateKey.data + + return curve.verify(hash, sig, pubkey) +} + +function dsaVerify (sig, hash, pub) { + var p = pub.data.p + var q = pub.data.q + var g = pub.data.g + var y = pub.data.pub_key + var unpacked = parseKeys.signature.decode(sig, 'der') + var s = unpacked.s + var r = unpacked.r + checkValue(s, q) + checkValue(r, q) + var montp = BN.mont(p) + var w = s.invm(q) + var v = g.toRed(montp) + .redPow(new BN(hash).mul(w).mod(q)) + .fromRed() + .mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed()) + .mod(p) + .mod(q) + return v.cmp(r) === 0 +} + +function checkValue (b, q) { + if (b.cmpn(0) <= 0) throw new Error('invalid sig') + if (b.cmp(q) >= q) throw new Error('invalid sig') +} + +module.exports = verify + +}).call(this,require("buffer").Buffer) +},{"./curves.json":43,"bn.js":17,"buffer":49,"elliptic":68,"parse-asn1":112}],47:[function(require,module,exports){ +arguments[4][19][0].apply(exports,arguments) +},{"dup":19}],48:[function(require,module,exports){ +(function (Buffer){ +module.exports = function xor (a, b) { + var length = Math.min(a.length, b.length) + var buffer = new Buffer(length) + + for (var i = 0; i < length; ++i) { + buffer[i] = a[i] ^ b[i] + } + + return buffer +} + +}).call(this,require("buffer").Buffer) +},{"buffer":49}],49:[function(require,module,exports){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} + +function typedArraySupport () { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1) + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } + return arr.foo() === 42 + } catch (e) { + return false + } +} + +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.buffer + } +}) + +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.byteOffset + } +}) + +function createBuffer (length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"') + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf +} + +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ) + } + return allocUnsafe(arg) + } + return from(arg, encodingOrOffset, length) +} + +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species != null && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) +} + +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } + + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } + + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } + + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } + + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length) +} + +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number') + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } +} + +function alloc (size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) + } + return createBuffer(size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding) +} + +function allocUnsafe (size) { + assertSize(size) + return createBuffer(size < 0 ? 0 : checked(size) | 0) +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + + var length = byteLength(string, encoding) | 0 + var buf = createBuffer(length) + + var actual = buf.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual) + } + + return buf +} + +function fromArrayLike (array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + var buf = createBuffer(length) + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255 + } + return buf +} + +function fromArrayBuffer (array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds') + } + + var buf + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array) + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset) + } else { + buf = new Uint8Array(array, byteOffset, length) + } + + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf +} + +function fromObject (obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + var buf = createBuffer(len) + + if (buf.length === 0) { + return buf + } + + obj.copy(buf, 0, 0, len) + return buf + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) + } + return fromArrayLike(obj) + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } +} + +function checked (length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false +} + +Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf) + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) + } + + var len = string.length + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.toLocaleString = Buffer.prototype.toString + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + var strLen = string.length + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (numberIsNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0 + if (isFinite(length)) { + length = length >>> 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('Index out of range') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end) + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if ((encoding === 'utf8' && code < 128) || + encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code + } + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding) + var len = bytes.length + if (len === 0) { + throw new TypeError('The value "' + val + + '" is invalid for argument "value"') + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0] + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) +} +function numberIsNaN (obj) { + // For IE11 support + return obj !== obj // eslint-disable-line no-self-compare +} + +},{"base64-js":16,"ieee754":100}],50:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var Transform = require('stream').Transform +var StringDecoder = require('string_decoder').StringDecoder +var inherits = require('inherits') + +function CipherBase (hashMode) { + Transform.call(this) + this.hashMode = typeof hashMode === 'string' + if (this.hashMode) { + this[hashMode] = this._finalOrDigest + } else { + this.final = this._finalOrDigest + } + if (this._final) { + this.__final = this._final + this._final = null + } + this._decoder = null + this._encoding = null +} +inherits(CipherBase, Transform) + +CipherBase.prototype.update = function (data, inputEnc, outputEnc) { + if (typeof data === 'string') { + data = Buffer.from(data, inputEnc) + } + + var outData = this._update(data) + if (this.hashMode) return this + + if (outputEnc) { + outData = this._toString(outData, outputEnc) + } + + return outData +} + +CipherBase.prototype.setAutoPadding = function () {} +CipherBase.prototype.getAuthTag = function () { + throw new Error('trying to get auth tag in unsupported state') +} + +CipherBase.prototype.setAuthTag = function () { + throw new Error('trying to set auth tag in unsupported state') +} + +CipherBase.prototype.setAAD = function () { + throw new Error('trying to set aad in unsupported state') +} + +CipherBase.prototype._transform = function (data, _, next) { + var err + try { + if (this.hashMode) { + this._update(data) + } else { + this.push(this._update(data)) + } + } catch (e) { + err = e + } finally { + next(err) + } +} +CipherBase.prototype._flush = function (done) { + var err + try { + this.push(this.__final()) + } catch (e) { + err = e + } + + done(err) +} +CipherBase.prototype._finalOrDigest = function (outputEnc) { + var outData = this.__final() || Buffer.alloc(0) + if (outputEnc) { + outData = this._toString(outData, outputEnc, true) + } + return outData +} + +CipherBase.prototype._toString = function (value, enc, fin) { + if (!this._decoder) { + this._decoder = new StringDecoder(enc) + this._encoding = enc + } + + if (this._encoding !== enc) throw new Error('can\'t switch encodings') + + var out = this._decoder.write(value) + if (fin) { + out += this._decoder.end() + } + + return out +} + +module.exports = CipherBase + +},{"inherits":101,"safe-buffer":143,"stream":152,"string_decoder":153}],51:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":102}],52:[function(require,module,exports){ +(function (Buffer){ +var elliptic = require('elliptic') +var BN = require('bn.js') + +module.exports = function createECDH (curve) { + return new ECDH(curve) +} + +var aliases = { + secp256k1: { + name: 'secp256k1', + byteLength: 32 + }, + secp224r1: { + name: 'p224', + byteLength: 28 + }, + prime256v1: { + name: 'p256', + byteLength: 32 + }, + prime192v1: { + name: 'p192', + byteLength: 24 + }, + ed25519: { + name: 'ed25519', + byteLength: 32 + }, + secp384r1: { + name: 'p384', + byteLength: 48 + }, + secp521r1: { + name: 'p521', + byteLength: 66 + } +} + +aliases.p224 = aliases.secp224r1 +aliases.p256 = aliases.secp256r1 = aliases.prime256v1 +aliases.p192 = aliases.secp192r1 = aliases.prime192v1 +aliases.p384 = aliases.secp384r1 +aliases.p521 = aliases.secp521r1 + +function ECDH (curve) { + this.curveType = aliases[curve] + if (!this.curveType) { + this.curveType = { + name: curve + } + } + this.curve = new elliptic.ec(this.curveType.name) // eslint-disable-line new-cap + this.keys = void 0 +} + +ECDH.prototype.generateKeys = function (enc, format) { + this.keys = this.curve.genKeyPair() + return this.getPublicKey(enc, format) +} + +ECDH.prototype.computeSecret = function (other, inenc, enc) { + inenc = inenc || 'utf8' + if (!Buffer.isBuffer(other)) { + other = new Buffer(other, inenc) + } + var otherPub = this.curve.keyFromPublic(other).getPublic() + var out = otherPub.mul(this.keys.getPrivate()).getX() + return formatReturnValue(out, enc, this.curveType.byteLength) +} + +ECDH.prototype.getPublicKey = function (enc, format) { + var key = this.keys.getPublic(format === 'compressed', true) + if (format === 'hybrid') { + if (key[key.length - 1] % 2) { + key[0] = 7 + } else { + key[0] = 6 + } + } + return formatReturnValue(key, enc) +} + +ECDH.prototype.getPrivateKey = function (enc) { + return formatReturnValue(this.keys.getPrivate(), enc) +} + +ECDH.prototype.setPublicKey = function (pub, enc) { + enc = enc || 'utf8' + if (!Buffer.isBuffer(pub)) { + pub = new Buffer(pub, enc) + } + this.keys._importPublic(pub) + return this +} + +ECDH.prototype.setPrivateKey = function (priv, enc) { + enc = enc || 'utf8' + if (!Buffer.isBuffer(priv)) { + priv = new Buffer(priv, enc) + } + + var _priv = new BN(priv) + _priv = _priv.toString(16) + this.keys = this.curve.genKeyPair() + this.keys._importPrivate(_priv) + return this +} + +function formatReturnValue (bn, enc, len) { + if (!Array.isArray(bn)) { + bn = bn.toArray() + } + var buf = new Buffer(bn) + if (len && buf.length < len) { + var zeros = new Buffer(len - buf.length) + zeros.fill(0) + buf = Buffer.concat([zeros, buf]) + } + if (!enc) { + return buf + } else { + return buf.toString(enc) + } +} + +}).call(this,require("buffer").Buffer) +},{"bn.js":17,"buffer":49,"elliptic":68}],53:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var MD5 = require('md5.js') +var RIPEMD160 = require('ripemd160') +var sha = require('sha.js') +var Base = require('cipher-base') + +function Hash (hash) { + Base.call(this, 'digest') + + this._hash = hash +} + +inherits(Hash, Base) + +Hash.prototype._update = function (data) { + this._hash.update(data) +} + +Hash.prototype._final = function () { + return this._hash.digest() +} + +module.exports = function createHash (alg) { + alg = alg.toLowerCase() + if (alg === 'md5') return new MD5() + if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160() + + return new Hash(sha(alg)) +} + +},{"cipher-base":50,"inherits":101,"md5.js":104,"ripemd160":142,"sha.js":145}],54:[function(require,module,exports){ +var MD5 = require('md5.js') + +module.exports = function (buffer) { + return new MD5().update(buffer).digest() +} + +},{"md5.js":104}],55:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var Legacy = require('./legacy') +var Base = require('cipher-base') +var Buffer = require('safe-buffer').Buffer +var md5 = require('create-hash/md5') +var RIPEMD160 = require('ripemd160') + +var sha = require('sha.js') + +var ZEROS = Buffer.alloc(128) + +function Hmac (alg, key) { + Base.call(this, 'digest') + if (typeof key === 'string') { + key = Buffer.from(key) + } + + var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 + + this._alg = alg + this._key = key + if (key.length > blocksize) { + var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) + key = hash.update(key).digest() + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) + } + + var ipad = this._ipad = Buffer.allocUnsafe(blocksize) + var opad = this._opad = Buffer.allocUnsafe(blocksize) + + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) + this._hash.update(ipad) +} + +inherits(Hmac, Base) + +Hmac.prototype._update = function (data) { + this._hash.update(data) +} + +Hmac.prototype._final = function () { + var h = this._hash.digest() + var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg) + return hash.update(this._opad).update(h).digest() +} + +module.exports = function createHmac (alg, key) { + alg = alg.toLowerCase() + if (alg === 'rmd160' || alg === 'ripemd160') { + return new Hmac('rmd160', key) + } + if (alg === 'md5') { + return new Legacy(md5, key) + } + return new Hmac(alg, key) +} + +},{"./legacy":56,"cipher-base":50,"create-hash/md5":54,"inherits":101,"ripemd160":142,"safe-buffer":143,"sha.js":145}],56:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var Buffer = require('safe-buffer').Buffer + +var Base = require('cipher-base') + +var ZEROS = Buffer.alloc(128) +var blocksize = 64 + +function Hmac (alg, key) { + Base.call(this, 'digest') + if (typeof key === 'string') { + key = Buffer.from(key) + } + + this._alg = alg + this._key = key + + if (key.length > blocksize) { + key = alg(key) + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) + } + + var ipad = this._ipad = Buffer.allocUnsafe(blocksize) + var opad = this._opad = Buffer.allocUnsafe(blocksize) + + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + + this._hash = [ipad] +} + +inherits(Hmac, Base) + +Hmac.prototype._update = function (data) { + this._hash.push(data) +} + +Hmac.prototype._final = function () { + var h = this._alg(Buffer.concat(this._hash)) + return this._alg(Buffer.concat([this._opad, h])) +} +module.exports = Hmac + +},{"cipher-base":50,"inherits":101,"safe-buffer":143}],57:[function(require,module,exports){ +'use strict' + +exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes') +exports.createHash = exports.Hash = require('create-hash') +exports.createHmac = exports.Hmac = require('create-hmac') + +var algos = require('browserify-sign/algos') +var algoKeys = Object.keys(algos) +var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(algoKeys) +exports.getHashes = function () { + return hashes +} + +var p = require('pbkdf2') +exports.pbkdf2 = p.pbkdf2 +exports.pbkdf2Sync = p.pbkdf2Sync + +var aes = require('browserify-cipher') + +exports.Cipher = aes.Cipher +exports.createCipher = aes.createCipher +exports.Cipheriv = aes.Cipheriv +exports.createCipheriv = aes.createCipheriv +exports.Decipher = aes.Decipher +exports.createDecipher = aes.createDecipher +exports.Decipheriv = aes.Decipheriv +exports.createDecipheriv = aes.createDecipheriv +exports.getCiphers = aes.getCiphers +exports.listCiphers = aes.listCiphers + +var dh = require('diffie-hellman') + +exports.DiffieHellmanGroup = dh.DiffieHellmanGroup +exports.createDiffieHellmanGroup = dh.createDiffieHellmanGroup +exports.getDiffieHellman = dh.getDiffieHellman +exports.createDiffieHellman = dh.createDiffieHellman +exports.DiffieHellman = dh.DiffieHellman + +var sign = require('browserify-sign') + +exports.createSign = sign.createSign +exports.Sign = sign.Sign +exports.createVerify = sign.createVerify +exports.Verify = sign.Verify + +exports.createECDH = require('create-ecdh') + +var publicEncrypt = require('public-encrypt') + +exports.publicEncrypt = publicEncrypt.publicEncrypt +exports.privateEncrypt = publicEncrypt.privateEncrypt +exports.publicDecrypt = publicEncrypt.publicDecrypt +exports.privateDecrypt = publicEncrypt.privateDecrypt + +// the least I can do is make error messages for the rest of the node.js/crypto api. +// ;[ +// 'createCredentials' +// ].forEach(function (name) { +// exports[name] = function () { +// throw new Error([ +// 'sorry, ' + name + ' is not implemented yet', +// 'we accept pull requests', +// 'https://github.com/crypto-browserify/crypto-browserify' +// ].join('\n')) +// } +// }) + +var rf = require('randomfill') + +exports.randomFill = rf.randomFill +exports.randomFillSync = rf.randomFillSync + +exports.createCredentials = function () { + throw new Error([ + 'sorry, createCredentials is not implemented yet', + 'we accept pull requests', + 'https://github.com/crypto-browserify/crypto-browserify' + ].join('\n')) +} + +exports.constants = { + 'DH_CHECK_P_NOT_SAFE_PRIME': 2, + 'DH_CHECK_P_NOT_PRIME': 1, + 'DH_UNABLE_TO_CHECK_GENERATOR': 4, + 'DH_NOT_SUITABLE_GENERATOR': 8, + 'NPN_ENABLED': 1, + 'ALPN_ENABLED': 1, + 'RSA_PKCS1_PADDING': 1, + 'RSA_SSLV23_PADDING': 2, + 'RSA_NO_PADDING': 3, + 'RSA_PKCS1_OAEP_PADDING': 4, + 'RSA_X931_PADDING': 5, + 'RSA_PKCS1_PSS_PADDING': 6, + 'POINT_CONVERSION_COMPRESSED': 2, + 'POINT_CONVERSION_UNCOMPRESSED': 4, + 'POINT_CONVERSION_HYBRID': 6 +} + +},{"browserify-cipher":37,"browserify-sign":44,"browserify-sign/algos":41,"create-ecdh":52,"create-hash":53,"create-hmac":55,"diffie-hellman":64,"pbkdf2":114,"public-encrypt":121,"randombytes":127,"randomfill":128}],58:[function(require,module,exports){ +'use strict'; + +exports.utils = require('./des/utils'); +exports.Cipher = require('./des/cipher'); +exports.DES = require('./des/des'); +exports.CBC = require('./des/cbc'); +exports.EDE = require('./des/ede'); + +},{"./des/cbc":59,"./des/cipher":60,"./des/des":61,"./des/ede":62,"./des/utils":63}],59:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +var proto = {}; + +function CBCState(iv) { + assert.equal(iv.length, 8, 'Invalid IV length'); + + this.iv = new Array(8); + for (var i = 0; i < this.iv.length; i++) + this.iv[i] = iv[i]; +} + +function instantiate(Base) { + function CBC(options) { + Base.call(this, options); + this._cbcInit(); + } + inherits(CBC, Base); + + var keys = Object.keys(proto); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + CBC.prototype[key] = proto[key]; + } + + CBC.create = function create(options) { + return new CBC(options); + }; + + return CBC; +} + +exports.instantiate = instantiate; + +proto._cbcInit = function _cbcInit() { + var state = new CBCState(this.options.iv); + this._cbcState = state; +}; + +proto._update = function _update(inp, inOff, out, outOff) { + var state = this._cbcState; + var superProto = this.constructor.super_.prototype; + + var iv = state.iv; + if (this.type === 'encrypt') { + for (var i = 0; i < this.blockSize; i++) + iv[i] ^= inp[inOff + i]; + + superProto._update.call(this, iv, 0, out, outOff); + + for (var i = 0; i < this.blockSize; i++) + iv[i] = out[outOff + i]; + } else { + superProto._update.call(this, inp, inOff, out, outOff); + + for (var i = 0; i < this.blockSize; i++) + out[outOff + i] ^= iv[i]; + + for (var i = 0; i < this.blockSize; i++) + iv[i] = inp[inOff + i]; + } +}; + +},{"inherits":101,"minimalistic-assert":106}],60:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); + +function Cipher(options) { + this.options = options; + + this.type = this.options.type; + this.blockSize = 8; + this._init(); + + this.buffer = new Array(this.blockSize); + this.bufferOff = 0; +} +module.exports = Cipher; + +Cipher.prototype._init = function _init() { + // Might be overrided +}; + +Cipher.prototype.update = function update(data) { + if (data.length === 0) + return []; + + if (this.type === 'decrypt') + return this._updateDecrypt(data); + else + return this._updateEncrypt(data); +}; + +Cipher.prototype._buffer = function _buffer(data, off) { + // Append data to buffer + var min = Math.min(this.buffer.length - this.bufferOff, data.length - off); + for (var i = 0; i < min; i++) + this.buffer[this.bufferOff + i] = data[off + i]; + this.bufferOff += min; + + // Shift next + return min; +}; + +Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { + this._update(this.buffer, 0, out, off); + this.bufferOff = 0; + return this.blockSize; +}; + +Cipher.prototype._updateEncrypt = function _updateEncrypt(data) { + var inputOff = 0; + var outputOff = 0; + + var count = ((this.bufferOff + data.length) / this.blockSize) | 0; + var out = new Array(count * this.blockSize); + + if (this.bufferOff !== 0) { + inputOff += this._buffer(data, inputOff); + + if (this.bufferOff === this.buffer.length) + outputOff += this._flushBuffer(out, outputOff); + } + + // Write blocks + var max = data.length - ((data.length - inputOff) % this.blockSize); + for (; inputOff < max; inputOff += this.blockSize) { + this._update(data, inputOff, out, outputOff); + outputOff += this.blockSize; + } + + // Queue rest + for (; inputOff < data.length; inputOff++, this.bufferOff++) + this.buffer[this.bufferOff] = data[inputOff]; + + return out; +}; + +Cipher.prototype._updateDecrypt = function _updateDecrypt(data) { + var inputOff = 0; + var outputOff = 0; + + var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1; + var out = new Array(count * this.blockSize); + + // TODO(indutny): optimize it, this is far from optimal + for (; count > 0; count--) { + inputOff += this._buffer(data, inputOff); + outputOff += this._flushBuffer(out, outputOff); + } + + // Buffer rest of the input + inputOff += this._buffer(data, inputOff); + + return out; +}; + +Cipher.prototype.final = function final(buffer) { + var first; + if (buffer) + first = this.update(buffer); + + var last; + if (this.type === 'encrypt') + last = this._finalEncrypt(); + else + last = this._finalDecrypt(); + + if (first) + return first.concat(last); + else + return last; +}; + +Cipher.prototype._pad = function _pad(buffer, off) { + if (off === 0) + return false; + + while (off < buffer.length) + buffer[off++] = 0; + + return true; +}; + +Cipher.prototype._finalEncrypt = function _finalEncrypt() { + if (!this._pad(this.buffer, this.bufferOff)) + return []; + + var out = new Array(this.blockSize); + this._update(this.buffer, 0, out, 0); + return out; +}; + +Cipher.prototype._unpad = function _unpad(buffer) { + return buffer; +}; + +Cipher.prototype._finalDecrypt = function _finalDecrypt() { + assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt'); + var out = new Array(this.blockSize); + this._flushBuffer(out, 0); + + return this._unpad(out); +}; + +},{"minimalistic-assert":106}],61:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +var des = require('../des'); +var utils = des.utils; +var Cipher = des.Cipher; + +function DESState() { + this.tmp = new Array(2); + this.keys = null; +} + +function DES(options) { + Cipher.call(this, options); + + var state = new DESState(); + this._desState = state; + + this.deriveKeys(state, options.key); +} +inherits(DES, Cipher); +module.exports = DES; + +DES.create = function create(options) { + return new DES(options); +}; + +var shiftTable = [ + 1, 1, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 1 +]; + +DES.prototype.deriveKeys = function deriveKeys(state, key) { + state.keys = new Array(16 * 2); + + assert.equal(key.length, this.blockSize, 'Invalid key length'); + + var kL = utils.readUInt32BE(key, 0); + var kR = utils.readUInt32BE(key, 4); + + utils.pc1(kL, kR, state.tmp, 0); + kL = state.tmp[0]; + kR = state.tmp[1]; + for (var i = 0; i < state.keys.length; i += 2) { + var shift = shiftTable[i >>> 1]; + kL = utils.r28shl(kL, shift); + kR = utils.r28shl(kR, shift); + utils.pc2(kL, kR, state.keys, i); + } +}; + +DES.prototype._update = function _update(inp, inOff, out, outOff) { + var state = this._desState; + + var l = utils.readUInt32BE(inp, inOff); + var r = utils.readUInt32BE(inp, inOff + 4); + + // Initial Permutation + utils.ip(l, r, state.tmp, 0); + l = state.tmp[0]; + r = state.tmp[1]; + + if (this.type === 'encrypt') + this._encrypt(state, l, r, state.tmp, 0); + else + this._decrypt(state, l, r, state.tmp, 0); + + l = state.tmp[0]; + r = state.tmp[1]; + + utils.writeUInt32BE(out, l, outOff); + utils.writeUInt32BE(out, r, outOff + 4); +}; + +DES.prototype._pad = function _pad(buffer, off) { + var value = buffer.length - off; + for (var i = off; i < buffer.length; i++) + buffer[i] = value; + + return true; +}; + +DES.prototype._unpad = function _unpad(buffer) { + var pad = buffer[buffer.length - 1]; + for (var i = buffer.length - pad; i < buffer.length; i++) + assert.equal(buffer[i], pad); + + return buffer.slice(0, buffer.length - pad); +}; + +DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) { + var l = lStart; + var r = rStart; + + // Apply f() x16 times + for (var i = 0; i < state.keys.length; i += 2) { + var keyL = state.keys[i]; + var keyR = state.keys[i + 1]; + + // f(r, k) + utils.expand(r, state.tmp, 0); + + keyL ^= state.tmp[0]; + keyR ^= state.tmp[1]; + var s = utils.substitute(keyL, keyR); + var f = utils.permute(s); + + var t = r; + r = (l ^ f) >>> 0; + l = t; + } + + // Reverse Initial Permutation + utils.rip(r, l, out, off); +}; + +DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) { + var l = rStart; + var r = lStart; + + // Apply f() x16 times + for (var i = state.keys.length - 2; i >= 0; i -= 2) { + var keyL = state.keys[i]; + var keyR = state.keys[i + 1]; + + // f(r, k) + utils.expand(l, state.tmp, 0); + + keyL ^= state.tmp[0]; + keyR ^= state.tmp[1]; + var s = utils.substitute(keyL, keyR); + var f = utils.permute(s); + + var t = l; + l = (r ^ f) >>> 0; + r = t; + } + + // Reverse Initial Permutation + utils.rip(l, r, out, off); +}; + +},{"../des":58,"inherits":101,"minimalistic-assert":106}],62:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +var des = require('../des'); +var Cipher = des.Cipher; +var DES = des.DES; + +function EDEState(type, key) { + assert.equal(key.length, 24, 'Invalid key length'); + + var k1 = key.slice(0, 8); + var k2 = key.slice(8, 16); + var k3 = key.slice(16, 24); + + if (type === 'encrypt') { + this.ciphers = [ + DES.create({ type: 'encrypt', key: k1 }), + DES.create({ type: 'decrypt', key: k2 }), + DES.create({ type: 'encrypt', key: k3 }) + ]; + } else { + this.ciphers = [ + DES.create({ type: 'decrypt', key: k3 }), + DES.create({ type: 'encrypt', key: k2 }), + DES.create({ type: 'decrypt', key: k1 }) + ]; + } +} + +function EDE(options) { + Cipher.call(this, options); + + var state = new EDEState(this.type, this.options.key); + this._edeState = state; +} +inherits(EDE, Cipher); + +module.exports = EDE; + +EDE.create = function create(options) { + return new EDE(options); +}; + +EDE.prototype._update = function _update(inp, inOff, out, outOff) { + var state = this._edeState; + + state.ciphers[0]._update(inp, inOff, out, outOff); + state.ciphers[1]._update(out, outOff, out, outOff); + state.ciphers[2]._update(out, outOff, out, outOff); +}; + +EDE.prototype._pad = DES.prototype._pad; +EDE.prototype._unpad = DES.prototype._unpad; + +},{"../des":58,"inherits":101,"minimalistic-assert":106}],63:[function(require,module,exports){ +'use strict'; + +exports.readUInt32BE = function readUInt32BE(bytes, off) { + var res = (bytes[0 + off] << 24) | + (bytes[1 + off] << 16) | + (bytes[2 + off] << 8) | + bytes[3 + off]; + return res >>> 0; +}; + +exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) { + bytes[0 + off] = value >>> 24; + bytes[1 + off] = (value >>> 16) & 0xff; + bytes[2 + off] = (value >>> 8) & 0xff; + bytes[3 + off] = value & 0xff; +}; + +exports.ip = function ip(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + for (var i = 6; i >= 0; i -= 2) { + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inR >>> (j + i)) & 1; + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inL >>> (j + i)) & 1; + } + } + + for (var i = 6; i >= 0; i -= 2) { + for (var j = 1; j <= 25; j += 8) { + outR <<= 1; + outR |= (inR >>> (j + i)) & 1; + } + for (var j = 1; j <= 25; j += 8) { + outR <<= 1; + outR |= (inL >>> (j + i)) & 1; + } + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.rip = function rip(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + for (var i = 0; i < 4; i++) { + for (var j = 24; j >= 0; j -= 8) { + outL <<= 1; + outL |= (inR >>> (j + i)) & 1; + outL <<= 1; + outL |= (inL >>> (j + i)) & 1; + } + } + for (var i = 4; i < 8; i++) { + for (var j = 24; j >= 0; j -= 8) { + outR <<= 1; + outR |= (inR >>> (j + i)) & 1; + outR <<= 1; + outR |= (inL >>> (j + i)) & 1; + } + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.pc1 = function pc1(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + // 7, 15, 23, 31, 39, 47, 55, 63 + // 6, 14, 22, 30, 39, 47, 55, 63 + // 5, 13, 21, 29, 39, 47, 55, 63 + // 4, 12, 20, 28 + for (var i = 7; i >= 5; i--) { + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inR >> (j + i)) & 1; + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inL >> (j + i)) & 1; + } + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inR >> (j + i)) & 1; + } + + // 1, 9, 17, 25, 33, 41, 49, 57 + // 2, 10, 18, 26, 34, 42, 50, 58 + // 3, 11, 19, 27, 35, 43, 51, 59 + // 36, 44, 52, 60 + for (var i = 1; i <= 3; i++) { + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= (inR >> (j + i)) & 1; + } + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= (inL >> (j + i)) & 1; + } + } + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= (inL >> (j + i)) & 1; + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.r28shl = function r28shl(num, shift) { + return ((num << shift) & 0xfffffff) | (num >>> (28 - shift)); +}; + +var pc2table = [ + // inL => outL + 14, 11, 17, 4, 27, 23, 25, 0, + 13, 22, 7, 18, 5, 9, 16, 24, + 2, 20, 12, 21, 1, 8, 15, 26, + + // inR => outR + 15, 4, 25, 19, 9, 1, 26, 16, + 5, 11, 23, 8, 12, 7, 17, 0, + 22, 3, 10, 14, 6, 20, 27, 24 +]; + +exports.pc2 = function pc2(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + var len = pc2table.length >>> 1; + for (var i = 0; i < len; i++) { + outL <<= 1; + outL |= (inL >>> pc2table[i]) & 0x1; + } + for (var i = len; i < pc2table.length; i++) { + outR <<= 1; + outR |= (inR >>> pc2table[i]) & 0x1; + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.expand = function expand(r, out, off) { + var outL = 0; + var outR = 0; + + outL = ((r & 1) << 5) | (r >>> 27); + for (var i = 23; i >= 15; i -= 4) { + outL <<= 6; + outL |= (r >>> i) & 0x3f; + } + for (var i = 11; i >= 3; i -= 4) { + outR |= (r >>> i) & 0x3f; + outR <<= 6; + } + outR |= ((r & 0x1f) << 1) | (r >>> 31); + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +var sTable = [ + 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, + 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, + 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, + 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, + + 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, + 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, + 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, + 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, + + 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, + 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, + 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, + 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, + + 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, + 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, + 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, + 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, + + 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, + 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, + 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, + 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, + + 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, + 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, + 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, + 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, + + 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, + 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, + 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, + 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, + + 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, + 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, + 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, + 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 +]; + +exports.substitute = function substitute(inL, inR) { + var out = 0; + for (var i = 0; i < 4; i++) { + var b = (inL >>> (18 - i * 6)) & 0x3f; + var sb = sTable[i * 0x40 + b]; + + out <<= 4; + out |= sb; + } + for (var i = 0; i < 4; i++) { + var b = (inR >>> (18 - i * 6)) & 0x3f; + var sb = sTable[4 * 0x40 + i * 0x40 + b]; + + out <<= 4; + out |= sb; + } + return out >>> 0; +}; + +var permuteTable = [ + 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, + 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7 +]; + +exports.permute = function permute(num) { + var out = 0; + for (var i = 0; i < permuteTable.length; i++) { + out <<= 1; + out |= (num >>> permuteTable[i]) & 0x1; + } + return out >>> 0; +}; + +exports.padSplit = function padSplit(num, size, group) { + var str = num.toString(2); + while (str.length < size) + str = '0' + str; + + var out = []; + for (var i = 0; i < size; i += group) + out.push(str.slice(i, i + group)); + return out.join(' '); +}; + +},{}],64:[function(require,module,exports){ +(function (Buffer){ +var generatePrime = require('./lib/generatePrime') +var primes = require('./lib/primes.json') + +var DH = require('./lib/dh') + +function getDiffieHellman (mod) { + var prime = new Buffer(primes[mod].prime, 'hex') + var gen = new Buffer(primes[mod].gen, 'hex') + + return new DH(prime, gen) +} + +var ENCODINGS = { + 'binary': true, 'hex': true, 'base64': true +} + +function createDiffieHellman (prime, enc, generator, genc) { + if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) { + return createDiffieHellman(prime, 'binary', enc, generator) + } + + enc = enc || 'binary' + genc = genc || 'binary' + generator = generator || new Buffer([2]) + + if (!Buffer.isBuffer(generator)) { + generator = new Buffer(generator, genc) + } + + if (typeof prime === 'number') { + return new DH(generatePrime(prime, generator), generator, true) + } + + if (!Buffer.isBuffer(prime)) { + prime = new Buffer(prime, enc) + } + + return new DH(prime, generator, true) +} + +exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman +exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman + +}).call(this,require("buffer").Buffer) +},{"./lib/dh":65,"./lib/generatePrime":66,"./lib/primes.json":67,"buffer":49}],65:[function(require,module,exports){ +(function (Buffer){ +var BN = require('bn.js'); +var MillerRabin = require('miller-rabin'); +var millerRabin = new MillerRabin(); +var TWENTYFOUR = new BN(24); +var ELEVEN = new BN(11); +var TEN = new BN(10); +var THREE = new BN(3); +var SEVEN = new BN(7); +var primes = require('./generatePrime'); +var randomBytes = require('randombytes'); +module.exports = DH; + +function setPublicKey(pub, enc) { + enc = enc || 'utf8'; + if (!Buffer.isBuffer(pub)) { + pub = new Buffer(pub, enc); + } + this._pub = new BN(pub); + return this; +} + +function setPrivateKey(priv, enc) { + enc = enc || 'utf8'; + if (!Buffer.isBuffer(priv)) { + priv = new Buffer(priv, enc); + } + this._priv = new BN(priv); + return this; +} + +var primeCache = {}; +function checkPrime(prime, generator) { + var gen = generator.toString('hex'); + var hex = [gen, prime.toString(16)].join('_'); + if (hex in primeCache) { + return primeCache[hex]; + } + var error = 0; + + if (prime.isEven() || + !primes.simpleSieve || + !primes.fermatTest(prime) || + !millerRabin.test(prime)) { + //not a prime so +1 + error += 1; + + if (gen === '02' || gen === '05') { + // we'd be able to check the generator + // it would fail so +8 + error += 8; + } else { + //we wouldn't be able to test the generator + // so +4 + error += 4; + } + primeCache[hex] = error; + return error; + } + if (!millerRabin.test(prime.shrn(1))) { + //not a safe prime + error += 2; + } + var rem; + switch (gen) { + case '02': + if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { + // unsuidable generator + error += 8; + } + break; + case '05': + rem = prime.mod(TEN); + if (rem.cmp(THREE) && rem.cmp(SEVEN)) { + // prime mod 10 needs to equal 3 or 7 + error += 8; + } + break; + default: + error += 4; + } + primeCache[hex] = error; + return error; +} + +function DH(prime, generator, malleable) { + this.setGenerator(generator); + this.__prime = new BN(prime); + this._prime = BN.mont(this.__prime); + this._primeLen = prime.length; + this._pub = undefined; + this._priv = undefined; + this._primeCode = undefined; + if (malleable) { + this.setPublicKey = setPublicKey; + this.setPrivateKey = setPrivateKey; + } else { + this._primeCode = 8; + } +} +Object.defineProperty(DH.prototype, 'verifyError', { + enumerable: true, + get: function () { + if (typeof this._primeCode !== 'number') { + this._primeCode = checkPrime(this.__prime, this.__gen); + } + return this._primeCode; + } +}); +DH.prototype.generateKeys = function () { + if (!this._priv) { + this._priv = new BN(randomBytes(this._primeLen)); + } + this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(); + return this.getPublicKey(); +}; + +DH.prototype.computeSecret = function (other) { + other = new BN(other); + other = other.toRed(this._prime); + var secret = other.redPow(this._priv).fromRed(); + var out = new Buffer(secret.toArray()); + var prime = this.getPrime(); + if (out.length < prime.length) { + var front = new Buffer(prime.length - out.length); + front.fill(0); + out = Buffer.concat([front, out]); + } + return out; +}; + +DH.prototype.getPublicKey = function getPublicKey(enc) { + return formatReturnValue(this._pub, enc); +}; + +DH.prototype.getPrivateKey = function getPrivateKey(enc) { + return formatReturnValue(this._priv, enc); +}; + +DH.prototype.getPrime = function (enc) { + return formatReturnValue(this.__prime, enc); +}; + +DH.prototype.getGenerator = function (enc) { + return formatReturnValue(this._gen, enc); +}; + +DH.prototype.setGenerator = function (gen, enc) { + enc = enc || 'utf8'; + if (!Buffer.isBuffer(gen)) { + gen = new Buffer(gen, enc); + } + this.__gen = gen; + this._gen = new BN(gen); + return this; +}; + +function formatReturnValue(bn, enc) { + var buf = new Buffer(bn.toArray()); + if (!enc) { + return buf; + } else { + return buf.toString(enc); + } +} + +}).call(this,require("buffer").Buffer) +},{"./generatePrime":66,"bn.js":17,"buffer":49,"miller-rabin":105,"randombytes":127}],66:[function(require,module,exports){ +var randomBytes = require('randombytes'); +module.exports = findPrime; +findPrime.simpleSieve = simpleSieve; +findPrime.fermatTest = fermatTest; +var BN = require('bn.js'); +var TWENTYFOUR = new BN(24); +var MillerRabin = require('miller-rabin'); +var millerRabin = new MillerRabin(); +var ONE = new BN(1); +var TWO = new BN(2); +var FIVE = new BN(5); +var SIXTEEN = new BN(16); +var EIGHT = new BN(8); +var TEN = new BN(10); +var THREE = new BN(3); +var SEVEN = new BN(7); +var ELEVEN = new BN(11); +var FOUR = new BN(4); +var TWELVE = new BN(12); +var primes = null; + +function _getPrimes() { + if (primes !== null) + return primes; + + var limit = 0x100000; + var res = []; + res[0] = 2; + for (var i = 1, k = 3; k < limit; k += 2) { + var sqrt = Math.ceil(Math.sqrt(k)); + for (var j = 0; j < i && res[j] <= sqrt; j++) + if (k % res[j] === 0) + break; + + if (i !== j && res[j] <= sqrt) + continue; + + res[i++] = k; + } + primes = res; + return res; +} + +function simpleSieve(p) { + var primes = _getPrimes(); + + for (var i = 0; i < primes.length; i++) + if (p.modn(primes[i]) === 0) { + if (p.cmpn(primes[i]) === 0) { + return true; + } else { + return false; + } + } + + return true; +} + +function fermatTest(p) { + var red = BN.mont(p); + return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0; +} + +function findPrime(bits, gen) { + if (bits < 16) { + // this is what openssl does + if (gen === 2 || gen === 5) { + return new BN([0x8c, 0x7b]); + } else { + return new BN([0x8c, 0x27]); + } + } + gen = new BN(gen); + + var num, n2; + + while (true) { + num = new BN(randomBytes(Math.ceil(bits / 8))); + while (num.bitLength() > bits) { + num.ishrn(1); + } + if (num.isEven()) { + num.iadd(ONE); + } + if (!num.testn(1)) { + num.iadd(TWO); + } + if (!gen.cmp(TWO)) { + while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { + num.iadd(FOUR); + } + } else if (!gen.cmp(FIVE)) { + while (num.mod(TEN).cmp(THREE)) { + num.iadd(FOUR); + } + } + n2 = num.shrn(1); + if (simpleSieve(n2) && simpleSieve(num) && + fermatTest(n2) && fermatTest(num) && + millerRabin.test(n2) && millerRabin.test(num)) { + return num; + } + } + +} + +},{"bn.js":17,"miller-rabin":105,"randombytes":127}],67:[function(require,module,exports){ +module.exports={ + "modp1": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" + }, + "modp2": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" + }, + "modp5": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" + }, + "modp14": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" + }, + "modp15": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" + }, + "modp16": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" + }, + "modp17": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" + }, + "modp18": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" + } +} +},{}],68:[function(require,module,exports){ +'use strict'; + +var elliptic = exports; + +elliptic.version = require('../package.json').version; +elliptic.utils = require('./elliptic/utils'); +elliptic.rand = require('brorand'); +elliptic.curve = require('./elliptic/curve'); +elliptic.curves = require('./elliptic/curves'); + +// Protocols +elliptic.ec = require('./elliptic/ec'); +elliptic.eddsa = require('./elliptic/eddsa'); + +},{"../package.json":83,"./elliptic/curve":71,"./elliptic/curves":74,"./elliptic/ec":75,"./elliptic/eddsa":78,"./elliptic/utils":82,"brorand":18}],69:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var getNAF = utils.getNAF; +var getJSF = utils.getJSF; +var assert = utils.assert; + +function BaseCurve(type, conf) { + this.type = type; + this.p = new BN(conf.p, 16); + + // Use Montgomery, when there is no fast reduction for the prime + this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); + + // Useful for many curves + this.zero = new BN(0).toRed(this.red); + this.one = new BN(1).toRed(this.red); + this.two = new BN(2).toRed(this.red); + + // Curve configuration, optional + this.n = conf.n && new BN(conf.n, 16); + this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); + + // Temporary arrays + this._wnafT1 = new Array(4); + this._wnafT2 = new Array(4); + this._wnafT3 = new Array(4); + this._wnafT4 = new Array(4); + + // Generalized Greg Maxwell's trick + var adjustCount = this.n && this.p.div(this.n); + if (!adjustCount || adjustCount.cmpn(100) > 0) { + this.redN = null; + } else { + this._maxwellTrick = true; + this.redN = this.n.toRed(this.red); + } +} +module.exports = BaseCurve; + +BaseCurve.prototype.point = function point() { + throw new Error('Not implemented'); +}; + +BaseCurve.prototype.validate = function validate() { + throw new Error('Not implemented'); +}; + +BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { + assert(p.precomputed); + var doubles = p._getDoubles(); + + var naf = getNAF(k, 1); + var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); + I /= 3; + + // Translate into more windowed form + var repr = []; + for (var j = 0; j < naf.length; j += doubles.step) { + var nafW = 0; + for (var k = j + doubles.step - 1; k >= j; k--) + nafW = (nafW << 1) + naf[k]; + repr.push(nafW); + } + + var a = this.jpoint(null, null, null); + var b = this.jpoint(null, null, null); + for (var i = I; i > 0; i--) { + for (var j = 0; j < repr.length; j++) { + var nafW = repr[j]; + if (nafW === i) + b = b.mixedAdd(doubles.points[j]); + else if (nafW === -i) + b = b.mixedAdd(doubles.points[j].neg()); + } + a = a.add(b); + } + return a.toP(); +}; + +BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { + var w = 4; + + // Precompute window + var nafPoints = p._getNAFPoints(w); + w = nafPoints.wnd; + var wnd = nafPoints.points; + + // Get NAF form + var naf = getNAF(k, w); + + // Add `this`*(N+1) for every w-NAF index + var acc = this.jpoint(null, null, null); + for (var i = naf.length - 1; i >= 0; i--) { + // Count zeroes + for (var k = 0; i >= 0 && naf[i] === 0; i--) + k++; + if (i >= 0) + k++; + acc = acc.dblp(k); + + if (i < 0) + break; + var z = naf[i]; + assert(z !== 0); + if (p.type === 'affine') { + // J +- P + if (z > 0) + acc = acc.mixedAdd(wnd[(z - 1) >> 1]); + else + acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); + } else { + // J +- J + if (z > 0) + acc = acc.add(wnd[(z - 1) >> 1]); + else + acc = acc.add(wnd[(-z - 1) >> 1].neg()); + } + } + return p.type === 'affine' ? acc.toP() : acc; +}; + +BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, + points, + coeffs, + len, + jacobianResult) { + var wndWidth = this._wnafT1; + var wnd = this._wnafT2; + var naf = this._wnafT3; + + // Fill all arrays + var max = 0; + for (var i = 0; i < len; i++) { + var p = points[i]; + var nafPoints = p._getNAFPoints(defW); + wndWidth[i] = nafPoints.wnd; + wnd[i] = nafPoints.points; + } + + // Comb small window NAFs + for (var i = len - 1; i >= 1; i -= 2) { + var a = i - 1; + var b = i; + if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { + naf[a] = getNAF(coeffs[a], wndWidth[a]); + naf[b] = getNAF(coeffs[b], wndWidth[b]); + max = Math.max(naf[a].length, max); + max = Math.max(naf[b].length, max); + continue; + } + + var comb = [ + points[a], /* 1 */ + null, /* 3 */ + null, /* 5 */ + points[b] /* 7 */ + ]; + + // Try to avoid Projective points, if possible + if (points[a].y.cmp(points[b].y) === 0) { + comb[1] = points[a].add(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].add(points[b].neg()); + } else { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } + + var index = [ + -3, /* -1 -1 */ + -1, /* -1 0 */ + -5, /* -1 1 */ + -7, /* 0 -1 */ + 0, /* 0 0 */ + 7, /* 0 1 */ + 5, /* 1 -1 */ + 1, /* 1 0 */ + 3 /* 1 1 */ + ]; + + var jsf = getJSF(coeffs[a], coeffs[b]); + max = Math.max(jsf[0].length, max); + naf[a] = new Array(max); + naf[b] = new Array(max); + for (var j = 0; j < max; j++) { + var ja = jsf[0][j] | 0; + var jb = jsf[1][j] | 0; + + naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; + naf[b][j] = 0; + wnd[a] = comb; + } + } + + var acc = this.jpoint(null, null, null); + var tmp = this._wnafT4; + for (var i = max; i >= 0; i--) { + var k = 0; + + while (i >= 0) { + var zero = true; + for (var j = 0; j < len; j++) { + tmp[j] = naf[j][i] | 0; + if (tmp[j] !== 0) + zero = false; + } + if (!zero) + break; + k++; + i--; + } + if (i >= 0) + k++; + acc = acc.dblp(k); + if (i < 0) + break; + + for (var j = 0; j < len; j++) { + var z = tmp[j]; + var p; + if (z === 0) + continue; + else if (z > 0) + p = wnd[j][(z - 1) >> 1]; + else if (z < 0) + p = wnd[j][(-z - 1) >> 1].neg(); + + if (p.type === 'affine') + acc = acc.mixedAdd(p); + else + acc = acc.add(p); + } + } + // Zeroify references + for (var i = 0; i < len; i++) + wnd[i] = null; + + if (jacobianResult) + return acc; + else + return acc.toP(); +}; + +function BasePoint(curve, type) { + this.curve = curve; + this.type = type; + this.precomputed = null; +} +BaseCurve.BasePoint = BasePoint; + +BasePoint.prototype.eq = function eq(/*other*/) { + throw new Error('Not implemented'); +}; + +BasePoint.prototype.validate = function validate() { + return this.curve.validate(this); +}; + +BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + bytes = utils.toArray(bytes, enc); + + var len = this.p.byteLength(); + + // uncompressed, hybrid-odd, hybrid-even + if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) && + bytes.length - 1 === 2 * len) { + if (bytes[0] === 0x06) + assert(bytes[bytes.length - 1] % 2 === 0); + else if (bytes[0] === 0x07) + assert(bytes[bytes.length - 1] % 2 === 1); + + var res = this.point(bytes.slice(1, 1 + len), + bytes.slice(1 + len, 1 + 2 * len)); + + return res; + } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && + bytes.length - 1 === len) { + return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); + } + throw new Error('Unknown point format'); +}; + +BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { + return this.encode(enc, true); +}; + +BasePoint.prototype._encode = function _encode(compact) { + var len = this.curve.p.byteLength(); + var x = this.getX().toArray('be', len); + + if (compact) + return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); + + return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ; +}; + +BasePoint.prototype.encode = function encode(enc, compact) { + return utils.encode(this._encode(compact), enc); +}; + +BasePoint.prototype.precompute = function precompute(power) { + if (this.precomputed) + return this; + + var precomputed = { + doubles: null, + naf: null, + beta: null + }; + precomputed.naf = this._getNAFPoints(8); + precomputed.doubles = this._getDoubles(4, power); + precomputed.beta = this._getBeta(); + this.precomputed = precomputed; + + return this; +}; + +BasePoint.prototype._hasDoubles = function _hasDoubles(k) { + if (!this.precomputed) + return false; + + var doubles = this.precomputed.doubles; + if (!doubles) + return false; + + return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); +}; + +BasePoint.prototype._getDoubles = function _getDoubles(step, power) { + if (this.precomputed && this.precomputed.doubles) + return this.precomputed.doubles; + + var doubles = [ this ]; + var acc = this; + for (var i = 0; i < power; i += step) { + for (var j = 0; j < step; j++) + acc = acc.dbl(); + doubles.push(acc); + } + return { + step: step, + points: doubles + }; +}; + +BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { + if (this.precomputed && this.precomputed.naf) + return this.precomputed.naf; + + var res = [ this ]; + var max = (1 << wnd) - 1; + var dbl = max === 1 ? null : this.dbl(); + for (var i = 1; i < max; i++) + res[i] = res[i - 1].add(dbl); + return { + wnd: wnd, + points: res + }; +}; + +BasePoint.prototype._getBeta = function _getBeta() { + return null; +}; + +BasePoint.prototype.dblp = function dblp(k) { + var r = this; + for (var i = 0; i < k; i++) + r = r.dbl(); + return r; +}; + +},{"../../elliptic":68,"bn.js":17}],70:[function(require,module,exports){ +'use strict'; + +var curve = require('../curve'); +var elliptic = require('../../elliptic'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = curve.base; + +var assert = elliptic.utils.assert; + +function EdwardsCurve(conf) { + // NOTE: Important as we are creating point in Base.call() + this.twisted = (conf.a | 0) !== 1; + this.mOneA = this.twisted && (conf.a | 0) === -1; + this.extended = this.mOneA; + + Base.call(this, 'edwards', conf); + + this.a = new BN(conf.a, 16).umod(this.red.m); + this.a = this.a.toRed(this.red); + this.c = new BN(conf.c, 16).toRed(this.red); + this.c2 = this.c.redSqr(); + this.d = new BN(conf.d, 16).toRed(this.red); + this.dd = this.d.redAdd(this.d); + + assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); + this.oneC = (conf.c | 0) === 1; +} +inherits(EdwardsCurve, Base); +module.exports = EdwardsCurve; + +EdwardsCurve.prototype._mulA = function _mulA(num) { + if (this.mOneA) + return num.redNeg(); + else + return this.a.redMul(num); +}; + +EdwardsCurve.prototype._mulC = function _mulC(num) { + if (this.oneC) + return num; + else + return this.c.redMul(num); +}; + +// Just for compatibility with Short curve +EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { + return this.point(x, y, z, t); +}; + +EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); + + var x2 = x.redSqr(); + var rhs = this.c2.redSub(this.a.redMul(x2)); + var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); + + var y2 = rhs.redMul(lhs.redInvm()); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + + return this.point(x, y); +}; + +EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { + y = new BN(y, 16); + if (!y.red) + y = y.toRed(this.red); + + // x^2 = (y^2 - c^2) / (c^2 d y^2 - a) + var y2 = y.redSqr(); + var lhs = y2.redSub(this.c2); + var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a); + var x2 = lhs.redMul(rhs.redInvm()); + + if (x2.cmp(this.zero) === 0) { + if (odd) + throw new Error('invalid point'); + else + return this.point(this.zero, y); + } + + var x = x2.redSqrt(); + if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + if (x.fromRed().isOdd() !== odd) + x = x.redNeg(); + + return this.point(x, y); +}; + +EdwardsCurve.prototype.validate = function validate(point) { + if (point.isInfinity()) + return true; + + // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2) + point.normalize(); + + var x2 = point.x.redSqr(); + var y2 = point.y.redSqr(); + var lhs = x2.redMul(this.a).redAdd(y2); + var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); + + return lhs.cmp(rhs) === 0; +}; + +function Point(curve, x, y, z, t) { + Base.BasePoint.call(this, curve, 'projective'); + if (x === null && y === null && z === null) { + this.x = this.curve.zero; + this.y = this.curve.one; + this.z = this.curve.one; + this.t = this.curve.zero; + this.zOne = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = z ? new BN(z, 16) : this.curve.one; + this.t = t && new BN(t, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + if (this.t && !this.t.red) + this.t = this.t.toRed(this.curve.red); + this.zOne = this.z === this.curve.one; + + // Use extended coordinates + if (this.curve.extended && !this.t) { + this.t = this.x.redMul(this.y); + if (!this.zOne) + this.t = this.t.redMul(this.z.redInvm()); + } + } +} +inherits(Point, Base.BasePoint); + +EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); +}; + +EdwardsCurve.prototype.point = function point(x, y, z, t) { + return new Point(this, x, y, z, t); +}; + +Point.fromJSON = function fromJSON(curve, obj) { + return new Point(curve, obj[0], obj[1], obj[2]); +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +Point.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.x.cmpn(0) === 0 && + (this.y.cmp(this.z) === 0 || + (this.zOne && this.y.cmp(this.curve.c) === 0)); +}; + +Point.prototype._extDbl = function _extDbl() { + // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html + // #doubling-dbl-2008-hwcd + // 4M + 4S + + // A = X1^2 + var a = this.x.redSqr(); + // B = Y1^2 + var b = this.y.redSqr(); + // C = 2 * Z1^2 + var c = this.z.redSqr(); + c = c.redIAdd(c); + // D = a * A + var d = this.curve._mulA(a); + // E = (X1 + Y1)^2 - A - B + var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); + // G = D + B + var g = d.redAdd(b); + // F = G - C + var f = g.redSub(c); + // H = D - B + var h = d.redSub(b); + // X3 = E * F + var nx = e.redMul(f); + // Y3 = G * H + var ny = g.redMul(h); + // T3 = E * H + var nt = e.redMul(h); + // Z3 = F * G + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); +}; + +Point.prototype._projDbl = function _projDbl() { + // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html + // #doubling-dbl-2008-bbjlp + // #doubling-dbl-2007-bl + // and others + // Generally 3M + 4S or 2M + 4S + + // B = (X1 + Y1)^2 + var b = this.x.redAdd(this.y).redSqr(); + // C = X1^2 + var c = this.x.redSqr(); + // D = Y1^2 + var d = this.y.redSqr(); + + var nx; + var ny; + var nz; + if (this.curve.twisted) { + // E = a * C + var e = this.curve._mulA(c); + // F = E + D + var f = e.redAdd(d); + if (this.zOne) { + // X3 = (B - C - D) * (F - 2) + nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); + // Y3 = F * (E - D) + ny = f.redMul(e.redSub(d)); + // Z3 = F^2 - 2 * F + nz = f.redSqr().redSub(f).redSub(f); + } else { + // H = Z1^2 + var h = this.z.redSqr(); + // J = F - 2 * H + var j = f.redSub(h).redISub(h); + // X3 = (B-C-D)*J + nx = b.redSub(c).redISub(d).redMul(j); + // Y3 = F * (E - D) + ny = f.redMul(e.redSub(d)); + // Z3 = F * J + nz = f.redMul(j); + } + } else { + // E = C + D + var e = c.redAdd(d); + // H = (c * Z1)^2 + var h = this.curve._mulC(this.z).redSqr(); + // J = E - 2 * H + var j = e.redSub(h).redSub(h); + // X3 = c * (B - E) * J + nx = this.curve._mulC(b.redISub(e)).redMul(j); + // Y3 = c * E * (C - D) + ny = this.curve._mulC(e).redMul(c.redISub(d)); + // Z3 = E * J + nz = e.redMul(j); + } + return this.curve.point(nx, ny, nz); +}; + +Point.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + + // Double in extended coordinates + if (this.curve.extended) + return this._extDbl(); + else + return this._projDbl(); +}; + +Point.prototype._extAdd = function _extAdd(p) { + // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html + // #addition-add-2008-hwcd-3 + // 8M + + // A = (Y1 - X1) * (Y2 - X2) + var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); + // B = (Y1 + X1) * (Y2 + X2) + var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); + // C = T1 * k * T2 + var c = this.t.redMul(this.curve.dd).redMul(p.t); + // D = Z1 * 2 * Z2 + var d = this.z.redMul(p.z.redAdd(p.z)); + // E = B - A + var e = b.redSub(a); + // F = D - C + var f = d.redSub(c); + // G = D + C + var g = d.redAdd(c); + // H = B + A + var h = b.redAdd(a); + // X3 = E * F + var nx = e.redMul(f); + // Y3 = G * H + var ny = g.redMul(h); + // T3 = E * H + var nt = e.redMul(h); + // Z3 = F * G + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); +}; + +Point.prototype._projAdd = function _projAdd(p) { + // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html + // #addition-add-2008-bbjlp + // #addition-add-2007-bl + // 10M + 1S + + // A = Z1 * Z2 + var a = this.z.redMul(p.z); + // B = A^2 + var b = a.redSqr(); + // C = X1 * X2 + var c = this.x.redMul(p.x); + // D = Y1 * Y2 + var d = this.y.redMul(p.y); + // E = d * C * D + var e = this.curve.d.redMul(c).redMul(d); + // F = B - E + var f = b.redSub(e); + // G = B + E + var g = b.redAdd(e); + // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D) + var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); + var nx = a.redMul(f).redMul(tmp); + var ny; + var nz; + if (this.curve.twisted) { + // Y3 = A * G * (D - a * C) + ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); + // Z3 = F * G + nz = f.redMul(g); + } else { + // Y3 = A * G * (D - C) + ny = a.redMul(g).redMul(d.redSub(c)); + // Z3 = c * F * G + nz = this.curve._mulC(f).redMul(g); + } + return this.curve.point(nx, ny, nz); +}; + +Point.prototype.add = function add(p) { + if (this.isInfinity()) + return p; + if (p.isInfinity()) + return this; + + if (this.curve.extended) + return this._extAdd(p); + else + return this._projAdd(p); +}; + +Point.prototype.mul = function mul(k) { + if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else + return this.curve._wnafMul(this, k); +}; + +Point.prototype.mulAdd = function mulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false); +}; + +Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true); +}; + +Point.prototype.normalize = function normalize() { + if (this.zOne) + return this; + + // Normalize coordinates + var zi = this.z.redInvm(); + this.x = this.x.redMul(zi); + this.y = this.y.redMul(zi); + if (this.t) + this.t = this.t.redMul(zi); + this.z = this.curve.one; + this.zOne = true; + return this; +}; + +Point.prototype.neg = function neg() { + return this.curve.point(this.x.redNeg(), + this.y, + this.z, + this.t && this.t.redNeg()); +}; + +Point.prototype.getX = function getX() { + this.normalize(); + return this.x.fromRed(); +}; + +Point.prototype.getY = function getY() { + this.normalize(); + return this.y.fromRed(); +}; + +Point.prototype.eq = function eq(other) { + return this === other || + this.getX().cmp(other.getX()) === 0 && + this.getY().cmp(other.getY()) === 0; +}; + +Point.prototype.eqXToP = function eqXToP(x) { + var rx = x.toRed(this.curve.red).redMul(this.z); + if (this.x.cmp(rx) === 0) + return true; + + var xc = x.clone(); + var t = this.curve.redN.redMul(this.z); + for (;;) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } +}; + +// Compatibility with BaseCurve +Point.prototype.toP = Point.prototype.normalize; +Point.prototype.mixedAdd = Point.prototype.add; + +},{"../../elliptic":68,"../curve":71,"bn.js":17,"inherits":101}],71:[function(require,module,exports){ +'use strict'; + +var curve = exports; + +curve.base = require('./base'); +curve.short = require('./short'); +curve.mont = require('./mont'); +curve.edwards = require('./edwards'); + +},{"./base":69,"./edwards":70,"./mont":72,"./short":73}],72:[function(require,module,exports){ +'use strict'; + +var curve = require('../curve'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = curve.base; + +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; + +function MontCurve(conf) { + Base.call(this, 'mont', conf); + + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.i4 = new BN(4).toRed(this.red).redInvm(); + this.two = new BN(2).toRed(this.red); + this.a24 = this.i4.redMul(this.a.redAdd(this.two)); +} +inherits(MontCurve, Base); +module.exports = MontCurve; + +MontCurve.prototype.validate = function validate(point) { + var x = point.normalize().x; + var x2 = x.redSqr(); + var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); + var y = rhs.redSqrt(); + + return y.redSqr().cmp(rhs) === 0; +}; + +function Point(curve, x, z) { + Base.BasePoint.call(this, curve, 'projective'); + if (x === null && z === null) { + this.x = this.curve.one; + this.z = this.curve.zero; + } else { + this.x = new BN(x, 16); + this.z = new BN(z, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + } +} +inherits(Point, Base.BasePoint); + +MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + return this.point(utils.toArray(bytes, enc), 1); +}; + +MontCurve.prototype.point = function point(x, z) { + return new Point(this, x, z); +}; + +MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); +}; + +Point.prototype.precompute = function precompute() { + // No-op +}; + +Point.prototype._encode = function _encode() { + return this.getX().toArray('be', this.curve.p.byteLength()); +}; + +Point.fromJSON = function fromJSON(curve, obj) { + return new Point(curve, obj[0], obj[1] || curve.one); +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +Point.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.z.cmpn(0) === 0; +}; + +Point.prototype.dbl = function dbl() { + // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3 + // 2M + 2S + 4A + + // A = X1 + Z1 + var a = this.x.redAdd(this.z); + // AA = A^2 + var aa = a.redSqr(); + // B = X1 - Z1 + var b = this.x.redSub(this.z); + // BB = B^2 + var bb = b.redSqr(); + // C = AA - BB + var c = aa.redSub(bb); + // X3 = AA * BB + var nx = aa.redMul(bb); + // Z3 = C * (BB + A24 * C) + var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); + return this.curve.point(nx, nz); +}; + +Point.prototype.add = function add() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.diffAdd = function diffAdd(p, diff) { + // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3 + // 4M + 2S + 6A + + // A = X2 + Z2 + var a = this.x.redAdd(this.z); + // B = X2 - Z2 + var b = this.x.redSub(this.z); + // C = X3 + Z3 + var c = p.x.redAdd(p.z); + // D = X3 - Z3 + var d = p.x.redSub(p.z); + // DA = D * A + var da = d.redMul(a); + // CB = C * B + var cb = c.redMul(b); + // X5 = Z1 * (DA + CB)^2 + var nx = diff.z.redMul(da.redAdd(cb).redSqr()); + // Z5 = X1 * (DA - CB)^2 + var nz = diff.x.redMul(da.redISub(cb).redSqr()); + return this.curve.point(nx, nz); +}; + +Point.prototype.mul = function mul(k) { + var t = k.clone(); + var a = this; // (N / 2) * Q + Q + var b = this.curve.point(null, null); // (N / 2) * Q + var c = this; // Q + + for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) + bits.push(t.andln(1)); + + for (var i = bits.length - 1; i >= 0; i--) { + if (bits[i] === 0) { + // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q + a = a.diffAdd(b, c); + // N * Q = 2 * ((N / 2) * Q + Q)) + b = b.dbl(); + } else { + // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q) + b = a.diffAdd(b, c); + // N * Q + Q = 2 * ((N / 2) * Q + Q) + a = a.dbl(); + } + } + return b; +}; + +Point.prototype.mulAdd = function mulAdd() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.jumlAdd = function jumlAdd() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.eq = function eq(other) { + return this.getX().cmp(other.getX()) === 0; +}; + +Point.prototype.normalize = function normalize() { + this.x = this.x.redMul(this.z.redInvm()); + this.z = this.curve.one; + return this; +}; + +Point.prototype.getX = function getX() { + // Normalize coordinates + this.normalize(); + + return this.x.fromRed(); +}; + +},{"../../elliptic":68,"../curve":71,"bn.js":17,"inherits":101}],73:[function(require,module,exports){ +'use strict'; + +var curve = require('../curve'); +var elliptic = require('../../elliptic'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = curve.base; + +var assert = elliptic.utils.assert; + +function ShortCurve(conf) { + Base.call(this, 'short', conf); + + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.tinv = this.two.redInvm(); + + this.zeroA = this.a.fromRed().cmpn(0) === 0; + this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; + + // If the curve is endomorphic, precalculate beta and lambda + this.endo = this._getEndomorphism(conf); + this._endoWnafT1 = new Array(4); + this._endoWnafT2 = new Array(4); +} +inherits(ShortCurve, Base); +module.exports = ShortCurve; + +ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { + // No efficient endomorphism + if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) + return; + + // Compute beta and lambda, that lambda * P = (beta * Px; Py) + var beta; + var lambda; + if (conf.beta) { + beta = new BN(conf.beta, 16).toRed(this.red); + } else { + var betas = this._getEndoRoots(this.p); + // Choose the smallest beta + beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; + beta = beta.toRed(this.red); + } + if (conf.lambda) { + lambda = new BN(conf.lambda, 16); + } else { + // Choose the lambda that is matching selected beta + var lambdas = this._getEndoRoots(this.n); + if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { + lambda = lambdas[0]; + } else { + lambda = lambdas[1]; + assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); + } + } + + // Get basis vectors, used for balanced length-two representation + var basis; + if (conf.basis) { + basis = conf.basis.map(function(vec) { + return { + a: new BN(vec.a, 16), + b: new BN(vec.b, 16) + }; + }); + } else { + basis = this._getEndoBasis(lambda); + } + + return { + beta: beta, + lambda: lambda, + basis: basis + }; +}; + +ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { + // Find roots of for x^2 + x + 1 in F + // Root = (-1 +- Sqrt(-3)) / 2 + // + var red = num === this.p ? this.red : BN.mont(num); + var tinv = new BN(2).toRed(red).redInvm(); + var ntinv = tinv.redNeg(); + + var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); + + var l1 = ntinv.redAdd(s).fromRed(); + var l2 = ntinv.redSub(s).fromRed(); + return [ l1, l2 ]; +}; + +ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { + // aprxSqrt >= sqrt(this.n) + var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); + + // 3.74 + // Run EGCD, until r(L + 1) < aprxSqrt + var u = lambda; + var v = this.n.clone(); + var x1 = new BN(1); + var y1 = new BN(0); + var x2 = new BN(0); + var y2 = new BN(1); + + // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) + var a0; + var b0; + // First vector + var a1; + var b1; + // Second vector + var a2; + var b2; + + var prevR; + var i = 0; + var r; + var x; + while (u.cmpn(0) !== 0) { + var q = v.div(u); + r = v.sub(q.mul(u)); + x = x2.sub(q.mul(x1)); + var y = y2.sub(q.mul(y1)); + + if (!a1 && r.cmp(aprxSqrt) < 0) { + a0 = prevR.neg(); + b0 = x1; + a1 = r.neg(); + b1 = x; + } else if (a1 && ++i === 2) { + break; + } + prevR = r; + + v = u; + u = r; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + a2 = r.neg(); + b2 = x; + + var len1 = a1.sqr().add(b1.sqr()); + var len2 = a2.sqr().add(b2.sqr()); + if (len2.cmp(len1) >= 0) { + a2 = a0; + b2 = b0; + } + + // Normalize signs + if (a1.negative) { + a1 = a1.neg(); + b1 = b1.neg(); + } + if (a2.negative) { + a2 = a2.neg(); + b2 = b2.neg(); + } + + return [ + { a: a1, b: b1 }, + { a: a2, b: b2 } + ]; +}; + +ShortCurve.prototype._endoSplit = function _endoSplit(k) { + var basis = this.endo.basis; + var v1 = basis[0]; + var v2 = basis[1]; + + var c1 = v2.b.mul(k).divRound(this.n); + var c2 = v1.b.neg().mul(k).divRound(this.n); + + var p1 = c1.mul(v1.a); + var p2 = c2.mul(v2.a); + var q1 = c1.mul(v1.b); + var q2 = c2.mul(v2.b); + + // Calculate answer + var k1 = k.sub(p1).sub(p2); + var k2 = q1.add(q2).neg(); + return { k1: k1, k2: k2 }; +}; + +ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); + + var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + // XXX Is there any way to tell if the number is odd without converting it + // to non-red form? + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + + return this.point(x, y); +}; + +ShortCurve.prototype.validate = function validate(point) { + if (point.inf) + return true; + + var x = point.x; + var y = point.y; + + var ax = this.a.redMul(x); + var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); + return y.redSqr().redISub(rhs).cmpn(0) === 0; +}; + +ShortCurve.prototype._endoWnafMulAdd = + function _endoWnafMulAdd(points, coeffs, jacobianResult) { + var npoints = this._endoWnafT1; + var ncoeffs = this._endoWnafT2; + for (var i = 0; i < points.length; i++) { + var split = this._endoSplit(coeffs[i]); + var p = points[i]; + var beta = p._getBeta(); + + if (split.k1.negative) { + split.k1.ineg(); + p = p.neg(true); + } + if (split.k2.negative) { + split.k2.ineg(); + beta = beta.neg(true); + } + + npoints[i * 2] = p; + npoints[i * 2 + 1] = beta; + ncoeffs[i * 2] = split.k1; + ncoeffs[i * 2 + 1] = split.k2; + } + var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); + + // Clean-up references to points and coefficients + for (var j = 0; j < i * 2; j++) { + npoints[j] = null; + ncoeffs[j] = null; + } + return res; +}; + +function Point(curve, x, y, isRed) { + Base.BasePoint.call(this, curve, 'affine'); + if (x === null && y === null) { + this.x = null; + this.y = null; + this.inf = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + // Force redgomery representation when loading from JSON + if (isRed) { + this.x.forceRed(this.curve.red); + this.y.forceRed(this.curve.red); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + this.inf = false; + } +} +inherits(Point, Base.BasePoint); + +ShortCurve.prototype.point = function point(x, y, isRed) { + return new Point(this, x, y, isRed); +}; + +ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { + return Point.fromJSON(this, obj, red); +}; + +Point.prototype._getBeta = function _getBeta() { + if (!this.curve.endo) + return; + + var pre = this.precomputed; + if (pre && pre.beta) + return pre.beta; + + var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); + if (pre) { + var curve = this.curve; + var endoMul = function(p) { + return curve.point(p.x.redMul(curve.endo.beta), p.y); + }; + pre.beta = beta; + beta.precomputed = { + beta: null, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(endoMul) + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(endoMul) + } + }; + } + return beta; +}; + +Point.prototype.toJSON = function toJSON() { + if (!this.precomputed) + return [ this.x, this.y ]; + + return [ this.x, this.y, this.precomputed && { + doubles: this.precomputed.doubles && { + step: this.precomputed.doubles.step, + points: this.precomputed.doubles.points.slice(1) + }, + naf: this.precomputed.naf && { + wnd: this.precomputed.naf.wnd, + points: this.precomputed.naf.points.slice(1) + } + } ]; +}; + +Point.fromJSON = function fromJSON(curve, obj, red) { + if (typeof obj === 'string') + obj = JSON.parse(obj); + var res = curve.point(obj[0], obj[1], red); + if (!obj[2]) + return res; + + function obj2point(obj) { + return curve.point(obj[0], obj[1], red); + } + + var pre = obj[2]; + res.precomputed = { + beta: null, + doubles: pre.doubles && { + step: pre.doubles.step, + points: [ res ].concat(pre.doubles.points.map(obj2point)) + }, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: [ res ].concat(pre.naf.points.map(obj2point)) + } + }; + return res; +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +Point.prototype.isInfinity = function isInfinity() { + return this.inf; +}; + +Point.prototype.add = function add(p) { + // O + P = P + if (this.inf) + return p; + + // P + O = P + if (p.inf) + return this; + + // P + P = 2P + if (this.eq(p)) + return this.dbl(); + + // P + (-P) = O + if (this.neg().eq(p)) + return this.curve.point(null, null); + + // P + Q = O + if (this.x.cmp(p.x) === 0) + return this.curve.point(null, null); + + var c = this.y.redSub(p.y); + if (c.cmpn(0) !== 0) + c = c.redMul(this.x.redSub(p.x).redInvm()); + var nx = c.redSqr().redISub(this.x).redISub(p.x); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.dbl = function dbl() { + if (this.inf) + return this; + + // 2P = O + var ys1 = this.y.redAdd(this.y); + if (ys1.cmpn(0) === 0) + return this.curve.point(null, null); + + var a = this.curve.a; + + var x2 = this.x.redSqr(); + var dyinv = ys1.redInvm(); + var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); + + var nx = c.redSqr().redISub(this.x.redAdd(this.x)); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.getX = function getX() { + return this.x.fromRed(); +}; + +Point.prototype.getY = function getY() { + return this.y.fromRed(); +}; + +Point.prototype.mul = function mul(k) { + k = new BN(k, 16); + + if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else if (this.curve.endo) + return this.curve._endoWnafMulAdd([ this ], [ k ]); + else + return this.curve._wnafMul(this, k); +}; + +Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2); +}; + +Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs, true); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2, true); +}; + +Point.prototype.eq = function eq(p) { + return this === p || + this.inf === p.inf && + (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); +}; + +Point.prototype.neg = function neg(_precompute) { + if (this.inf) + return this; + + var res = this.curve.point(this.x, this.y.redNeg()); + if (_precompute && this.precomputed) { + var pre = this.precomputed; + var negate = function(p) { + return p.neg(); + }; + res.precomputed = { + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(negate) + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(negate) + } + }; + } + return res; +}; + +Point.prototype.toJ = function toJ() { + if (this.inf) + return this.curve.jpoint(null, null, null); + + var res = this.curve.jpoint(this.x, this.y, this.curve.one); + return res; +}; + +function JPoint(curve, x, y, z) { + Base.BasePoint.call(this, curve, 'jacobian'); + if (x === null && y === null && z === null) { + this.x = this.curve.one; + this.y = this.curve.one; + this.z = new BN(0); + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = new BN(z, 16); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + + this.zOne = this.z === this.curve.one; +} +inherits(JPoint, Base.BasePoint); + +ShortCurve.prototype.jpoint = function jpoint(x, y, z) { + return new JPoint(this, x, y, z); +}; + +JPoint.prototype.toP = function toP() { + if (this.isInfinity()) + return this.curve.point(null, null); + + var zinv = this.z.redInvm(); + var zinv2 = zinv.redSqr(); + var ax = this.x.redMul(zinv2); + var ay = this.y.redMul(zinv2).redMul(zinv); + + return this.curve.point(ax, ay); +}; + +JPoint.prototype.neg = function neg() { + return this.curve.jpoint(this.x, this.y.redNeg(), this.z); +}; + +JPoint.prototype.add = function add(p) { + // O + P = P + if (this.isInfinity()) + return p; + + // P + O = P + if (p.isInfinity()) + return this; + + // 12M + 4S + 7A + var pz2 = p.z.redSqr(); + var z2 = this.z.redSqr(); + var u1 = this.x.redMul(pz2); + var u2 = p.x.redMul(z2); + var s1 = this.y.redMul(pz2.redMul(p.z)); + var s2 = p.y.redMul(z2.redMul(this.z)); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(p.z).redMul(h); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mixedAdd = function mixedAdd(p) { + // O + P = P + if (this.isInfinity()) + return p.toJ(); + + // P + O = P + if (p.isInfinity()) + return this; + + // 8M + 3S + 7A + var z2 = this.z.redSqr(); + var u1 = this.x; + var u2 = p.x.redMul(z2); + var s1 = this.y; + var s2 = p.y.redMul(z2).redMul(this.z); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(h); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.dblp = function dblp(pow) { + if (pow === 0) + return this; + if (this.isInfinity()) + return this; + if (!pow) + return this.dbl(); + + if (this.curve.zeroA || this.curve.threeA) { + var r = this; + for (var i = 0; i < pow; i++) + r = r.dbl(); + return r; + } + + // 1M + 2S + 1A + N * (4S + 5M + 8A) + // N = 1 => 6M + 6S + 9A + var a = this.curve.a; + var tinv = this.curve.tinv; + + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + + // Reuse results + var jyd = jy.redAdd(jy); + for (var i = 0; i < pow; i++) { + var jx2 = jx.redSqr(); + var jyd2 = jyd.redSqr(); + var jyd4 = jyd2.redSqr(); + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + + var t1 = jx.redMul(jyd2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + var dny = c.redMul(t2); + dny = dny.redIAdd(dny).redISub(jyd4); + var nz = jyd.redMul(jz); + if (i + 1 < pow) + jz4 = jz4.redMul(jyd4); + + jx = nx; + jz = nz; + jyd = dny; + } + + return this.curve.jpoint(jx, jyd.redMul(tinv), jz); +}; + +JPoint.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + + if (this.curve.zeroA) + return this._zeroDbl(); + else if (this.curve.threeA) + return this._threeDbl(); + else + return this._dbl(); +}; + +JPoint.prototype._zeroDbl = function _zeroDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 14A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // T = M ^ 2 - 2*S + var t = m.redSqr().redISub(s).redISub(s); + + // 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2*Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-dbl-2009-l + // 2M + 5S + 13A + + // A = X1^2 + var a = this.x.redSqr(); + // B = Y1^2 + var b = this.y.redSqr(); + // C = B^2 + var c = b.redSqr(); + // D = 2 * ((X1 + B)^2 - A - C) + var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); + d = d.redIAdd(d); + // E = 3 * A + var e = a.redAdd(a).redIAdd(a); + // F = E^2 + var f = e.redSqr(); + + // 8 * C + var c8 = c.redIAdd(c); + c8 = c8.redIAdd(c8); + c8 = c8.redIAdd(c8); + + // X3 = F - 2 * D + nx = f.redISub(d).redISub(d); + // Y3 = E * (D - X3) - 8 * C + ny = e.redMul(d.redISub(nx)).redISub(c8); + // Z3 = 2 * Y1 * Z1 + nz = this.y.redMul(this.z); + nz = nz.redIAdd(nz); + } + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype._threeDbl = function _threeDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 15A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a + var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); + // T = M^2 - 2 * S + var t = m.redSqr().redISub(s).redISub(s); + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2 * Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b + // 3M + 5S + + // delta = Z1^2 + var delta = this.z.redSqr(); + // gamma = Y1^2 + var gamma = this.y.redSqr(); + // beta = X1 * gamma + var beta = this.x.redMul(gamma); + // alpha = 3 * (X1 - delta) * (X1 + delta) + var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); + alpha = alpha.redAdd(alpha).redIAdd(alpha); + // X3 = alpha^2 - 8 * beta + var beta4 = beta.redIAdd(beta); + beta4 = beta4.redIAdd(beta4); + var beta8 = beta4.redAdd(beta4); + nx = alpha.redSqr().redISub(beta8); + // Z3 = (Y1 + Z1)^2 - gamma - delta + nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); + // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 + var ggamma8 = gamma.redSqr(); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); + } + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype._dbl = function _dbl() { + var a = this.curve.a; + + // 4M + 6S + 10A + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + + var jx2 = jx.redSqr(); + var jy2 = jy.redSqr(); + + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + + var jxd4 = jx.redAdd(jx); + jxd4 = jxd4.redIAdd(jxd4); + var t1 = jxd4.redMul(jy2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + + var jyd8 = jy2.redSqr(); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + var ny = c.redMul(t2).redISub(jyd8); + var nz = jy.redAdd(jy).redMul(jz); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.trpl = function trpl() { + if (!this.curve.zeroA) + return this.dbl().add(this); + + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl + // 5M + 10S + ... + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // ZZ = Z1^2 + var zz = this.z.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // M = 3 * XX + a * ZZ2; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // MM = M^2 + var mm = m.redSqr(); + // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM + var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + e = e.redIAdd(e); + e = e.redAdd(e).redIAdd(e); + e = e.redISub(mm); + // EE = E^2 + var ee = e.redSqr(); + // T = 16*YYYY + var t = yyyy.redIAdd(yyyy); + t = t.redIAdd(t); + t = t.redIAdd(t); + t = t.redIAdd(t); + // U = (M + E)^2 - MM - EE - T + var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); + // X3 = 4 * (X1 * EE - 4 * YY * U) + var yyu4 = yy.redMul(u); + yyu4 = yyu4.redIAdd(yyu4); + yyu4 = yyu4.redIAdd(yyu4); + var nx = this.x.redMul(ee).redISub(yyu4); + nx = nx.redIAdd(nx); + nx = nx.redIAdd(nx); + // Y3 = 8 * Y1 * (U * (T - U) - E * EE) + var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + // Z3 = (Z1 + E)^2 - ZZ - EE + var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mul = function mul(k, kbase) { + k = new BN(k, kbase); + + return this.curve._wnafMul(this, k); +}; + +JPoint.prototype.eq = function eq(p) { + if (p.type === 'affine') + return this.eq(p.toJ()); + + if (this === p) + return true; + + // x1 * z2^2 == x2 * z1^2 + var z2 = this.z.redSqr(); + var pz2 = p.z.redSqr(); + if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) + return false; + + // y1 * z2^3 == y2 * z1^3 + var z3 = z2.redMul(this.z); + var pz3 = pz2.redMul(p.z); + return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; +}; + +JPoint.prototype.eqXToP = function eqXToP(x) { + var zs = this.z.redSqr(); + var rx = x.toRed(this.curve.red).redMul(zs); + if (this.x.cmp(rx) === 0) + return true; + + var xc = x.clone(); + var t = this.curve.redN.redMul(zs); + for (;;) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } +}; + +JPoint.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +JPoint.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.z.cmpn(0) === 0; +}; + +},{"../../elliptic":68,"../curve":71,"bn.js":17,"inherits":101}],74:[function(require,module,exports){ +'use strict'; + +var curves = exports; + +var hash = require('hash.js'); +var elliptic = require('../elliptic'); + +var assert = elliptic.utils.assert; + +function PresetCurve(options) { + if (options.type === 'short') + this.curve = new elliptic.curve.short(options); + else if (options.type === 'edwards') + this.curve = new elliptic.curve.edwards(options); + else + this.curve = new elliptic.curve.mont(options); + this.g = this.curve.g; + this.n = this.curve.n; + this.hash = options.hash; + + assert(this.g.validate(), 'Invalid curve'); + assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); +} +curves.PresetCurve = PresetCurve; + +function defineCurve(name, options) { + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + get: function() { + var curve = new PresetCurve(options); + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + value: curve + }); + return curve; + } + }); +} + +defineCurve('p192', { + type: 'short', + prime: 'p192', + p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', + b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', + n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', + hash: hash.sha256, + gRed: false, + g: [ + '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', + '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811' + ] +}); + +defineCurve('p224', { + type: 'short', + prime: 'p224', + p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', + b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', + n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', + hash: hash.sha256, + gRed: false, + g: [ + 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', + 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34' + ] +}); + +defineCurve('p256', { + type: 'short', + prime: null, + p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', + a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', + b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', + n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', + hash: hash.sha256, + gRed: false, + g: [ + '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5' + ] +}); + +defineCurve('p384', { + type: 'short', + prime: null, + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 ffffffff', + a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 fffffffc', + b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + + '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', + n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + + 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', + hash: hash.sha384, + gRed: false, + g: [ + 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + + '5502f25d bf55296c 3a545e38 72760ab7', + '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' + ] +}); + +defineCurve('p521', { + type: 'short', + prime: null, + p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff', + a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff fffffffc', + b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + + '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + + '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', + n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + + 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', + hash: hash.sha512, + gRed: false, + g: [ + '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + + '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + + 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', + '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + + '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + + '3fad0761 353c7086 a272c240 88be9476 9fd16650' + ] +}); + +defineCurve('curve25519', { + type: 'mont', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '76d06', + b: '1', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash.sha256, + gRed: false, + g: [ + '9' + ] +}); + +defineCurve('ed25519', { + type: 'edwards', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '-1', + c: '1', + // -121665 * (121666^(-1)) (mod P) + d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash.sha256, + gRed: false, + g: [ + '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', + + // 4/5 + '6666666666666666666666666666666666666666666666666666666666666658' + ] +}); + +var pre; +try { + pre = require('./precomputed/secp256k1'); +} catch (e) { + pre = undefined; +} + +defineCurve('secp256k1', { + type: 'short', + prime: 'k256', + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', + a: '0', + b: '7', + n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', + h: '1', + hash: hash.sha256, + + // Precomputed endomorphism + beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', + lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', + basis: [ + { + a: '3086d221a7d46bcde86c90e49284eb15', + b: '-e4437ed6010e88286f547fa90abfe4c3' + }, + { + a: '114ca50f7a8e2f3f657c1108d9d44cfd8', + b: '3086d221a7d46bcde86c90e49284eb15' + } + ], + + gRed: false, + g: [ + '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', + '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', + pre + ] +}); + +},{"../elliptic":68,"./precomputed/secp256k1":81,"hash.js":87}],75:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var HmacDRBG = require('hmac-drbg'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; + +var KeyPair = require('./key'); +var Signature = require('./signature'); + +function EC(options) { + if (!(this instanceof EC)) + return new EC(options); + + // Shortcut `elliptic.ec(curve-name)` + if (typeof options === 'string') { + assert(elliptic.curves.hasOwnProperty(options), 'Unknown curve ' + options); + + options = elliptic.curves[options]; + } + + // Shortcut for `elliptic.ec(elliptic.curves.curveName)` + if (options instanceof elliptic.curves.PresetCurve) + options = { curve: options }; + + this.curve = options.curve.curve; + this.n = this.curve.n; + this.nh = this.n.ushrn(1); + this.g = this.curve.g; + + // Point on curve + this.g = options.curve.g; + this.g.precompute(options.curve.n.bitLength() + 1); + + // Hash for function for DRBG + this.hash = options.hash || options.curve.hash; +} +module.exports = EC; + +EC.prototype.keyPair = function keyPair(options) { + return new KeyPair(this, options); +}; + +EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { + return KeyPair.fromPrivate(this, priv, enc); +}; + +EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { + return KeyPair.fromPublic(this, pub, enc); +}; + +EC.prototype.genKeyPair = function genKeyPair(options) { + if (!options) + options = {}; + + // Instantiate Hmac_DRBG + var drbg = new HmacDRBG({ + hash: this.hash, + pers: options.pers, + persEnc: options.persEnc || 'utf8', + entropy: options.entropy || elliptic.rand(this.hash.hmacStrength), + entropyEnc: options.entropy && options.entropyEnc || 'utf8', + nonce: this.n.toArray() + }); + + var bytes = this.n.byteLength(); + var ns2 = this.n.sub(new BN(2)); + do { + var priv = new BN(drbg.generate(bytes)); + if (priv.cmp(ns2) > 0) + continue; + + priv.iaddn(1); + return this.keyFromPrivate(priv); + } while (true); +}; + +EC.prototype._truncateToN = function truncateToN(msg, truncOnly) { + var delta = msg.byteLength() * 8 - this.n.bitLength(); + if (delta > 0) + msg = msg.ushrn(delta); + if (!truncOnly && msg.cmp(this.n) >= 0) + return msg.sub(this.n); + else + return msg; +}; + +EC.prototype.sign = function sign(msg, key, enc, options) { + if (typeof enc === 'object') { + options = enc; + enc = null; + } + if (!options) + options = {}; + + key = this.keyFromPrivate(key, enc); + msg = this._truncateToN(new BN(msg, 16)); + + // Zero-extend key to provide enough entropy + var bytes = this.n.byteLength(); + var bkey = key.getPrivate().toArray('be', bytes); + + // Zero-extend nonce to have the same byte size as N + var nonce = msg.toArray('be', bytes); + + // Instantiate Hmac_DRBG + var drbg = new HmacDRBG({ + hash: this.hash, + entropy: bkey, + nonce: nonce, + pers: options.pers, + persEnc: options.persEnc || 'utf8' + }); + + // Number of bytes to generate + var ns1 = this.n.sub(new BN(1)); + + for (var iter = 0; true; iter++) { + var k = options.k ? + options.k(iter) : + new BN(drbg.generate(this.n.byteLength())); + k = this._truncateToN(k, true); + if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) + continue; + + var kp = this.g.mul(k); + if (kp.isInfinity()) + continue; + + var kpX = kp.getX(); + var r = kpX.umod(this.n); + if (r.cmpn(0) === 0) + continue; + + var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); + s = s.umod(this.n); + if (s.cmpn(0) === 0) + continue; + + var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | + (kpX.cmp(r) !== 0 ? 2 : 0); + + // Use complement of `s`, if it is > `n / 2` + if (options.canonical && s.cmp(this.nh) > 0) { + s = this.n.sub(s); + recoveryParam ^= 1; + } + + return new Signature({ r: r, s: s, recoveryParam: recoveryParam }); + } +}; + +EC.prototype.verify = function verify(msg, signature, key, enc) { + msg = this._truncateToN(new BN(msg, 16)); + key = this.keyFromPublic(key, enc); + signature = new Signature(signature, 'hex'); + + // Perform primitive values validation + var r = signature.r; + var s = signature.s; + if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) + return false; + if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) + return false; + + // Validate signature + var sinv = s.invm(this.n); + var u1 = sinv.mul(msg).umod(this.n); + var u2 = sinv.mul(r).umod(this.n); + + if (!this.curve._maxwellTrick) { + var p = this.g.mulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; + + return p.getX().umod(this.n).cmp(r) === 0; + } + + // NOTE: Greg Maxwell's trick, inspired by: + // https://git.io/vad3K + + var p = this.g.jmulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; + + // Compare `p.x` of Jacobian point with `r`, + // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the + // inverse of `p.z^2` + return p.eqXToP(r); +}; + +EC.prototype.recoverPubKey = function(msg, signature, j, enc) { + assert((3 & j) === j, 'The recovery param is more than two bits'); + signature = new Signature(signature, enc); + + var n = this.n; + var e = new BN(msg); + var r = signature.r; + var s = signature.s; + + // A set LSB signifies that the y-coordinate is odd + var isYOdd = j & 1; + var isSecondKey = j >> 1; + if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) + throw new Error('Unable to find sencond key candinate'); + + // 1.1. Let x = r + jn. + if (isSecondKey) + r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); + else + r = this.curve.pointFromX(r, isYOdd); + + var rInv = signature.r.invm(n); + var s1 = n.sub(e).mul(rInv).umod(n); + var s2 = s.mul(rInv).umod(n); + + // 1.6.1 Compute Q = r^-1 (sR - eG) + // Q = r^-1 (sR + -eG) + return this.g.mulAdd(s1, r, s2); +}; + +EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) { + signature = new Signature(signature, enc); + if (signature.recoveryParam !== null) + return signature.recoveryParam; + + for (var i = 0; i < 4; i++) { + var Qprime; + try { + Qprime = this.recoverPubKey(e, signature, i); + } catch (e) { + continue; + } + + if (Qprime.eq(Q)) + return i; + } + throw new Error('Unable to find valid recovery factor'); +}; + +},{"../../elliptic":68,"./key":76,"./signature":77,"bn.js":17,"hmac-drbg":99}],76:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; + +function KeyPair(ec, options) { + this.ec = ec; + this.priv = null; + this.pub = null; + + // KeyPair(ec, { priv: ..., pub: ... }) + if (options.priv) + this._importPrivate(options.priv, options.privEnc); + if (options.pub) + this._importPublic(options.pub, options.pubEnc); +} +module.exports = KeyPair; + +KeyPair.fromPublic = function fromPublic(ec, pub, enc) { + if (pub instanceof KeyPair) + return pub; + + return new KeyPair(ec, { + pub: pub, + pubEnc: enc + }); +}; + +KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { + if (priv instanceof KeyPair) + return priv; + + return new KeyPair(ec, { + priv: priv, + privEnc: enc + }); +}; + +KeyPair.prototype.validate = function validate() { + var pub = this.getPublic(); + + if (pub.isInfinity()) + return { result: false, reason: 'Invalid public key' }; + if (!pub.validate()) + return { result: false, reason: 'Public key is not a point' }; + if (!pub.mul(this.ec.curve.n).isInfinity()) + return { result: false, reason: 'Public key * N != O' }; + + return { result: true, reason: null }; +}; + +KeyPair.prototype.getPublic = function getPublic(compact, enc) { + // compact is optional argument + if (typeof compact === 'string') { + enc = compact; + compact = null; + } + + if (!this.pub) + this.pub = this.ec.g.mul(this.priv); + + if (!enc) + return this.pub; + + return this.pub.encode(enc, compact); +}; + +KeyPair.prototype.getPrivate = function getPrivate(enc) { + if (enc === 'hex') + return this.priv.toString(16, 2); + else + return this.priv; +}; + +KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { + this.priv = new BN(key, enc || 16); + + // Ensure that the priv won't be bigger than n, otherwise we may fail + // in fixed multiplication method + this.priv = this.priv.umod(this.ec.curve.n); +}; + +KeyPair.prototype._importPublic = function _importPublic(key, enc) { + if (key.x || key.y) { + // Montgomery points only have an `x` coordinate. + // Weierstrass/Edwards points on the other hand have both `x` and + // `y` coordinates. + if (this.ec.curve.type === 'mont') { + assert(key.x, 'Need x coordinate'); + } else if (this.ec.curve.type === 'short' || + this.ec.curve.type === 'edwards') { + assert(key.x && key.y, 'Need both x and y coordinate'); + } + this.pub = this.ec.curve.point(key.x, key.y); + return; + } + this.pub = this.ec.curve.decodePoint(key, enc); +}; + +// ECDH +KeyPair.prototype.derive = function derive(pub) { + return pub.mul(this.priv).getX(); +}; + +// ECDSA +KeyPair.prototype.sign = function sign(msg, enc, options) { + return this.ec.sign(msg, this, enc, options); +}; + +KeyPair.prototype.verify = function verify(msg, signature) { + return this.ec.verify(msg, signature, this); +}; + +KeyPair.prototype.inspect = function inspect() { + return ''; +}; + +},{"../../elliptic":68,"bn.js":17}],77:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); + +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; + +function Signature(options, enc) { + if (options instanceof Signature) + return options; + + if (this._importDER(options, enc)) + return; + + assert(options.r && options.s, 'Signature without r or s'); + this.r = new BN(options.r, 16); + this.s = new BN(options.s, 16); + if (options.recoveryParam === undefined) + this.recoveryParam = null; + else + this.recoveryParam = options.recoveryParam; +} +module.exports = Signature; + +function Position() { + this.place = 0; +} + +function getLength(buf, p) { + var initial = buf[p.place++]; + if (!(initial & 0x80)) { + return initial; + } + var octetLen = initial & 0xf; + var val = 0; + for (var i = 0, off = p.place; i < octetLen; i++, off++) { + val <<= 8; + val |= buf[off]; + } + p.place = off; + return val; +} + +function rmPadding(buf) { + var i = 0; + var len = buf.length - 1; + while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) { + i++; + } + if (i === 0) { + return buf; + } + return buf.slice(i); +} + +Signature.prototype._importDER = function _importDER(data, enc) { + data = utils.toArray(data, enc); + var p = new Position(); + if (data[p.place++] !== 0x30) { + return false; + } + var len = getLength(data, p); + if ((len + p.place) !== data.length) { + return false; + } + if (data[p.place++] !== 0x02) { + return false; + } + var rlen = getLength(data, p); + var r = data.slice(p.place, rlen + p.place); + p.place += rlen; + if (data[p.place++] !== 0x02) { + return false; + } + var slen = getLength(data, p); + if (data.length !== slen + p.place) { + return false; + } + var s = data.slice(p.place, slen + p.place); + if (r[0] === 0 && (r[1] & 0x80)) { + r = r.slice(1); + } + if (s[0] === 0 && (s[1] & 0x80)) { + s = s.slice(1); + } + + this.r = new BN(r); + this.s = new BN(s); + this.recoveryParam = null; + + return true; +}; + +function constructLength(arr, len) { + if (len < 0x80) { + arr.push(len); + return; + } + var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); + arr.push(octets | 0x80); + while (--octets) { + arr.push((len >>> (octets << 3)) & 0xff); + } + arr.push(len); +} + +Signature.prototype.toDER = function toDER(enc) { + var r = this.r.toArray(); + var s = this.s.toArray(); + + // Pad values + if (r[0] & 0x80) + r = [ 0 ].concat(r); + // Pad values + if (s[0] & 0x80) + s = [ 0 ].concat(s); + + r = rmPadding(r); + s = rmPadding(s); + + while (!s[0] && !(s[1] & 0x80)) { + s = s.slice(1); + } + var arr = [ 0x02 ]; + constructLength(arr, r.length); + arr = arr.concat(r); + arr.push(0x02); + constructLength(arr, s.length); + var backHalf = arr.concat(s); + var res = [ 0x30 ]; + constructLength(res, backHalf.length); + res = res.concat(backHalf); + return utils.encode(res, enc); +}; + +},{"../../elliptic":68,"bn.js":17}],78:[function(require,module,exports){ +'use strict'; + +var hash = require('hash.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; +var parseBytes = utils.parseBytes; +var KeyPair = require('./key'); +var Signature = require('./signature'); + +function EDDSA(curve) { + assert(curve === 'ed25519', 'only tested with ed25519 so far'); + + if (!(this instanceof EDDSA)) + return new EDDSA(curve); + + var curve = elliptic.curves[curve].curve; + this.curve = curve; + this.g = curve.g; + this.g.precompute(curve.n.bitLength() + 1); + + this.pointClass = curve.point().constructor; + this.encodingLength = Math.ceil(curve.n.bitLength() / 8); + this.hash = hash.sha512; +} + +module.exports = EDDSA; + +/** +* @param {Array|String} message - message bytes +* @param {Array|String|KeyPair} secret - secret bytes or a keypair +* @returns {Signature} - signature +*/ +EDDSA.prototype.sign = function sign(message, secret) { + message = parseBytes(message); + var key = this.keyFromSecret(secret); + var r = this.hashInt(key.messagePrefix(), message); + var R = this.g.mul(r); + var Rencoded = this.encodePoint(R); + var s_ = this.hashInt(Rencoded, key.pubBytes(), message) + .mul(key.priv()); + var S = r.add(s_).umod(this.curve.n); + return this.makeSignature({ R: R, S: S, Rencoded: Rencoded }); +}; + +/** +* @param {Array} message - message bytes +* @param {Array|String|Signature} sig - sig bytes +* @param {Array|String|Point|KeyPair} pub - public key +* @returns {Boolean} - true if public key matches sig of message +*/ +EDDSA.prototype.verify = function verify(message, sig, pub) { + message = parseBytes(message); + sig = this.makeSignature(sig); + var key = this.keyFromPublic(pub); + var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); + var SG = this.g.mul(sig.S()); + var RplusAh = sig.R().add(key.pub().mul(h)); + return RplusAh.eq(SG); +}; + +EDDSA.prototype.hashInt = function hashInt() { + var hash = this.hash(); + for (var i = 0; i < arguments.length; i++) + hash.update(arguments[i]); + return utils.intFromLE(hash.digest()).umod(this.curve.n); +}; + +EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { + return KeyPair.fromPublic(this, pub); +}; + +EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { + return KeyPair.fromSecret(this, secret); +}; + +EDDSA.prototype.makeSignature = function makeSignature(sig) { + if (sig instanceof Signature) + return sig; + return new Signature(this, sig); +}; + +/** +* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2 +* +* EDDSA defines methods for encoding and decoding points and integers. These are +* helper convenience methods, that pass along to utility functions implied +* parameters. +* +*/ +EDDSA.prototype.encodePoint = function encodePoint(point) { + var enc = point.getY().toArray('le', this.encodingLength); + enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0; + return enc; +}; + +EDDSA.prototype.decodePoint = function decodePoint(bytes) { + bytes = utils.parseBytes(bytes); + + var lastIx = bytes.length - 1; + var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80); + var xIsOdd = (bytes[lastIx] & 0x80) !== 0; + + var y = utils.intFromLE(normed); + return this.curve.pointFromY(y, xIsOdd); +}; + +EDDSA.prototype.encodeInt = function encodeInt(num) { + return num.toArray('le', this.encodingLength); +}; + +EDDSA.prototype.decodeInt = function decodeInt(bytes) { + return utils.intFromLE(bytes); +}; + +EDDSA.prototype.isPoint = function isPoint(val) { + return val instanceof this.pointClass; +}; + +},{"../../elliptic":68,"./key":79,"./signature":80,"hash.js":87}],79:[function(require,module,exports){ +'use strict'; + +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; +var parseBytes = utils.parseBytes; +var cachedProperty = utils.cachedProperty; + +/** +* @param {EDDSA} eddsa - instance +* @param {Object} params - public/private key parameters +* +* @param {Array} [params.secret] - secret seed bytes +* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms) +* @param {Array} [params.pub] - public key point encoded as bytes +* +*/ +function KeyPair(eddsa, params) { + this.eddsa = eddsa; + this._secret = parseBytes(params.secret); + if (eddsa.isPoint(params.pub)) + this._pub = params.pub; + else + this._pubBytes = parseBytes(params.pub); +} + +KeyPair.fromPublic = function fromPublic(eddsa, pub) { + if (pub instanceof KeyPair) + return pub; + return new KeyPair(eddsa, { pub: pub }); +}; + +KeyPair.fromSecret = function fromSecret(eddsa, secret) { + if (secret instanceof KeyPair) + return secret; + return new KeyPair(eddsa, { secret: secret }); +}; + +KeyPair.prototype.secret = function secret() { + return this._secret; +}; + +cachedProperty(KeyPair, 'pubBytes', function pubBytes() { + return this.eddsa.encodePoint(this.pub()); +}); + +cachedProperty(KeyPair, 'pub', function pub() { + if (this._pubBytes) + return this.eddsa.decodePoint(this._pubBytes); + return this.eddsa.g.mul(this.priv()); +}); + +cachedProperty(KeyPair, 'privBytes', function privBytes() { + var eddsa = this.eddsa; + var hash = this.hash(); + var lastIx = eddsa.encodingLength - 1; + + var a = hash.slice(0, eddsa.encodingLength); + a[0] &= 248; + a[lastIx] &= 127; + a[lastIx] |= 64; + + return a; +}); + +cachedProperty(KeyPair, 'priv', function priv() { + return this.eddsa.decodeInt(this.privBytes()); +}); + +cachedProperty(KeyPair, 'hash', function hash() { + return this.eddsa.hash().update(this.secret()).digest(); +}); + +cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() { + return this.hash().slice(this.eddsa.encodingLength); +}); + +KeyPair.prototype.sign = function sign(message) { + assert(this._secret, 'KeyPair can only verify'); + return this.eddsa.sign(message, this); +}; + +KeyPair.prototype.verify = function verify(message, sig) { + return this.eddsa.verify(message, sig, this); +}; + +KeyPair.prototype.getSecret = function getSecret(enc) { + assert(this._secret, 'KeyPair is public only'); + return utils.encode(this.secret(), enc); +}; + +KeyPair.prototype.getPublic = function getPublic(enc) { + return utils.encode(this.pubBytes(), enc); +}; + +module.exports = KeyPair; + +},{"../../elliptic":68}],80:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; +var cachedProperty = utils.cachedProperty; +var parseBytes = utils.parseBytes; + +/** +* @param {EDDSA} eddsa - eddsa instance +* @param {Array|Object} sig - +* @param {Array|Point} [sig.R] - R point as Point or bytes +* @param {Array|bn} [sig.S] - S scalar as bn or bytes +* @param {Array} [sig.Rencoded] - R point encoded +* @param {Array} [sig.Sencoded] - S scalar encoded +*/ +function Signature(eddsa, sig) { + this.eddsa = eddsa; + + if (typeof sig !== 'object') + sig = parseBytes(sig); + + if (Array.isArray(sig)) { + sig = { + R: sig.slice(0, eddsa.encodingLength), + S: sig.slice(eddsa.encodingLength) + }; + } + + assert(sig.R && sig.S, 'Signature without R or S'); + + if (eddsa.isPoint(sig.R)) + this._R = sig.R; + if (sig.S instanceof BN) + this._S = sig.S; + + this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; + this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; +} + +cachedProperty(Signature, 'S', function S() { + return this.eddsa.decodeInt(this.Sencoded()); +}); + +cachedProperty(Signature, 'R', function R() { + return this.eddsa.decodePoint(this.Rencoded()); +}); + +cachedProperty(Signature, 'Rencoded', function Rencoded() { + return this.eddsa.encodePoint(this.R()); +}); + +cachedProperty(Signature, 'Sencoded', function Sencoded() { + return this.eddsa.encodeInt(this.S()); +}); + +Signature.prototype.toBytes = function toBytes() { + return this.Rencoded().concat(this.Sencoded()); +}; + +Signature.prototype.toHex = function toHex() { + return utils.encode(this.toBytes(), 'hex').toUpperCase(); +}; + +module.exports = Signature; + +},{"../../elliptic":68,"bn.js":17}],81:[function(require,module,exports){ +module.exports = { + doubles: { + step: 4, + points: [ + [ + 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a', + 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821' + ], + [ + '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508', + '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf' + ], + [ + '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739', + 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695' + ], + [ + '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640', + '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9' + ], + [ + '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c', + '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36' + ], + [ + '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda', + '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f' + ], + [ + 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa', + '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999' + ], + [ + '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0', + 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09' + ], + [ + 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d', + '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d' + ], + [ + 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d', + 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088' + ], + [ + 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1', + '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d' + ], + [ + '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0', + '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8' + ], + [ + '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047', + '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a' + ], + [ + '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862', + '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453' + ], + [ + '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7', + '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160' + ], + [ + '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd', + '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0' + ], + [ + '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83', + '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6' + ], + [ + '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a', + '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589' + ], + [ + '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8', + 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17' + ], + [ + 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d', + '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda' + ], + [ + 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725', + '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd' + ], + [ + '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754', + '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2' + ], + [ + '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c', + '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6' + ], + [ + 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6', + '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f' + ], + [ + '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39', + 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01' + ], + [ + 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891', + '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3' + ], + [ + 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b', + 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f' + ], + [ + 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03', + '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7' + ], + [ + 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d', + 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78' + ], + [ + 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070', + '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1' + ], + [ + '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4', + 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150' + ], + [ + '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da', + '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82' + ], + [ + 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11', + '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc' + ], + [ + '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e', + 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b' + ], + [ + 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41', + '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51' + ], + [ + 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef', + '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45' + ], + [ + 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8', + 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120' + ], + [ + '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d', + '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84' + ], + [ + '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96', + '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d' + ], + [ + '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd', + 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d' + ], + [ + '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5', + '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8' + ], + [ + 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266', + '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8' + ], + [ + '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71', + '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac' + ], + [ + '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac', + 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f' + ], + [ + '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751', + '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962' + ], + [ + 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e', + '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907' + ], + [ + '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241', + 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec' + ], + [ + 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3', + 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d' + ], + [ + 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f', + '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414' + ], + [ + '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19', + 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd' + ], + [ + '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be', + 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0' + ], + [ + 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9', + '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811' + ], + [ + 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2', + '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1' + ], + [ + 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13', + '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c' + ], + [ + '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c', + 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73' + ], + [ + '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba', + '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd' + ], + [ + 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151', + 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405' + ], + [ + '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073', + 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589' + ], + [ + '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458', + '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e' + ], + [ + '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b', + '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27' + ], + [ + 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366', + 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1' + ], + [ + '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa', + '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482' + ], + [ + '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0', + '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945' + ], + [ + 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787', + '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573' + ], + [ + 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e', + 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82' + ] + ] + }, + naf: { + wnd: 7, + points: [ + [ + 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9', + '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672' + ], + [ + '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4', + 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6' + ], + [ + '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc', + '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da' + ], + [ + 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe', + 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37' + ], + [ + '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb', + 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b' + ], + [ + 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8', + 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81' + ], + [ + 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e', + '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58' + ], + [ + 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34', + '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77' + ], + [ + '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c', + '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a' + ], + [ + '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5', + '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c' + ], + [ + '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f', + '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67' + ], + [ + '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714', + '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402' + ], + [ + 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729', + 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55' + ], + [ + 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db', + '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482' + ], + [ + '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4', + 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82' + ], + [ + '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5', + 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396' + ], + [ + '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479', + '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49' + ], + [ + '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d', + '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf' + ], + [ + '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f', + '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a' + ], + [ + '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb', + 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7' + ], + [ + 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9', + 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933' + ], + [ + '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963', + '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a' + ], + [ + '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74', + '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6' + ], + [ + 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530', + 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37' + ], + [ + '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b', + '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e' + ], + [ + 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247', + 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6' + ], + [ + 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1', + 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476' + ], + [ + '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120', + '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40' + ], + [ + '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435', + '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61' + ], + [ + '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18', + '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683' + ], + [ + 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8', + '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5' + ], + [ + '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb', + '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b' + ], + [ + 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f', + '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417' + ], + [ + '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143', + 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868' + ], + [ + '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba', + 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a' + ], + [ + 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45', + 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6' + ], + [ + '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a', + '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996' + ], + [ + '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e', + 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e' + ], + [ + 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8', + 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d' + ], + [ + '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c', + '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2' + ], + [ + '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519', + 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e' + ], + [ + '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab', + '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437' + ], + [ + '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca', + 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311' + ], + [ + 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf', + '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4' + ], + [ + '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610', + '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575' + ], + [ + '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4', + 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d' + ], + [ + '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c', + 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d' + ], + [ + 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940', + 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629' + ], + [ + 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980', + 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06' + ], + [ + '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3', + '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374' + ], + [ + '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf', + '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee' + ], + [ + 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63', + '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1' + ], + [ + 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448', + 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b' + ], + [ + '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf', + '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661' + ], + [ + '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5', + '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6' + ], + [ + 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6', + '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e' + ], + [ + '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5', + '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d' + ], + [ + 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99', + 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc' + ], + [ + '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51', + 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4' + ], + [ + '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5', + '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c' + ], + [ + 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5', + '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b' + ], + [ + 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997', + '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913' + ], + [ + '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881', + '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154' + ], + [ + '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5', + '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865' + ], + [ + '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66', + 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc' + ], + [ + '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726', + 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224' + ], + [ + '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede', + '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e' + ], + [ + '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94', + '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6' + ], + [ + '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31', + '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511' + ], + [ + '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51', + 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b' + ], + [ + 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252', + 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2' + ], + [ + '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5', + 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c' + ], + [ + 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b', + '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3' + ], + [ + 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4', + '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d' + ], + [ + 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f', + '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700' + ], + [ + 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889', + '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4' + ], + [ + '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246', + 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196' + ], + [ + '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984', + '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4' + ], + [ + '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a', + 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257' + ], + [ + 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030', + 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13' + ], + [ + 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197', + '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096' + ], + [ + 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593', + 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38' + ], + [ + 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef', + '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f' + ], + [ + '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38', + '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448' + ], + [ + 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a', + '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a' + ], + [ + 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111', + '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4' + ], + [ + '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502', + '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437' + ], + [ + '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea', + 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7' + ], + [ + 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26', + '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d' + ], + [ + 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986', + '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a' + ], + [ + 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e', + '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54' + ], + [ + '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4', + '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77' + ], + [ + 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda', + 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517' + ], + [ + '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859', + 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10' + ], + [ + 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f', + 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125' + ], + [ + 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c', + '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e' + ], + [ + '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942', + 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1' + ], + [ + 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a', + '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2' + ], + [ + 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80', + '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423' + ], + [ + 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d', + '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8' + ], + [ + '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1', + 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758' + ], + [ + '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63', + 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375' + ], + [ + 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352', + '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d' + ], + [ + '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193', + 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec' + ], + [ + '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00', + '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0' + ], + [ + '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58', + 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c' + ], + [ + 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7', + 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4' + ], + [ + '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8', + 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f' + ], + [ + '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e', + '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649' + ], + [ + '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d', + 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826' + ], + [ + '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b', + '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5' + ], + [ + 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f', + 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87' + ], + [ + '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6', + '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b' + ], + [ + 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297', + '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc' + ], + [ + '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a', + '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c' + ], + [ + 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c', + 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f' + ], + [ + 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52', + '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a' + ], + [ + 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb', + 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46' + ], + [ + '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065', + 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f' + ], + [ + '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917', + '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03' + ], + [ + '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9', + 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08' + ], + [ + '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3', + '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8' + ], + [ + '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57', + '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373' + ], + [ + '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66', + 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3' + ], + [ + '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8', + '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8' + ], + [ + '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721', + '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1' + ], + [ + '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180', + '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9' + ] + ] + } +}; + +},{}],82:[function(require,module,exports){ +'use strict'; + +var utils = exports; +var BN = require('bn.js'); +var minAssert = require('minimalistic-assert'); +var minUtils = require('minimalistic-crypto-utils'); + +utils.assert = minAssert; +utils.toArray = minUtils.toArray; +utils.zero2 = minUtils.zero2; +utils.toHex = minUtils.toHex; +utils.encode = minUtils.encode; + +// Represent num in a w-NAF form +function getNAF(num, w) { + var naf = []; + var ws = 1 << (w + 1); + var k = num.clone(); + while (k.cmpn(1) >= 0) { + var z; + if (k.isOdd()) { + var mod = k.andln(ws - 1); + if (mod > (ws >> 1) - 1) + z = (ws >> 1) - mod; + else + z = mod; + k.isubn(z); + } else { + z = 0; + } + naf.push(z); + + // Optimization, shift by word if possible + var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1; + for (var i = 1; i < shift; i++) + naf.push(0); + k.iushrn(shift); + } + + return naf; +} +utils.getNAF = getNAF; + +// Represent k1, k2 in a Joint Sparse Form +function getJSF(k1, k2) { + var jsf = [ + [], + [] + ]; + + k1 = k1.clone(); + k2 = k2.clone(); + var d1 = 0; + var d2 = 0; + while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { + + // First phase + var m14 = (k1.andln(3) + d1) & 3; + var m24 = (k2.andln(3) + d2) & 3; + if (m14 === 3) + m14 = -1; + if (m24 === 3) + m24 = -1; + var u1; + if ((m14 & 1) === 0) { + u1 = 0; + } else { + var m8 = (k1.andln(7) + d1) & 7; + if ((m8 === 3 || m8 === 5) && m24 === 2) + u1 = -m14; + else + u1 = m14; + } + jsf[0].push(u1); + + var u2; + if ((m24 & 1) === 0) { + u2 = 0; + } else { + var m8 = (k2.andln(7) + d2) & 7; + if ((m8 === 3 || m8 === 5) && m14 === 2) + u2 = -m24; + else + u2 = m24; + } + jsf[1].push(u2); + + // Second phase + if (2 * d1 === u1 + 1) + d1 = 1 - d1; + if (2 * d2 === u2 + 1) + d2 = 1 - d2; + k1.iushrn(1); + k2.iushrn(1); + } + + return jsf; +} +utils.getJSF = getJSF; + +function cachedProperty(obj, name, computer) { + var key = '_' + name; + obj.prototype[name] = function cachedProperty() { + return this[key] !== undefined ? this[key] : + this[key] = computer.call(this); + }; +} +utils.cachedProperty = cachedProperty; + +function parseBytes(bytes) { + return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : + bytes; +} +utils.parseBytes = parseBytes; + +function intFromLE(bytes) { + return new BN(bytes, 'hex', 'le'); +} +utils.intFromLE = intFromLE; + + +},{"bn.js":17,"minimalistic-assert":106,"minimalistic-crypto-utils":107}],83:[function(require,module,exports){ +module.exports={ + "_from": "elliptic@^6.0.0", + "_id": "elliptic@6.4.1", + "_inBundle": false, + "_integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "_location": "/elliptic", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "elliptic@^6.0.0", + "name": "elliptic", + "escapedName": "elliptic", + "rawSpec": "^6.0.0", + "saveSpec": null, + "fetchSpec": "^6.0.0" + }, + "_requiredBy": [ + "/browserify-sign", + "/create-ecdh" + ], + "_resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "_shasum": "c2d0b7776911b86722c632c3c06c60f2f819939a", + "_spec": "elliptic@^6.0.0", + "_where": "/Users/koen/Projects/opencamlib/src/emscriptenlib/node_modules/browserify-sign", + "author": { + "name": "Fedor Indutny", + "email": "fedor@indutny.com" + }, + "bugs": { + "url": "https://github.com/indutny/elliptic/issues" + }, + "bundleDependencies": false, + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "deprecated": false, + "description": "EC cryptography", + "devDependencies": { + "brfs": "^1.4.3", + "coveralls": "^2.11.3", + "grunt": "^0.4.5", + "grunt-browserify": "^5.0.0", + "grunt-cli": "^1.2.0", + "grunt-contrib-connect": "^1.0.0", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-uglify": "^1.0.1", + "grunt-mocha-istanbul": "^3.0.1", + "grunt-saucelabs": "^8.6.2", + "istanbul": "^0.4.2", + "jscs": "^2.9.0", + "jshint": "^2.6.0", + "mocha": "^2.1.0" + }, + "files": [ + "lib" + ], + "homepage": "https://github.com/indutny/elliptic", + "keywords": [ + "EC", + "Elliptic", + "curve", + "Cryptography" + ], + "license": "MIT", + "main": "lib/elliptic.js", + "name": "elliptic", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/indutny/elliptic.git" + }, + "scripts": { + "jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", + "jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", + "lint": "npm run jscs && npm run jshint", + "test": "npm run lint && npm run unit", + "unit": "istanbul test _mocha --reporter=spec test/index.js", + "version": "grunt dist && git add dist/" + }, + "version": "6.4.1" +} + +},{}],84:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var objectCreate = Object.create || objectCreatePolyfill +var objectKeys = Object.keys || objectKeysPolyfill +var bind = Function.prototype.bind || functionBindPolyfill + +function EventEmitter() { + if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { + this._events = objectCreate(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +var hasDefineProperty; +try { + var o = {}; + if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); + hasDefineProperty = o.x === 0; +} catch (err) { hasDefineProperty = false } +if (hasDefineProperty) { + Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + // check whether the input is a positive number (whose value is zero or + // greater and not a NaN). + if (typeof arg !== 'number' || arg < 0 || arg !== arg) + throw new TypeError('"defaultMaxListeners" must be a positive number'); + defaultMaxListeners = arg; + } + }); +} else { + EventEmitter.defaultMaxListeners = defaultMaxListeners; +} + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; +}; + +function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); +}; + +// These standalone emit* functions are used to optimize calling of event +// handlers for fast cases because emit() itself often has a variable number of +// arguments and can be deoptimized because of that. These functions always have +// the same number of arguments and thus do not get deoptimized, so the code +// inside them can execute faster. +function emitNone(handler, isFn, self) { + if (isFn) + handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self); + } +} +function emitOne(handler, isFn, self, arg1) { + if (isFn) + handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1); + } +} +function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) + handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2); + } +} +function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) + handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } +} + +function emitMany(handler, isFn, self, args) { + if (isFn) + handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].apply(self, args); + } +} + +EventEmitter.prototype.emit = function emit(type) { + var er, handler, len, args, i, events; + var doError = (type === 'error'); + + events = this._events; + if (events) + doError = (doError && events.error == null); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + if (arguments.length > 1) + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Unhandled "error" event. (' + er + ')'); + err.context = er; + throw err; + } + return false; + } + + handler = events[type]; + + if (!handler) + return false; + + var isFn = typeof handler === 'function'; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = target._events; + if (!events) { + events = target._events = objectCreate(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } + + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' "' + String(type) + '" listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit.'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + if (typeof console === 'object' && console.warn) { + console.warn('%s: %s', w.name, w.message); + } + } + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + switch (arguments.length) { + case 0: + return this.listener.call(this.target); + case 1: + return this.listener.call(this.target, arguments[0]); + case 2: + return this.listener.call(this.target, arguments[0], arguments[1]); + case 3: + return this.listener.call(this.target, arguments[0], arguments[1], + arguments[2]); + default: + var args = new Array(arguments.length); + for (var i = 0; i < args.length; ++i) + args[i] = arguments[i]; + this.listener.apply(this.target, args); + } + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = bind.call(onceWrapper, state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = this._events; + if (!events) + return this; + + list = events[type]; + if (!list) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else + spliceOne(list, position); + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (!events) + return this; + + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = objectCreate(null); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = objectKeys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = objectCreate(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (!events) + return []; + + var evlistener = events[type]; + if (!evlistener) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; +}; + +// About 1.5x faster than the two-arg version of Array#splice(). +function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); +} + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function objectCreatePolyfill(proto) { + var F = function() {}; + F.prototype = proto; + return new F; +} +function objectKeysPolyfill(obj) { + var keys = []; + for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { + keys.push(k); + } + return k; +} +function functionBindPolyfill(context) { + var fn = this; + return function () { + return fn.apply(context, arguments); + }; +} + +},{}],85:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var MD5 = require('md5.js') + +/* eslint-disable camelcase */ +function EVP_BytesToKey (password, salt, keyBits, ivLen) { + if (!Buffer.isBuffer(password)) password = Buffer.from(password, 'binary') + if (salt) { + if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, 'binary') + if (salt.length !== 8) throw new RangeError('salt should be Buffer with 8 byte length') + } + + var keyLen = keyBits / 8 + var key = Buffer.alloc(keyLen) + var iv = Buffer.alloc(ivLen || 0) + var tmp = Buffer.alloc(0) + + while (keyLen > 0 || ivLen > 0) { + var hash = new MD5() + hash.update(tmp) + hash.update(password) + if (salt) hash.update(salt) + tmp = hash.digest() + + var used = 0 + + if (keyLen > 0) { + var keyStart = key.length - keyLen + used = Math.min(keyLen, tmp.length) + tmp.copy(key, keyStart, 0, used) + keyLen -= used + } + + if (used < tmp.length && ivLen > 0) { + var ivStart = iv.length - ivLen + var length = Math.min(ivLen, tmp.length - used) + tmp.copy(iv, ivStart, used, used + length) + ivLen -= length + } + } + + tmp.fill(0) + return { key: key, iv: iv } +} + +module.exports = EVP_BytesToKey + +},{"md5.js":104,"safe-buffer":143}],86:[function(require,module,exports){ +'use strict' +var Buffer = require('safe-buffer').Buffer +var Transform = require('stream').Transform +var inherits = require('inherits') + +function throwIfNotStringOrBuffer (val, prefix) { + if (!Buffer.isBuffer(val) && typeof val !== 'string') { + throw new TypeError(prefix + ' must be a string or a buffer') + } +} + +function HashBase (blockSize) { + Transform.call(this) + + this._block = Buffer.allocUnsafe(blockSize) + this._blockSize = blockSize + this._blockOffset = 0 + this._length = [0, 0, 0, 0] + + this._finalized = false +} + +inherits(HashBase, Transform) + +HashBase.prototype._transform = function (chunk, encoding, callback) { + var error = null + try { + this.update(chunk, encoding) + } catch (err) { + error = err + } + + callback(error) +} + +HashBase.prototype._flush = function (callback) { + var error = null + try { + this.push(this.digest()) + } catch (err) { + error = err + } + + callback(error) +} + +HashBase.prototype.update = function (data, encoding) { + throwIfNotStringOrBuffer(data, 'Data') + if (this._finalized) throw new Error('Digest already called') + if (!Buffer.isBuffer(data)) data = Buffer.from(data, encoding) + + // consume data + var block = this._block + var offset = 0 + while (this._blockOffset + data.length - offset >= this._blockSize) { + for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++] + this._update() + this._blockOffset = 0 + } + while (offset < data.length) block[this._blockOffset++] = data[offset++] + + // update length + for (var j = 0, carry = data.length * 8; carry > 0; ++j) { + this._length[j] += carry + carry = (this._length[j] / 0x0100000000) | 0 + if (carry > 0) this._length[j] -= 0x0100000000 * carry + } + + return this +} + +HashBase.prototype._update = function () { + throw new Error('_update is not implemented') +} + +HashBase.prototype.digest = function (encoding) { + if (this._finalized) throw new Error('Digest already called') + this._finalized = true + + var digest = this._digest() + if (encoding !== undefined) digest = digest.toString(encoding) + + // reset state + this._block.fill(0) + this._blockOffset = 0 + for (var i = 0; i < 4; ++i) this._length[i] = 0 + + return digest +} + +HashBase.prototype._digest = function () { + throw new Error('_digest is not implemented') +} + +module.exports = HashBase + +},{"inherits":101,"safe-buffer":143,"stream":152}],87:[function(require,module,exports){ +var hash = exports; + +hash.utils = require('./hash/utils'); +hash.common = require('./hash/common'); +hash.sha = require('./hash/sha'); +hash.ripemd = require('./hash/ripemd'); +hash.hmac = require('./hash/hmac'); + +// Proxy hash functions to the main object +hash.sha1 = hash.sha.sha1; +hash.sha256 = hash.sha.sha256; +hash.sha224 = hash.sha.sha224; +hash.sha384 = hash.sha.sha384; +hash.sha512 = hash.sha.sha512; +hash.ripemd160 = hash.ripemd.ripemd160; + +},{"./hash/common":88,"./hash/hmac":89,"./hash/ripemd":90,"./hash/sha":91,"./hash/utils":98}],88:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var assert = require('minimalistic-assert'); + +function BlockHash() { + this.pending = null; + this.pendingTotal = 0; + this.blockSize = this.constructor.blockSize; + this.outSize = this.constructor.outSize; + this.hmacStrength = this.constructor.hmacStrength; + this.padLength = this.constructor.padLength / 8; + this.endian = 'big'; + + this._delta8 = this.blockSize / 8; + this._delta32 = this.blockSize / 32; +} +exports.BlockHash = BlockHash; + +BlockHash.prototype.update = function update(msg, enc) { + // Convert message to array, pad it, and join into 32bit blocks + msg = utils.toArray(msg, enc); + if (!this.pending) + this.pending = msg; + else + this.pending = this.pending.concat(msg); + this.pendingTotal += msg.length; + + // Enough data, try updating + if (this.pending.length >= this._delta8) { + msg = this.pending; + + // Process pending data in blocks + var r = msg.length % this._delta8; + this.pending = msg.slice(msg.length - r, msg.length); + if (this.pending.length === 0) + this.pending = null; + + msg = utils.join32(msg, 0, msg.length - r, this.endian); + for (var i = 0; i < msg.length; i += this._delta32) + this._update(msg, i, i + this._delta32); + } + + return this; +}; + +BlockHash.prototype.digest = function digest(enc) { + this.update(this._pad()); + assert(this.pending === null); + + return this._digest(enc); +}; + +BlockHash.prototype._pad = function pad() { + var len = this.pendingTotal; + var bytes = this._delta8; + var k = bytes - ((len + this.padLength) % bytes); + var res = new Array(k + this.padLength); + res[0] = 0x80; + for (var i = 1; i < k; i++) + res[i] = 0; + + // Append length + len <<= 3; + if (this.endian === 'big') { + for (var t = 8; t < this.padLength; t++) + res[i++] = 0; + + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = (len >>> 24) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = len & 0xff; + } else { + res[i++] = len & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 24) & 0xff; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + + for (t = 8; t < this.padLength; t++) + res[i++] = 0; + } + + return res; +}; + +},{"./utils":98,"minimalistic-assert":106}],89:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var assert = require('minimalistic-assert'); + +function Hmac(hash, key, enc) { + if (!(this instanceof Hmac)) + return new Hmac(hash, key, enc); + this.Hash = hash; + this.blockSize = hash.blockSize / 8; + this.outSize = hash.outSize / 8; + this.inner = null; + this.outer = null; + + this._init(utils.toArray(key, enc)); +} +module.exports = Hmac; + +Hmac.prototype._init = function init(key) { + // Shorten key, if needed + if (key.length > this.blockSize) + key = new this.Hash().update(key).digest(); + assert(key.length <= this.blockSize); + + // Add padding to key + for (var i = key.length; i < this.blockSize; i++) + key.push(0); + + for (i = 0; i < key.length; i++) + key[i] ^= 0x36; + this.inner = new this.Hash().update(key); + + // 0x36 ^ 0x5c = 0x6a + for (i = 0; i < key.length; i++) + key[i] ^= 0x6a; + this.outer = new this.Hash().update(key); +}; + +Hmac.prototype.update = function update(msg, enc) { + this.inner.update(msg, enc); + return this; +}; + +Hmac.prototype.digest = function digest(enc) { + this.outer.update(this.inner.digest()); + return this.outer.digest(enc); +}; + +},{"./utils":98,"minimalistic-assert":106}],90:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var common = require('./common'); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_3 = utils.sum32_3; +var sum32_4 = utils.sum32_4; +var BlockHash = common.BlockHash; + +function RIPEMD160() { + if (!(this instanceof RIPEMD160)) + return new RIPEMD160(); + + BlockHash.call(this); + + this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; + this.endian = 'little'; +} +utils.inherits(RIPEMD160, BlockHash); +exports.ripemd160 = RIPEMD160; + +RIPEMD160.blockSize = 512; +RIPEMD160.outSize = 160; +RIPEMD160.hmacStrength = 192; +RIPEMD160.padLength = 64; + +RIPEMD160.prototype._update = function update(msg, start) { + var A = this.h[0]; + var B = this.h[1]; + var C = this.h[2]; + var D = this.h[3]; + var E = this.h[4]; + var Ah = A; + var Bh = B; + var Ch = C; + var Dh = D; + var Eh = E; + for (var j = 0; j < 80; j++) { + var T = sum32( + rotl32( + sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), + s[j]), + E); + A = E; + E = D; + D = rotl32(C, 10); + C = B; + B = T; + T = sum32( + rotl32( + sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), + sh[j]), + Eh); + Ah = Eh; + Eh = Dh; + Dh = rotl32(Ch, 10); + Ch = Bh; + Bh = T; + } + T = sum32_3(this.h[1], C, Dh); + this.h[1] = sum32_3(this.h[2], D, Eh); + this.h[2] = sum32_3(this.h[3], E, Ah); + this.h[3] = sum32_3(this.h[4], A, Bh); + this.h[4] = sum32_3(this.h[0], B, Ch); + this.h[0] = T; +}; + +RIPEMD160.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'little'); + else + return utils.split32(this.h, 'little'); +}; + +function f(j, x, y, z) { + if (j <= 15) + return x ^ y ^ z; + else if (j <= 31) + return (x & y) | ((~x) & z); + else if (j <= 47) + return (x | (~y)) ^ z; + else if (j <= 63) + return (x & z) | (y & (~z)); + else + return x ^ (y | (~z)); +} + +function K(j) { + if (j <= 15) + return 0x00000000; + else if (j <= 31) + return 0x5a827999; + else if (j <= 47) + return 0x6ed9eba1; + else if (j <= 63) + return 0x8f1bbcdc; + else + return 0xa953fd4e; +} + +function Kh(j) { + if (j <= 15) + return 0x50a28be6; + else if (j <= 31) + return 0x5c4dd124; + else if (j <= 47) + return 0x6d703ef3; + else if (j <= 63) + return 0x7a6d76e9; + else + return 0x00000000; +} + +var r = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +]; + +var rh = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +]; + +var s = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +]; + +var sh = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +]; + +},{"./common":88,"./utils":98}],91:[function(require,module,exports){ +'use strict'; + +exports.sha1 = require('./sha/1'); +exports.sha224 = require('./sha/224'); +exports.sha256 = require('./sha/256'); +exports.sha384 = require('./sha/384'); +exports.sha512 = require('./sha/512'); + +},{"./sha/1":92,"./sha/224":93,"./sha/256":94,"./sha/384":95,"./sha/512":96}],92:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var shaCommon = require('./common'); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_5 = utils.sum32_5; +var ft_1 = shaCommon.ft_1; +var BlockHash = common.BlockHash; + +var sha1_K = [ + 0x5A827999, 0x6ED9EBA1, + 0x8F1BBCDC, 0xCA62C1D6 +]; + +function SHA1() { + if (!(this instanceof SHA1)) + return new SHA1(); + + BlockHash.call(this); + this.h = [ + 0x67452301, 0xefcdab89, 0x98badcfe, + 0x10325476, 0xc3d2e1f0 ]; + this.W = new Array(80); +} + +utils.inherits(SHA1, BlockHash); +module.exports = SHA1; + +SHA1.blockSize = 512; +SHA1.outSize = 160; +SHA1.hmacStrength = 80; +SHA1.padLength = 64; + +SHA1.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + + for(; i < W.length; i++) + W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + + for (i = 0; i < W.length; i++) { + var s = ~~(i / 20); + var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); + e = d; + d = c; + c = rotl32(b, 30); + b = a; + a = t; + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); +}; + +SHA1.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +},{"../common":88,"../utils":98,"./common":97}],93:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var SHA256 = require('./256'); + +function SHA224() { + if (!(this instanceof SHA224)) + return new SHA224(); + + SHA256.call(this); + this.h = [ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; +} +utils.inherits(SHA224, SHA256); +module.exports = SHA224; + +SHA224.blockSize = 512; +SHA224.outSize = 224; +SHA224.hmacStrength = 192; +SHA224.padLength = 64; + +SHA224.prototype._digest = function digest(enc) { + // Just truncate output + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 7), 'big'); + else + return utils.split32(this.h.slice(0, 7), 'big'); +}; + + +},{"../utils":98,"./256":94}],94:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var shaCommon = require('./common'); +var assert = require('minimalistic-assert'); + +var sum32 = utils.sum32; +var sum32_4 = utils.sum32_4; +var sum32_5 = utils.sum32_5; +var ch32 = shaCommon.ch32; +var maj32 = shaCommon.maj32; +var s0_256 = shaCommon.s0_256; +var s1_256 = shaCommon.s1_256; +var g0_256 = shaCommon.g0_256; +var g1_256 = shaCommon.g1_256; + +var BlockHash = common.BlockHash; + +var sha256_K = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +]; + +function SHA256() { + if (!(this instanceof SHA256)) + return new SHA256(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ]; + this.k = sha256_K; + this.W = new Array(64); +} +utils.inherits(SHA256, BlockHash); +module.exports = SHA256; + +SHA256.blockSize = 512; +SHA256.outSize = 256; +SHA256.hmacStrength = 192; +SHA256.padLength = 64; + +SHA256.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + for (; i < W.length; i++) + W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + var f = this.h[5]; + var g = this.h[6]; + var h = this.h[7]; + + assert(this.k.length === W.length); + for (i = 0; i < W.length; i++) { + var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); + var T2 = sum32(s0_256(a), maj32(a, b, c)); + h = g; + g = f; + f = e; + e = sum32(d, T1); + d = c; + c = b; + b = a; + a = sum32(T1, T2); + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); + this.h[5] = sum32(this.h[5], f); + this.h[6] = sum32(this.h[6], g); + this.h[7] = sum32(this.h[7], h); +}; + +SHA256.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +},{"../common":88,"../utils":98,"./common":97,"minimalistic-assert":106}],95:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); + +var SHA512 = require('./512'); + +function SHA384() { + if (!(this instanceof SHA384)) + return new SHA384(); + + SHA512.call(this); + this.h = [ + 0xcbbb9d5d, 0xc1059ed8, + 0x629a292a, 0x367cd507, + 0x9159015a, 0x3070dd17, + 0x152fecd8, 0xf70e5939, + 0x67332667, 0xffc00b31, + 0x8eb44a87, 0x68581511, + 0xdb0c2e0d, 0x64f98fa7, + 0x47b5481d, 0xbefa4fa4 ]; +} +utils.inherits(SHA384, SHA512); +module.exports = SHA384; + +SHA384.blockSize = 1024; +SHA384.outSize = 384; +SHA384.hmacStrength = 192; +SHA384.padLength = 128; + +SHA384.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 12), 'big'); + else + return utils.split32(this.h.slice(0, 12), 'big'); +}; + +},{"../utils":98,"./512":96}],96:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var assert = require('minimalistic-assert'); + +var rotr64_hi = utils.rotr64_hi; +var rotr64_lo = utils.rotr64_lo; +var shr64_hi = utils.shr64_hi; +var shr64_lo = utils.shr64_lo; +var sum64 = utils.sum64; +var sum64_hi = utils.sum64_hi; +var sum64_lo = utils.sum64_lo; +var sum64_4_hi = utils.sum64_4_hi; +var sum64_4_lo = utils.sum64_4_lo; +var sum64_5_hi = utils.sum64_5_hi; +var sum64_5_lo = utils.sum64_5_lo; + +var BlockHash = common.BlockHash; + +var sha512_K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function SHA512() { + if (!(this instanceof SHA512)) + return new SHA512(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xf3bcc908, + 0xbb67ae85, 0x84caa73b, + 0x3c6ef372, 0xfe94f82b, + 0xa54ff53a, 0x5f1d36f1, + 0x510e527f, 0xade682d1, + 0x9b05688c, 0x2b3e6c1f, + 0x1f83d9ab, 0xfb41bd6b, + 0x5be0cd19, 0x137e2179 ]; + this.k = sha512_K; + this.W = new Array(160); +} +utils.inherits(SHA512, BlockHash); +module.exports = SHA512; + +SHA512.blockSize = 1024; +SHA512.outSize = 512; +SHA512.hmacStrength = 192; +SHA512.padLength = 128; + +SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { + var W = this.W; + + // 32 x 32bit words + for (var i = 0; i < 32; i++) + W[i] = msg[start + i]; + for (; i < W.length; i += 2) { + var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 + var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); + var c1_hi = W[i - 14]; // i - 7 + var c1_lo = W[i - 13]; + var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 + var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); + var c3_hi = W[i - 32]; // i - 16 + var c3_lo = W[i - 31]; + + W[i] = sum64_4_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + W[i + 1] = sum64_4_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + } +}; + +SHA512.prototype._update = function _update(msg, start) { + this._prepareBlock(msg, start); + + var W = this.W; + + var ah = this.h[0]; + var al = this.h[1]; + var bh = this.h[2]; + var bl = this.h[3]; + var ch = this.h[4]; + var cl = this.h[5]; + var dh = this.h[6]; + var dl = this.h[7]; + var eh = this.h[8]; + var el = this.h[9]; + var fh = this.h[10]; + var fl = this.h[11]; + var gh = this.h[12]; + var gl = this.h[13]; + var hh = this.h[14]; + var hl = this.h[15]; + + assert(this.k.length === W.length); + for (var i = 0; i < W.length; i += 2) { + var c0_hi = hh; + var c0_lo = hl; + var c1_hi = s1_512_hi(eh, el); + var c1_lo = s1_512_lo(eh, el); + var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); + var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); + var c3_hi = this.k[i]; + var c3_lo = this.k[i + 1]; + var c4_hi = W[i]; + var c4_lo = W[i + 1]; + + var T1_hi = sum64_5_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + var T1_lo = sum64_5_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + + c0_hi = s0_512_hi(ah, al); + c0_lo = s0_512_lo(ah, al); + c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); + c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); + + var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); + var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); + + hh = gh; + hl = gl; + + gh = fh; + gl = fl; + + fh = eh; + fl = el; + + eh = sum64_hi(dh, dl, T1_hi, T1_lo); + el = sum64_lo(dl, dl, T1_hi, T1_lo); + + dh = ch; + dl = cl; + + ch = bh; + cl = bl; + + bh = ah; + bl = al; + + ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); + al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); + } + + sum64(this.h, 0, ah, al); + sum64(this.h, 2, bh, bl); + sum64(this.h, 4, ch, cl); + sum64(this.h, 6, dh, dl); + sum64(this.h, 8, eh, el); + sum64(this.h, 10, fh, fl); + sum64(this.h, 12, gh, gl); + sum64(this.h, 14, hh, hl); +}; + +SHA512.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +function ch64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ ((~xh) & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function ch64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ ((~xl) & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 28); + var c1_hi = rotr64_hi(xl, xh, 2); // 34 + var c2_hi = rotr64_hi(xl, xh, 7); // 39 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 28); + var c1_lo = rotr64_lo(xl, xh, 2); // 34 + var c2_lo = rotr64_lo(xl, xh, 7); // 39 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 14); + var c1_hi = rotr64_hi(xh, xl, 18); + var c2_hi = rotr64_hi(xl, xh, 9); // 41 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 14); + var c1_lo = rotr64_lo(xh, xl, 18); + var c2_lo = rotr64_lo(xl, xh, 9); // 41 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 1); + var c1_hi = rotr64_hi(xh, xl, 8); + var c2_hi = shr64_hi(xh, xl, 7); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 1); + var c1_lo = rotr64_lo(xh, xl, 8); + var c2_lo = shr64_lo(xh, xl, 7); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 19); + var c1_hi = rotr64_hi(xl, xh, 29); // 61 + var c2_hi = shr64_hi(xh, xl, 6); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 19); + var c1_lo = rotr64_lo(xl, xh, 29); // 61 + var c2_lo = shr64_lo(xh, xl, 6); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +},{"../common":88,"../utils":98,"minimalistic-assert":106}],97:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var rotr32 = utils.rotr32; + +function ft_1(s, x, y, z) { + if (s === 0) + return ch32(x, y, z); + if (s === 1 || s === 3) + return p32(x, y, z); + if (s === 2) + return maj32(x, y, z); +} +exports.ft_1 = ft_1; + +function ch32(x, y, z) { + return (x & y) ^ ((~x) & z); +} +exports.ch32 = ch32; + +function maj32(x, y, z) { + return (x & y) ^ (x & z) ^ (y & z); +} +exports.maj32 = maj32; + +function p32(x, y, z) { + return x ^ y ^ z; +} +exports.p32 = p32; + +function s0_256(x) { + return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); +} +exports.s0_256 = s0_256; + +function s1_256(x) { + return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); +} +exports.s1_256 = s1_256; + +function g0_256(x) { + return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); +} +exports.g0_256 = g0_256; + +function g1_256(x) { + return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); +} +exports.g1_256 = g1_256; + +},{"../utils":98}],98:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +exports.inherits = inherits; + +function isSurrogatePair(msg, i) { + if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) { + return false; + } + if (i < 0 || i + 1 >= msg.length) { + return false; + } + return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00; +} + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg === 'string') { + if (!enc) { + // Inspired by stringToUtf8ByteArray() in closure-library by Google + // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143 + // Apache License 2.0 + // https://github.com/google/closure-library/blob/master/LICENSE + var p = 0; + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + if (c < 128) { + res[p++] = c; + } else if (c < 2048) { + res[p++] = (c >> 6) | 192; + res[p++] = (c & 63) | 128; + } else if (isSurrogatePair(msg, i)) { + c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF); + res[p++] = (c >> 18) | 240; + res[p++] = ((c >> 12) & 63) | 128; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; + } else { + res[p++] = (c >> 12) | 224; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; + } + } + } else if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } + } else { + for (i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + } + return res; +} +exports.toArray = toArray; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +exports.toHex = toHex; + +function htonl(w) { + var res = (w >>> 24) | + ((w >>> 8) & 0xff00) | + ((w << 8) & 0xff0000) | + ((w & 0xff) << 24); + return res >>> 0; +} +exports.htonl = htonl; + +function toHex32(msg, endian) { + var res = ''; + for (var i = 0; i < msg.length; i++) { + var w = msg[i]; + if (endian === 'little') + w = htonl(w); + res += zero8(w.toString(16)); + } + return res; +} +exports.toHex32 = toHex32; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +exports.zero2 = zero2; + +function zero8(word) { + if (word.length === 7) + return '0' + word; + else if (word.length === 6) + return '00' + word; + else if (word.length === 5) + return '000' + word; + else if (word.length === 4) + return '0000' + word; + else if (word.length === 3) + return '00000' + word; + else if (word.length === 2) + return '000000' + word; + else if (word.length === 1) + return '0000000' + word; + else + return word; +} +exports.zero8 = zero8; + +function join32(msg, start, end, endian) { + var len = end - start; + assert(len % 4 === 0); + var res = new Array(len / 4); + for (var i = 0, k = start; i < res.length; i++, k += 4) { + var w; + if (endian === 'big') + w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; + else + w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; + res[i] = w >>> 0; + } + return res; +} +exports.join32 = join32; + +function split32(msg, endian) { + var res = new Array(msg.length * 4); + for (var i = 0, k = 0; i < msg.length; i++, k += 4) { + var m = msg[i]; + if (endian === 'big') { + res[k] = m >>> 24; + res[k + 1] = (m >>> 16) & 0xff; + res[k + 2] = (m >>> 8) & 0xff; + res[k + 3] = m & 0xff; + } else { + res[k + 3] = m >>> 24; + res[k + 2] = (m >>> 16) & 0xff; + res[k + 1] = (m >>> 8) & 0xff; + res[k] = m & 0xff; + } + } + return res; +} +exports.split32 = split32; + +function rotr32(w, b) { + return (w >>> b) | (w << (32 - b)); +} +exports.rotr32 = rotr32; + +function rotl32(w, b) { + return (w << b) | (w >>> (32 - b)); +} +exports.rotl32 = rotl32; + +function sum32(a, b) { + return (a + b) >>> 0; +} +exports.sum32 = sum32; + +function sum32_3(a, b, c) { + return (a + b + c) >>> 0; +} +exports.sum32_3 = sum32_3; + +function sum32_4(a, b, c, d) { + return (a + b + c + d) >>> 0; +} +exports.sum32_4 = sum32_4; + +function sum32_5(a, b, c, d, e) { + return (a + b + c + d + e) >>> 0; +} +exports.sum32_5 = sum32_5; + +function sum64(buf, pos, ah, al) { + var bh = buf[pos]; + var bl = buf[pos + 1]; + + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + buf[pos] = hi >>> 0; + buf[pos + 1] = lo; +} +exports.sum64 = sum64; + +function sum64_hi(ah, al, bh, bl) { + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + return hi >>> 0; +} +exports.sum64_hi = sum64_hi; + +function sum64_lo(ah, al, bh, bl) { + var lo = al + bl; + return lo >>> 0; +} +exports.sum64_lo = sum64_lo; + +function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + + var hi = ah + bh + ch + dh + carry; + return hi >>> 0; +} +exports.sum64_4_hi = sum64_4_hi; + +function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { + var lo = al + bl + cl + dl; + return lo >>> 0; +} +exports.sum64_4_lo = sum64_4_lo; + +function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + lo = (lo + el) >>> 0; + carry += lo < el ? 1 : 0; + + var hi = ah + bh + ch + dh + eh + carry; + return hi >>> 0; +} +exports.sum64_5_hi = sum64_5_hi; + +function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var lo = al + bl + cl + dl + el; + + return lo >>> 0; +} +exports.sum64_5_lo = sum64_5_lo; + +function rotr64_hi(ah, al, num) { + var r = (al << (32 - num)) | (ah >>> num); + return r >>> 0; +} +exports.rotr64_hi = rotr64_hi; + +function rotr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.rotr64_lo = rotr64_lo; + +function shr64_hi(ah, al, num) { + return ah >>> num; +} +exports.shr64_hi = shr64_hi; + +function shr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.shr64_lo = shr64_lo; + +},{"inherits":101,"minimalistic-assert":106}],99:[function(require,module,exports){ +'use strict'; + +var hash = require('hash.js'); +var utils = require('minimalistic-crypto-utils'); +var assert = require('minimalistic-assert'); + +function HmacDRBG(options) { + if (!(this instanceof HmacDRBG)) + return new HmacDRBG(options); + this.hash = options.hash; + this.predResist = !!options.predResist; + + this.outLen = this.hash.outSize; + this.minEntropy = options.minEntropy || this.hash.hmacStrength; + + this._reseed = null; + this.reseedInterval = null; + this.K = null; + this.V = null; + + var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex'); + var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex'); + var pers = utils.toArray(options.pers, options.persEnc || 'hex'); + assert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + this._init(entropy, nonce, pers); +} +module.exports = HmacDRBG; + +HmacDRBG.prototype._init = function init(entropy, nonce, pers) { + var seed = entropy.concat(nonce).concat(pers); + + this.K = new Array(this.outLen / 8); + this.V = new Array(this.outLen / 8); + for (var i = 0; i < this.V.length; i++) { + this.K[i] = 0x00; + this.V[i] = 0x01; + } + + this._update(seed); + this._reseed = 1; + this.reseedInterval = 0x1000000000000; // 2^48 +}; + +HmacDRBG.prototype._hmac = function hmac() { + return new hash.hmac(this.hash, this.K); +}; + +HmacDRBG.prototype._update = function update(seed) { + var kmac = this._hmac() + .update(this.V) + .update([ 0x00 ]); + if (seed) + kmac = kmac.update(seed); + this.K = kmac.digest(); + this.V = this._hmac().update(this.V).digest(); + if (!seed) + return; + + this.K = this._hmac() + .update(this.V) + .update([ 0x01 ]) + .update(seed) + .digest(); + this.V = this._hmac().update(this.V).digest(); +}; + +HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { + // Optional entropy enc + if (typeof entropyEnc !== 'string') { + addEnc = add; + add = entropyEnc; + entropyEnc = null; + } + + entropy = utils.toArray(entropy, entropyEnc); + add = utils.toArray(add, addEnc); + + assert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + + this._update(entropy.concat(add || [])); + this._reseed = 1; +}; + +HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { + if (this._reseed > this.reseedInterval) + throw new Error('Reseed is required'); + + // Optional encoding + if (typeof enc !== 'string') { + addEnc = add; + add = enc; + enc = null; + } + + // Optional additional data + if (add) { + add = utils.toArray(add, addEnc || 'hex'); + this._update(add); + } + + var temp = []; + while (temp.length < len) { + this.V = this._hmac().update(this.V).digest(); + temp = temp.concat(this.V); + } + + var res = temp.slice(0, len); + this._update(add); + this._reseed++; + return utils.encode(res, enc); +}; + +},{"hash.js":87,"minimalistic-assert":106,"minimalistic-crypto-utils":107}],100:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],101:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],102:[function(require,module,exports){ +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + +},{}],103:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + +},{}],104:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var HashBase = require('hash-base') +var Buffer = require('safe-buffer').Buffer + +var ARRAY16 = new Array(16) + +function MD5 () { + HashBase.call(this, 64) + + // state + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 +} + +inherits(MD5, HashBase) + +MD5.prototype._update = function () { + var M = ARRAY16 + for (var i = 0; i < 16; ++i) M[i] = this._block.readInt32LE(i * 4) + + var a = this._a + var b = this._b + var c = this._c + var d = this._d + + a = fnF(a, b, c, d, M[0], 0xd76aa478, 7) + d = fnF(d, a, b, c, M[1], 0xe8c7b756, 12) + c = fnF(c, d, a, b, M[2], 0x242070db, 17) + b = fnF(b, c, d, a, M[3], 0xc1bdceee, 22) + a = fnF(a, b, c, d, M[4], 0xf57c0faf, 7) + d = fnF(d, a, b, c, M[5], 0x4787c62a, 12) + c = fnF(c, d, a, b, M[6], 0xa8304613, 17) + b = fnF(b, c, d, a, M[7], 0xfd469501, 22) + a = fnF(a, b, c, d, M[8], 0x698098d8, 7) + d = fnF(d, a, b, c, M[9], 0x8b44f7af, 12) + c = fnF(c, d, a, b, M[10], 0xffff5bb1, 17) + b = fnF(b, c, d, a, M[11], 0x895cd7be, 22) + a = fnF(a, b, c, d, M[12], 0x6b901122, 7) + d = fnF(d, a, b, c, M[13], 0xfd987193, 12) + c = fnF(c, d, a, b, M[14], 0xa679438e, 17) + b = fnF(b, c, d, a, M[15], 0x49b40821, 22) + + a = fnG(a, b, c, d, M[1], 0xf61e2562, 5) + d = fnG(d, a, b, c, M[6], 0xc040b340, 9) + c = fnG(c, d, a, b, M[11], 0x265e5a51, 14) + b = fnG(b, c, d, a, M[0], 0xe9b6c7aa, 20) + a = fnG(a, b, c, d, M[5], 0xd62f105d, 5) + d = fnG(d, a, b, c, M[10], 0x02441453, 9) + c = fnG(c, d, a, b, M[15], 0xd8a1e681, 14) + b = fnG(b, c, d, a, M[4], 0xe7d3fbc8, 20) + a = fnG(a, b, c, d, M[9], 0x21e1cde6, 5) + d = fnG(d, a, b, c, M[14], 0xc33707d6, 9) + c = fnG(c, d, a, b, M[3], 0xf4d50d87, 14) + b = fnG(b, c, d, a, M[8], 0x455a14ed, 20) + a = fnG(a, b, c, d, M[13], 0xa9e3e905, 5) + d = fnG(d, a, b, c, M[2], 0xfcefa3f8, 9) + c = fnG(c, d, a, b, M[7], 0x676f02d9, 14) + b = fnG(b, c, d, a, M[12], 0x8d2a4c8a, 20) + + a = fnH(a, b, c, d, M[5], 0xfffa3942, 4) + d = fnH(d, a, b, c, M[8], 0x8771f681, 11) + c = fnH(c, d, a, b, M[11], 0x6d9d6122, 16) + b = fnH(b, c, d, a, M[14], 0xfde5380c, 23) + a = fnH(a, b, c, d, M[1], 0xa4beea44, 4) + d = fnH(d, a, b, c, M[4], 0x4bdecfa9, 11) + c = fnH(c, d, a, b, M[7], 0xf6bb4b60, 16) + b = fnH(b, c, d, a, M[10], 0xbebfbc70, 23) + a = fnH(a, b, c, d, M[13], 0x289b7ec6, 4) + d = fnH(d, a, b, c, M[0], 0xeaa127fa, 11) + c = fnH(c, d, a, b, M[3], 0xd4ef3085, 16) + b = fnH(b, c, d, a, M[6], 0x04881d05, 23) + a = fnH(a, b, c, d, M[9], 0xd9d4d039, 4) + d = fnH(d, a, b, c, M[12], 0xe6db99e5, 11) + c = fnH(c, d, a, b, M[15], 0x1fa27cf8, 16) + b = fnH(b, c, d, a, M[2], 0xc4ac5665, 23) + + a = fnI(a, b, c, d, M[0], 0xf4292244, 6) + d = fnI(d, a, b, c, M[7], 0x432aff97, 10) + c = fnI(c, d, a, b, M[14], 0xab9423a7, 15) + b = fnI(b, c, d, a, M[5], 0xfc93a039, 21) + a = fnI(a, b, c, d, M[12], 0x655b59c3, 6) + d = fnI(d, a, b, c, M[3], 0x8f0ccc92, 10) + c = fnI(c, d, a, b, M[10], 0xffeff47d, 15) + b = fnI(b, c, d, a, M[1], 0x85845dd1, 21) + a = fnI(a, b, c, d, M[8], 0x6fa87e4f, 6) + d = fnI(d, a, b, c, M[15], 0xfe2ce6e0, 10) + c = fnI(c, d, a, b, M[6], 0xa3014314, 15) + b = fnI(b, c, d, a, M[13], 0x4e0811a1, 21) + a = fnI(a, b, c, d, M[4], 0xf7537e82, 6) + d = fnI(d, a, b, c, M[11], 0xbd3af235, 10) + c = fnI(c, d, a, b, M[2], 0x2ad7d2bb, 15) + b = fnI(b, c, d, a, M[9], 0xeb86d391, 21) + + this._a = (this._a + a) | 0 + this._b = (this._b + b) | 0 + this._c = (this._c + c) | 0 + this._d = (this._d + d) | 0 +} + +MD5.prototype._digest = function () { + // create padding and handle blocks + this._block[this._blockOffset++] = 0x80 + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64) + this._update() + this._blockOffset = 0 + } + + this._block.fill(0, this._blockOffset, 56) + this._block.writeUInt32LE(this._length[0], 56) + this._block.writeUInt32LE(this._length[1], 60) + this._update() + + // produce result + var buffer = Buffer.allocUnsafe(16) + buffer.writeInt32LE(this._a, 0) + buffer.writeInt32LE(this._b, 4) + buffer.writeInt32LE(this._c, 8) + buffer.writeInt32LE(this._d, 12) + return buffer +} + +function rotl (x, n) { + return (x << n) | (x >>> (32 - n)) +} + +function fnF (a, b, c, d, m, k, s) { + return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + b) | 0 +} + +function fnG (a, b, c, d, m, k, s) { + return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + b) | 0 +} + +function fnH (a, b, c, d, m, k, s) { + return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + b) | 0 +} + +function fnI (a, b, c, d, m, k, s) { + return (rotl((a + ((c ^ (b | (~d)))) + m + k) | 0, s) + b) | 0 +} + +module.exports = MD5 + +},{"hash-base":86,"inherits":101,"safe-buffer":143}],105:[function(require,module,exports){ +var bn = require('bn.js'); +var brorand = require('brorand'); + +function MillerRabin(rand) { + this.rand = rand || new brorand.Rand(); +} +module.exports = MillerRabin; + +MillerRabin.create = function create(rand) { + return new MillerRabin(rand); +}; + +MillerRabin.prototype._randbelow = function _randbelow(n) { + var len = n.bitLength(); + var min_bytes = Math.ceil(len / 8); + + // Generage random bytes until a number less than n is found. + // This ensures that 0..n-1 have an equal probability of being selected. + do + var a = new bn(this.rand.generate(min_bytes)); + while (a.cmp(n) >= 0); + + return a; +}; + +MillerRabin.prototype._randrange = function _randrange(start, stop) { + // Generate a random number greater than or equal to start and less than stop. + var size = stop.sub(start); + return start.add(this._randbelow(size)); +}; + +MillerRabin.prototype.test = function test(n, k, cb) { + var len = n.bitLength(); + var red = bn.mont(n); + var rone = new bn(1).toRed(red); + + if (!k) + k = Math.max(1, (len / 48) | 0); + + // Find d and s, (n - 1) = (2 ^ s) * d; + var n1 = n.subn(1); + for (var s = 0; !n1.testn(s); s++) {} + var d = n.shrn(s); + + var rn1 = n1.toRed(red); + + var prime = true; + for (; k > 0; k--) { + var a = this._randrange(new bn(2), n1); + if (cb) + cb(a); + + var x = a.toRed(red).redPow(d); + if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) + continue; + + for (var i = 1; i < s; i++) { + x = x.redSqr(); + + if (x.cmp(rone) === 0) + return false; + if (x.cmp(rn1) === 0) + break; + } + + if (i === s) + return false; + } + + return prime; +}; + +MillerRabin.prototype.getDivisor = function getDivisor(n, k) { + var len = n.bitLength(); + var red = bn.mont(n); + var rone = new bn(1).toRed(red); + + if (!k) + k = Math.max(1, (len / 48) | 0); + + // Find d and s, (n - 1) = (2 ^ s) * d; + var n1 = n.subn(1); + for (var s = 0; !n1.testn(s); s++) {} + var d = n.shrn(s); + + var rn1 = n1.toRed(red); + + for (; k > 0; k--) { + var a = this._randrange(new bn(2), n1); + + var g = n.gcd(a); + if (g.cmpn(1) !== 0) + return g; + + var x = a.toRed(red).redPow(d); + if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) + continue; + + for (var i = 1; i < s; i++) { + x = x.redSqr(); + + if (x.cmp(rone) === 0) + return x.fromRed().subn(1).gcd(n); + if (x.cmp(rn1) === 0) + break; + } + + if (i === s) { + x = x.redSqr(); + return x.fromRed().subn(1).gcd(n); + } + } + + return false; +}; + +},{"bn.js":17,"brorand":18}],106:[function(require,module,exports){ +module.exports = assert; + +function assert(val, msg) { + if (!val) + throw new Error(msg || 'Assertion failed'); +} + +assert.equal = function assertEqual(l, r, msg) { + if (l != r) + throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); +}; + +},{}],107:[function(require,module,exports){ +'use strict'; + +var utils = exports; + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg !== 'string') { + for (var i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + return res; + } + if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (var i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } else { + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + var hi = c >> 8; + var lo = c & 0xff; + if (hi) + res.push(hi, lo); + else + res.push(lo); + } + } + return res; +} +utils.toArray = toArray; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +utils.zero2 = zero2; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +utils.toHex = toHex; + +utils.encode = function encode(arr, enc) { + if (enc === 'hex') + return toHex(arr); + else + return arr; +}; + +},{}],108:[function(require,module,exports){ +module.exports={"2.16.840.1.101.3.4.1.1": "aes-128-ecb", +"2.16.840.1.101.3.4.1.2": "aes-128-cbc", +"2.16.840.1.101.3.4.1.3": "aes-128-ofb", +"2.16.840.1.101.3.4.1.4": "aes-128-cfb", +"2.16.840.1.101.3.4.1.21": "aes-192-ecb", +"2.16.840.1.101.3.4.1.22": "aes-192-cbc", +"2.16.840.1.101.3.4.1.23": "aes-192-ofb", +"2.16.840.1.101.3.4.1.24": "aes-192-cfb", +"2.16.840.1.101.3.4.1.41": "aes-256-ecb", +"2.16.840.1.101.3.4.1.42": "aes-256-cbc", +"2.16.840.1.101.3.4.1.43": "aes-256-ofb", +"2.16.840.1.101.3.4.1.44": "aes-256-cfb" +} +},{}],109:[function(require,module,exports){ +// from https://github.com/indutny/self-signed/blob/gh-pages/lib/asn1.js +// Fedor, you are amazing. +'use strict' + +var asn1 = require('asn1.js') + +exports.certificate = require('./certificate') + +var RSAPrivateKey = asn1.define('RSAPrivateKey', function () { + this.seq().obj( + this.key('version').int(), + this.key('modulus').int(), + this.key('publicExponent').int(), + this.key('privateExponent').int(), + this.key('prime1').int(), + this.key('prime2').int(), + this.key('exponent1').int(), + this.key('exponent2').int(), + this.key('coefficient').int() + ) +}) +exports.RSAPrivateKey = RSAPrivateKey + +var RSAPublicKey = asn1.define('RSAPublicKey', function () { + this.seq().obj( + this.key('modulus').int(), + this.key('publicExponent').int() + ) +}) +exports.RSAPublicKey = RSAPublicKey + +var PublicKey = asn1.define('SubjectPublicKeyInfo', function () { + this.seq().obj( + this.key('algorithm').use(AlgorithmIdentifier), + this.key('subjectPublicKey').bitstr() + ) +}) +exports.PublicKey = PublicKey + +var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () { + this.seq().obj( + this.key('algorithm').objid(), + this.key('none').null_().optional(), + this.key('curve').objid().optional(), + this.key('params').seq().obj( + this.key('p').int(), + this.key('q').int(), + this.key('g').int() + ).optional() + ) +}) + +var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () { + this.seq().obj( + this.key('version').int(), + this.key('algorithm').use(AlgorithmIdentifier), + this.key('subjectPrivateKey').octstr() + ) +}) +exports.PrivateKey = PrivateKeyInfo +var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () { + this.seq().obj( + this.key('algorithm').seq().obj( + this.key('id').objid(), + this.key('decrypt').seq().obj( + this.key('kde').seq().obj( + this.key('id').objid(), + this.key('kdeparams').seq().obj( + this.key('salt').octstr(), + this.key('iters').int() + ) + ), + this.key('cipher').seq().obj( + this.key('algo').objid(), + this.key('iv').octstr() + ) + ) + ), + this.key('subjectPrivateKey').octstr() + ) +}) + +exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo + +var DSAPrivateKey = asn1.define('DSAPrivateKey', function () { + this.seq().obj( + this.key('version').int(), + this.key('p').int(), + this.key('q').int(), + this.key('g').int(), + this.key('pub_key').int(), + this.key('priv_key').int() + ) +}) +exports.DSAPrivateKey = DSAPrivateKey + +exports.DSAparam = asn1.define('DSAparam', function () { + this.int() +}) + +var ECPrivateKey = asn1.define('ECPrivateKey', function () { + this.seq().obj( + this.key('version').int(), + this.key('privateKey').octstr(), + this.key('parameters').optional().explicit(0).use(ECParameters), + this.key('publicKey').optional().explicit(1).bitstr() + ) +}) +exports.ECPrivateKey = ECPrivateKey + +var ECParameters = asn1.define('ECParameters', function () { + this.choice({ + namedCurve: this.objid() + }) +}) + +exports.signature = asn1.define('signature', function () { + this.seq().obj( + this.key('r').int(), + this.key('s').int() + ) +}) + +},{"./certificate":110,"asn1.js":2}],110:[function(require,module,exports){ +// from https://github.com/Rantanen/node-dtls/blob/25a7dc861bda38cfeac93a723500eea4f0ac2e86/Certificate.js +// thanks to @Rantanen + +'use strict' + +var asn = require('asn1.js') + +var Time = asn.define('Time', function () { + this.choice({ + utcTime: this.utctime(), + generalTime: this.gentime() + }) +}) + +var AttributeTypeValue = asn.define('AttributeTypeValue', function () { + this.seq().obj( + this.key('type').objid(), + this.key('value').any() + ) +}) + +var AlgorithmIdentifier = asn.define('AlgorithmIdentifier', function () { + this.seq().obj( + this.key('algorithm').objid(), + this.key('parameters').optional(), + this.key('curve').objid().optional() + ) +}) + +var SubjectPublicKeyInfo = asn.define('SubjectPublicKeyInfo', function () { + this.seq().obj( + this.key('algorithm').use(AlgorithmIdentifier), + this.key('subjectPublicKey').bitstr() + ) +}) + +var RelativeDistinguishedName = asn.define('RelativeDistinguishedName', function () { + this.setof(AttributeTypeValue) +}) + +var RDNSequence = asn.define('RDNSequence', function () { + this.seqof(RelativeDistinguishedName) +}) + +var Name = asn.define('Name', function () { + this.choice({ + rdnSequence: this.use(RDNSequence) + }) +}) + +var Validity = asn.define('Validity', function () { + this.seq().obj( + this.key('notBefore').use(Time), + this.key('notAfter').use(Time) + ) +}) + +var Extension = asn.define('Extension', function () { + this.seq().obj( + this.key('extnID').objid(), + this.key('critical').bool().def(false), + this.key('extnValue').octstr() + ) +}) + +var TBSCertificate = asn.define('TBSCertificate', function () { + this.seq().obj( + this.key('version').explicit(0).int().optional(), + this.key('serialNumber').int(), + this.key('signature').use(AlgorithmIdentifier), + this.key('issuer').use(Name), + this.key('validity').use(Validity), + this.key('subject').use(Name), + this.key('subjectPublicKeyInfo').use(SubjectPublicKeyInfo), + this.key('issuerUniqueID').implicit(1).bitstr().optional(), + this.key('subjectUniqueID').implicit(2).bitstr().optional(), + this.key('extensions').explicit(3).seqof(Extension).optional() + ) +}) + +var X509Certificate = asn.define('X509Certificate', function () { + this.seq().obj( + this.key('tbsCertificate').use(TBSCertificate), + this.key('signatureAlgorithm').use(AlgorithmIdentifier), + this.key('signatureValue').bitstr() + ) +}) + +module.exports = X509Certificate + +},{"asn1.js":2}],111:[function(require,module,exports){ +(function (Buffer){ +// adapted from https://github.com/apatil/pemstrip +var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r\+\/\=]+)[\n\r]+/m +var startRegex = /^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----/m +var fullRegex = /^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----([0-9A-z\n\r\+\/\=]+)-----END \1-----$/m +var evp = require('evp_bytestokey') +var ciphers = require('browserify-aes') +module.exports = function (okey, password) { + var key = okey.toString() + var match = key.match(findProc) + var decrypted + if (!match) { + var match2 = key.match(fullRegex) + decrypted = new Buffer(match2[2].replace(/[\r\n]/g, ''), 'base64') + } else { + var suite = 'aes' + match[1] + var iv = new Buffer(match[2], 'hex') + var cipherText = new Buffer(match[3].replace(/[\r\n]/g, ''), 'base64') + var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key + var out = [] + var cipher = ciphers.createDecipheriv(suite, cipherKey, iv) + out.push(cipher.update(cipherText)) + out.push(cipher.final()) + decrypted = Buffer.concat(out) + } + var tag = key.match(startRegex)[1] + return { + tag: tag, + data: decrypted + } +} + +}).call(this,require("buffer").Buffer) +},{"browserify-aes":22,"buffer":49,"evp_bytestokey":85}],112:[function(require,module,exports){ +var asn1 = require('./asn1') +var aesid = require('./aesid.json') +var fixProc = require('./fixProc') +var ciphers = require('browserify-aes') +var compat = require('pbkdf2') +var Buffer = require('safe-buffer').Buffer +module.exports = parseKeys + +function parseKeys (buffer) { + var password + if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) { + password = buffer.passphrase + buffer = buffer.key + } + if (typeof buffer === 'string') { + buffer = Buffer.from(buffer) + } + + var stripped = fixProc(buffer, password) + + var type = stripped.tag + var data = stripped.data + var subtype, ndata + switch (type) { + case 'CERTIFICATE': + ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo + // falls through + case 'PUBLIC KEY': + if (!ndata) { + ndata = asn1.PublicKey.decode(data, 'der') + } + subtype = ndata.algorithm.algorithm.join('.') + switch (subtype) { + case '1.2.840.113549.1.1.1': + return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der') + case '1.2.840.10045.2.1': + ndata.subjectPrivateKey = ndata.subjectPublicKey + return { + type: 'ec', + data: ndata + } + case '1.2.840.10040.4.1': + ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der') + return { + type: 'dsa', + data: ndata.algorithm.params + } + default: throw new Error('unknown key id ' + subtype) + } + throw new Error('unknown key type ' + type) + case 'ENCRYPTED PRIVATE KEY': + data = asn1.EncryptedPrivateKey.decode(data, 'der') + data = decrypt(data, password) + // falls through + case 'PRIVATE KEY': + ndata = asn1.PrivateKey.decode(data, 'der') + subtype = ndata.algorithm.algorithm.join('.') + switch (subtype) { + case '1.2.840.113549.1.1.1': + return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der') + case '1.2.840.10045.2.1': + return { + curve: ndata.algorithm.curve, + privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey + } + case '1.2.840.10040.4.1': + ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der') + return { + type: 'dsa', + params: ndata.algorithm.params + } + default: throw new Error('unknown key id ' + subtype) + } + throw new Error('unknown key type ' + type) + case 'RSA PUBLIC KEY': + return asn1.RSAPublicKey.decode(data, 'der') + case 'RSA PRIVATE KEY': + return asn1.RSAPrivateKey.decode(data, 'der') + case 'DSA PRIVATE KEY': + return { + type: 'dsa', + params: asn1.DSAPrivateKey.decode(data, 'der') + } + case 'EC PRIVATE KEY': + data = asn1.ECPrivateKey.decode(data, 'der') + return { + curve: data.parameters.value, + privateKey: data.privateKey + } + default: throw new Error('unknown key type ' + type) + } +} +parseKeys.signature = asn1.signature +function decrypt (data, password) { + var salt = data.algorithm.decrypt.kde.kdeparams.salt + var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10) + var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')] + var iv = data.algorithm.decrypt.cipher.iv + var cipherText = data.subjectPrivateKey + var keylen = parseInt(algo.split('-')[1], 10) / 8 + var key = compat.pbkdf2Sync(password, salt, iters, keylen, 'sha1') + var cipher = ciphers.createDecipheriv(algo, key, iv) + var out = [] + out.push(cipher.update(cipherText)) + out.push(cipher.final()) + return Buffer.concat(out) +} + +},{"./aesid.json":108,"./asn1":109,"./fixProc":111,"browserify-aes":22,"pbkdf2":114,"safe-buffer":143}],113:[function(require,module,exports){ +(function (process){ +// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, +// backported and transplited with Babel, with backwards-compat fixes + +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function (path) { + if (typeof path !== 'string') path = path + ''; + if (path.length === 0) return '.'; + var code = path.charCodeAt(0); + var hasRoot = code === 47 /*/*/; + var end = -1; + var matchedSlash = true; + for (var i = path.length - 1; i >= 1; --i) { + code = path.charCodeAt(i); + if (code === 47 /*/*/) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) return hasRoot ? '/' : '.'; + if (hasRoot && end === 1) { + // return '//'; + // Backwards-compat fix: + return '/'; + } + return path.slice(0, end); +}; + +function basename(path) { + if (typeof path !== 'string') path = path + ''; + + var start = 0; + var end = -1; + var matchedSlash = true; + var i; + + for (i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // path component + matchedSlash = false; + end = i + 1; + } + } + + if (end === -1) return ''; + return path.slice(start, end); +} + +// Uses a mixed approach for backwards-compatibility, as ext behavior changed +// in new Node.js versions, so only basename() above is backported here +exports.basename = function (path, ext) { + var f = basename(path); + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + +exports.extname = function (path) { + if (typeof path !== 'string') path = path + ''; + var startDot = -1; + var startPart = 0; + var end = -1; + var matchedSlash = true; + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + var preDotState = 0; + for (var i = path.length - 1; i >= 0; --i) { + var code = path.charCodeAt(i); + if (code === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === 46 /*.*/) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) + startDot = i; + else if (preDotState !== 1) + preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if (startDot === -1 || end === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + return ''; + } + return path.slice(startDot, end); +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":120}],114:[function(require,module,exports){ +exports.pbkdf2 = require('./lib/async') +exports.pbkdf2Sync = require('./lib/sync') + +},{"./lib/async":115,"./lib/sync":118}],115:[function(require,module,exports){ +(function (process,global){ +var checkParameters = require('./precondition') +var defaultEncoding = require('./default-encoding') +var sync = require('./sync') +var Buffer = require('safe-buffer').Buffer + +var ZERO_BUF +var subtle = global.crypto && global.crypto.subtle +var toBrowser = { + 'sha': 'SHA-1', + 'sha-1': 'SHA-1', + 'sha1': 'SHA-1', + 'sha256': 'SHA-256', + 'sha-256': 'SHA-256', + 'sha384': 'SHA-384', + 'sha-384': 'SHA-384', + 'sha-512': 'SHA-512', + 'sha512': 'SHA-512' +} +var checks = [] +function checkNative (algo) { + if (global.process && !global.process.browser) { + return Promise.resolve(false) + } + if (!subtle || !subtle.importKey || !subtle.deriveBits) { + return Promise.resolve(false) + } + if (checks[algo] !== undefined) { + return checks[algo] + } + ZERO_BUF = ZERO_BUF || Buffer.alloc(8) + var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo) + .then(function () { + return true + }).catch(function () { + return false + }) + checks[algo] = prom + return prom +} + +function browserPbkdf2 (password, salt, iterations, length, algo) { + return subtle.importKey( + 'raw', password, {name: 'PBKDF2'}, false, ['deriveBits'] + ).then(function (key) { + return subtle.deriveBits({ + name: 'PBKDF2', + salt: salt, + iterations: iterations, + hash: { + name: algo + } + }, key, length << 3) + }).then(function (res) { + return Buffer.from(res) + }) +} + +function resolvePromise (promise, callback) { + promise.then(function (out) { + process.nextTick(function () { + callback(null, out) + }) + }, function (e) { + process.nextTick(function () { + callback(e) + }) + }) +} +module.exports = function (password, salt, iterations, keylen, digest, callback) { + if (typeof digest === 'function') { + callback = digest + digest = undefined + } + + digest = digest || 'sha1' + var algo = toBrowser[digest.toLowerCase()] + + if (!algo || typeof global.Promise !== 'function') { + return process.nextTick(function () { + var out + try { + out = sync(password, salt, iterations, keylen, digest) + } catch (e) { + return callback(e) + } + callback(null, out) + }) + } + + checkParameters(password, salt, iterations, keylen) + if (typeof callback !== 'function') throw new Error('No callback provided to pbkdf2') + if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding) + if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding) + + resolvePromise(checkNative(algo).then(function (resp) { + if (resp) return browserPbkdf2(password, salt, iterations, keylen, algo) + + return sync(password, salt, iterations, keylen, digest) + }), callback) +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./default-encoding":116,"./precondition":117,"./sync":118,"_process":120,"safe-buffer":143}],116:[function(require,module,exports){ +(function (process){ +var defaultEncoding +/* istanbul ignore next */ +if (process.browser) { + defaultEncoding = 'utf-8' +} else { + var pVersionMajor = parseInt(process.version.split('.')[0].slice(1), 10) + + defaultEncoding = pVersionMajor >= 6 ? 'utf-8' : 'binary' +} +module.exports = defaultEncoding + +}).call(this,require('_process')) +},{"_process":120}],117:[function(require,module,exports){ +(function (Buffer){ +var MAX_ALLOC = Math.pow(2, 30) - 1 // default in iojs + +function checkBuffer (buf, name) { + if (typeof buf !== 'string' && !Buffer.isBuffer(buf)) { + throw new TypeError(name + ' must be a buffer or string') + } +} + +module.exports = function (password, salt, iterations, keylen) { + checkBuffer(password, 'Password') + checkBuffer(salt, 'Salt') + + if (typeof iterations !== 'number') { + throw new TypeError('Iterations not a number') + } + + if (iterations < 0) { + throw new TypeError('Bad iterations') + } + + if (typeof keylen !== 'number') { + throw new TypeError('Key length not a number') + } + + if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { /* eslint no-self-compare: 0 */ + throw new TypeError('Bad key length') + } +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":102}],118:[function(require,module,exports){ +var md5 = require('create-hash/md5') +var RIPEMD160 = require('ripemd160') +var sha = require('sha.js') + +var checkParameters = require('./precondition') +var defaultEncoding = require('./default-encoding') +var Buffer = require('safe-buffer').Buffer +var ZEROS = Buffer.alloc(128) +var sizes = { + md5: 16, + sha1: 20, + sha224: 28, + sha256: 32, + sha384: 48, + sha512: 64, + rmd160: 20, + ripemd160: 20 +} + +function Hmac (alg, key, saltLen) { + var hash = getDigest(alg) + var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 + + if (key.length > blocksize) { + key = hash(key) + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) + } + + var ipad = Buffer.allocUnsafe(blocksize + sizes[alg]) + var opad = Buffer.allocUnsafe(blocksize + sizes[alg]) + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + + var ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4) + ipad.copy(ipad1, 0, 0, blocksize) + this.ipad1 = ipad1 + this.ipad2 = ipad + this.opad = opad + this.alg = alg + this.blocksize = blocksize + this.hash = hash + this.size = sizes[alg] +} + +Hmac.prototype.run = function (data, ipad) { + data.copy(ipad, this.blocksize) + var h = this.hash(ipad) + h.copy(this.opad, this.blocksize) + return this.hash(this.opad) +} + +function getDigest (alg) { + function shaFunc (data) { + return sha(alg).update(data).digest() + } + function rmd160Func (data) { + return new RIPEMD160().update(data).digest() + } + + if (alg === 'rmd160' || alg === 'ripemd160') return rmd160Func + if (alg === 'md5') return md5 + return shaFunc +} + +function pbkdf2 (password, salt, iterations, keylen, digest) { + checkParameters(password, salt, iterations, keylen) + + if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding) + if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding) + + digest = digest || 'sha1' + + var hmac = new Hmac(digest, password, salt.length) + + var DK = Buffer.allocUnsafe(keylen) + var block1 = Buffer.allocUnsafe(salt.length + 4) + salt.copy(block1, 0, 0, salt.length) + + var destPos = 0 + var hLen = sizes[digest] + var l = Math.ceil(keylen / hLen) + + for (var i = 1; i <= l; i++) { + block1.writeUInt32BE(i, salt.length) + + var T = hmac.run(block1, hmac.ipad1) + var U = T + + for (var j = 1; j < iterations; j++) { + U = hmac.run(U, hmac.ipad2) + for (var k = 0; k < hLen; k++) T[k] ^= U[k] + } + + T.copy(DK, destPos) + destPos += hLen + } + + return DK +} + +module.exports = pbkdf2 + +},{"./default-encoding":116,"./precondition":117,"create-hash/md5":54,"ripemd160":142,"safe-buffer":143,"sha.js":145}],119:[function(require,module,exports){ +(function (process){ +'use strict'; + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + + +}).call(this,require('_process')) +},{"_process":120}],120:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],121:[function(require,module,exports){ +exports.publicEncrypt = require('./publicEncrypt') +exports.privateDecrypt = require('./privateDecrypt') + +exports.privateEncrypt = function privateEncrypt (key, buf) { + return exports.publicEncrypt(key, buf, true) +} + +exports.publicDecrypt = function publicDecrypt (key, buf) { + return exports.privateDecrypt(key, buf, true) +} + +},{"./privateDecrypt":123,"./publicEncrypt":124}],122:[function(require,module,exports){ +var createHash = require('create-hash') +var Buffer = require('safe-buffer').Buffer + +module.exports = function (seed, len) { + var t = Buffer.alloc(0) + var i = 0 + var c + while (t.length < len) { + c = i2ops(i++) + t = Buffer.concat([t, createHash('sha1').update(seed).update(c).digest()]) + } + return t.slice(0, len) +} + +function i2ops (c) { + var out = Buffer.allocUnsafe(4) + out.writeUInt32BE(c, 0) + return out +} + +},{"create-hash":53,"safe-buffer":143}],123:[function(require,module,exports){ +var parseKeys = require('parse-asn1') +var mgf = require('./mgf') +var xor = require('./xor') +var BN = require('bn.js') +var crt = require('browserify-rsa') +var createHash = require('create-hash') +var withPublic = require('./withPublic') +var Buffer = require('safe-buffer').Buffer + +module.exports = function privateDecrypt (privateKey, enc, reverse) { + var padding + if (privateKey.padding) { + padding = privateKey.padding + } else if (reverse) { + padding = 1 + } else { + padding = 4 + } + + var key = parseKeys(privateKey) + var k = key.modulus.byteLength() + if (enc.length > k || new BN(enc).cmp(key.modulus) >= 0) { + throw new Error('decryption error') + } + var msg + if (reverse) { + msg = withPublic(new BN(enc), key) + } else { + msg = crt(enc, key) + } + var zBuffer = Buffer.alloc(k - msg.length) + msg = Buffer.concat([zBuffer, msg], k) + if (padding === 4) { + return oaep(key, msg) + } else if (padding === 1) { + return pkcs1(key, msg, reverse) + } else if (padding === 3) { + return msg + } else { + throw new Error('unknown padding') + } +} + +function oaep (key, msg) { + var k = key.modulus.byteLength() + var iHash = createHash('sha1').update(Buffer.alloc(0)).digest() + var hLen = iHash.length + if (msg[0] !== 0) { + throw new Error('decryption error') + } + var maskedSeed = msg.slice(1, hLen + 1) + var maskedDb = msg.slice(hLen + 1) + var seed = xor(maskedSeed, mgf(maskedDb, hLen)) + var db = xor(maskedDb, mgf(seed, k - hLen - 1)) + if (compare(iHash, db.slice(0, hLen))) { + throw new Error('decryption error') + } + var i = hLen + while (db[i] === 0) { + i++ + } + if (db[i++] !== 1) { + throw new Error('decryption error') + } + return db.slice(i) +} + +function pkcs1 (key, msg, reverse) { + var p1 = msg.slice(0, 2) + var i = 2 + var status = 0 + while (msg[i++] !== 0) { + if (i >= msg.length) { + status++ + break + } + } + var ps = msg.slice(2, i - 1) + + if ((p1.toString('hex') !== '0002' && !reverse) || (p1.toString('hex') !== '0001' && reverse)) { + status++ + } + if (ps.length < 8) { + status++ + } + if (status) { + throw new Error('decryption error') + } + return msg.slice(i) +} +function compare (a, b) { + a = Buffer.from(a) + b = Buffer.from(b) + var dif = 0 + var len = a.length + if (a.length !== b.length) { + dif++ + len = Math.min(a.length, b.length) + } + var i = -1 + while (++i < len) { + dif += (a[i] ^ b[i]) + } + return dif +} + +},{"./mgf":122,"./withPublic":125,"./xor":126,"bn.js":17,"browserify-rsa":40,"create-hash":53,"parse-asn1":112,"safe-buffer":143}],124:[function(require,module,exports){ +var parseKeys = require('parse-asn1') +var randomBytes = require('randombytes') +var createHash = require('create-hash') +var mgf = require('./mgf') +var xor = require('./xor') +var BN = require('bn.js') +var withPublic = require('./withPublic') +var crt = require('browserify-rsa') +var Buffer = require('safe-buffer').Buffer + +module.exports = function publicEncrypt (publicKey, msg, reverse) { + var padding + if (publicKey.padding) { + padding = publicKey.padding + } else if (reverse) { + padding = 1 + } else { + padding = 4 + } + var key = parseKeys(publicKey) + var paddedMsg + if (padding === 4) { + paddedMsg = oaep(key, msg) + } else if (padding === 1) { + paddedMsg = pkcs1(key, msg, reverse) + } else if (padding === 3) { + paddedMsg = new BN(msg) + if (paddedMsg.cmp(key.modulus) >= 0) { + throw new Error('data too long for modulus') + } + } else { + throw new Error('unknown padding') + } + if (reverse) { + return crt(paddedMsg, key) + } else { + return withPublic(paddedMsg, key) + } +} + +function oaep (key, msg) { + var k = key.modulus.byteLength() + var mLen = msg.length + var iHash = createHash('sha1').update(Buffer.alloc(0)).digest() + var hLen = iHash.length + var hLen2 = 2 * hLen + if (mLen > k - hLen2 - 2) { + throw new Error('message too long') + } + var ps = Buffer.alloc(k - mLen - hLen2 - 2) + var dblen = k - hLen - 1 + var seed = randomBytes(hLen) + var maskedDb = xor(Buffer.concat([iHash, ps, Buffer.alloc(1, 1), msg], dblen), mgf(seed, dblen)) + var maskedSeed = xor(seed, mgf(maskedDb, hLen)) + return new BN(Buffer.concat([Buffer.alloc(1), maskedSeed, maskedDb], k)) +} +function pkcs1 (key, msg, reverse) { + var mLen = msg.length + var k = key.modulus.byteLength() + if (mLen > k - 11) { + throw new Error('message too long') + } + var ps + if (reverse) { + ps = Buffer.alloc(k - mLen - 3, 0xff) + } else { + ps = nonZero(k - mLen - 3) + } + return new BN(Buffer.concat([Buffer.from([0, reverse ? 1 : 2]), ps, Buffer.alloc(1), msg], k)) +} +function nonZero (len) { + var out = Buffer.allocUnsafe(len) + var i = 0 + var cache = randomBytes(len * 2) + var cur = 0 + var num + while (i < len) { + if (cur === cache.length) { + cache = randomBytes(len * 2) + cur = 0 + } + num = cache[cur++] + if (num) { + out[i++] = num + } + } + return out +} + +},{"./mgf":122,"./withPublic":125,"./xor":126,"bn.js":17,"browserify-rsa":40,"create-hash":53,"parse-asn1":112,"randombytes":127,"safe-buffer":143}],125:[function(require,module,exports){ +var BN = require('bn.js') +var Buffer = require('safe-buffer').Buffer + +function withPublic (paddedMsg, key) { + return Buffer.from(paddedMsg + .toRed(BN.mont(key.modulus)) + .redPow(new BN(key.publicExponent)) + .fromRed() + .toArray()) +} + +module.exports = withPublic + +},{"bn.js":17,"safe-buffer":143}],126:[function(require,module,exports){ +module.exports = function xor (a, b) { + var len = a.length + var i = -1 + while (++i < len) { + a[i] ^= b[i] + } + return a +} + +},{}],127:[function(require,module,exports){ +(function (process,global){ +'use strict' + +function oldBrowser () { + throw new Error('Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11') +} + +var Buffer = require('safe-buffer').Buffer +var crypto = global.crypto || global.msCrypto + +if (crypto && crypto.getRandomValues) { + module.exports = randomBytes +} else { + module.exports = oldBrowser +} + +function randomBytes (size, cb) { + // phantomjs needs to throw + if (size > 65536) throw new Error('requested too many random bytes') + // in case browserify isn't using the Uint8Array version + var rawBytes = new global.Uint8Array(size) + + // This will not work in older browsers. + // See https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues + if (size > 0) { // getRandomValues fails on IE if size == 0 + crypto.getRandomValues(rawBytes) + } + + // XXX: phantomjs doesn't like a buffer being passed here + var bytes = Buffer.from(rawBytes.buffer) + + if (typeof cb === 'function') { + return process.nextTick(function () { + cb(null, bytes) + }) + } + + return bytes +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":120,"safe-buffer":143}],128:[function(require,module,exports){ +(function (process,global){ +'use strict' + +function oldBrowser () { + throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11') +} +var safeBuffer = require('safe-buffer') +var randombytes = require('randombytes') +var Buffer = safeBuffer.Buffer +var kBufferMaxLength = safeBuffer.kMaxLength +var crypto = global.crypto || global.msCrypto +var kMaxUint32 = Math.pow(2, 32) - 1 +function assertOffset (offset, length) { + if (typeof offset !== 'number' || offset !== offset) { // eslint-disable-line no-self-compare + throw new TypeError('offset must be a number') + } + + if (offset > kMaxUint32 || offset < 0) { + throw new TypeError('offset must be a uint32') + } + + if (offset > kBufferMaxLength || offset > length) { + throw new RangeError('offset out of range') + } +} + +function assertSize (size, offset, length) { + if (typeof size !== 'number' || size !== size) { // eslint-disable-line no-self-compare + throw new TypeError('size must be a number') + } + + if (size > kMaxUint32 || size < 0) { + throw new TypeError('size must be a uint32') + } + + if (size + offset > length || size > kBufferMaxLength) { + throw new RangeError('buffer too small') + } +} +if ((crypto && crypto.getRandomValues) || !process.browser) { + exports.randomFill = randomFill + exports.randomFillSync = randomFillSync +} else { + exports.randomFill = oldBrowser + exports.randomFillSync = oldBrowser +} +function randomFill (buf, offset, size, cb) { + if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) { + throw new TypeError('"buf" argument must be a Buffer or Uint8Array') + } + + if (typeof offset === 'function') { + cb = offset + offset = 0 + size = buf.length + } else if (typeof size === 'function') { + cb = size + size = buf.length - offset + } else if (typeof cb !== 'function') { + throw new TypeError('"cb" argument must be a function') + } + assertOffset(offset, buf.length) + assertSize(size, offset, buf.length) + return actualFill(buf, offset, size, cb) +} + +function actualFill (buf, offset, size, cb) { + if (process.browser) { + var ourBuf = buf.buffer + var uint = new Uint8Array(ourBuf, offset, size) + crypto.getRandomValues(uint) + if (cb) { + process.nextTick(function () { + cb(null, buf) + }) + return + } + return buf + } + if (cb) { + randombytes(size, function (err, bytes) { + if (err) { + return cb(err) + } + bytes.copy(buf, offset) + cb(null, buf) + }) + return + } + var bytes = randombytes(size) + bytes.copy(buf, offset) + return buf +} +function randomFillSync (buf, offset, size) { + if (typeof offset === 'undefined') { + offset = 0 + } + if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) { + throw new TypeError('"buf" argument must be a Buffer or Uint8Array') + } + + assertOffset(offset, buf.length) + + if (size === undefined) size = buf.length - offset + + assertSize(size, offset, buf.length) + + return actualFill(buf, offset, size) +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":120,"randombytes":127,"safe-buffer":143}],129:[function(require,module,exports){ +module.exports = require('./lib/_stream_duplex.js'); + +},{"./lib/_stream_duplex.js":130}],130:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; +},{"./_stream_readable":132,"./_stream_writable":134,"core-util-is":51,"inherits":101,"process-nextick-args":119}],131:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":133,"core-util-is":51,"inherits":101}],132:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./_stream_duplex":130,"./internal/streams/BufferList":135,"./internal/streams/destroy":136,"./internal/streams/stream":137,"_process":120,"core-util-is":51,"events":84,"inherits":101,"isarray":103,"process-nextick-args":119,"safe-buffer":143,"string_decoder/":153,"util":19}],133:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} +},{"./_stream_duplex":130,"core-util-is":51,"inherits":101}],134:[function(require,module,exports){ +(function (process,global,setImmediate){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) +},{"./_stream_duplex":130,"./internal/streams/destroy":136,"./internal/streams/stream":137,"_process":120,"core-util-is":51,"inherits":101,"process-nextick-args":119,"safe-buffer":143,"timers":154,"util-deprecate":155}],135:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} +},{"safe-buffer":143,"util":19}],136:[function(require,module,exports){ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; +},{"process-nextick-args":119}],137:[function(require,module,exports){ +module.exports = require('events').EventEmitter; + +},{"events":84}],138:[function(require,module,exports){ +module.exports = require('./readable').PassThrough + +},{"./readable":139}],139:[function(require,module,exports){ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); + +},{"./lib/_stream_duplex.js":130,"./lib/_stream_passthrough.js":131,"./lib/_stream_readable.js":132,"./lib/_stream_transform.js":133,"./lib/_stream_writable.js":134}],140:[function(require,module,exports){ +module.exports = require('./readable').Transform + +},{"./readable":139}],141:[function(require,module,exports){ +module.exports = require('./lib/_stream_writable.js'); + +},{"./lib/_stream_writable.js":134}],142:[function(require,module,exports){ +'use strict' +var Buffer = require('buffer').Buffer +var inherits = require('inherits') +var HashBase = require('hash-base') + +var ARRAY16 = new Array(16) + +var zl = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +] + +var zr = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +] + +var sl = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +] + +var sr = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +] + +var hl = [0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e] +var hr = [0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000] + +function RIPEMD160 () { + HashBase.call(this, 64) + + // state + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 +} + +inherits(RIPEMD160, HashBase) + +RIPEMD160.prototype._update = function () { + var words = ARRAY16 + for (var j = 0; j < 16; ++j) words[j] = this._block.readInt32LE(j * 4) + + var al = this._a | 0 + var bl = this._b | 0 + var cl = this._c | 0 + var dl = this._d | 0 + var el = this._e | 0 + + var ar = this._a | 0 + var br = this._b | 0 + var cr = this._c | 0 + var dr = this._d | 0 + var er = this._e | 0 + + // computation + for (var i = 0; i < 80; i += 1) { + var tl + var tr + if (i < 16) { + tl = fn1(al, bl, cl, dl, el, words[zl[i]], hl[0], sl[i]) + tr = fn5(ar, br, cr, dr, er, words[zr[i]], hr[0], sr[i]) + } else if (i < 32) { + tl = fn2(al, bl, cl, dl, el, words[zl[i]], hl[1], sl[i]) + tr = fn4(ar, br, cr, dr, er, words[zr[i]], hr[1], sr[i]) + } else if (i < 48) { + tl = fn3(al, bl, cl, dl, el, words[zl[i]], hl[2], sl[i]) + tr = fn3(ar, br, cr, dr, er, words[zr[i]], hr[2], sr[i]) + } else if (i < 64) { + tl = fn4(al, bl, cl, dl, el, words[zl[i]], hl[3], sl[i]) + tr = fn2(ar, br, cr, dr, er, words[zr[i]], hr[3], sr[i]) + } else { // if (i<80) { + tl = fn5(al, bl, cl, dl, el, words[zl[i]], hl[4], sl[i]) + tr = fn1(ar, br, cr, dr, er, words[zr[i]], hr[4], sr[i]) + } + + al = el + el = dl + dl = rotl(cl, 10) + cl = bl + bl = tl + + ar = er + er = dr + dr = rotl(cr, 10) + cr = br + br = tr + } + + // update state + var t = (this._b + cl + dr) | 0 + this._b = (this._c + dl + er) | 0 + this._c = (this._d + el + ar) | 0 + this._d = (this._e + al + br) | 0 + this._e = (this._a + bl + cr) | 0 + this._a = t +} + +RIPEMD160.prototype._digest = function () { + // create padding and handle blocks + this._block[this._blockOffset++] = 0x80 + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64) + this._update() + this._blockOffset = 0 + } + + this._block.fill(0, this._blockOffset, 56) + this._block.writeUInt32LE(this._length[0], 56) + this._block.writeUInt32LE(this._length[1], 60) + this._update() + + // produce result + var buffer = Buffer.alloc ? Buffer.alloc(20) : new Buffer(20) + buffer.writeInt32LE(this._a, 0) + buffer.writeInt32LE(this._b, 4) + buffer.writeInt32LE(this._c, 8) + buffer.writeInt32LE(this._d, 12) + buffer.writeInt32LE(this._e, 16) + return buffer +} + +function rotl (x, n) { + return (x << n) | (x >>> (32 - n)) +} + +function fn1 (a, b, c, d, e, m, k, s) { + return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0 +} + +function fn2 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0 +} + +function fn3 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0 +} + +function fn4 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0 +} + +function fn5 (a, b, c, d, e, m, k, s) { + return (rotl((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0 +} + +module.exports = RIPEMD160 + +},{"buffer":49,"hash-base":86,"inherits":101}],143:[function(require,module,exports){ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + +},{"buffer":49}],144:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer + +// prototype class for hash functions +function Hash (blockSize, finalSize) { + this._block = Buffer.alloc(blockSize) + this._finalSize = finalSize + this._blockSize = blockSize + this._len = 0 +} + +Hash.prototype.update = function (data, enc) { + if (typeof data === 'string') { + enc = enc || 'utf8' + data = Buffer.from(data, enc) + } + + var block = this._block + var blockSize = this._blockSize + var length = data.length + var accum = this._len + + for (var offset = 0; offset < length;) { + var assigned = accum % blockSize + var remainder = Math.min(length - offset, blockSize - assigned) + + for (var i = 0; i < remainder; i++) { + block[assigned + i] = data[offset + i] + } + + accum += remainder + offset += remainder + + if ((accum % blockSize) === 0) { + this._update(block) + } + } + + this._len += length + return this +} + +Hash.prototype.digest = function (enc) { + var rem = this._len % this._blockSize + + this._block[rem] = 0x80 + + // zero (rem + 1) trailing bits, where (rem + 1) is the smallest + // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize + this._block.fill(0, rem + 1) + + if (rem >= this._finalSize) { + this._update(this._block) + this._block.fill(0) + } + + var bits = this._len * 8 + + // uint32 + if (bits <= 0xffffffff) { + this._block.writeUInt32BE(bits, this._blockSize - 4) + + // uint64 + } else { + var lowBits = (bits & 0xffffffff) >>> 0 + var highBits = (bits - lowBits) / 0x100000000 + + this._block.writeUInt32BE(highBits, this._blockSize - 8) + this._block.writeUInt32BE(lowBits, this._blockSize - 4) + } + + this._update(this._block) + var hash = this._hash() + + return enc ? hash.toString(enc) : hash +} + +Hash.prototype._update = function () { + throw new Error('_update must be implemented by subclass') +} + +module.exports = Hash + +},{"safe-buffer":143}],145:[function(require,module,exports){ +var exports = module.exports = function SHA (algorithm) { + algorithm = algorithm.toLowerCase() + + var Algorithm = exports[algorithm] + if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)') + + return new Algorithm() +} + +exports.sha = require('./sha') +exports.sha1 = require('./sha1') +exports.sha224 = require('./sha224') +exports.sha256 = require('./sha256') +exports.sha384 = require('./sha384') +exports.sha512 = require('./sha512') + +},{"./sha":146,"./sha1":147,"./sha224":148,"./sha256":149,"./sha384":150,"./sha512":151}],146:[function(require,module,exports){ +/* + * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined + * in FIPS PUB 180-1 + * This source code is derived from sha1.js of the same repository. + * The difference between SHA-0 and SHA-1 is just a bitwise rotate left + * operation was added. + */ + +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 +] + +var W = new Array(80) + +function Sha () { + this.init() + this._w = W + + Hash.call(this, 64, 56) +} + +inherits(Sha, Hash) + +Sha.prototype.init = function () { + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 + + return this +} + +function rotl5 (num) { + return (num << 5) | (num >>> 27) +} + +function rotl30 (num) { + return (num << 30) | (num >>> 2) +} + +function ft (s, b, c, d) { + if (s === 0) return (b & c) | ((~b) & d) + if (s === 2) return (b & c) | (b & d) | (c & d) + return b ^ c ^ d +} + +Sha.prototype._update = function (M) { + var W = this._w + + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 + + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 80; ++i) W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16] + + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20) + var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 + + e = d + d = c + c = rotl30(b) + b = a + a = t + } + + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 +} + +Sha.prototype._hash = function () { + var H = Buffer.allocUnsafe(20) + + H.writeInt32BE(this._a | 0, 0) + H.writeInt32BE(this._b | 0, 4) + H.writeInt32BE(this._c | 0, 8) + H.writeInt32BE(this._d | 0, 12) + H.writeInt32BE(this._e | 0, 16) + + return H +} + +module.exports = Sha + +},{"./hash":144,"inherits":101,"safe-buffer":143}],147:[function(require,module,exports){ +/* + * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined + * in FIPS PUB 180-1 + * Version 2.1a Copyright Paul Johnston 2000 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for details. + */ + +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 +] + +var W = new Array(80) + +function Sha1 () { + this.init() + this._w = W + + Hash.call(this, 64, 56) +} + +inherits(Sha1, Hash) + +Sha1.prototype.init = function () { + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 + + return this +} + +function rotl1 (num) { + return (num << 1) | (num >>> 31) +} + +function rotl5 (num) { + return (num << 5) | (num >>> 27) +} + +function rotl30 (num) { + return (num << 30) | (num >>> 2) +} + +function ft (s, b, c, d) { + if (s === 0) return (b & c) | ((~b) & d) + if (s === 2) return (b & c) | (b & d) | (c & d) + return b ^ c ^ d +} + +Sha1.prototype._update = function (M) { + var W = this._w + + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 + + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 80; ++i) W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]) + + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20) + var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 + + e = d + d = c + c = rotl30(b) + b = a + a = t + } + + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 +} + +Sha1.prototype._hash = function () { + var H = Buffer.allocUnsafe(20) + + H.writeInt32BE(this._a | 0, 0) + H.writeInt32BE(this._b | 0, 4) + H.writeInt32BE(this._c | 0, 8) + H.writeInt32BE(this._d | 0, 12) + H.writeInt32BE(this._e | 0, 16) + + return H +} + +module.exports = Sha1 + +},{"./hash":144,"inherits":101,"safe-buffer":143}],148:[function(require,module,exports){ +/** + * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined + * in FIPS 180-2 + * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * + */ + +var inherits = require('inherits') +var Sha256 = require('./sha256') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var W = new Array(64) + +function Sha224 () { + this.init() + + this._w = W // new Array(64) + + Hash.call(this, 64, 56) +} + +inherits(Sha224, Sha256) + +Sha224.prototype.init = function () { + this._a = 0xc1059ed8 + this._b = 0x367cd507 + this._c = 0x3070dd17 + this._d = 0xf70e5939 + this._e = 0xffc00b31 + this._f = 0x68581511 + this._g = 0x64f98fa7 + this._h = 0xbefa4fa4 + + return this +} + +Sha224.prototype._hash = function () { + var H = Buffer.allocUnsafe(28) + + H.writeInt32BE(this._a, 0) + H.writeInt32BE(this._b, 4) + H.writeInt32BE(this._c, 8) + H.writeInt32BE(this._d, 12) + H.writeInt32BE(this._e, 16) + H.writeInt32BE(this._f, 20) + H.writeInt32BE(this._g, 24) + + return H +} + +module.exports = Sha224 + +},{"./hash":144,"./sha256":149,"inherits":101,"safe-buffer":143}],149:[function(require,module,exports){ +/** + * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined + * in FIPS 180-2 + * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * + */ + +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 +] + +var W = new Array(64) + +function Sha256 () { + this.init() + + this._w = W // new Array(64) + + Hash.call(this, 64, 56) +} + +inherits(Sha256, Hash) + +Sha256.prototype.init = function () { + this._a = 0x6a09e667 + this._b = 0xbb67ae85 + this._c = 0x3c6ef372 + this._d = 0xa54ff53a + this._e = 0x510e527f + this._f = 0x9b05688c + this._g = 0x1f83d9ab + this._h = 0x5be0cd19 + + return this +} + +function ch (x, y, z) { + return z ^ (x & (y ^ z)) +} + +function maj (x, y, z) { + return (x & y) | (z & (x | y)) +} + +function sigma0 (x) { + return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10) +} + +function sigma1 (x) { + return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7) +} + +function gamma0 (x) { + return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3) +} + +function gamma1 (x) { + return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10) +} + +Sha256.prototype._update = function (M) { + var W = this._w + + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 + var f = this._f | 0 + var g = this._g | 0 + var h = this._h | 0 + + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 64; ++i) W[i] = (gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16]) | 0 + + for (var j = 0; j < 64; ++j) { + var T1 = (h + sigma1(e) + ch(e, f, g) + K[j] + W[j]) | 0 + var T2 = (sigma0(a) + maj(a, b, c)) | 0 + + h = g + g = f + f = e + e = (d + T1) | 0 + d = c + c = b + b = a + a = (T1 + T2) | 0 + } + + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 + this._f = (f + this._f) | 0 + this._g = (g + this._g) | 0 + this._h = (h + this._h) | 0 +} + +Sha256.prototype._hash = function () { + var H = Buffer.allocUnsafe(32) + + H.writeInt32BE(this._a, 0) + H.writeInt32BE(this._b, 4) + H.writeInt32BE(this._c, 8) + H.writeInt32BE(this._d, 12) + H.writeInt32BE(this._e, 16) + H.writeInt32BE(this._f, 20) + H.writeInt32BE(this._g, 24) + H.writeInt32BE(this._h, 28) + + return H +} + +module.exports = Sha256 + +},{"./hash":144,"inherits":101,"safe-buffer":143}],150:[function(require,module,exports){ +var inherits = require('inherits') +var SHA512 = require('./sha512') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var W = new Array(160) + +function Sha384 () { + this.init() + this._w = W + + Hash.call(this, 128, 112) +} + +inherits(Sha384, SHA512) + +Sha384.prototype.init = function () { + this._ah = 0xcbbb9d5d + this._bh = 0x629a292a + this._ch = 0x9159015a + this._dh = 0x152fecd8 + this._eh = 0x67332667 + this._fh = 0x8eb44a87 + this._gh = 0xdb0c2e0d + this._hh = 0x47b5481d + + this._al = 0xc1059ed8 + this._bl = 0x367cd507 + this._cl = 0x3070dd17 + this._dl = 0xf70e5939 + this._el = 0xffc00b31 + this._fl = 0x68581511 + this._gl = 0x64f98fa7 + this._hl = 0xbefa4fa4 + + return this +} + +Sha384.prototype._hash = function () { + var H = Buffer.allocUnsafe(48) + + function writeInt64BE (h, l, offset) { + H.writeInt32BE(h, offset) + H.writeInt32BE(l, offset + 4) + } + + writeInt64BE(this._ah, this._al, 0) + writeInt64BE(this._bh, this._bl, 8) + writeInt64BE(this._ch, this._cl, 16) + writeInt64BE(this._dh, this._dl, 24) + writeInt64BE(this._eh, this._el, 32) + writeInt64BE(this._fh, this._fl, 40) + + return H +} + +module.exports = Sha384 + +},{"./hash":144,"./sha512":151,"inherits":101,"safe-buffer":143}],151:[function(require,module,exports){ +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +] + +var W = new Array(160) + +function Sha512 () { + this.init() + this._w = W + + Hash.call(this, 128, 112) +} + +inherits(Sha512, Hash) + +Sha512.prototype.init = function () { + this._ah = 0x6a09e667 + this._bh = 0xbb67ae85 + this._ch = 0x3c6ef372 + this._dh = 0xa54ff53a + this._eh = 0x510e527f + this._fh = 0x9b05688c + this._gh = 0x1f83d9ab + this._hh = 0x5be0cd19 + + this._al = 0xf3bcc908 + this._bl = 0x84caa73b + this._cl = 0xfe94f82b + this._dl = 0x5f1d36f1 + this._el = 0xade682d1 + this._fl = 0x2b3e6c1f + this._gl = 0xfb41bd6b + this._hl = 0x137e2179 + + return this +} + +function Ch (x, y, z) { + return z ^ (x & (y ^ z)) +} + +function maj (x, y, z) { + return (x & y) | (z & (x | y)) +} + +function sigma0 (x, xl) { + return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25) +} + +function sigma1 (x, xl) { + return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23) +} + +function Gamma0 (x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7) +} + +function Gamma0l (x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25) +} + +function Gamma1 (x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6) +} + +function Gamma1l (x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26) +} + +function getCarry (a, b) { + return (a >>> 0) < (b >>> 0) ? 1 : 0 +} + +Sha512.prototype._update = function (M) { + var W = this._w + + var ah = this._ah | 0 + var bh = this._bh | 0 + var ch = this._ch | 0 + var dh = this._dh | 0 + var eh = this._eh | 0 + var fh = this._fh | 0 + var gh = this._gh | 0 + var hh = this._hh | 0 + + var al = this._al | 0 + var bl = this._bl | 0 + var cl = this._cl | 0 + var dl = this._dl | 0 + var el = this._el | 0 + var fl = this._fl | 0 + var gl = this._gl | 0 + var hl = this._hl | 0 + + for (var i = 0; i < 32; i += 2) { + W[i] = M.readInt32BE(i * 4) + W[i + 1] = M.readInt32BE(i * 4 + 4) + } + for (; i < 160; i += 2) { + var xh = W[i - 15 * 2] + var xl = W[i - 15 * 2 + 1] + var gamma0 = Gamma0(xh, xl) + var gamma0l = Gamma0l(xl, xh) + + xh = W[i - 2 * 2] + xl = W[i - 2 * 2 + 1] + var gamma1 = Gamma1(xh, xl) + var gamma1l = Gamma1l(xl, xh) + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7h = W[i - 7 * 2] + var Wi7l = W[i - 7 * 2 + 1] + + var Wi16h = W[i - 16 * 2] + var Wi16l = W[i - 16 * 2 + 1] + + var Wil = (gamma0l + Wi7l) | 0 + var Wih = (gamma0 + Wi7h + getCarry(Wil, gamma0l)) | 0 + Wil = (Wil + gamma1l) | 0 + Wih = (Wih + gamma1 + getCarry(Wil, gamma1l)) | 0 + Wil = (Wil + Wi16l) | 0 + Wih = (Wih + Wi16h + getCarry(Wil, Wi16l)) | 0 + + W[i] = Wih + W[i + 1] = Wil + } + + for (var j = 0; j < 160; j += 2) { + Wih = W[j] + Wil = W[j + 1] + + var majh = maj(ah, bh, ch) + var majl = maj(al, bl, cl) + + var sigma0h = sigma0(ah, al) + var sigma0l = sigma0(al, ah) + var sigma1h = sigma1(eh, el) + var sigma1l = sigma1(el, eh) + + // t1 = h + sigma1 + ch + K[j] + W[j] + var Kih = K[j] + var Kil = K[j + 1] + + var chh = Ch(eh, fh, gh) + var chl = Ch(el, fl, gl) + + var t1l = (hl + sigma1l) | 0 + var t1h = (hh + sigma1h + getCarry(t1l, hl)) | 0 + t1l = (t1l + chl) | 0 + t1h = (t1h + chh + getCarry(t1l, chl)) | 0 + t1l = (t1l + Kil) | 0 + t1h = (t1h + Kih + getCarry(t1l, Kil)) | 0 + t1l = (t1l + Wil) | 0 + t1h = (t1h + Wih + getCarry(t1l, Wil)) | 0 + + // t2 = sigma0 + maj + var t2l = (sigma0l + majl) | 0 + var t2h = (sigma0h + majh + getCarry(t2l, sigma0l)) | 0 + + hh = gh + hl = gl + gh = fh + gl = fl + fh = eh + fl = el + el = (dl + t1l) | 0 + eh = (dh + t1h + getCarry(el, dl)) | 0 + dh = ch + dl = cl + ch = bh + cl = bl + bh = ah + bl = al + al = (t1l + t2l) | 0 + ah = (t1h + t2h + getCarry(al, t1l)) | 0 + } + + this._al = (this._al + al) | 0 + this._bl = (this._bl + bl) | 0 + this._cl = (this._cl + cl) | 0 + this._dl = (this._dl + dl) | 0 + this._el = (this._el + el) | 0 + this._fl = (this._fl + fl) | 0 + this._gl = (this._gl + gl) | 0 + this._hl = (this._hl + hl) | 0 + + this._ah = (this._ah + ah + getCarry(this._al, al)) | 0 + this._bh = (this._bh + bh + getCarry(this._bl, bl)) | 0 + this._ch = (this._ch + ch + getCarry(this._cl, cl)) | 0 + this._dh = (this._dh + dh + getCarry(this._dl, dl)) | 0 + this._eh = (this._eh + eh + getCarry(this._el, el)) | 0 + this._fh = (this._fh + fh + getCarry(this._fl, fl)) | 0 + this._gh = (this._gh + gh + getCarry(this._gl, gl)) | 0 + this._hh = (this._hh + hh + getCarry(this._hl, hl)) | 0 +} + +Sha512.prototype._hash = function () { + var H = Buffer.allocUnsafe(64) + + function writeInt64BE (h, l, offset) { + H.writeInt32BE(h, offset) + H.writeInt32BE(l, offset + 4) + } + + writeInt64BE(this._ah, this._al, 0) + writeInt64BE(this._bh, this._bl, 8) + writeInt64BE(this._ch, this._cl, 16) + writeInt64BE(this._dh, this._dl, 24) + writeInt64BE(this._eh, this._el, 32) + writeInt64BE(this._fh, this._fl, 40) + writeInt64BE(this._gh, this._gl, 48) + writeInt64BE(this._hh, this._hl, 56) + + return H +} + +module.exports = Sha512 + +},{"./hash":144,"inherits":101,"safe-buffer":143}],152:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":84,"inherits":101,"readable-stream/duplex.js":129,"readable-stream/passthrough.js":138,"readable-stream/readable.js":139,"readable-stream/transform.js":140,"readable-stream/writable.js":141}],153:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} +},{"safe-buffer":143}],154:[function(require,module,exports){ +(function (setImmediate,clearImmediate){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":120,"timers":154}],155:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],156:[function(require,module,exports){ +var indexOf = function (xs, item) { + if (xs.indexOf) return xs.indexOf(item); + else for (var i = 0; i < xs.length; i++) { + if (xs[i] === item) return i; + } + return -1; +}; +var Object_keys = function (obj) { + if (Object.keys) return Object.keys(obj) + else { + var res = []; + for (var key in obj) res.push(key) + return res; + } +}; + +var forEach = function (xs, fn) { + if (xs.forEach) return xs.forEach(fn) + else for (var i = 0; i < xs.length; i++) { + fn(xs[i], i, xs); + } +}; + +var defineProp = (function() { + try { + Object.defineProperty({}, '_', {}); + return function(obj, name, value) { + Object.defineProperty(obj, name, { + writable: true, + enumerable: false, + configurable: true, + value: value + }) + }; + } catch(e) { + return function(obj, name, value) { + obj[name] = value; + }; + } +}()); + +var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', +'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', +'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', +'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', +'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape']; + +function Context() {} +Context.prototype = {}; + +var Script = exports.Script = function NodeScript (code) { + if (!(this instanceof Script)) return new Script(code); + this.code = code; +}; + +Script.prototype.runInContext = function (context) { + if (!(context instanceof Context)) { + throw new TypeError("needs a 'context' argument."); + } + + var iframe = document.createElement('iframe'); + if (!iframe.style) iframe.style = {}; + iframe.style.display = 'none'; + + document.body.appendChild(iframe); + + var win = iframe.contentWindow; + var wEval = win.eval, wExecScript = win.execScript; + + if (!wEval && wExecScript) { + // win.eval() magically appears when this is called in IE: + wExecScript.call(win, 'null'); + wEval = win.eval; + } + + forEach(Object_keys(context), function (key) { + win[key] = context[key]; + }); + forEach(globals, function (key) { + if (context[key]) { + win[key] = context[key]; + } + }); + + var winKeys = Object_keys(win); + + var res = wEval.call(win, this.code); + + forEach(Object_keys(win), function (key) { + // Avoid copying circular objects like `top` and `window` by only + // updating existing context properties or new properties in the `win` + // that was only introduced after the eval. + if (key in context || indexOf(winKeys, key) === -1) { + context[key] = win[key]; + } + }); + + forEach(globals, function (key) { + if (!(key in context)) { + defineProp(context, key, win[key]); + } + }); + + document.body.removeChild(iframe); + + return res; +}; + +Script.prototype.runInThisContext = function () { + return eval(this.code); // maybe... +}; + +Script.prototype.runInNewContext = function (context) { + var ctx = Script.createContext(context); + var res = this.runInContext(ctx); + + if (context) { + forEach(Object_keys(ctx), function (key) { + context[key] = ctx[key]; + }); + } + + return res; +}; + +forEach(Object_keys(Script.prototype), function (name) { + exports[name] = Script[name] = function (code) { + var s = Script(code); + return s[name].apply(s, [].slice.call(arguments, 1)); + }; +}); + +exports.isContext = function (context) { + return context instanceof Context; +}; + +exports.createScript = function (code) { + return exports.Script(code); +}; + +exports.createContext = Script.createContext = function (context) { + var copy = new Context(); + if(typeof context === 'object') { + forEach(Object_keys(context), function (key) { + copy[key] = context[key]; + }); + } + return copy; +}; + +},{}],157:[function(require,module,exports){ +(function (process,Buffer,__dirname){ + +var Module = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + return ( +function(Module) { + Module = Module || {}; + +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",abort);Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var tempRet0=0;var setTempRet0=(function(value){tempRet0=value});var getTempRet0=(function(){return tempRet0});var GLOBAL_BASE=1024;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NONE=3;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var WASM_PAGE_SIZE=65536;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE=1024,STACK_BASE=48352,DYNAMIC_BASE=5291232,DYNAMICTOP_PTR=48096;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){var PAGE_MULTIPLE=65536;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY>2]=DYNAMIC_BASE;function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmBinaryFile="data:application/octet-stream;base64,AGFzbQEAAAABnQVRYAJ/fwF/YAN/f38Bf2AFf39+f38AYAF/AGACf38AYAF/AX9gBX9/f39/AX9gCH9/f39/f39/AX9gAn98AXxgBH9/f38Bf2AEf39/fwBgA39/fwBgAn98AGABfwF8YAN/f3wAYAABf2ACf38BfGADf3x/AGAGf39/f39/AX9gBX9/f398AX9gAABgBn9/f39/fwBgBX9/f39/AGADf39/AXxgAn98AX9gA398fAF/YAR/fHx8AX9gBX98fHx/AX9gBn9/f39/fAF/YAd/f39/f39/AX9gBX9/f39+AX9gBH9/fH8AYA1/f39/f39/f39/f39/AGAIf39/f39/f38AYAp/f39/f39/f39/AGAHf3x8fHx8fABgBH98fHwAYAV/fHx8fwBgA398fwF/YAV/fH9/fwF/YAR/fH9/AX9gA398fABgBH9/f3wBf2AGf3x/f39/AX9gBX9/fHx8AGAIfHx/f39/fH8Bf2AGfHx8f39/AX9gB39/fHx8f38AYAN8fH8BfGAGf398f39/AGAGf398fH9/AGACfHwBfGABfAF8YAF8AX9gA39/fgBgBH9/f34BfmAFf39/f38BfGAGf39/f39/AXxgAn9/AX5gAnx/AXxgA35/fwF/YAJ+fwF/YAR/f39/AX5gAnx/AX9gAn9+AX9gCn9/f39/f39/f38Bf2AMf39/f39/f39/f39/AX9gA39/fwF9YAd/f39/f39/AGALf39/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AGADf398AXxgBH9/f38BfGADf398AX9gBH9/fHwBf2AFf398fHwBf2AGf398fHx/AX9gB39/f39/f3wBf2AJf39/f39/f39/AX9gBH9/f3wAYAV/f398fwACqQo3A2VudgVhYm9ydAADA2Vudg1lbmxhcmdlTWVtb3J5AA8DZW52DmdldFRvdGFsTWVtb3J5AA8DZW52F2Fib3J0T25DYW5ub3RHcm93TWVtb3J5AA8DZW52GV9fX2N4YV9hbGxvY2F0ZV9leGNlcHRpb24ABQNlbnYTX19fY3hhX3B1cmVfdmlydHVhbAAUA2VudgxfX19jeGFfdGhyb3cACwNlbnYZX19fY3hhX3VuY2F1Z2h0X2V4Y2VwdGlvbgAPA2VudgdfX19sb2NrAAMDZW52C19fX21hcF9maWxlAAADZW52C19fX3NldEVyck5vAAMDZW52DV9fX3N5c2NhbGwxNDAAAANlbnYNX19fc3lzY2FsbDE0NQAAA2Vudg1fX19zeXNjYWxsMTQ2AAADZW52DV9fX3N5c2NhbGwyMjEAAANlbnYLX19fc3lzY2FsbDUAAANlbnYMX19fc3lzY2FsbDU0AAADZW52C19fX3N5c2NhbGw2AAADZW52DF9fX3N5c2NhbGw5MQAAA2VudglfX191bmxvY2sAAwNlbnYWX19lbWJpbmRfcmVnaXN0ZXJfYm9vbAAWA2VudhdfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcwAgA2VudiNfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19jb25zdHJ1Y3RvcgAVA2VudiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbgAhA2VudiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19wcm9wZXJ0eQAiA2VudhdfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbAAEA2VudhZfX2VtYmluZF9yZWdpc3Rlcl9lbnVtAAoDZW52HF9fZW1iaW5kX3JlZ2lzdGVyX2VudW1fdmFsdWUACwNlbnYXX19lbWJpbmRfcmVnaXN0ZXJfZmxvYXQACwNlbnYZX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcgAWA2Vudh1fX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldwALA2VudhxfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nAAQDZW52HV9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nAAsDZW52Fl9fZW1iaW5kX3JlZ2lzdGVyX3ZvaWQABANlbnYOX19lbXZhbF9kZWNyZWYAAwNlbnYOX19lbXZhbF9pbmNyZWYAAwNlbnYSX19lbXZhbF90YWtlX3ZhbHVlAAADZW52Bl9hYm9ydAAUA2VudhZfZW1zY3JpcHRlbl9tZW1jcHlfYmlnAAEDZW52B19nZXRlbnYABQNlbnYSX2xsdm1fc3RhY2tyZXN0b3JlAAMDZW52D19sbHZtX3N0YWNrc2F2ZQAPA2VudgpfbGx2bV90cmFwABQDZW52El9wdGhyZWFkX2NvbmRfd2FpdAAAA2VudhRfcHRocmVhZF9nZXRzcGVjaWZpYwAFA2VudhNfcHRocmVhZF9rZXlfY3JlYXRlAAADZW52DV9wdGhyZWFkX29uY2UAAANlbnYUX3B0aHJlYWRfc2V0c3BlY2lmaWMAAANlbnYLX3N0cmZ0aW1lX2wABgNlbnYMX190YWJsZV9iYXNlA38AA2Vudg5EWU5BTUlDVE9QX1BUUgN/AAZnbG9iYWwDTmFOA3wABmdsb2JhbAhJbmZpbml0eQN8AANlbnYGbWVtb3J5AgCAAgNlbnYFdGFibGUBcAH+Cv4KA/UJ8wkFBQ8DBAQWAwQOAwMBEgMjAwAEEAMECyQlBAQDAwIKBQAAAwMDAwADAwMkJQQEABgmJygACwQECwQNDgMDAwQFDQ4EBQ0OAyQpBA0LEAMNAwQMDAwMEAsXAAoLCwoBAAEACwALBBQEAwMEAwMDAwUDBAECCgUAAAMDAwMEBQMDCgQEKgQAGAQGCggIKykYBAYKCAgkAwMYAQEECQkJBgoICAQEBAQDAwQGBAYDAywEBCQYAQQJBgoICCsdJAEBCQkJBgYtLgYTAQkBARgECQoICCkLCwsICwsILC8EBAQEBQMFMAAECwMMAAAEAwMEBAwNAwQEAwQEBAMWCgMEAwkAMQMDAAsGCwEDAwQEAwMDAwMEAwQEAwMDAwMEAwQDAwMDMgkDAwMEAwMDAwQFBAQDAwMDAwMEBAMDBAMDKRERESsAAAUECwAABAQLCxAOAAMDAwMDAwsDAwMECwMDAwMMAwMDMjIJAwQDBAQEBAQEAwMqIQQEAwsDAwMJEgkDMzQ1BxIDAwQMAwkDFBQFAwUPGgEZAAAFEAQXAQ4JABAOBQAFARsJAAAFAQ8JAQEADwsAAQALBQMBAAAFBgkABQALDwAFAA8PDQwEDwwEDQwEDwAACx8PFBQUDwQPDA8AAAEBBAUDDwQLCgULAQEJCwsFAwQLBQsBCwUDBAsFCwELAwMUFAUFAQEFDwEBBQUFBQUFAA8FBQUFBQAFBQUJAwAFAQEABQAFAAUPAAUFBQABAQEEBQA2CTcXODk6OzMzOzMFBQEAAQYLBQs8PT0WACs7AAABAQAJAQAAAwUABQAAFDcJAAkBAAAAAAUFCT4+MDM/CTAFAQABAQUGBRcBAQUJNDQ0NDQFAwAABAMEAwMDAQIKAQUFAAEFAQMDAQUBAQMDAwMDAwMDBAQABAsDAwsFBAMAAQUBQAAAGAAUFAMDCwsEBQEABAEABAUFAAAEBQUAAAMGCgELBAYKAQsEEhISEhISEhISEgADQQ8BBQMLAwMGFkIXCgYXBkMSBQs+EgkSCRI+EgkdEhISEhISEhISEkEGFkIGBhIBCwASEhISHQYGHgYeExMGBgEBCUQKRAYGHgYeExMGEkREBRISEhISBwUFBQUFBQUUFBQVFQcWFhYWFhYKFRYWFhYKBhISEhISBwUFBQUFBQUUFBQVFQcWFhYWFhYKFRYWFhYKBgMDBQUFBQUFBQUFBQUFBQUFBQMFBQMDHRUDHRUFBAQEBQQDAwUFBAQEBAUEBAMDAwMFBAQEBAUEAwMdHUUBIgsLHR1FASIcEiJGHBIiRgEVFQcHBgYFARISBwYDAwcHBgUGBQMHBwYBEhIDAwMDAwYKAwMGCgMDAAEAAQAJAQYDAwABAAEDAwEJCQkAAQABAAkBBgMDBAQDAwQEAQkJCQABAAEACQEGAwMEChIJBAQECwQBChIJBAsEBAQFARUDAAEBBAQVAAABBAQUAwsEBAQKBAQDBAQEBA8LBAQEBAQECgMEDwMAAwAEBQQDBAsLAQMAAQEhAwAEARUBBAkABQAKBAsLAQEBIQMARAEEBQALDxQPBAEVFgoLCwoAFRYKFAMDAwUDBQEBFRYKChUWAwUBBQUBAQEFEEcXSABJSktMAQkGHBJNHQdOAwQOHwtPUAoWFUQNCBAXDwUYGRobAAEJEwYcEh0HHhQDDBEEDh8LChYVAh1EBikHfwEjAQt/AUEAC38BQQALfAEjAgt8ASMDC38BQeD5Agt/AUHg+cICCweSCDoQX19ncm93V2FzbU1lbW9yeQAxEl9fR0xPQkFMX19JXzAwMDEwMQDsBRhfX0dMT0JBTF9fc3ViX0lfYmluZF9jcHAAsgQhX19HTE9CQUxfX3N1Yl9JX2Vtc2NyaXB0ZW5saWJfY3BwALsDHF9fR0xPQkFMX19zdWJfSV9pb3N0cmVhbV9jcHAAkAUdX19HTE9CQUxfX3N1Yl9JX3N0bHJlYWRlcl9jcHAAlgEaX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYAvgkQX19fY3hhX2Nhbl9jYXRjaADeCRZfX19jeGFfaXNfcG9pbnRlcl90eXBlAN8JEV9fX2Vycm5vX2xvY2F0aW9uALkEDl9fX2dldFR5cGVOYW1lALQEBV9mcmVlALcFD19sbHZtX2Jzd2FwX2kzMgDgCQdfbWFsbG9jALYFB19tZW1jcHkA4QkIX21lbW1vdmUA4gkHX21lbXNldADjCRdfcHRocmVhZF9jb25kX2Jyb2FkY2FzdABwE19wdGhyZWFkX211dGV4X2xvY2sAcBVfcHRocmVhZF9tdXRleF91bmxvY2sAcAVfc2JyawDkCQpkeW5DYWxsX2RpAOUJC2R5bkNhbGxfZGlkAOYJC2R5bkNhbGxfZGlpAOcJDGR5bkNhbGxfZGlpaQDoCQlkeW5DYWxsX2kAvwMKZHluQ2FsbF9paQDpCQtkeW5DYWxsX2lpZADqCQxkeW5DYWxsX2lpZGQA6wkNZHluQ2FsbF9paWRkZADsCQ5keW5DYWxsX2lpZGRkaQDtCQtkeW5DYWxsX2lpaQDuCQxkeW5DYWxsX2lpaWkA7wkNZHluQ2FsbF9paWlpaQDwCQ5keW5DYWxsX2lpaWlpZADxCQ5keW5DYWxsX2lpaWlpaQDyCQ9keW5DYWxsX2lpaWlpaWQA8wkPZHluQ2FsbF9paWlpaWlpAPQJEGR5bkNhbGxfaWlpaWlpaWkA9QkRZHluQ2FsbF9paWlpaWlpaWkA9gkOZHluQ2FsbF9paWlpaWoAogoJZHluQ2FsbF92APcJCmR5bkNhbGxfdmkA+AkLZHluQ2FsbF92aWQA+QkMZHluQ2FsbF92aWRpAPoJC2R5bkNhbGxfdmlpAPsJDGR5bkNhbGxfdmlpZAD8CQ1keW5DYWxsX3ZpaWRpAP0JDGR5bkNhbGxfdmlpaQD+CQ1keW5DYWxsX3ZpaWlpAP8JDmR5bkNhbGxfdmlpaWlpAIAKD2R5bkNhbGxfdmlpaWlpaQCBCg5keW5DYWxsX3ZpaWppaQCjChNlc3RhYmxpc2hTdGFja1NwYWNlADUIc2V0VGhyZXcANgpzdGFja0FsbG9jADIMc3RhY2tSZXN0b3JlADQJc3RhY2tTYXZlADMJ9BQBACMAC/4KggpxdaECe3/3A/0Dgwq6AbsBwgHDAdAB0QHoAekBgAKBAoYCiQKDCoMKgwqECscDfYYBzgPOA8cDxwPOA4QKhAqECoQKhAqECoQKhQrJA4YKwAPaA98D8QP1A/YD+gOABIUEiQSLBI0ElQSVBJUEhwpwcFDFBXB0nwGlAXDdArUExAVwcMQFzQXzBfMF+gX7Bf8FgAbrBvIG8wb0BvUG9gb3BvgG6waTB5QHlQeWB5cHmAeZB7AHsQeyB7MHtAe1B7YHtwe4B7kHuge7B7wHvQe+B8EHsQeyB7MHtAe1B7YHtwe4B7kHuge7B7wHvQe+B8oHygdwygfKB3DOB84HcM4Hzgdw0gfTB9gH0gfTB9gH3wetAeQH3wetAeQHcHCDCHR0dI4IcJAIcHCDCNIH0wffB60B0QnTCb0DvwPGA70D0APQA9IDvQPQA9AD2AO9A78DvQO9A78DrQG9A+UDvQPqA70D7gO9A78D8wO9A70D0APQA78DvQPQA9ADvwO9A9AD0AO/A70DvwO9A/QCvQO/A70D0APQA78DvQPQA9ADvwO9A78DvQO9A9AD0AO9A9AD0AO9A9AD0AO9A9AD0AOoBL8DrASgBL8DpASTBL8DmQSHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKiAq2Ab4BxwHiAfwBiAqICokKwwPDA8MDwwOJCokKiQqKCsEDwQPBA8EDwQOKCooKiwrUA4wKUVKmAacBxgXGBcYFxgX1BfgF/AWBBqUIpwipCK8IsQi5CLsIvQjNCM8I0Qi0AsQDxQPNA9EDzQPWA9cDzQPeA+EDQuMDzQPoA+kD4wPtA+MD7wPyA/QD9AP0A4EEggThA80D9AOOBI8E4QPhA+EDjAqMCowKjAqMCowKjQrABcMFxwWiAe0B7gHIAckB4wG2BLcEugS7BIcFwAXMBc4F9AX3BYYGiwb8B/wHpgioCKsIsAiyCLUIugi8CL8IyQjOCNAI0wjCCdQJ1QnUCcIDygOOAdMD2QPcA90D4gPnA5AEkQSbBK4EmwSmBJsEnATgBI0KjQqNCo0KjQqOCu8B8AHxAcsBzAHNAeUB/gGqCLYItwi4CL4IygjLCMwI0gjMA9UD2wPsA50EnQSdBI4KjgqOCo4KjgqOCo4KjwrWBtcG5QbmBo8KjwqPCpAKuAHAAc4B5gGEBokG0QbSBtQG2AbgBuEG4wbnBoEIggiBCIgIjQiPCIEIlAidCKEIrAjACNQI6wOQCpAKkAqRCvQH+AeRCpIKjgaPBpAGkQaSBpIGkwaUBpUGlgaXBrgGuQa6BrsGvAa8Br0Gvga/BsAGwQbsBu0G7gbvBvAGjQeOB48HkAeRB/UH+QeSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkwrFB8gH6AfpB+8H8AeTCpQK8QaSB/8HgAiHCIcIiwiMCJIIkwiUCpQKlAqUCpQKlQrTBtUG4gbkBpUKlQqVCpYKBb8JzQmXCjs8Ozw7PNQF1QXWBdcFU1RVVkxNWFk7PGxtOzw7PDw7PNAF0QXSBdMFqAGpAaoBqwGbAZwBnQGeAZkBoAE7PDs8PMUBxgHcAd0B1gHXAcYBPDycAp0CogI7pQI7O7ICswK5AroCO74CvwLAAsECwwLHAsgCyQLOAs8C0ALVAtYC2ALZAtoC2wLkAuUCO+gC6QKAA4EDggODA4QDiQO6Ao4DjwORA5IDoAOhA6ADqAO0A7UDuAO6ArAEsQS7Bb0FvgW/BcoFywXQBdEF0gXTBdQF1QXWBdcFywW/BcsFvwU7PIMGOzw7PDs8Ozw7PDs8OzyuB68HrgevB8MHxAfDB8QHwwfEB8MHxAc7PDs8Ozw7PNAH0QfbB9wH3QfeB+YH5wc7PDs8Ozw7PDs8Ozw7PDw7PDs8OzyJCIoIkQiKCDs8OzyYCJkImwicCJ8IoAijCKQIrQiuCLMItAjBCMIIxQjGCMIIxgg8PDw8PK4ItAg7PDs7PM8J0AnQCTs8PDw8PL4Dfr4DvgO+A74DvgO+A+YDvgO+A74DvgO+A74DvgO+A74DvgO+A74DvgO+A74DvgO+A74DqQShBJQEngagBju3Bc4JlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpgKoAKQA7cDgwGEAYUBmAL4A/gD+wP+A/gDjASYCpgKmQrvAvACmQqaCqMCoQG3Ab8BygHkAf0BngKfAqMCowKkAqYCowK7ArwCowLCAsQC1wLcAuYC5wK2A6MC8gX2BfkF/gXLB8sHywfMB80HzQfLB8sHywfMB80HzQfLB8sHywfPB80HzQfLB8sHywfPB80HzQfUB9UH1gfXB9kH2gfUB9UH1gfXB9kH2gfgB+EH4gfjB9oH5QfgB+EH4gfjB9oH5QejAqMC1AfDCMQI4AfHCMgIyAOVAWdmSqwBmwJvc8gDyAPNAvkDyAP8A/8D9QLIA4oEqgSiBJYEmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpsKcnbLA88DzwPLA8sDywPLA88DywPLA5sKmwqbCpwKhASdCoMChAKFAocChAKIAnzgA+QD5APkA/AD4APgA+AD4APgA+ADgwTgA6sErQTgA6MEpQTgA5cEmgSdCp0KnQqeCk+kAbkBwQHPAecB/wHCBcIFhQaKBp4IogjFCcwJ2AmYBJgEmASeCp4KngqeCp4KngqeCp4KngqeCp4KngqfCsQJywnXCaAK/Qf+B8MJygnWCaAKoAqhCk6jAcEFwQWhCqEKoQoKlocT8wkGACAAQAALGwEBfyMJIQEgACMJaiQJIwlBD2pBcHEkCSABCwQAIwkLBgAgACQJCwoAIAAkCSABJAoLEAAjBUUEQCAAJAUgASQGCwtPAQN/IABBuJsBNgIAIABBGGoiBRB3IABBOGoiBhB3IABB2ABqIgcQdyAFIAEQkQEaIAYgAhCRARogByADEJEBGiAAIARBAXE6AHgg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IgAEQCAAKAIAKAIEIQQgACAEQf8DcUGEBWoRAwALQSgQlwkiACACEHogAEHYmwE2AgAgACACKAIgNgIgIAMgADYCAEEBC3wBAX8gAiADEI8BRQRAQQAPCyAAQRhqIgMrAwAgAWNFBEBBAA8LIAMgATkDACAAQSBqIgMoAgAiAARAIAAoAgAoAgQhBCAAIARB/wNxQYQFahEDAAtBKBCXCSIAIAIQeiAAQdibATYCACAAIAIoAiA2AiAgAyAANgIAQQELWQEBfyAAIAFGBEAgAA8LIAAgASsDCDkDCCAAIAErAxA5AxAgACABKwMYOQMYQSgQlwkiAiABKAIgIgEQeiACQdibATYCACACIAEoAiA2AiAgACACNgIgIAALQgEBfyAAIAErAwggAisDCKAgASsDECACKwMQoCABKwMYIAIrAxigEHggAEHgnAE2AgBBKBCXCSIDEEUgACADNgIgCyIBAX8gACABKAIgIgIQeiAAQdibATYCACAAIAIoAiA2AiALlwIBBX8jCSEFIwlBkAFqJAkgBSICQThqIQQgAkGE/AA2AgAgBEGY/AA2AgAgAkE4aiACQQRqIgMQ2QUgAkEANgKAASACQX82AoQBIAJB7JsBNgIAIARBgJwBNgIAIAMQ3QUgA0GgnAE2AgAgAkEkaiIGQgA3AgAgBkIANwIIIAJBEDYCNCACQaPbAUEDED0gASsDCBDqBUHg3AFBAhA9IAErAxAQ6gVB4NwBQQIQPSABKwMYEOoFQafbAUEFED0gASgCIBBXGiAAIAMQSyACQeybATYCACAEQYCcATYCACADQaCcATYCACAGLAALQQBOBEAgAxC+BSAEELsFIAUkCQ8LIAYoAgAQtwUgAxC+BSAEELsFIAUkCQsvAQF/IABB8JwBNgIAIABBCGoiAxB3IABBKGoiABB3IAMgARCRARogACACEJEBGgs1AQF/IABB8JwBNgIAIABBCGoiAhB3IABBKGoiABB3IAIgAUEIahCRARogACABQShqEJEBGgssAgF/AXwjCSEBIwlBIGokCSABIABBKGogAEEIahCHASABEH8hAiABJAkgAgtIAQN/IwkhAyMJQdAAaiQJIANBQGsiBCACOQMAIAMgAUEoaiABQQhqIgEQhwEgA0EgaiIFIAMgBBCSASAAIAUgARCLASADJAkLeAEEfyAAQYCdATYCACAAQQxqIgMoAgBFBEAPCyAAKAIIIgEoAgAiBCAAQQRqIgIoAgBBBGoiACgCADYCBCAAKAIAIAQ2AgAgA0EANgIAIAEgAkYEQA8LIAEhAANAIAAoAgQhASAAELcFIAEgAkcEQCABIQAMAQsLC4MBAQV/IABBgJ0BNgIAIABBDGoiASgCAEUEQCAAELcFDwsgACgCCCICKAIAIgQgAEEEaiIDKAIAQQRqIgUoAgA2AgQgBSgCACAENgIAIAFBADYCACACIANGBEAgABC3BQ8LA0AgAigCBCEBIAIQtwUgASADRwRAIAEhAgwBCwsgABC3BQsnAQF/IABBgJ0BNgIAIABBBGoiASABNgIAIAAgATYCCCAAQQA2AgwLYAECf0HQABCXCSICQZCdATYCACACQQhqIAEQaUEMEJcJIgEgAjYCCCABIABBBGoiAjYCBCABIAIoAgAiAzYCACADIAE2AgQgAiABNgIAIABBDGoiACAAKAIAQQFqNgIACwQAQQALCQAgAEEIahBqCw0AIAAgAUEIaiACEGsLYAECf0GIARCXCSICQaydATYCACACQQhqIAEQOUEMEJcJIgEgAjYCCCABIABBBGoiAjYCBCABIAIoAgAiAzYCACADIAE2AgQgAiABNgIAIABBDGoiACAAKAIAQQFqNgIACwQAQQELBwAgACsDEAsNACAAIAFBCGogAhA6CycBAX8gAEHInQE2AgAgAEEIaiIBQgA3AwAgAUIANwMIIAFCADcDEAsgACAAQcidATYCACAAIAE5AwggACACOQMQIAAgAzkDGAsnACAAQcidATYCACAAIAE5AwggACACOQMQIABEAAAAAAAAAAA5AxgLKQAgAEHInQE2AgAgACABKwMIOQMIIAAgASsDEDkDECAAIAErAxg5AxgLJQEBfCAAKwMIIgEgAaIgACsDECIBIAGioCAAKwMYIgEgAaKgnwtnAQZ8IAErAxAhAyACKwMYIQQgASsDGCEFIAIrAxAhBiACKwMIIQcgASsDCCEIIABByJ0BNgIAIAAgAyAEoiAFIAaioTkDCCAAIAUgB6IgBCAIoqE5AxAgACAGIAiiIAMgB6KhOQMYCyUAIAArAwggASsDCKIgACsDECABKwMQoqAgACsDGCABKwMYoqALcAICfwR8IABBCGoiASsDACIDIAOiIABBEGoiAisDACIE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nyIHIAZEAAAAAAAAAAAQeCAEIAeaIAErAwBEAAAAAAAAAAAQeCAFIAIgAxCUASAEIAIgAxCUASAAIAUrAwggBCsDCCAFKwMYIgYgBCsDGCIHZCIBGzkDACAAIAYgByABGzkDCCAEJAkLHQBEAAAAAAAAAABEAAAAAAAA8L8gACsDKCABZhsLBwAgACsDKAtGACAAQfShATYCACAAIAE5AyAgACABRAAAAAAAAOA/oiIBOQMoIAAgAjkDMCAAIAE5AwggAEEQaiIAQgA3AwAgAEIANwMIC0UBAX8gACABQdgAahB6IABBCGoiAyADKwMAIAErA3ggAisDAKKgOQMAIABBEGoiACAAKwMAIAErA4ABIAIrAwiioDkDAAtsAQN/IwkhAyMJQeAAaiQJIAEoAgAoAgAhBCADQSBqIgUgASACIARBH3FBqgpqEQsAIAEoAgAoAgghBCADIAEgAiAEQR9xQaoKahELACADQUBrIgIgAUGIAWogAxCMASAAIAUgAhCLASADJAkLKgAgACABKwOAASACKwMAoiABKwN4IAIrAwiiRAAAAAAAAAAAEHggABB+C0kBA38jCSECIwlBQGskCSACEJcCIAIgARCYAiAAKAIAKAIEIQMgAkEYaiIEIAAgAiADQR9xQaoKahELACAEKwMQIQEgAiQJIAELegEDfyMJIQMjCUHwAGokCSADQShqIgQgASsDeCACKwMAojkDACADQdAAaiIFIAQgAUGwAWoQjAEgA0EwaiIEIAFB2ABqIAUQiwEgAyABKwOAASACKwMIojkDACADQQhqIgIgAyABQdABahCMASAAIAQgAhCLASADJAkLbAEDfyMJIQMjCUHQAGokCSADQcgAaiIEIAIrAwAgASsDgAGiOQMAIANBKGoiBSAEIAFBsAFqEIwBIAMgAisDCCABKwN4ojkDACADQQhqIgIgAyABQdABahCMASAAIAUgAhCLASAAEH4gAyQJC2EBBH8jCSECIwlB4ABqJAkgAkFAayIDEJcCIAMgARCYAiAAKAIAKAIEIQQgAkEgaiIFIAAgAyAEQR9xQaoKahELACACIABBkAFqIAUQhwEgAiAAQfABahB9IQEgAiQJIAELmAEBA38jCSEFIwlBIGokCSAAQbCiATYCACAAQRBqEJcCIABBKGoQlwIgAEFAaxCXAiAAQdgAaiIGEHcg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QZSnATYCACAAQSxqIgYgACgCKDYCACAAQdgAaiIDKAIAIgIEQCACIABB3ABqIgQoAgAiAUYEfyACBQNAIAFBiH9qIgEoAgAoAgAhBSABIAVB/wNxQYQFahEDACABIAJHDQALIAMoAgALIQEgBCACNgIAIAEQtwULIABBzABqIgMoAgAiAgRAIAIgAEHQAGoiBCgCACIBRgR/IAIFA0AgAUGIf2oiASgCACgCACEFIAEgBUH/A3FBhAVqEQMAIAEgAkcNAAsgAygCAAshASAEIAI2AgAgARC3BQsgAEFAayIFKAIAIgMEQCADIABBxABqIgcoAgAiAUYEfyADBQNAIAFBdGoiAigCACIEBEAgBCABQXhqIggoAgAiAUYEfyAEBQNAIAFBYGoiASgCACgCACEJIAEgCUH/A3FBhAVqEQMAIAEgBEcNAAsgAigCAAshASAIIAQ2AgAgARC3BQsgAiADRwRAIAIhAQwBCwsgBSgCAAshASAHIAM2AgAgARC3BQsgAEG8owE2AgAgACgCKCIARQRADwsgBiAANgIAIAAQtwULDAAgABCAAyAAELcFC9sBAQN/IAAQhQMgAEEoaiICKAIAKAIAIgEoAgAoAhghAyABIANB/wNxQYQFahEDACACKAIAKAIEIgEoAgAoAhghAyABIANB/wNxQYQFahEDACACKAIAKAIAIgEoAgBBQGsoAgAhAyABIANB/wFxQTpqEQUAIgEgAEHMAGoiA0cEQCADIAEoAgAgASgCBBCGAwsgAigCACgCBCICKAIAQUBrKAIAIQEgAiABQf8BcUE6ahEFACICIABB2ABqIgFGBEAgABCMAw8LIAEgAigCACACKAIEEIYDIAAQjAML2wEBBH8gACgCTCICIABB0ABqIgMoAgAiAUcEQANAIAFBiH9qIgEoAgAoAgAhBCABIARB/wNxQYQFahEDACABIAJHDQALCyADIAI2AgAgACgCWCICIABB3ABqIgMoAgAiAUcEQANAIAFBiH9qIgEoAgAoAgAhBCABIARB/wNxQYQFahEDACABIAJHDQALCyADIAI2AgAgAEEoaiIAKAIAKAIAIgEoAgAoAiQhAiABIAJB/wNxQYQFahEDACAAKAIAKAIEIgAoAgAoAiQhASAAIAFB/wNxQYQFahEDAAvbAQEDfyAAEIUDIABBKGoiAigCACgCACIB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ACAMIBQgDSsDECALKwMAEHggCCsDACEUIApB4ANqIg4gBkQAAAAAAADwPyAGKAIAKAIIQQ9xQZgKahEOACANIBQgDisDECALKwMAEHggBCsDACEUIApB8AFqIgMgBkQAAAAAAADwPyAGKAIAKAIIQQ9xQZgKahEOACAOIBQgAysDECALKwMAEHggAyAQIAwQ9gIgCiIFIA0gDhD2AiAAQShqIhIoAgAoAgAiAigCACgCICEBIAIgAyABQf8AcUGYCWoRBAAgEigCACgCACICKAIAKAIgIQEgAiAFIAFB/wBxQZgJahEEACAJKAIAIgEgACgCVEYEQCAHIAMQ3gIFIAFB3KABNgIAIAFBCGogA0EIahB6IAFBKGogA0EoahB6IAFByABqIANByABqEHogAUHoAGogA0HoAGoQ0gEgCSAJKAIAQfgAajYCAAtBrOUCQZrwAUEZED0aIApB+ARqIglB3KABNgIAIAlBCGogA0EIahB6IAlBKGogA0EoahB6IAlByABqIANByABqEHogCUHoAGogA0HoAGoQ0gEgCkGABGoiAUHcoAE2AgAgAUEIaiAFQQhqEHogAUEoaiAFQShqEHogAUHIAGogBUHIAGoQeiABQegAaiAFQegAahDSASAAIAZEAAAAAAAAAABEAAAAAAAA8D8gCSABEJQDIAFB3KABNgIAIAFB6ABqIgQoAgAiAgRAIAIgAUHsAGoiCCgCACIBRgR/IAIFA0AgAUH4fmoiASgCACgCACEHIAEgB0H/A3FBhAVqEQMAIAEgAkcNAAsgBCgCAAshASAIIAI2AgAgARC3BQsgCUHcoAE2AgAgCUHoAGoiBCgCACICBEAgAiAJQewAaiIIKAIAIgFGBH8gAgUDQCABQfh+aiIBKAIAKAIAIQcgASAHQf8DcUGEBWoRAwAgASACRw0ACyAEKAIACyEBIAggAjYCACABELcFCyAFQdygATYCACAFQegAaiIEKAIAIgIEQCACIAVB7ABqIggoAgAiAUYEfyACBQNAIAFB+H5qIgEoAgAoAgAhByABIAdB/wNxQYQFahEDACABIAJHDQALIAQoAgALIQEgCCACNgIAIAEQtwULIANB3KABNgIAIANB6ABqIgQoAgAiAgRAIAIgA0HsAGoiCCgCACIBRgR/IAIFA0AgAUH4fmoiASgCACgCACEHIAEgB0H/A3FBhAVqEQMAIAEgAkcNAAsgBCgCAAshASAIIAI2AgAgARC3BQsgAEHYAGoiBygCACIIIABB3ABqIgQoAgAiAUcEQANAIAFBiH9qIgEoAgAoAgAhAiABIAJB/wNxQYQFahEDACABIAhHDQALCyAEIAg2AgAgDCAGRAAAAAAAAAAAIAYoAgAoAghBD3FBmApqEQ4AIBAgDCsDCCATKwMAIAsrAwAQeCANIAZEAAAAAAAAAAAgBigCACgCCEEPcUGYCmoRDgAgDCANKwMIIBErAwAgCysDABB4IA4gBkQAAAAAAADwPyAGKAIAKAIIQQ9xQZgKahEOACANIA4rAwggEysDACALKwMAEHggAyAGRAAAAAAAAPA/IAYoAgAoAghBD3FBmApqEQ4AIA4gAysDCCARKwMAIAsrAwAQeCADIBAgDBD2AiAFIA0gDhD2AiASKAIAKAIEIgIoAgAoAiAhASACIAMgAUH/AHFBmAlqEQQAIBIoAgAoAgQiAigCACgCICEBIAIgBSABQf8AcUGYCWoRBAAgBCgCACIBIAAoAmBGBEAgByADEN4CBSABQdygATYCACABQQhqIANBCGoQeiABQShqIANBKGoQeiABQcgAaiADQcgAahB6IAFB6ABqIANB6ABqENIBIAQgBCgCAEH4AGo2AgALQazlAkG08AFBGRA9GiAKQegCaiIEQdygATYCACAEQQhqIANBCGoQeiAEQShqIANBKGoQeiAEQcgAaiADQcgAahB6IARB6ABqIANB6ABqENIBIApB+ABqIgJB3KABNgIAIAJBCGogBUEIahB6IAJBKGogBUEoahB6IAJByABqIAVByABqEHogAkHoAGogBUHoAGoQ0gEgACAGRAAAAAAAAAAARAAAAAAAAPA/IAQgAhCVAyACQdygATYCACACQegAaiIIKAIAIgEEQCABIAJB7ABqIgcoAgAiAEYEfyABBQNAIABB+H5qIgAoAgAoAgAhAiAAIAJB/wNxQYQFahEDACAAIAFHDQALIAgoAgALIQAgByABNgIAIAAQtwULIARB3KABNgIAIARB6ABqIggoAgAiAQRAIAEgBEHsAGoiBygCACIARgR/IAEFA0AgAEH4fmoiACgCACgCACECIAAgAkH/A3FBhAVqEQMAIAAgAUcNAAsgCCgCAAshACAHIAE2AgAgABC3BQsgBUHc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CkEEaiEVIApBCGohFiAAQTBqIRAgAEE0aiEXIABBLGohGAJAAkADQAJAIAZBADYCACAHQQA2AgAgEUEANgIAIAggDSgCACgCECILNgIAIAshAEEAIQFBACECA0AgASACRgRAIAYgCBDgAQUgASAANgIAIAcgBygCAEEEajYCAAsgDigCACIDBEAgCCgCACECIA4hASADIQADQCABIAAgACgCECACSSIEGyEBIABBBGogACAEGygCACIADQALIAEgDkcEQCACIAEoAhBPBEAgASgCBCIABEADQCAAKAIAIgIEQCACIQAMAQsLBSABIAFBCGoiACgCACICKAIARgR/IAIFA38gACgCACIEQQhqIgAoAgAhAiACKAIAIARHDQAgAgsLIQALIAEgDSgCAEYEQCANIAA2AgALIAwgDCgCAEF/ajYCACADIAEQmgMgARC3BQsLCyAIKAIAIQMgD0EANgIAIAlBADYCACASQQA2AgAgAyEEIAMgAygCBCIAIgFGBH9BACEDQQAFQQAhE0EAIRRBACECA0AgACgCCCEZIAAoAgxBEGohACAKIAQ2AgAgFSAZNgIAIBYgADYCACATIBRJBEAgAiAKKQIANwIAIAIgCigCCDYCCCAJIAkoAgBBDGo2AgAFIA8gChCbAwsgASgCBCIAIgEgA0cEQCAJKAIAIgIhEyASKAIAIRQMAQsLIA8oAgAiAwsiBEEEaiEAIARBCGohAQNAIAEoAgAiAkEEaiEBIAJBCGohAiAAKAIAIgAoAhgEQCABIQAgAiEBDAELCyAIIAA2AgAgBARAIAkgBDYCACADELcFIAgoAgAhAAsgACALRwRAIAcoAgAhASARKAIAIQIMAQsLIBAoAgAiASAXKAIARgRAIBggBhCcAyAGKAIAIQAFIAFBADYCACABQQRqIgNBADYCACABQQhqIgRBADYCACAHKAIAIAYoAgAiAGsiAkECdSELIAIEQCALQf////8DSw0CIAMgAhCXCSICNgIAIAEgAjYCACAEIAtBAnQgAmo2AgAgBygCACAGKAIAIgBrIgFBAEoEQCACIAAgARDhCRogAyABQQJ2QQJ0IAJqNgIACwsgECAQKAIAQQxqNgIACyAABEAgByAANgIAIAAQtwULIAwoAgANAQwCCwsQJQwBCyAFJAkLC88LAQl/An8CQCABKAIAIgYEfyABKAIEIgIEfwNAIAIoAgAiAwRAIAMhAgwBCwsgAgUgASEDIAEhBCAGIQIMAgsFIAEhAiABCyEDIAIoAgQiBgR/IAIhBCAGIQIMAQUgAkEIaiEFIAIhBkEACwwBCyACIARBCGoiBigCADYCCCAGIQVBASEIIAQhBiACCyEEIAUoAgAiBygCACICIAZGBEAgByAENgIAIAAgBkYEfyAEIQBBAAUgBygCBAshAgUgByAENgIECyAGQQxqIgosAAAhByABIAZHBEAgBSABQQhqIgUoAgAiCTYCACAJIAlBBGogASAFKAIAKAIARhsgBjYCACADIAEoAgAiAzYCACADIAY2AgggBiABKAIEIgM2AgQgAwRAIAMgBjYCCAsgCiABLAAMOgAAIAYgACAAIAFGGyEACyAHQQBHIABBAEdxRQRADwsgCARAIARBAToADA8LAkACQAJAAkACQAJAAkACQAJAAkADQAJAIAJBDGoiAywAAEEARyEBIAIgAkEIaiIEKAIAIgUoAgBGBEAgAQRAIAIhAQUgA0EBOgAAIAVBADoADCAFIAJBBGoiAygCACIBNgIAIAEEQCABIAU2AggLIAQgBUEIaiIGKAIANgIAIAYoAgAiBCgCACAFRgRAIAQgAjYCACAFKAIAIQEFIAQgAjYCBAsgAyAFNgIAIAYgAjYCACACIAAgACAFRhshAAsgASgCACIERSICRQRAIAQsAAxFDQgLIAEoAgQiAwRAIAMsAAxFDQcLIAFBADoADCABKAIIIgEsAAxFIAAgAUZyDQUFIAEEQCACIQEFIANBAToAACAFQQA6AAwgBUEEaiIBKAIAIgQoAgAhAyABIAM2AgAgAwRAIAMgBTYCCAsgBCAFQQhqIgMoAgA2AgggAygCACIBIAFBBGogBSABKAIARhsgBDYCACAEIAU2AgAgAyAENgIAIAIoAgAiAygCBCEBIAIgACAAIANGGyEACyABKAIAIgcEQCAHLAAMRQ0ECyABKAIEIgIEQCACLAAMRQ0FCyABQQA6AAwgACABKAIIIgFGDQEgASwADEUEQCABIQAMAgsLIAEoAggiAkEEaiACIAEgAigCAEYbKAIAIQIMAQsLIABBAToADA8LIAEoAgQiAgRAIAEhAAwFBSABIQAMBwsACyABIQAMAwsgAUEBOgAMDwsgAUEEaiEAIAIEfyAAIQIgAwUgBEEMaiIALAAARQ0DIAFBBGoiACECIAAoAgALIgRBDGoiA0EBOgAAIAFBDGoiAEEAOgAAIAIgBCgCACICNgIAIAIEQCACIAE2AggLIARBCGoiAiABQQhqIgUoAgA2AgAgBSgCACIGIAZBBGogASAGKAIARhsgBDYCACAEIAE2AgAgBSAENgIADAQLIARBDGohAAwBCyACQQxqIgIsAAANASACIQAgAUEMaiEEIAFBCGohAgwDCyABQQhqIQIgAUEMaiEDDAELIAdBDGoiBEEBOgAAIAFBDGoiA0EAOgAAIAAgB0EEaiIAKAIAIgI2AgAgAgRAIAIgATYCCAsgB0EIaiICIAFBCGoiBSgCADYCACAFKAIAIgYgBkEEaiABIAYoAgBGGyAHNgIAIAAgATYCACAFIAc2AgAgAyEADAELIAMgAigCACIEQQxqIgEsAAA6AAAgAUEBOgAAIABBAToAACAEIAQoAgAiA0EEaiIAKAIAIgE2AgAgAQRAIAEgBDYCCAsgAyAEQQhqIgIoAgA2AgggAigCACIBIAFBBGogBCABKAIARhsgAzYCACAAIAQ2AgAgAiADNgIADwsgBCACKAIAIgNBDGoiASwAADoAACABQQE6AAAgAEEBOgAAIANBBGoiACgCACICKAIAIQEgACABNgIAIAEEQCABIAM2AggLIAIgA0EIaiIBKAIANgIIIAEoAgAiACAAQQRqIAMgACgCAEYbIAI2AgAgAiADNgIAIAEgAjYCAAv7AQEJfyAAQQRqIgcoAgAgACgCACIEayIFQQxtIghBAWoiA0HVqtWqAUsEQBAlCyADIABBCGoiCSgCACAEa0EMbSICQQF0IgogCiADSRtB1arVqgEgAkGq1arVAEkbIgMEQCADQdWq1aoBSwRAQQgQBCICEJkJIAJBtNgBNgIAIAJB0JkBQesBEAYFIANBDGwQlwkhBgsLIAhBDGwgBmoiAiABKQIANwIAIAIgASgCCDYCCCAFQXRtQQxsIAJqIQEgBUEASgRAIAEgBCAFEOEJGgsgACABNgIAIAcgAkEMajYCACAJIANBDGwgBmo2AgAgBEUEQA8LIAQQtwUL1gQBDH8gAEEEaiIMKAIAIgIgACgCACIEa0EMbSIGQQFqIgdB1arVqgFLBEAQJQsgByAAQQhqIg0oAgAgBGtBDG0iBUEBdCIDIAMgB0kbQdWq1aoBIAVBqtWq1QBJGyIIBEAgCEHVqtWqAUsEQEEIEAQiAxCZCSADQbTYATYCACADQdCZAUHrARAGBSAIQQxsEJcJIQsLCyAGQQxsIAtqIgVBADYCACAGQQxsIAtqQQRqIglBADYCACAGQQxsIAtqQQhqIgNBADYCACABKAIEIAEoAgAiAWsiCkECdSEHIAoEQCAHQf////8DSwRAECULIAkgChCXCSIGNgIAIAUgBjYCACADIAdBAnQgBmo2AgAgCkEASgRAIAYgASAKEOEJGiAJIApBAnZBAnQgBmo2AgALCyAIQQxsIAtqIQggBUEMaiEJIAIgBCIDRgR/IAAgBTYCACAMIAk2AgAgDSAINgIAIAQFIAUhAQNAIAFBdGoiBEEANgIAIAFBeGoiBUEANgIAIAFBfGoiB0EANgIAIAQgAkF0aiIBKAIANgIAIAUgAkF4aiIFKAIANgIAIAcgAkF8aiICKAIANgIAIAJBADYCACAFQQA2AgAgAUEANgIAIAEgA0cEQCABIQIgBCEBDAELCyAMKAIAIQIgACgCACIBIQMgACAENgIAIAwgCTYCACANIAg2AgAgAiADRgR/IAEFIAIhAAN/IABBdGoiAigCACIEBEAgAEF4aiAENgIAIAQQtwULIAIgA0YEfyABBSACIQAMAQsLCwsiAEUEQA8LIAAQtwULvwQBD38jCSEHIwlBIGokCSAAQQA2AgAgAEEEaiIKQQA2AgAgAEEIaiIPQQA2AgAgASgCLCIGIAEoAjAiEEYEQCAHJAkPCyAHQQxqIghBBGohCSAIQQhqIQ0gByIEQQRqIQUgBEEIaiELAkACQANAAkAgCEEANgIAIAlBADYCACANQQA2AgAgBkEEaiICKAIAIAYoAgBrIgFBAnUhAwJAAkAgAUUNACADQf////8DSw0CIAkgARCXCSIBNgIAIAggATYCACANIANBAnQgAWo2AgAgAigCACAGKAIAIgJrIgNBAEwNACABIAIgAxDhCRogCSADQQJ2QQJ0IAFqIg42AgAgBEEANgIAIAVBADYCACALQQA2AgAgASAORwRAAkBBACEMQQAhAwNAIAEoAgBBIGohAiADIAxGBEAgBCACELQBBSAMIAIQeiAFIAUoAgBBIGo2AgALIA4gAUEEaiIBRg0BIAUoAgAhDCALKAIAIQMMAAsACwsMAQsgBEEANgIAIAVBADYCACALQQA2AgALIAooAgAiASAPKAIARgRAIAAgBBCfAwUgASAEEJ4DIAogCigCAEEMajYCAAsgBCgCACICBEAgAiAFKAIAIgFGBH8gAgUDQCABQWBqIgEoAgAoAgAhAyABIANB/wNxQYQFahEDACABIAJHDQALIAQoAgALIQEgBSACNgIAIAEQtwULIAgoAgAiAQRAIAkgATYCACABELcFCyAQIAZBDGoiBkcNAQwCCwsQJQwBCyAHJAkLC6cBAQV/IABBADYCACAAQQRqIgNBADYCACAAQQhqIgRBADYCACABQQRqIgUoAgAgASgCAGsiAkUEQA8LIAJBBXUiBkH///8/SwRAECULIAMgAhCXCSICNgIAIAAgAjYCACAEIAZBBXQgAmo2AgAgASgCACIAIAUoAgAiBEYEQA8LIAIhAQNAIAEgABB6IAMgAygCAEEgaiIBNgIAIABBIGoiACAERw0ACwvzAwEKfyAAQQRqIgYoAgAgACgCACIDa0EMbSIEQQFqIgJB1arVqgFLBEAQJQsgAiAAQQhqIgooAgAgA2tBDG0iA0EBdCIFIAUgAkkbQdWq1aoBIANBqtWq1QBJGyIHBEAgB0HVqtWqAUsEQEEIEAQiAhCZCSACQbTYATYCACACQdCZAUHrARAGBSAHQQxsEJcJIQkLCyAEQQxsIAlqIgQgARCeAyAAKAIAIgUgBigCACIBRgR/IAQhAyAFIgEFIAQhAgNAIAJBdGoiA0EANgIAIAJBeGoiCEEANgIAIAJBfGoiC0EANgIAIAMgAUF0aiICKAIANgIAIAggAUF4aiIIKAIANgIAIAsgAUF8aiIBKAIANgIAIAFBADYCACAIQQA2AgAgAkEANgIAIAIgBUcEQCACIQEgAyECDAELCyAAKAIAIQEgBigCAAshAiAAIAM2AgAgBiAEQQxqNgIAIAogB0EMbCAJajYCACACIAEiBEcEQCACIQADQCAAQXRqIgIoAgAiAwRAIAMgAEF4aiIFKAIAIgBGBH8gAwUDQCAAQWBqIgAoAgAoAgAhBiAAIAZB/wNxQYQFahEDACAAIANHDQALIAIoAgALIQAgBSADNgIAIAAQtwULIAIgBEcEQCACIQAMAQsLCyABRQRADwsgARC3BQsMACAAEIkDIAAQtwUL3g8CK38DfCMJIQsjCUGQAWokCSAAKAI8Ih0gACgCOCIIRgRAIAskCQ8LIAtBiAFqIRcgC0GEAWohGCALQYABaiEZIAtB4ABqIg5BCGohHiAOQQhqIR8gDkEIaiEgIAtBQGsiGkEIaiEhIABBBGohGyAAQRBqIQ0gAEEYaiEQIABBxABqISIgAEHIAGohIyALQSBqIglBEGohJCAJQRBqISUgCUEQaiEmIAlBCGohJyALIhFBEGohKCAJQRBqISkgAEHQAGohEiAAQdQAaiEPIABB2ABqIRMDQCAIKAJoIgogCCgCbCIqRwRAIAhBGGohHCAIQSBqISsDQCAOIAggCkHgAGoiAisDABD+AiAeKwMAIS0gDiAIIApB2ABqIgErAwAQ/gIgHysDACIuIC2hRAAAAAAAAAAAZARAIApBAToAaCAOIAggAisDABD+AiAAIA4gCiAgKwMAEKIDIQUgGiAIIAErAwAQ/gIgACAaIAogISsDABCiAyEGQTQQlwkiAiAFNgIIIAIgBjYCDCACQRhqIgxBADYCACACQSRqIgdBADYCACACQQA2AjAgAiANNgIEIAIgDSgCACIBNgIAIAEgAjYCBCANIAI2AgAgECAQKAIAQQFqNgIAQRAQlwkiASAGNgIIIAEgAjYCDCABIAU2AgQgASAFKAIAIgM2AgAgAyABNgIEIAUgATYCACAFQQhqIgEgASgCAEEBajYCAEEQEJcJIgEgBTYCCCABIAI2AgwgASAGQQxqIgM2AgQgASADKAIAIgQ2AgAgBCABNgIEIAMgATYCACAGQRRqIgEgASgCAEEBajYCAEE0EJcJIgEgBjYCCCABIAU2AgwgAUEYaiIUQQA2AgAgAUEkaiIVQQA2AgAgAUEANgIwIAEgDTYCBCABIA0oAgAiAzYCACADIAE2AgQgDSABNgIAIBAgECgCAEEBajYCAEEQEJcJIgMgBTYCCCADIAE2AgwgAyAGNgIEIAMgBigCACIENgIAIAQgAzYCBCAGIAM2AgAgBkEIaiIDIAMoAgBBAWo2AgBBEBCXCSIDIAY2AgggAyABNgIMIAMgBUEMaiIENgIEIAMgBCgCACIWNgIAIBYgAzYCBCAEIAM2AgAgBUEUaiIDIAMoAgBBAWo2AgAgAkEQaiIDIAY2AgAgAiAFNgIUIAwgAUEQaiIENgIAIAQgBTYCACABIAY2AhQgFCADNgIAIAIgBjYCHCACIAU2AiAgByAENgIAIAEgBTYCHCABIAY2AiAgFSADNgIAICIoAgAiAyAjKAIAIhRHBEAgCkH8AGohDANAIC0gA0EQaiIVKwMAIixjICwgLmNxBEAgAygCaCIEIAMoAmwiFkcEQANAIAkgAyAEQeAAaiICKwMAEP4CICQrAwAhLCAJIAMgBEHYAGoiASsDABD+AiAsIBwrAwAiLGMgLCAlKwMAY3EEQCAEQegAaiIHLAAARQRAIAkgAyACKwMAEP4CIAAgCSAEICYrAwAQogMaIBEgAyABKwMAEP4CIAAgESAEICgrAwAQogMaIAdBAToAACAcKwMAISwLIAkgFSsDACAsICsrAwAQeCAnKwMAISwgDCgCACICBEAgDCEBA0AgASACIAIrAxggLGMiBxshASACQQRqIAIgBxsoAgAiAg0ACwUgDCEBCyABKAIAIgIEQANAIAIoAgQiBwRAIAchAgwBCwsFIAEhAgNAIAIgAigCCCICKAIARg0ACwsgAigCECECIBEgASgCEDYCACAXIAI2AgAgKSsDACEsIARB/ABqIgEoAgAiAgRAA0AgASACIAIrAxggLGMiBxshASACQQRqIAIgBxsoAgAiAg0ACwsgASgCACICBEADQCACKAIEIgcEQCAHIQIMAQsLBSABIQIDQCACIAIoAggiAigCAEYNAAsLIAIoAhAhAiAYIAEoAhA2AgAgGSACNgIAIAAgCSAXIBEgGSAYIAogBBCjAwsgBEGIAWoiBCAWRw0ACwsLIBQgA0H4AGoiA0cNAAsLIAooAoABQQJGBEAgDygCACICBEAgDyEDIAIhAQNAIAMgASABKAIQIAVJIgQbIQMgAUEEaiABIAQbKAIAIgENAAsgAyAPRgR/IAIhAyACBSAFIAMoAhBJBH8gAiEDIAIFIAMoAgQiAQRAA0AgASgCACIEBEAgBCEBDAELCwUgAyADQQhqIgEoAgAiBCgCAEYEfyAEBQN/IAEoAgAiDEEIaiIBKAIAIQQgBCgCACAMRw0AIAQLCyEBCyADIBIoAgBGBEAgEiABNgIACyATIBMoAgBBf2o2AgAgAiADEJoDIAMQtwUgDygCACIDCwsiAQRAIA8hAgNAIAIgASABKAIQIAZJIgIbIQQgAUEEaiABIAIbKAIAIgEEQCAEIQIMAQsLIAQgD0cEQCAGIAQoAhBPBEAgBCgCBCICBEADQCACKAIAIgEEQCABIQIMAQsLBSAEIARBCGoiAigCACIBKAIARgR/IAEFA38gAigCACIMQQhqIgIoAgAhASABKAIAIAxHDQAgAQsLIQILIAQgEigCAEYEQCASIAI2AgALIBMgEygCAEF/ajYCACADIAQQmgMgBBC3BQsLCwsgBSANEKQDIAYgDRCkAyAbIAUQpQMgGyAGEKUDCwsgKiAKQYgBaiIKRw0ACwsgCEH4AGoiCCAdRw0ACyALJAkL5AQCBX8BfEHYABCXCSIGEKYDQQwQlwkiBCAGIgg2AgggBCAAQRxqIgU2AgQgBCAFKAIAIgc2AgAgByAENgIEIAUgBDYCACAAQSRqIgUgBSgCAEEBajYCACAGIAQ2AlAgBkEgaiABEJEBGiAGQQA2AhggAkH8AGoiASgCACIEBEACQCACQfwAaiEFIAQhAQJAAkADQAJAIAErAxgiCSADZARAIAEoAgAiBEUNAQUgCSADY0UNBCABQQRqIgUoAgAiBEUNAyAFIQELIAEhBSAEIQEMAQsLIAEhBAwCCyABIQQgBSEBDAELIAEhBCAFIQELBSABIQQLIAJB+ABqIQcgASgCAEUEQEEgEJcJIgUgCDYCECAFIAM5AxggBUEANgIAIAVBADYCBCAFIAQ2AgggASAFNgIAIAcoAgAoAgAiBARAIAcgBDYCACABKAIAIQULIAIoAnwgBRDaASACQYABaiIBIAEoAgBBAWo2AgALIABB1ABqIgEoAgAiAgRAAkAgAEHUAGohBCACIQECQAJAA0ACQCAGIAEoAhAiAkkEQCABKAIAIgJFDQEFIAIgBk8NBCABQQRqIgQoAgAiAkUNAyAEIQELIAEhBCACIQEMAQsLIAEhAgwCCyABIQIgBCEBDAELIAEhAiAEIQELBSABIQILIAEoAgAEQCAGDwtBFBCXCSIEIAg2AhAgBEEANgIAIARBADYCBCAEIAI2AgggASAENgIAIABB0ABqIgIoAgAoAgAiBQRAIAIgBTYCACABKAIAIQQLIAAoAlQgBBDaASAAQdgAaiIAIAAoAgBBAWo2AgAgBgukJwJKfwJ8IwkhMSMJQRBqJAlB2AAQlwkiCRCmA0EMEJcJIgggCSIeNgIIIAggAEEcaiILNgIEIAggCygCACIKNgIAIAogCDYCBCALIAg2AgAgAEEkaiILIAsoAgBBAWo2AgAgCSAINgJQIAlBIGogARCRARogCUEENgIYIAMoAgAhCgJAAkAgAigCACIbKAIEIgggG0YNACAIIQsDfyAKIAsoAghGDQEgGyAIKAIEIgsiCEcNAEEACyELDAELIAggG0YEf0EAIQtBAAUgCCgCDEEQaiILCyEjCyALKAIAITogCygCBCE7IAsoAgghKiALKAIMITwgCygCECE9IAsoAhQhKyAKKAIEIgggCkcEfyAIKAIIIBtHBH8DQCAIKAIEIgohCCAKKAIIIBtHDQALIAoFIAgLBSAICygCDCIIQRBqIjcoAgAhPiAIKAIUIT8gCCgCGCEsIAgoAhwhQCAIKAIgIUEgCCgCJCEtIAUoAgAhGgJAAkAgBCgCACIOKAIEIgggDkYiEAR/IAghCwwBBSAIIQogCCELA38gGiAKKAIIRg0CIA4gCygCBCIKIgtHDQBBAAsLIR8MAQsgCyAORgR/QQAFAkACQCAQDQAgCCELA38gGiALKAIIRg0BIA4gCCgCBCILIghHDQBBACEQQQALIQsMAQsgCCAORgR/QQAhC0EABSAIKAIMQRBqIgsLIRALIBooAgQiCCAaRwR/IAgoAgggDkcEfwNAIAgoAgQiCiEIIAooAgggDkcNAAsgCgUgCAsFIAgLKAIMIghBEGohHyAIKAIcITIgHygCACEzIBAoAgwhNCAQKAIAITUgCCgCICE2IAgoAhQhLiAQKAIQIS8gECgCBCEwIAgoAiQhJCAIKAIYISUgECgCFCEoIBAoAgghKUEBITggCwshIAtBNBCXCSITIBs2AgggEyAJNgIMIBNBGGoiQkEANgIAIBNBJGoiQ0EANgIAIBNBADYCMCATIABBEGoiDzYCBCATIA8oAgAiCDYCACAIIBM2AgQgDyATNgIAIABBGGoiDCAMKAIAQQFqNgIAQRAQlwkiACAeNgIIIAAgEzYCDCAAIBs2AgQgACAbKAIAIgg2AgAgCCAANgIEIBsgADYCACAbQQhqIgAgACgCAEEBajYCAEEQEJcJIgAgGzYCCCAAIBM2AgwgACAJQQxqIg02AgQgACANKAIAIgg2AgAgCCAANgIEIA0gADYCACAJQRRqIhwgHCgCAEEBajYCACAEKAIAIQtBNBCXCSIUIAk2AgggFCALNgIMIBRBEGohECAUQRhqIkRBADYCACAUQSRqIkVBADYCACAUQQA2AjAgFCAPNgIEIBQgEzYCACATIBQ2AgQgDyAUNgIAIAwgDCgCAEEBajYCAEEQEJcJIgAgCzYCCCAAIBQ2AgwgACAJNgIEIAAgCSgCACIINgIAIAggADYCBCAJIAA2AgAgCUEIaiIhICEoAgBBAWo2AgBBEBCXCSIAIB42AgggACAUNgIMIAAgC0EMaiIINgIEIAAgCCgCACIKNgIAIAogADYCBCAIIAA2AgAgC0EUaiIAIAAoAgBBAWo2AgAgBCgCACEAQTQQlwkiFSAANgIIIBUgCTYCDCAVQRBqIQ4gFUEYaiJGQQA2AgAgFUEkaiJHQQA2AgAgFUEANgIwIBUgDzYCBCAVIBQ2AgAgFCAVNgIEIA8gFTYCACAMIAwoAgBBAWo2AgBBEBCXCSIIIB42AgggCCAVNgIMIAggADYCBCAIIAAoAgAiCjYCACAKIAg2AgQgACAINgIAIABBCGoiCCAIKAIAQQFqNgIAQRAQlwkiCCAANgIIIAggFTYCDCAIIA02AgQgCCANKAIAIgo2AgAgCiAINgIEIA0gCDYCACAcIBwoAgBBAWo2AgAgAygCACEmQTQQlwkiFiAJNgIIIBYgJjYCDCAWQRhqIkhBADYCACAWQSRqIklBADYCACAWQQA2AjAgFiAPNgIEIBYgFTYCACAVIBY2AgQgDyAWNgIAIAwgDCgCAEEBajYCAEEQEJcJIgggJjYCCCAIIBY2AgwgCCAJNgIEIAggCSgCACIKNgIAIAogCDYCBCAJIAg2AgAgISAhKAIAQQFqNgIAQRAQlwkiCCAeNgIIIAggFjYCDCAIICZBDGoiCjYCBCAIIAooAgAiGjYCACAaIAg2AgQgCiAINgIAICZBFGoiCCAIKAIAQQFqNgIAIAMoAgAhIkE0EJcJIhcgIjYCCCAXIAk2AgwgF0EYaiJKQQA2AgAgF0EkaiJLQQA2AgAgF0EANgIwIBcgDzYCBCAXIBY2AgAgFiAXNgIEIA8gFzYCACAMIAwoAgBBAWo2AgBBEBCXCSIIIB42AgggCCAXNgIMIAggIjYCBCAIICIoAgAiCjYCACAKIAg2AgQgIiAINgIAICJBCGoiCCAIKAIAQQFqNgIAQRAQlwkiCCAiNgIIIAggFzYCDCAIIA02AgQgCCANKAIAIgo2AgAgCiAINgIEIA0gCDYCACAcIBwoAgBBAWo2AgAgBSgCACEKQTQQlwkiGCAJNgIIIBggCjYCDCAYQRBqIRogGEEYaiJMQQA2AgAgGEEkaiJNQQA2AgAgGEEANgIwIBggDzYCBCAYIBc2AgAgFyAYNgIEIA8gGDYCACAMIAwoAgBBAWo2AgBBEBCXCSIIIAo2AgggCCAYNgIMIAggCTYCBCAIIAkoAgAiHTYCACAdIAg2AgQgCSAINgIAICEgISgCAEEBajYCAEEQEJcJIgggHjYCCCAIIBg2AgwgCCAKQQxqIh02AgQgCCAdKAIAIhE2AgAgESAINgIEIB0gCDYCACAKQRRqIgggCCgCAEEBajYCACAFKAIAIQhBNBCXCSIZIAg2AgggGSAJNgIMIBlBEGohHSAZQRhqIk5BADYCACAZQSRqIk9BADYCACAZQQA2AjAgGSAPNgIEIBkgGDYCACAYIBk2AgQgDyAZNgIAIAwgDCgCAEEBajYCAEEQEJcJIhEgHjYCCCARIBk2AgwgESAINgIEIBEgCCgCACISNgIAIBIgETYCBCAIIBE2AgAgCEEIaiIRIBEoAgBBAWo2AgBBEBCXCSIRIAg2AgggESAZNgIMIBEgDTYCBCARIA0oAgAiEjYCACASIBE2AgQgDSARNgIAIBwgHCgCAEEBajYCACACKAIAISdBNBCXCSISIAk2AgggEiAnNgIMIBJBGGoiUEEANgIAIBJBJGoiUUEANgIAIBJBADYCMCASIA82AgQgEiAZNgIAIBkgEjYCBCAPIBI2AgAgDCAMKAIAQQFqNgIAQRAQlwkiDCAnNgIIIAwgEjYCDCAMIAk2AgQgDCAJKAIAIg02AgAgDSAMNgIEIAkgDDYCACAhICEoAgBBAWo2AgBBEBCXCSIMIB42AgggDCASNgIMIAwgJ0EMaiINNgIEIAwgDSgCACIcNgIAIBwgDDYCBCANIAw2AgAgJ0EUaiIMIAwoAgBBAWo2AgAgOAR/IAkgMiAgICRGIgwbIRwgACAzICAgJUYiIBshISAJIDQgHyAoRiINGyERIAggNSAfIClGIjkbITIgCiA2IAwbITMgCSAuICAbITQgCyAvIA0bITUgCSAwIDkbITYgGiAkIAwbIR8gECAoIA0bIQwgHSApIDkbIQ0gDiAlICAbBSAJIRwgACEhIAkhESAIITIgCiEzIAkhNCALITUgCSE2IBohHyAQIQwgHSENIA4LISAgF0EQaiIoICogKiA3RiIqGyEkIBZBEGoiKSAtICMgLUYiLRshJSATQRBqIi4gLCAjICxGIiwbISMgEkEQaiIvICsgKyA3RiIrGyIwIBs2AgAgMCAJNgIEIDAgLjYCCCATIAkgPCArGzYCHCATICcgPSArGzYCICBDIDA2AgAgLiAJNgIAIBMgCzYCFCBCIBA2AgAgFCAbNgIcIBQgCTYCICBFIC42AgAgECAhNgIAIBQgNDYCFCBEICA2AgAgICAJNgIMICAgCzYCECAgIBA2AhQgDCAANgIAIAwgCTYCBCAMIA42AgggFSARNgIcIBUgNTYCICBHIAw2AgAgDiAJNgIAIBUgJjYCFCBGICk2AgAgFiAANgIcIBYgCTYCICBJIA42AgAgKSAiIDogKhs2AgAgFiAJIDsgKhs2AhQgSCAkNgIAICQgCTYCDCAkICY2AhAgJCApNgIUICUgIjYCACAlIAk2AgQgJSAoNgIIIBcgCSBAIC0bNgIcIBcgJiBBIC0bNgIgIEsgJTYCACAoIAk2AgAgFyAKNgIUIEogGjYCACAYICI2AhwgGCAJNgIgIE0gKDYCACAaIDI2AgAgGCA2NgIUIEwgDTYCACANIAk2AgwgDSAKNgIQIA0gGjYCFCAfIAg2AgAgHyAJNgIEIB8gHTYCCCAZIBw2AhwgGSAzNgIgIE8gHzYCACAdIAk2AgAgGSAnNgIUIE4gLzYCACASIAg2AhwgEiAJNgIgIFEgHTYCACAvIBsgPiAsGzYCACASIAkgPyAsGzYCFCBQICM2AgAgIyAJNgIMICMgJzYCECAjIC82AhQgAigCACEOIAMoAgAhACAxQQFqIhAgMSILLAAAOgAAIA8gDiAAEKcDIABBDGohCiAAQRRqIhooAgAEQAJAIAAoAhAiACAKRwRAAkAgACEIA0AgDiAIKAIIRg0BIAogACgCBCIIIgBHDQALDAILCyAAIApHBEAgACgCBCIJIApHBEAgACEIA38gCUEIaiIdKAIAIA5HBEAgACAdKQIANwIIIAAoAgQiACEICyAJKAIEIgkgCkcNACAICyEACyAAIApHBEAgACgCACIIIAooAgBBBGoiCSgCADYCBCAJKAIAIAg2AgADQCAAKAIEIQggGiAaKAIAQX9qNgIAIAAQtwUgCCAKRwRAIAghAAwBCwsLCwsLIAMoAgAhCSACKAIAIQAgECALLAAAOgAAIA8gCSAAEKcDIABBDGohCCAAQRRqIgooAgAEQAJAIAAoAhAiACAIRwRAAkAgACECA0AgCSACKAIIRg0BIAggACgCBCICIgBHDQALDAILCyAAIAhHBEAgACgCBCIDIAhHBEAgACECA38gA0EIaiIOKAIAIAlHBEAgACAOKQIANwIIIAAoAgQiACECCyADKAIEIgMgCEcNACACCyEACyAAIAhHBEAgACgCACICIAgoAgBBBGoiAygCADYCBCADKAIAIAI2AgADQCAAKAIEIQIgCiAKKAIAQX9qNgIAIAAQtwUgAiAIRwRAIAIhAAwBCwsLCwsLIDgEQCAEKAIAIQkgBSgCACEAIBAgCywAADoAACAPIAkgABCnAyAAQQxqIQggAEEUaiIKKAIABEACQCAAKAIQIgAgCEcEQAJAIAAhAgNAIAkgAigCCEYNASAIIAAoAgQiAiIARw0ACwwCCwsgACAIRwRAIAAoAgQiAyAIRwRAIAAhAgN/IANBCGoiDigCACAJRwRAIAAgDikCADcCCCAAKAIEIgAhAgsgAygCBCIDIAhHDQAgAgshAAsgACAIRwRAIAAoAgAiAiAIKAIAQQRqIgMoAgA2AgQgAygCACACNgIAA0AgACgCBCECIAogCigCAEF/ajYCACAAELcFIAIgCEcEQCACIQAMAQsLCwsLCyAFKAIAIQUgBCgCACEAIBAgCywAADoAACAPIAUgABCnAyAAQQxqIQQgAEEUaiIIKAIABEACQCAAKAIQIgAgBEcEQAJAIAAhAgNAIAUgAigCCEYNASAEIAAoAgQiAiIARw0ACwwCCwsgACAERwRAIAAoAgQiAyAERwRAIAAhAgN/IANBCGoiCSgCACAFRwRAIAAgCSkCADcCCCAAKAIEIgAhAgsgAygCBCIDIARHDQAgAgshAAsgACAERwRAIAAoAgAiAiAEKAIAQQRqIgMoAgA2AgQgAygCACACNgIAA0AgACgCBCECIAggCCgCAEF/ajYCACAAELcFIAIgBEcEQCACIQAMAQsLCwsLCwsgASsDCCFSIAZB/ABqIgAoAgAiAgRAAkAgBkH8AGohAyACIQACQAJAA0ACQCBSIAArAxgiU2MEQCAAKAIAIgJFDQEFIFMgUmNFDQQgAEEEaiIDKAIAIgJFDQMgAyEACyAAIQMgAiEADAELCyAAIQIMAgsgACECIAMhAAwBCyAAIQIgAyEACwUgACECCyAGQfgAaiEEIAAoAgBFBEBBIBCXCSIDIB42AhAgAyBSOQMYIANBADYCACADQQA2AgQgAyACNgIIIAAgAzYCACAEKAIAKAIAIgIEQCAEIAI2AgAgACgCACEDCyAGKAJ8IAMQ2gEgBkGAAWoiACAAKAIAQQFqNgIACyABKwMQIVIgB0H8AGoiACgCACIBBEACQCAHQfwAaiECIAEhAAJAAkADQAJAIFIgACsDGCJTYwRAIAAoAgAiAUUNAQUgUyBSY0UNBCAAQQRqIgIoAgAiAUUNAyACIQALIAAhAiABIQAMAQsLIAAhAQwCCyAAIQEgAiEADAELIAAhASACIQALBSAAIQELIAAoAgAEQCAxJAkPC0EgEJcJIgIgHjYCECACIFI5AxggAkEANgIAIAJBADYCBCACIAE2AgggACACNgIAIAdB+ABqIgEoAgAoAgAiAwRAIAEgAzYCACAAKAIAIQILIAcoAnwgAhDaASAHQYABaiIAIAAoAgBBAWo2AgAgMSQJC+8GAQt/IABBBGoiCygCACICIgkgAEcEQCABQQhqIQcDQCACIgYoAggiAkEMaiEEIAJBFGoiCCgCAARAAkAgBCACKAIQIgJHBEACQCACIQMDQCAAIAMoAghGDQEgBCACKAIEIgMiAkcNAAsMAgsLIAIgBEcEQCAEIAIoAgQiBUcEQCACIQMDfyAFQQhqIgooAgAgAEcEQCACIAopAgA3AgggAigCBCICIQMLIAQgBSgCBCIFRw0AIAMLIQILIAIgBEcEQCACKAIAIgMgBCgCAEEEaiIFKAIANgIEIAUoAgAgAzYCAANAIAIoAgQhAyAIIAgoAgBBf2o2AgAgAhC3BSADIARHBEAgAyECDAELCwsLCwsgBigCDCICQQRqIQMgAigCACIFIAMoAgA2AgQgAygCACAFNgIAIAcgBygCAEF/ajYCACACELcFIAkoAgQiAiIJIABHDQALCyAAQQxqIgQgAEEQaiIKKAIAIgIiBUcEQCABQQhqIQcgAiEBA0AgASIJKAIIIgZBCGoiCCgCAARAAkAgBigCBCIBIAZHBEACQCABIQIDQCAAIAIoAghGDQEgBiABKAIEIgIiAUcNAAsMAgsLIAEgBkcEQCAGIAEoAgQiA0cEQCABIQIDfyADQQhqIgwoAgAgAEcEQCABIAwpAgA3AgggASgCBCIBIQILIAYgAygCBCIDRw0AIAILIQELIAEgBkcEQCABKAIAIgIgBigCAEEEaiIDKAIANgIEIAMoAgAgAjYCAANAIAEoAgQhAiAIIAgoAgBBf2o2AgAgARC3BSACIAZHBEAgAiEBDAELCwsLCwsgCSgCDCIBQQRqIQIgASgCACIDIAIoAgA2AgQgAigCACADNgIAIAcgBygCAEF/ajYCACABELcFIAQgBSgCBCIBIgVHDQALCyAAQQhqIgIoAgAEQCALKAIAIgEoAgAiAyAAKAIAQQRqIgUoAgA2AgQgBSgCACADNgIAIAJBADYCACAAIAFHBEADQCABKAIEIQIgARC3BSAAIAJHBEAgAiEBDAELCwsLIABBFGoiASgCAEUEQA8LIAooAgAiACgCACICIAQoAgBBBGoiAygCADYCBCADKAIAIAI2AgAgAUEANgIAIAAgBEYEQA8LA0AgACgCBCEBIAAQtwUgASAERwRAIAEhAAwBCwsLkQIBBH8gASgCUCICQQRqIQMgAigCACIEIAMoAgA2AgQgAygCACAENgIAIABBIGoiACAAKAIAQX9qNgIAIAIQtwUgAUUEQA8LIAFBDGohAyABQRRqIgIoAgAEQCABKAIQIgAoAgAiBCADKAIAQQRqIgUoAgA2AgQgBSgCACAENgIAIAJBADYCACAAIANHBEADQCAAKAIEIQIgABC3BSACIANHBEAgAiEADAELCwsLIAFBCGoiAigCAARAIAEoAgQiACgCACIDIAEoAgBBBGoiBCgCADYCBCAEKAIAIAM2AgAgAkEANgIAIAAgAUcEQANAIAAoAgQhAiAAELcFIAEgAkcEQCACIQAMAQsLCwsgARC3BQteAQF/IAAgADYCACAAIAA2AgQgAEEANgIIIABBDGoiASABNgIAIAAgATYCECAAQQA2AhQgAEEgahB3IABBQGtBjN8CKAIAIgE2AgBBjN8CIAFBAWo2AgAgAEEANgJQC5EDAQd/IAFBBGoiCSgCACIEIgMgAUcEQCAAQQhqIQggBCEAA0AgAiAAIgQoAghGBH8gBCgCDCEFIAEgA0EEaiIHKAIAIgNGBH9BAAUgBSADKAIMRgshBiAFKAIAIgQgBUEEaiIDKAIANgIEIAMoAgAgBDYCACAIIAgoAgBBf2o2AgAgBRC3BSAGBH8gBygCAAUgAAsFIAALKAIEIgAiAyABRw0ACwsgAUEIaiIGKAIARQRADwsgASAJKAIAIgBGBEAPCyAAIQMCQAJAA0AgAygCCCACRwRAIAEgACgCBCIDIgBGDQIMAQsLDAELDwsgACABRgRADwsgACgCBCIEIAFHBEAgACEDA38gBEEIaiIHKAIAIAJHBEAgACAHKQIANwIIIAAoAgQiACEDCyAEKAIEIgQgAUcNACADCyEACyAAIAFGBEAPCyAAKAIAIgMgASgCAEEEaiICKAIANgIEIAIoAgAgAzYCAANAIAAoAgQhAiAGIAYoAgBBf2o2AgAgABC3BSABIAJHBEAgAiEADAELCwuECwETfyMJIQgjCUEwaiQJIAhBJGohCSAIQSBqIQogCEEcaiEEIAhBGGohDCAIQRRqIQ0gCEEQaiEOQazlAkGn8QFBGhA9GiAAEKkDIAAQqgMgACgCOCIGIAAoAjwiEUcEQANAIAZB7ABqIhIoAgAgBigCaCILIgdLBEADQCAHKAJ0QQFLBEAgBygCbCICKAIEIgMEQANAIAMoAgAiAQRAIAEhAwwBCwsFIAJBCGoiASgCACIDKAIAIAJHBEADQCABKAIAIgVBCGoiASgCACEDIAMoAgAgBUcNAAsLCyAHQfAAaiITIANHBEADQCACQRBqIg8oAgAiASEFIANBEGoiECgCACABa0H4AEoEQCAFQfgAaiECIAUoAuABIgEgBUHkAWoiBSgCAEkEQANAIAYgCSABIAIQqwNFBEAgAUGIAWoiASAFKAIASQ0BCwsgDygCAEH4AGohAgsgBCALNgIAIAwgATYCACAKIAQoAgA2AgAgCSAMKAIANgIAIAAgBiACIAogCUEFEKwDGiAQKAIAIgEhBSABIA8oAgBrQfABSgRAIAVBiH9qIQIgBUFwaigCACIBIAVBdGoiBSgCAEkEQANAIAYgCSABIAIQqwNFBEAgAUGIAWoiASAFKAIASQ0BCwsgECgCAEGIf2ohAgsgDSALNgIAIA4gATYCACAKIA0oAgA2AgAgCSAOKAIANgIAIAAgBiACIAogCUEFEKwDGgsLIAMoAgQiAQRAA0AgASgCACICBEAgAiEBDAELCwUgAyADQQhqIgEoAgAiAigCAEYEfyACBQN/IAEoAgAiBUEIaiIBKAIAIQIgAigCACAFRw0AIAILCyEBCyABIBNHBEAgAyECIAEhAwwBCwsLCyAHQYgBaiIHIQsgEigCACAHSw0ACwsgBkH4AGoiBiARRw0ACwsgACgCSCIRIAAoAkQiBkYEQEGs5QJBwvEBQSgQPRDgBRogABCuA0Gs5QJB6/EBQQcQPRDgBRogCCQJDwsgCEEMaiEMIAhBCGohDSAIQQRqIQ4gCCEFA0AgBkHsAGoiEigCACAGKAJoIgsiB0sEQANAIAcoAnRBAUsEQCAHKAJsIgIoAgQiAwRAA0AgAygCACIBBEAgASEDDAELCwUgAkEIaiIBKAIAIgMoAgAgAkcEQANAIAEoAgAiBEEIaiIBKAIAIQMgAygCACAERw0ACwsLIAdB8ABqIhMgA0cEQANAIAJBEGoiDygCACIBIQQgA0EQaiIQKAIAIAFrQfgASgRAIARB+ABqIQIgBCgC4AEiASAEQeQBaiIEKAIASQRAA0AgBiAJIAEgAhCtA0UEQCABQYgBaiIBIAQoAgBJDQELCyAPKAIAQfgAaiECCyAMIAE2AgAgDSALNgIAIAogDCgCADYCACAJIA0oAgA2AgAgACACIAYgCiAJQQUQrAMaIBAoAgAiASEEIAEgDygCAGtB8AFKBEAgBEGIf2ohAiAEQXBqKAIAIgEgBEF0aiIEKAIASQRAA0AgBiAJIAEgAhCtA0UEQCABQYgBaiIBIAQoAgBJDQELCyAQKAIAQYh/aiECCyAOIAE2AgAgBSALNgIAIAogDigCADYCACAJIAUoAgA2AgAgACACIAYgCiAJQQUQrAMaCwsgAygCBCIBBEADQCABKAIAIgIEQCACIQEMAQsLBSADIANBCGoiASgCACICKAIARgR/IAIFA38gASgCACIEQQhqIgEoAgAhAiACKAIAIARHDQAgAgsLIQELIAEgE0cEQCADIQIgASEDDAELCwsLIAdBiAFqIgchCyASKAIAIAdLDQALCyAGQfgAaiIGIBFHDQALQazlAkHC8QFBKBA9EOAFGiAAEK4DQazlAkHr8QFBBxA9EOAFGiAIJAkLnAwBHH8jCSEIIwlB4ABqJAkgAEE8aiIYKAIAIgEgACgCOCIQIgdNBEAgCCQJDwsgCEHYAGohDSAIQdQAaiEOIAhB0ABqIQkgCEHMAGohESAIQcgAaiESIAhBxABqIRMgCEFAayEUIABBxABqIRkgAEHIAGohDyAIQSBqIhVBCGohGiAIIhZBCGohGwNAIAdB7ABqIhwoAgAgBygCaCIKIgZLBEADQCAZKAIAIgIgCSAGIAcQrQMhBCACIA8oAgAiAUkiA0EBcyAEcgR/IAMFA38gAkH4AGoiAiABSQRAIAIgCSAGIAcQrQMhAyAPKAIAIQEFQQAhAwsgAyACIAFJIgNBAXNyRQ0AIAMLCyEBIAIhCyABBEAgFSAHIAYrA2AQ/gIgACAVIAYgGisDABCiAxogFiAHIAYrA1gQ/gIgACAWIAYgGysDABCiAxogESAKNgIAIBIgCSgCACIMNgIAIA4gESgCADYCACANIBIoAgA2AgAgACAHIAIgDiANQQQQrAMaIAZB8ABqIgMoAgAiAQRAAkAgBkHwAGohBQJAAkADQAJAIAIgASgCECIESQRAIAEoAgAiBEUNAQUgBCACTw0EIAFBBGoiBSgCACIERQ0DIAUhAQsgASEFIAQhAQwBCwsgASEEDAILIAEhBCAFIQEMAQsgASEEIAUhAQsFIAMhBCADIQELIAwhBSAGQewAaiEMIAEoAgAEfyAFBUEUEJcJIgUgCzYCECAFQQA2AgAgBUEANgIEIAUgBDYCCCABIAU2AgAgDCgCACgCACIEBEAgDCAENgIAIAEoAgAhBQsgBigCcCAFENoBIAZB9ABqIgEgASgCAEEBajYCACAJKAIACyILQfAAaiIBKAIAIgQEQAJAIAtB8ABqIQUgBCEBAkACQANAAkAgASgCECIEIAdLBEAgASgCACIERQ0BBSAEIAdPDQQgAUEEaiIFKAIAIgRFDQMgBSEBCyABIQUgBCEBDAELCyABIQQMAgsgASEEIAUhAQwBCyABIQQgBSEBCwUgASEECyALQewAaiEXIAEoAgBFBEBBFBCXCSIFIBA2AhAgBUEANgIAIAVBADYCBCAFIAQ2AgggASAFNgIAIBcoAgAoAgAiBARAIBcgBDYCACABKAIAIQULIAsoAnAgBRDaASALQfQAaiIBIAEoAgBBAWo2AgALIAIgCSAGIAcQrQMgAiAPKAIAIgFJcQRAA0AgAkH4AGoiAiABSQRAIAIgCSAGIAcQrQMhBCAPKAIAIQEFQQEhBAsgBCACIAFJcQ0ACwsgEyAKNgIAIBQgCSgCACIKNgIAIA4gEygCADYCACANIBQoAgA2AgAgACAHIAJBiH9qIgQgDiANQQQQrAMaIAMoAgAiAQRAAkAgBkHwAGohAwJAAkADQAJAIAQgASgCECICSQRAIAEoAgAiAkUNAQUgAiAETw0EIAFBBGoiAygCACICRQ0DIAMhAQsgASEDIAIhAQwBCwsgASECDAILIAEhAiADIQEMAQsgASECIAMhAQsFIAMhAiADIQELIAohAyABKAIABH8gAwVBFBCXCSIDIAQ2AhAgA0EANgIAIANBADYCBCADIAI2AgggASADNgIAIAwoAgAoAgAiAgRAIAwgAjYCACABKAIAIQMLIAYoAnAgAxDaASAGQfQAaiIBIAEoAgBBAWo2AgAgCSgCAAsiBEHwAGoiASgCACICBEACQCAEQfAAaiEDIAIhAQJAAkADQAJAIAEoAhAiAiAHSwRAIAEoAgAiAkUNAQUgAiAHTw0EIAFBBGoiAygCACICRQ0DIAMhAQsgASEDIAIhAQwBCwsgASECDAILIAEhAiADIQEMAQsgASECIAMhAQsFIAEhAgsgBEHsAGohCiABKAIARQRAQRQQlwkiAyAQNgIQIANBADYCACADQQA2AgQgAyACNgIIIAEgAzYCACAKKAIAKAIAIgIEQCAKIAI2AgAgASgCACEDCyAEKAJwIAMQ2gEgBEH0AGoiASABKAIAQQFqNgIACwsgBkGIAWoiBiEKIBwoAgAgBksNAAsgGCgCACEBCyAHQfgAaiIHIRAgASAHSw0ACyAIJAkLnwwBG38jCSEIIwlB4ABqJAkgAEHIAGoiFygCACIBIAAoAkQiDiIGTQRAIAgkCQ8LIAhB2ABqIQsgCEHUAGohDCAIQdAAaiEKIAhBzABqIRAgCEHIAGohESAIQcQAaiESIAhBQGshEyAAQThqIRggAEE8aiENIAhBIGoiFEEQaiEZIAgiFUEQaiEaA0AgBkHsAGoiGygCACAGKAJoIgciBUsEQANAIBgoAgAiAyAKIAUgBhCrAyEEIAMgDSgCACIBSSICQQFzIARyBH8gAgUDfyADQfgAaiIDIAFJBEAgAyAKIAUgBhCrAyECIA0oAgAhAQVBACECCyACIAMgAUkiAkEBc3JFDQAgAgsLIQEgAyEPIAEEQCAUIAYgBSsDYBD+AiAAIBQgBSAZKwMAEKIDGiAVIAYgBSsDWBD+AiAAIBUgBSAaKwMAEKIDGiAQIAooAgAiCTYCACARIAc2AgAgDCAQKAIANgIAIAsgESgCADYCACAAIAMgBiAMIAtBBBCsAwRAIAlB8ABqIgEoAgAiAgRAAkAgCUHwAGohBCACIQECQAJAA0ACQCABKAIQIgIgBksEQCABKAIAIgJFDQEFIAIgBk8NBCABQQRqIgQoAgAiAkUNAyAEIQELIAEhBCACIQEMAQsLIAEhAgwCCyABIQIgBCEBDAELIAEhAiAEIQELBSABIQILIAlB7ABqIRYgASgCAEUEQEEUEJcJIgQgDjYCECAEQQA2AgAgBEEANgIEIAQgAjYCCCABIAQ2AgAgFigCACgCACICBEAgFiACNgIAIAEoAgAhBAsgCSgCcCAEENoBIAlB9ABqIgEgASgCAEEBajYCAAsgBUHwAGoiASgCACICBEACQCAFQfAAaiEEIAIhAQJAAkADQAJAIAMgASgCECICSQRAIAEoAgAiAkUNAQUgAiADTw0EIAFBBGoiBCgCACICRQ0DIAQhAQsgASEEIAIhAQwBCwsgASECDAILIAEhAiAEIQEMAQsgASECIAQhAQsFIAEhAgsgBUHsAGohCSABKAIARQRAQRQQlwkiBCAPNgIQIARBADYCACAEQQA2AgQgBCACNgIIIAEgBDYCACAJKAIAKAIAIgIEQCAJIAI2AgAgASgCACEECyAFKAJwIAQQ2gEgBUH0AGoiASABKAIAQQFqNgIACwsgAyAKIAUgBhCrAyADIA0oAgAiAUlxBEADQCADQfgAaiIDIAFJBEAgAyAKIAUgBhCrAyECIA0oAgAhAQVBASECCyACIAMgAUlxDQALCyADQYh/aiIEIQ8gEiAKKAIAIgE2AgAgEyAHNgIAIAEhByAMIBIoAgA2AgAgCyATKAIANgIAIAAgBCAGIAwgC0EEEKwDBEAgB0HwAGoiASgCACIDBEACQCAHQfAAaiECIAMhAQJAAkADQAJAIAEoAhAiAyAGSwRAIAEoAgAiA0UNAQUgAyAGTw0EIAFBBGoiAigCACIDRQ0DIAIhAQsgASECIAMhAQwBCwsgASEDDAILIAEhAyACIQEMAQsgASEDIAIhAQsFIAEhAwsgB0HsAGohCSABKAIARQRAQRQQlwkiAiAONgIQIAJBADYCACACQQA2AgQgAiADNgIIIAEgAjYCACAJKAIAKAIAIgMEQCAJIAM2AgAgASgCACECCyAHKAJwIAIQ2gEgB0H0AGoiASABKAIAQQFqNgIACyAFQfAAaiIBKAIAIgMEQAJAIAVB8ABqIQIgAyEBAkACQANAAkAgBCABKAIQIgNJBEAgASgCACIDRQ0BBSADIARPDQQgAUEEaiICKAIAIgNFDQMgAiEBCyABIQIgAyEBDAELCyABIQMMAgsgASEDIAIhAQwBCyABIQMgAiEBCwUgASEDCyAFQewAaiEHIAEoAgBFBEBBFBCXCSICIA82AhAgAkEANgIAIAJBADYCBCACIAM2AgggASACNgIAIAcoAgAoAgAiAwRAIAcgAzYCACABKAIAIQILIAUoAnAgAhDaASAFQfQAaiIBIAEoAgBBAWo2AgALCwsgBUGIAWoiBSEHIBsoAgAgBUsNAAsgFygCACEBCyAGQfgAaiIGIQ4gASAGSw0ACyAIJAkLiAICB38BfCMJIQQjCUFAayQJIABBGGoiBSsDACELIARBIGoiBiADIAIrA2AQ/gIgCyAGKwMQZkUEQCAEJAlBAA8LIAUrAwAhCyAEIgcgAyACKwNYEP4CIAsgBCsDEGVFBEAgBCQJQQAPCyAAQewAaiIJKAIAIAAoAmgiBSICTQRAIAQkCUEADwsgBkEIaiEKIANBEGohCCAHQQhqIQMCQAJAA0ACQCAGIAAgAisDYBD+AiAKKwMAIAgrAwBlBEAgByAAIAIrA1gQ/gIgAysDACAIKwMAZg0BCyACQYgBaiICIQUgCSgCACACSw0BDAILCwwBCyAEJAlBAA8LIAEgBTYCACAEJAlBAQv8BgIIfwJ8IwkhCSMJQSBqJAkgBCgCACIKKAJsIQYgBiAKQfAAaiIIRwRAAkAgAUEIaiELIAFBKGohDANAAkAgBigCECIHQQhqIAsQkwEEQCAHQShqIAwQkwEEQEEAIQAMAgsLIAYoAgQiBwRAIAchBgNAIAYoAgAiBwRAIAchBgwBCwsFIAYgBkEIaiIGKAIAIgcoAgBGBH8gBwUDfyAGKAIAIg1BCGoiBigCACEHIAcoAgAgDUcNACAHCwshBgsgBiAIRw0BDAILCyAJJAkgAA8LCyAJIgcgAisDECABKwMYIAErAyAQeEHYABCXCSIBEKYDQQwQlwkiAiABIgY2AgggAiAAQRxqIgg2AgQgAiAIKAIAIgs2AgAgCyACNgIEIAggAjYCACAAQSRqIgAgACgCAEEBajYCACABIAI2AlAgAUEgaiAHEJEBGiABIAU2AhggASADKAIAIgM2AkQgASAKNgJIIAcrAwghDiADQfwAaiIAKAIAIgEEQAJAIANB/ABqIQIgASEAAkACQANAAkAgDiAAKwMYIg9jBEAgACgCACIBRQ0BBSAPIA5jRQ0EIABBBGoiAigCACIBRQ0DIAIhAAsgACECIAEhAAwBCwsgACEBDAILIAAhASACIQAMAQsgACEBIAIhAAsFIAAhAQsgA0H4AGohBSAAKAIABH8gCgVBIBCXCSICIAY2AhAgAiAOOQMYIAJBADYCACACQQA2AgQgAiABNgIIIAAgAjYCACAFKAIAKAIAIgEEQCAFIAE2AgAgACgCACECCyADKAJ8IAIQ2gEgA0GAAWoiACAAKAIAQQFqNgIAIAQoAgALIQMgBysDECEOIANB/ABqIgAoAgAiAQRAAkAgA0H8AGohAiABIQACQAJAA0ACQCAOIAArAxgiD2MEQCAAKAIAIgFFDQEFIA8gDmNFDQQgAEEEaiICKAIAIgFFDQMgAiEACyAAIQIgASEADAELCyAAIQEMAgsgACEBIAIhAAwBCyAAIQEgAiEACwUgACEBCyADQfgAaiEEIAAoAgBFBEBBIBCXCSICIAY2AhAgAiAOOQMYIAJBADYCACACQQA2AgQgAiABNgIIIAAgAjYCACAEKAIAKAIAIgEEQCAEIAE2AgAgACgCACECCyADKAJ8IAIQ2gEgA0GAAWoiACAAKAIAQQFqNgIACyAJJAlBAQuIAgIHfwF8IwkhBCMJQUBrJAkgAEEQaiIFKwMAIQsgBEEgaiIGIAMgAisDYBD+AiALIAYrAwhmRQRAIAQkCUEADwsgBSsDACELIAQiByADIAIrA1gQ/gIgCyAEKwMIZUUEQCAEJAlBAA8LIABB7ABqIgkoAgAgACgCaCIFIgJNBEAgBCQJQQAPCyAGQRBqIQogA0EYaiEIIAdBEGohAwJAAkADQAJAIAYgACACKwNgEP4CIAorAwAgCCsDAGUEQCAHIAAgAisDWBD+AiADKwMAIAgrAwBmDQELIAJBiAFqIgIhBSAJKAIAIAJLDQEMAgsLDAELIAQkCUEADwsgASAFNgIAIAQkCUEBC7sVAiB/AXwjCSEJIwlB4ABqJAkgCUHMAGoiEEEANgIAIBBBBGoiEUEANgIAIBBBCGoiB0EANgIAIAAoAiAiASIFIABBHGoiBkcEQANAIAFBCGohASACIANGBEAgECABEOABBSACIAEoAgA2AgAgESARKAIAQQRqNgIACyAFKAIEIgEiBSAGRwRAIBEoAgAhAiAHKAIAIQMMAQsLCyAJQUBrIQ0gCUE0aiEOIAlBKGohDyAJQSRqIRggCUEgaiEdIAlBHGohGSAJQRhqIRogCUEMaiEKIAkhB0Gs5QJB8/EBQQoQPSARKAIAIBAoAgBrQQJ1EOkFQf7xAUELED0aIBAoAgAiBSARKAIAIiBHBEAgDUEEaiEGIA1BCGohFCAOQQRqIQsgDkEIaiEbIA9BBGohDCAPQQhqIRwgCkEIaiEVIAdBCGohFiAAQRBqIRIgAEEYaiEXIApBBGohHiAHQQRqIR8DQCAFKAIAKAIYQX5xQQRGBEAgDUEANgIAIAZBADYCACAUQQA2AgAgDkEANgIAIAtBADYCACAbQQA2AgAgD0EANgIAIAxBADYCACAcQQA2AgAgBSgCACIAKwMoISEgACgCREH8AGoiASgCACIABEADQCABIAAgACsDGCAhYyICGyEBIABBBGogACACGygCACIADQALCwJ/AkAgASgCBCIABH8DQCAAKAIAIgEEQCABIQAMAQsLDAEFIAEgAUEIaiIAKAIAIgIoAgBGBH8gAgUDfyAAKAIAIgFBCGoiACgCACECIAIoAgAgAUcNACACCwshACABRQ0BA38gASgCBCICBH8gAiEBDAEFIAALCwsMAQsgACEBA0AgASABKAIIIgEoAgBGDQALIAALIQIgASgCACIABEADQCAAKAIEIgEEQCABIQAMAQsLBQNAIAEgASgCCCIBKAIARg0ACyABIQALIAAoAhAhACAYIAIoAhA2AgAgHSAANgIAIAUoAgAiACsDMCEhIAAoAkhB/ABqIgEoAgAiAARAA0AgASAAIAArAxggIWMiAhshASAAQQRqIAAgAhsoAgAiAA0ACwsCfwJAIAEoAgQiAAR/A0AgACgCACIBBEAgASEADAELCwwBBSABIAFBCGoiACgCACICKAIARgR/IAIFA38gACgCACIBQQhqIgAoAgAhAiACKAIAIAFHDQAgAgsLIQAgAUUNAQN/IAEoAgQiAgR/IAIhAQwBBSAACwsLDAELIAAhAQNAIAEgASgCCCIBKAIARg0ACyAACyECIAEoAgAiAARAA0AgACgCBCIBBEAgASEADAELCwUDQCABIAEoAggiASgCAEYNAAsgASEACyAAKAIQIQAgGSACKAIQNgIAIBogADYCACANIB0Q4AEgBigCACIAIBQoAgBGBEAgDSAZEOABIAYoAgAhAAUgACAZKAIANgIAIAYgBigCAEEEaiIANgIACyAUKAIAIABGBEAgDSAYEOABIAYoAgAhAAUgACAYKAIANgIAIAYgBigCAEEEaiIANgIACyAUKAIAIABGBEAgDSAaEOABIAYoAgAhAAUgACAaKAIANgIAIAYgBigCAEEEaiIANgIACyANKAIAIgIgAEkEQANAIBVBADYCACAWQQA2AgAgBSgCACEIAkACQCACKAIAIgQoAgQiACAERiITBEAgACEBBQJAIAAhAyAAIQEDQCAIIAMoAghGDQEgBCABKAIEIgMiAUcNAAsMAgsLIAEgBEYNAAJ/AkAgEwR/DAEFIAAhAQN/IAggASgCCEYNAiAEIAAoAgQiASIARw0AQQALCwwBC0EAIAAgBEYNABogACgCDEEQagshACAKIAQ2AgAgHiAINgIAIBUgADYCACACKAIAIQQCfwJAIAUoAgAiAygCBCIAIANGBH8MAQUgACEBA38gBCABKAIIRg0CIAMgACgCBCIBIgBHDQBBAAsLDAELQQAgACADRg0AGiAAKAIMQRBqCyEAIAcgAzYCACAfIAQ2AgAgFiAANgIAIAsoAgAiACAbKAIARgRAIA4gChCbAwUgACAKKQIANwIAIAAgCigCCDYCCCALIAsoAgBBDGo2AgALIAwoAgAiACAcKAIARgRAIA8gBxCbAwUgACAHKQIANwIAIAAgBygCCDYCCCAMIAwoAgBBDGo2AgALDAELQTQQlwkiACAENgIIIAAgCDYCDCAAQQA2AhggAEEANgIkIABBADYCMCAAIBI2AgQgACASKAIAIgE2AgAgASAANgIEIBIgADYCACAXIBcoAgBBAWo2AgBBEBCXCSIBIAg2AgggASAANgIMIAEgBDYCBCABIAQoAgAiAzYCACADIAE2AgQgBCABNgIAIARBCGoiASABKAIAQQFqNgIAQRAQlwkiASAENgIIIAEgADYCDCABIAhBDGoiAzYCBCABIAMoAgAiEzYCACATIAE2AgQgAyAB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ca0iD0J/hVYEQCABIQIgBCEBDAMLIA4gD3whCyABIAUoAgAiAiAHKAIASQR/IAUgAkEBajYCACACLQAABSAAEOMECyIEQYHhAGosAAAiAkH/AXFLDQAgASECIAQLBSABIQIgBAshAQsgAiABQYHhAGotAABLBEADQCACIAUoAgAiASAHKAIASQR/IAUgAUEBajYCACABLQAABSAAEOMEC0GB4QBqLQAASw0AC0Ho3wJBIjYCACAIQQAgA0IBg0IAURshCCADIQsLCyAHKAIABEAgBSAFKAIAQX9qNgIACyALIANaBEAgCEEARyADQgGDQgBSckUEQEHo3wJBIjYCACADQn98IQMMAgsgCyADVgRAQejfAkEiNgIADAILCyALIAisIgOFIAN9IQMLCyADC+wHAQd/AnwCQAJAAkACQAJAIAEOAwABAgMLQet+IQZBGCEHDAMLQc53IQZBNSEHDAILQc53IQZBNSEHDAELRAAAAAAAAAAADAELIABBBGohAyAAQeQAaiEFA0AgAygCACIBIAUoAgBJBH8gAyABQQFqNgIAIAEtAAAFIAAQ4wQLIgEQywQNAAsCQAJAAkAgAUEraw4DAAEAAQtBASABQS1GQQF0ayEIIAMoAgAiASAFKAIASQRAIAMgAUEBajYCACABLQAAIQEMAgUgABDjBCEBDAILAAtBASEICwJAAkACQAN/IARByJUCaiwAACABQSByRgR/IARBB0kEQCADKAIAIgEgBSgCAEkEfyADIAFBAWo2AgAgAS0AAAUgABDjBAshAQsgBEEBaiIEQQhJDQFBCAUgBAsLIgRB/////wdxQQNrDgYBAAAAAAIACyACQQBHIgkgBEEDS3EEQCAEQQhGDQIMAQsgBEUEQAJAQQAhBAN/IARBhpYCaiwAACABQSByRw0BIARBAkkEQCADKAIAIgEgBSgCAEkEfyADIAFBAWo2AgAgAS0AAAUgABDjBAshAQsgBEEBaiIEQQNJDQBBAwshBAsLAkACQAJAIAQOBAECAgACCyADKAIAIgEgBSgCAEkEfyADIAFBAWo2AgAgAS0AAAUgABDjBAtBKEcEQCMHIAUoAgBFDQUaIAMgAygCAEF/ajYCACMHDAULQQEhAQNAAkAgAygCACICIAUoAgBJBH8gAyACQQFqNgIAIAItAAAFIAAQ4wQLIgJBUGpBCkkg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FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcAARcEFwUXBgcXFxcKFxcXFw4PEBcXFxMVFxcXFxcXFwABAgMDFxcBFwgXFwkLFwwXDRcLFxcREhQXCyAMIAIoAgA2AgAgCCAMKAIANgIAIAAgBUEYaiABIAggBCAJEPwGDBcLIA0gAigCADYCACAIIA0oAgA2AgAgACAFQRBqIAEgCCAEIAkQ/QYMFgsgAEEIaiIGKAIAKAIMIQsgBiALQf8BcUE6ahEFACEGIA4gASgCADYCACAPIAIoAgA2AgAgBigCACAGIAYsAAsiAkEASCILGyIJIAYoAgQgAkH/AXEgCxtqIQIgCiAOKAIANgIAIAggDygCADYCACABIAAgCiAIIAMgBCAFIAkgAhD+BjYCAAwVCyAQIAIoAgA2AgAgCCAQKAIANgIAIAVBDGogASAIIAQgCRD/BgwUCyARIAEoAgA2AgAgEiACKAIANgIAIAogESgCADYCACAIIBIoAgA2AgAgASAAIAogCCADIAQgBUHDoAJBy6ACEP4GNgIADBMLIBMgASgCADYCACAUIAIoAgA2AgAgCiATKAIANgIAIAggFCgCADYCACABIAAgCiAIIAMgBCAFQcugAkHToAIQ/gY2AgAMEgsgFSACKAIANgIAIAggFSgCADYCACAFQQhqIAEgCCAEIAkQgAcMEQsgFiACKAIANgIAIAggFigCADYCACAFQQhqIAEgCCAEIAkQgQcMEAsgFyACKAIANgIAIAggFygCADYCACAFQRxqIAEgCCAEIAkQggcMDwsgGCACKAIANgIAIAggGCgCADYCACAFQRBqIAEgCCAEIAkQgwcMDgsgGSACKAIANgIAIAggGSgCADYCACAFQQRqIAEgCCAEIAkQhAcMDQsgGiACKAIANgIAIAggGigCADYCACABIAggBCAJEIUHDAwLIBsgAigCADYCACAIIBsoAgA2AgAgACAFQQhqIAEgCCAEIAkQhgcMCwsgHCABKAIANgIAIB0gAigCADYCACAKIBwoAgA2AgAgCCAdKAIANgIAIAEgACAKIAggAyAEIAVB06ACQd6gAhD+BjYCAAwKCyAeIAEoAgA2AgAgHyACKAIANgIAIAogHigCADYCACAIIB8oAgA2AgAgASAAIAogCCADIAQgBUHeoAJB46ACEP4GNgIADAkLICAgAigC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NgIAIAggFSgCADYCACAFQQhqIAEgCCAEIAkQoQcMEQsgFiACKAIANgIAIAggFigCADYCACAFQQhqIAEgCCAEIAkQogcMEAsgFyACKAIANgIAIAggFygCADYCACAFQRxqIAEgCCAEIAkQowcMDwsgGCACKAIANgIAIAggGCgCADYCACAFQRBqIAEgCCAEIAkQpAcMDgsgGSACKAIANgIAIAggGSgCADYCACAFQQRqIAEgCCAEIAkQpQcMDQsgGiACKAIANgIAIAggGigCADYCACABIAggBCAJEKYHDAwLIBsgAigCADYCACAIIBsoAgA2AgAgACAFQQhqIAEgCCAEIAkQpwcMCwsgHCABKAIANgIAIB0gAigCADYCACAKIBwoAgA2AgAgCCAdKAIANgIAIAEgACAKIAggAyAEIAVBwPoAQez6ABCfBzYCAAwKCyAeIAEoAgA2AgAgHyACKAIANgIAIAogHigCADYCACAIIB8oAgA2AgAgASAAIAogCCADIAQgBUHw+gBBhPsAEJ8HNgIADAkLICAgAigCADYCACAIICAoAgA2AgAgBSABIAggBCAJEKgHDAgLICEgASgCADYCACAiIAIoAgA2AgAgCiAhKAIANgIAIAggIigCADYCACABIAAgCiAIIAMgBCAFQZD7AEGw+wAQnwc2AgAMBwsgIyACKAIANgIAIAggIygCADYCACAFQRhqIAEgCCAEIAkQqQcMBgsgACgCACgCFCEGICQgASgCADYCACAlIAIoAgA2AgAgCiAkKAIANgIAIAggJSgCADYCACAAIAogCCADIAQgBSAGQT9xQaAEahESAAwGCyAAQQhqIgYoAgAoAhghCyAGIAtB/wFxQTpqEQUAIQYgJiABKAIANgIAICcgAigCADYCACAGKAIAIAYgBiwACyILQQBIIgkbIQIgBigCBCALQf8BcSAJG0ECdCACaiEGIAogJigCADYCACAIICcoAgA2AgAgASAAIAogCCADIAQgBSACIAYQnwc2AgAMBAsgKCACKAIANgIAIAggKCgCADYCACAFQRRqIAEgCCAEIAkQqgcMAwsgKSACKAIANgIAIAggKSgCADYCACAFQRRqIAEgCCAEIAkQqwcMAgsgCyACKAIANgIAIAggCygCADYCACABIAggBCAJEKwHDAELIAQgBCgCAEEEcjYCAAsgASgC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AUEBaiIBaiwAAEH5AEYEf0ECBSADBEAgAigCACECCyABIAJqLAAAQdkARw0CQQILDAILIAFBAmohAQNAAkAgASADBH8gBCgCAAUgAAtPDQAgAwR/IAIoAgAFIAILIAFqLAAAQSVGDQAgAUEBaiEBDAELCyADBH8gBCgCAAUgAAsgAUYNACADBH8gAigCAAUgAgsgAUEBamosAABB7QBHDQAgAUECaiEBA0ACQCABIAMEfyAEKAIABSAAC08NACADBH8gAigCAAUgAgsgAWosAABBJUYNACABQQFqIQEMAQsLIAMEQCAEKAIAIQALIAAgAUYNACADBH8gAigCAAUgAgsgAUEBaiIBaiwAAEH5AEYEf0EBBSADBEAgAigCACECCyABIAJqLAAAQdkARw0BQQELDAELQQALCwoAIAAoAgAQigULCgAgAEEMahDCBwvUCAEEfyAAQfwDaiECIAAsAIcEIgFBAEghAyAAQYAEaiEEIAFB/wFxIQBBACEBA0ACQCABIAMEfyAEKAIABSAAC08NACADBH8gAigCAAUgAgsgAUECdGooAgBBJUYNACABQQFqIQEMAQsLAn8CQAJAAkACQCADBH8gAigCAAUgAgsgAUEBakECdGooAgBB2QBrDiEAAwMDAwMDAwMDAwIDAwMDAwMDAwEDAwMDAwMDAwMDAwADCyABQQJqIQEDQAJAIAEgAwR/IAQoAgAFIAALTw0AIAMEfyACKAIABSACCyABQQJ0aigCAEElRg0AIAFBAWohAQwBCwsgAwR/IAQoAgAFIAALIAFGDQICQAJAIAMEfyACKAIABSACCyABQQFqQQJ0aigCAEHkAGsOCgEEBAQEBAQEBAAECyABQQJqIQEDQAJAIAEgAwR/IAQoAgAFIAALTw0AIAMEfyACKAIABSACCyABQQJ0aigCAEElRg0AIAFBAWohAQwBCwsgAwRAIAQoAgAhAAsgACABRg0DIAMEQCACKAIAIQILIAFBAWpBAnQgAmooAgBB5ABHDQNBAwwECyABQQJqIQEDQAJAIAEgAwR/IAQoAgAFIAALTw0AIAMEfyACKAIABSACCyABQQJ0aigCAEElRg0AIAFBAWohAQwBCwsgAwRAIAQoAgAhAAsgACABRg0CIAMEQCACKAIAIQILIAFBAWpBAnQgAmooAgBB7QBHDQJBBAwDCyABQQJq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CSAAIAopAgA3AgAgACAKKAIINgIIQQAhAANAIABBA0cEQCAAQQJ0IApqQQA2AgAgAEEBaiEADAELCyAKEJ4JIAEoAgAoAhghACAKIAEgAEH/AHFBmAlqEQQAIAZBC2oiACwAAEEASAR/IAYoAgAhACALQQA6AAAgACALEIgGIAZBADYCBCAGBSALQQA6AAAgBiALEIgGIABBADoAACAGCyEAIAYQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIkIQAgASAAQf8BcUE6ahEFAAUgAUH07QIQmAYiASgCACgCLCEAIAsgASAAQf8AcUGYCWoRBAAgAiALKAIANgAAIAEoAgAoAiAhACAKIAEgAEH/AHFBmAlqEQQAIAhBC2oiACwAAEEASAR/IAgoAgAhACALQQA6AAAgACALEIgGIAhBADYCBCAIBSALQQA6AAAgCCALEIgGIABBADoAACAICyEAIAgQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIcIQAgCiABIABB/wBxQZgJahEEACAHQQtqIgAsAABBAEgEfyAHKAIAIQAgC0EAOgAAIAAgCxCIBiAHQQA2AgQgBwUgC0EAOgAAIAcgCxCIBiAAQQA6AAAgBwshACAHEKMJIAAgCikCADcCACAAIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCDCEAIAMgASAAQf8BcUE6ahEFADoAACABKAIAKAIQIQAgBCABIABB/wFxQTpqEQUAOgAAIAEoAgAoAhQhACAKIAEgAEH/AHFBmAlqEQQAIAVBC2oiACwAAEEASAR/IAUoAgAhACALQQA6AAAgACALEIgGIAVBADYCBCAFBSALQQA6AAAgBSALEIgGIABBADoAACAFCyEAIAUQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIYIQAgCiABIABB/wBxQZgJahEEACAGQQtqIgAsAABBAEgEfyAG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ACAHIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCDCEAIAMgASAAQf8BcUE6ahEFADYCACABKAIAKAIQIQAgBCABIABB/wFxQTpqEQUANgIAIAEoAgAoAhQhACAKIAEgAEH/AHFBmAlqEQQAIAVBC2oiACwAAEEASAR/IAUoAgAhACALQQA6AAAgACALEIgGIAVBADYCBCAFBSALQQA6AAAgBSALEIgGIABBADoAACAFCyEAIAUQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIYIQAgCiABIABB/wBxQZgJahEEACAGQQtqIgAsAABBAEgEQCAGKAIAIQAgC0EANgIAIAAgCxCNBiAGQQA2AgQFIAtBADYCACAGIAsQjQYgAEEAOgAACyAGELYJIAYgCikCADcCACAGIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCJCEAIAEgAEH/AXFBOmoRBQAFIAFBhO4CEJgGIgEoAgAoAiwhACALIAEgAEH/AHFBmAlqEQQAIAIgCygCADYAACABKAIAKAIgIQAgCiABIABB/wBxQZgJahEEACAIQQtqIgAsAABBAEgEQCAIKAIAIQAgC0EANgIAIAAgCxCNBiAIQQA2AgQFIAtBADYCACAIIAsQjQYgAEEAOgAACyAIELYJIAggCikCADcCACAIIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCHCEAIAogASAAQf8AcUGYCWoRBAAgB0ELaiIALAAAQQBIBEAgBygCACEAIAtBADYCACAAIAsQjQYgB0EANgIEBSALQQA2AgAgByALEI0GIABBADoAAAsgBxC2CSAHIAopAgA3AgAgByAKKAIINgIIQQAhAANAIABBA0cEQCAAQQJ0IApqQQA2AgAgAEEBaiEADAELCyAKEJ4JIAEoAgAoAgwhACADIAEgAEH/AXFBOmoRBQA2AgAgASgCACgCECEAIAQgASAAQf8BcUE6ahEFADYCACABKAIAKAIUIQAgCiABIABB/wBxQZgJahEEACAFQQtqIgAsAABBAEgEfyAFKAIAIQAgC0EAOgAAIAAgCxCIBiAFQQA2AgQgBQUgC0EAOgAAIAUgCxCIBiAAQQA6AAAgBQshACAFEKMJIAAgCikCADcCACAAIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCGCEAIAogASAAQf8AcUGYCWoRBAAgBkELaiIALAAAQQBIBEAgBigCACEAIAtBADYCACAAIAsQjQYgBkEANgIEBSALQQA2AgAgBiALEI0GIABBADoAAAsgBhC2CSAGIAopAgA3AgAgBiAKKAIINgIIQQAhAANAIABBA0cEQCAAQQJ0IApqQQA2AgAgAEEBaiEADAELCyAKEJ4JIAEoAgAoAiQhACABIABB/wFxQTpqEQUACzYCACAMJAkLuQYBFH8jCSEHIwlBoANqJAkgB0HIAmohCCAHQfAAaiEAIAdBkANqIgkgB0HgAWoiBjYCACAHQdACaiINIAU5AwAgBiANEIUFIgZB4wBLBEAQmwYhACAIIAU5AwAgCSAAQeWqAiAIENwGIQYgCSgCACIARQRAECULIAYQtgUiCCELIAgEQCAIIQwgBiEKIAshECAAIREFECULBSAAIQwgBiEKCyAHQYwDaiIOIAMQ2wUgDkGU7AIQmAYiEigCACgCICEAIBIgCSgCACIGIAYgCmogDCAAQR9xQdQDahEJABogCgR/IAkoAgAsAABBLUYFQQALIRMgB0GYA2ohFCAHQZUDaiEVIAdBlANqIRYgB0H0AmohBiAHQegCaiEIIAdB5AJqIQkgB0GAA2oiC0IANwIAIAtBADYCCEEAIQADQCAAQQNHBEAgAEECdCALakEANgIAIABBAWohAAwBCwsgBkIANwIAIAZBADYCCEEAIQADQCAAQQNHBEAgAEECdCAGakEANgIAIABBAWohAAwBCwsgCEIANwIAIAhBADYCCEEAIQADQCAAQQNHBEAgAEECdCAIakEANgIAIABBAWohAAwBCwsgAiATIA4gFCAVIBYgCyAGIAggCRD2ByAKIAkoAgAiCUoEfyAGKAIEIAYsAAsiAEH/AXEgAEEASBshAiAIKAIEIAgsAAsiAEH/AXEgAEEASBshFyAJQQFqIAogCWtBAXRqBSAGKAIEIAYsAAsiAEH/AXEgAEEASBshAiAIKAIEIAgsAAsiAEH/AXEgAEEASBshFyAJQQJqCyEZIAchACACIBcgGWpqIgJB5ABLBEAgAhC2BSIAIQIgAARAIAAhDyACIRgFECULBSAAIQ8LIA8gB0HgAmoiACAHQdwCaiICIAMoAgQgDCAKIAxqIBIgEyAUIBUsAAAgFiwAACALIAYgCCAJEPcHIAdB2AJqIgogASgCADYCACAAKAIAIQAgAigCACEBIA0gCigCADYCACANIA8gACABIAMgBBA+IQAgGARAIBgQtwULIAgQngkgBhCeCSALEJ4JIA4QmQYgEARAIBAQtwULIBEEQCARELcFCyAHJAkgAAvXBQERfyMJIQYjCUGwAWokCSAGQZgBaiINIAMQ2wUgDUGU7AIQmAYhDiAFQQtqIgssAAAiB0EASCEAIAVBBGoiDCgCACAHQf8BcSAAGwR/IAUoAgAgBSAAGy0AACAOQS0gDigCACgCHEE/cUHUAmoRAABB/wFxRgVBAAshECAGQaQBaiERIAZBoQFqIRIgBkGgAWohEyAGQYABaiEHIAZB9ABqIQggBkHwAGohCSAGQYwBaiIKQgA3AgAgCkEANgIIQQAhAANAIABBA0cEQCAAQQJ0IApqQQA2AgAgAEEBaiEADAELCyAHQgA3AgAgB0EANgIIQQAhAANAIABBA0cEQCAAQQJ0IAdqQQA2AgAgAEEBaiEADAELCyAIQgA3AgAgCEEANgIIQQAhAANAIABBA0cEQCAAQQJ0IAhqQQA2AgAgAEEBaiEADAELCyACIBAgDSARIBIgEyAKIAcgCCAJEPYHIAssAAAiAEEASCELIAwoAgAgAEH/AXEgCxsiDCAJKAIAIglKBH8gBygCBCAHLAALIgBB/wFxIABBAEgbIQIgCCgCBCAILAALIgBB/wFxIABBAEgbIRQgCUEBaiAMIAlrQQF0agUgBygCBCAHLAALIgBB/wFxIABBAEgbIQIgCCgCBCAILAALIgBB/wFxIABBAEgbIRQgCUECagshFiAGIQAgAiAUIBZqaiICQeQASwRAIAIQtgUiACECIAAEQCAAIQ8gAiEVBRAlCwUgACEPCyAPIAZB7ABqIgAgBkHoAGoiAiADKAIEIAUoAgAgBSALGyIFIAUgDGogDiAQIBEgEiwAACATLAAAIAogByAIIAkQ9wcgBkHkAGoiBSABKAIANgIAIAAoAgAhACACKAIAIQEgBkGcAWoiAiAFKAIANgIAIAIgDyAAIAEgAyAEED4hACAVBEAgFRC3BQsgCBCeCSAHEJ4JIAoQngkgDRCZBiAGJAkgAAu/DQEDfyMJIQwjCUEQaiQJIAxBDGohCiAMIQsgCSAABH8gAkH87QIQmAYhACABBH8gACgCACgCLCEBIAogACABQf8AcUGYCWoRBAAgAyAKKAIANgAAIAAoAgAoAiAhASALIAAgAUH/AHFBmAlqEQQAIAhBC2oiASwAAEEASAR/IAgoAgAhASAKQQA6AAAgASAKEIgGIAhBADYCBCAIBSAKQQA6AAAgCCAKEIgGIAFBADoAACAICyEBIAgQowkgASALKQIANwIAIAEgCygCCDYCCEEAIQEDQCABQQNHBEAgAUECdCALakEANgIAIAFBAWohAQwBCwsgCxCeCSAABSAAKAIAKAIoIQEgCiAAIAFB/wBxQZgJahEEACADIAooAgA2AAAgACgCACgCHCEBIAsgACABQf8AcUGYCWoRBAAgCEELaiIBLAAAQQBIBH8gCCgCACEBIApBADoAACABIAoQiAYgCEEANgIEIAgFIApBADoAACAIIAoQiAYgAUEAOgAAIAgLIQEgCBCjCSABIAspAgA3AgAgASALKAIINgIIQQAhAQNAIAFBA0cEQCABQQJ0IAtqQQA2AgAgAUEBaiEBDAELCyALEJ4JIAALIQEgACgCACgCDCECIAQgACACQf8BcUE6ahEFADoAACAAKAIAKAIQIQIgBSAAIAJB/wFxQTpqEQUAOgAAIAEoAgAoAhQhAiALIAAgAkH/AHFBmAlqEQQAIAZBC2oiAiwAAEEASAR/IAYoAgAhAiAKQQA6AAAgAiAKEIgGIAZBADYCBCAGBSAKQQA6AAAgBiAKEIgGIAJBADoAACAGCyECIAYQowkgAiALKQIANwIAIAIgCygCCDYCCEEAIQIDQCACQQNHBEAgAkECdCALakEANgIAIAJBAWohAgwBCwsgCxCeCSABKAIAKAIYIQEgCyAAIAFB/wBxQZgJahEEACAHQQtqIgEsAABBAEgEfyAHKAIAIQEgCkEAOgAAIAEgChCIBiAHQQA2AgQgBwUgCkEAOgAAIAcgChCIBiABQQA6AAAgBwshASAHEKMJIAEgCykCADcCACABIAsoAgg2AghBACEBA0AgAUEDRwRAIAFBAnQgC2pBADYCACABQQFqIQEMAQsLIAsQngkgACgCACgCJCEBIAAgAUH/AXFBOmoRBQAFIAJB9O0CEJgGIQAgAQR/IAAoAgAoAiwhASAKIAAgAUH/AHFBmAlqEQQAIAMgCigCADYAACAAKAIAKAIgIQEgCyAAIAFB/wBxQZgJahEEACAIQQtqIgEsAABBAEgEfyAIKAIAIQEgCkEAOgAAIAEgChCIBiAIQQA2AgQgCAUgCkEAOgAAIAggChCIBiABQQA6AAAgCAshASAIEKMJIAEgCykCADcCACABIAsoAgg2AghBACEBA0AgAUEDRwRAIAFBAnQgC2pBADYCACABQQFqIQEMAQsLIAsQngkgAAUgACgCACgCKCEBIAogACABQf8AcUGYCWoRBAAgAyAKKAIANgAAIAAoAgAoAhwhASALIAAgAUH/AHFBmAlqEQQAIAhBC2oiASwAAEEASAR/IAgoAgAhASAKQQA6AAAgASAKEIgGIAhBADYCBCAIBSAKQQA6AAAgCCAKEIgGIAFBADoAACAICyEBIAgQowkgASALKQIANwIAIAEgCygCCDYCCEEAIQEDQCABQQNHBEAgAUECdCALakEANgIAIAFBAWohAQwBCwsgCxCeCSAACyEBIAAoAgAoAgwhAiAEIAAgAkH/AXFBOmoRBQA6AAAgACgCACgCECECIAUgACACQf8BcUE6ahEFADoAACABKAIAKAIUIQIgCyAAIAJB/wBxQZgJahEEACAGQQtqIgIsAABBAEgEfyAGKAIAIQIgCkEAOgAAIAIgChCIBiAGQQA2AgQgBgUgCkEAOgAAIAYgChCIBiACQQA6AAAgBgshAiAGEKMJIAIgCykCADcCACACIAsoAgg2AghBACECA0AgAkEDRwRAIAJBAnQgC2pBADYCACACQQFqIQIMAQsLIAsQngkgASgCACgCGCEBIAsgACABQf8AcUGYCWoRBAAgB0ELaiIBLAAAQQBIBH8gBygCACEBIApBADoAACABIAoQiAYgB0EANgIEIAcFIApBADoAACAHIAoQiAYgAUEAOgAAIAcLIQEgBxCjCSABIAspAgA3AgAgASALKAIINgIIQQAhAQNAIAFBA0cEQCABQQJ0IAtqQQA2AgAgAUEBaiEBDAELCyALEJ4JIAAoAgAoAiQhASAAIAFB/wFxQTpqEQUACzYCACAMJAkL9AgBEX8gAiAANgIAIA1BC2ohFyANQQRqIRggDEELaiEbIAxBBGohHCADQYAEcUUhHSAGQQhqIR4gDkEASiEfIAtBC2ohGSALQQRqIRoDQCAVQQRHBEACQAJAAkACQAJAAkAgCCAVaiwAAA4FAAEDAgQFCyABIAIoAgA2AgAMBAsgASACKAIANgIAIAYoAgAoAhwhDyAGQSAgD0E/cUHUAmoRAAAhECACIAIoAgAiD0EBajYCACAPIBA6AAAMAwsgFywAACIPQQBIIRAgGCgCACAPQf8BcSAQGwRAIA0oAgAgDSAQGywAACEQIAIgAigCACIPQQFqNgIAIA8gEDoAAAsMAgsgGywAACIPQQBIIRAgHSAcKAIAIA9B/wFxIBAbIg9FckUEQCAPIAwoAgAgDCAQGyIPaiEQIAIoAgAhEQNAIA8gEEcEQCARIA8sAAA6AAAgEUEBaiERIA9BAWohDwwBCwsgAiARNgIACwwBCyACKAIAIRIgBEEBaiAEIAcbIhMhBANAAkAgBCAFTw0AIAQsAAAiD0F/TA0AIB4oAgAgD0EBdGouAQBBgBBxRQ0AIARBAWohBAwBCwsgHwRAIA4hDwNAIA9BAEoiECAEIBNLcQRAIARBf2oiBCwAACERIAIgAigCACIQQQFqNgIAIBAgEToAACAPQX9qIQ8MAQsLIBAEfyAGKAIAKAIcIRAgBkEwIBBBP3FB1AJqEQAABUEACyERA0AgAiACKAIAIhBBAWo2AgAgD0EASgRAIBAgEToAACAPQX9qIQ8MAQsLIBAgCToAAAsgBCATRgRAIAYoAgAoAhwhBCAGQTAgBEE/cUHUAmoRAAAhDyACIAIoAgAiBEEBajYCACAEIA86AAAFAkAgGSwAACIPQQBIIRAgGigCACAPQf8BcSAQGwR/IAsoAgAgCyAQGywAAAVBfwshD0EAIRFBACEUIAQhEANAIBAgE0YNASAPIBRGBEAgAiACKAIAIgRBAWo2AgAgBCAKOgAAIBksAAAiD0EASCEWIBFBAWoiBCAaKAIAIA9B/wFxIBYbSQR/QX8gBCALKAIAIAsgFhtqLAAAIg8gD0H/AEYbIQ9BAAUgFCEPQQALIRQFIBEhBAsgEEF/aiIQLAAAIRYgAiACKAIAIhFBAWo2AgAgESAWOgAAIAQhESAUQQFqIRQMAAsACwsgAigCACIEIBJGBH8gEwUDQCASIARBf2oiBEkEQCASLAAAIQ8gEiAELAAAOgAAIAQgDzoAACASQQFqIRIMAQUgEyEEDAMLAAsACyEECyAVQQFqIRUMAQsLIBcsAAAiBEEASCEGIBgoAgAgBEH/AXEgBhsiBUEBSwRAIA0oAgAgDSAGGyIEIAVqIQUgAigCACEGA0AgBSAEQQFqIgRHBEAgBiAELAAAOgAAIAZBAWohBgwBCwsgAiAGNgIACwJAAkACQCADQbABcUEYdEEYdUEQaw4RAgEBAQEBAQEBAQEBAQEBAQABCyABIAIoAgA2AgAMAQsgASAANgIACwvDBgEUfyMJIQcjCUHgB2okCSAHQYgHaiEIIAdBkANqIQAgB0HYB2oiCSAHQaAGaiIGNgIAIAdBkAdqIg0gBTkDACAGIA0QhQUiBkHjAEsEQBCbBiEAIAggBTkDACAJIABB5aoCIAgQ3AYhBiAJKAIAIgBFBEAQJQsgBkECdBC2BSIIIQsgCARAIAghDCAGIQogCyEQIAAhEQUQJQsFIAAhDCAGIQoLIAdB1AdqIg4gAxDbBSAOQbTsAhCYBiISKAIAKAIwIQAgEiAJKAIAIgYgBiAKaiAMIABBH3FB1ANqEQkAGiAKBH8gCSgCACwAAEEtRgVBAAshEyAHQdwHaiEUIAdB0AdqIRUgB0HMB2ohFiAHQbQHaiEGIAdBqAdqIQggB0GkB2ohCSAHQcAHaiILQgA3AgAgC0EANgIIQQAhAANAIABBA0cEQCAAQQJ0IAtqQQA2AgAgAEEBaiEADAELCyAGQgA3AgAgBkEANgIIQQAhAANAIABBA0cEQCAAQQJ0IAZqQQA2AgAgAEEBaiEADAELCyAIQgA3AgAgCEEANgIIQQAhAANAIABBA0cEQCAAQQJ0IAhqQQA2AgAgAEEBaiEADAELCyACIBMgDiAUIBUgFiALIAYgCCAJEPoHIAogCSgCACIJSgR/IAYoAgQgBiwACyIAQf8BcSAAQQBIGyECIAgoAgQgCCwACyIAQf8BcSAAQQBIGyEXIAlBAWogCiAJa0EBdGoFIAYoAgQgBiwACyIAQf8BcSAAQQBIGyECIAgoAgQgCCwACyIAQf8BcSAAQQBIGyEXIAlBAmoLIRkgByEAIAIgFyAZamoiAkHkAEsEQCACQQJ0ELYFIgAhAiAABEAgACEPIAIhGAUQJQsFIAAhDwsgDyAHQaAHaiIAIAdBnAdqIgIgAygCBCAMIApBAnQgDGogEiATIBQgFSgCACAWKAIAIAsgBiAIIAkQ+wcgB0GYB2oiCiABKAIANgIAIAAoAgAhACACKAIAIQEgDSAKKAIANgIAIA0gDyAAIAEgAyAEEOgGIQAgGARAIBgQtwULIAgQngkgBhCeCSALEJ4JIA4QmQYgEARAIBAQtwULIBEEQCARELcFCyAHJAkgAAvaBQERfyMJIQYjCUHgA2okCSAGQcwDaiINIAMQ2wUgDUG07AIQmAYhDiAFQQtqIgssAAAiB0EASCEAIAVBBGoiDCgCACAHQf8BcSAAGwR/IAUoAgAgBSAAGygCACAOQS0gDigCACgCLEE/cUHUAmoRAABGBUEACyEQIAZB1ANqIREgBkHIA2ohEiAGQcQDaiETIAZBrANqIQcgBkGgA2ohCCAGQZwDaiEJIAZBuANqIgpCADcCACAKQQA2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAdCADcCACAHQQA2AghBACEAA0AgAEEDRwRAIABBAnQgB2pBADYCACAAQQFqIQAMAQsLIAhCADcCACAIQQA2AghBACEAA0AgAEEDRwRAIABBAnQgCGpBADYCACAAQQFqIQAMAQsLIAIgECANIBEgEiATIAogByAIIAkQ+gcgCywAACIAQQBIIQsgDCgCACAAQf8BcSALGyIMIAkoAgAiCUoEfyAHKAIEIAcsAAsiAEH/AXEgAEEASBshAiAIKAIEIAgsAAsiAEH/AXEgAEEASBshFCAJQQFqIAwgCWtBAXRqBSAHKAIEIAcsAAsiAEH/AXEgAEEASBshAiAIKAIEIAgsAAsiAEH/AXEgAEEASBshFCAJQQJqCyEWIAYhACACIBQgFmpqIgJB5ABLBEAgAkECdBC2BSIAIQIgAARAIAAhDyACIRUFECULBSAAIQ8LIA8gBkGYA2oiACAGQZQDaiICIAMoAgQgBSgCACAFIAsbIgUgDEECdCAFaiAOIBAgESASKAIAIBMoAgAgCiAHIAggCRD7ByAGQZADaiIFIAEoAgA2AgAgACgCACEAIAIoAgAhASAGQdADaiICIAUoAgA2AgAgAiAPIAAgASADIAQQ6AYhACAVBEAgFRC3BQsgCBCeCSAHEJ4JIAoQngkgDRCZBiAGJAkgAAuPDQEDfyMJIQwjCUEQaiQJIAxBDGohCiAMIQsgCSAABH8gAkGM7gIQmAYhAiABBEAgAigCACgCLCEAIAogAiAAQf8AcUGYCWoRBAAgAyAKKAIANgAAIAIoAgAoAiAhACALIAIgAEH/AHFBmAlqEQQAIAhBC2oiACwAAEEASARAIAgoAgAhACAKQQA2AgAgACAKEI0GIAhBADYCBAUgCkEANgIAIAggChCNBiAAQQA6AAALIAgQtgkgCCALKQIANwIAIAggCygCCDYCCEEAIQADQCAAQQNHBEAgAEECdCALakEANgIAIABBAWohAAwBCwsgCxCeCQUgAigCACgCKCEAIAogAiAAQf8AcUGYCWoRBAAgAyAKKAIANgAAIAIoAgAoAhwhACALIAIgAEH/AHFBmAlqEQQAIAhBC2oiACwAAEEASARAIAgoAgAhACAKQQA2AgAgACAKEI0GIAhBADYCBAUgCkEANgIAIAggChCNBiAAQQA6AAALIAgQtgkgCCALKQIANwIAIAggCygCCDYCCEEAIQADQCAAQQNHBEAgAEECdCALakEANgIAIABBAWohAAwBCwsgCxCeCQsgAigCACgCDCEAIAQgAiAAQf8BcUE6ahEFADYCACACKAIAKAIQIQAgBSACIABB/wFxQTpqEQUANgIAIAIoAgAoAhQhACALIAIgAEH/AHFBmAlqEQQAIAZBC2oiACwAAEEASAR/IAYoAgAhACAKQQA6AAAgACAKEIgGIAZBADYCBCAGBSAKQQA6AAAgBiAKEIgGIABBADoAACAGCyEAIAYQowkgACALKQIANwIAIAAgCygCCDYCCEEAIQADQCAAQQNHBEAgAEECdCALakEANgIAIABBAWohAAwBCwsgCxCeCSACKAIAKAIYIQAgCyACIABB/wBxQZgJahEEACAHQQtqIgAsAABBAEgEQCAHKAIAIQAgCkEANgIAIAAgChCNBiAHQQA2AgQFIApBADYCACAHIAoQjQYgAEEAOgAACyAHELYJIAcgCykCADcCACAHIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkgAigCACgCJCEAIAIgAEH/AXFBOmoRBQAFIAJBhO4CEJgGIQIgAQRAIAIoAgAoAiwhACAKIAIgAEH/AHFBmAlqEQQAIAMgCigCADYAACACKAIAKAIgIQAgCyACIABB/wBxQZgJahEEACAIQQtqIgAsAABBAEgEQCAIKAIAIQAgCkEANgIAIAAgChCNBiAIQQA2AgQFIApBADYCACAIIAoQjQYgAEEAOgAACyAIELYJIAggCykCADcCACAIIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkFIAIoAgAoAighACAKIAIgAEH/AHFBmAlqEQQAIAMgCigCADYAACACKAIAKAIcIQAgCyACIABB/wBxQZgJahEEACAIQQtqIgAsAABBAEgEQCAIKAIAIQAgCkEANgIAIAAgChCNBiAIQQA2AgQFIApBADYCACAIIAoQjQYgAEEAOgAACyAIELYJIAggCykCADcCACAIIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkLIAIoAgAoAgwhACAEIAIgAEH/AXFBOmoRBQA2AgAgAigCACgCECEAIAUgAiAAQf8BcUE6ahEFADYCACACKAIAKAIUIQAgCyACIABB/wBxQZgJahEEACAGQQtqIgAsAABBAEgEfyAGKAIAIQAgCkEAOgAAIAAgChCIBiAGQQA2AgQgBgUgCkEAOgAAIAYgChCIBiAAQQA6AAAgBgshACAGEKMJIAAgCykCADcCACAAIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkgAigCACgCGCEAIAsgAiAAQf8AcUGYCWoRBAAgB0ELaiIALAAAQQBIBEAgBygCACEAIApBADYCACAAIAoQjQYgB0EANgIEBSAKQQA2AgAgByAKEI0GIABBADoAAAsgBxC2CSAHIAspAgA3AgAgByALKAIINgIIQQAhAANAIABBA0cEQCAAQQJ0IAtqQQA2AgAgAEEBaiEADAELCyALEJ4JIAIoAgAoAiQhACACIABB/wFxQTpqEQUACzYCACAMJAkLswkBEX8gAiAANgIAIA1BC2ohGSANQQRqIRggDEELaiEcIAxBBGohHSADQYAEcUUhHiAOQQBKIR8gC0ELaiEaIAtBBGohGwNAIBdBBEcE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AAs6AAAgAUEBaiEBDAELCyACCwQAIAELKQADQCABIAJHBEAgAyABLAAAOgAAIANBAWohAyABQQFqIQEMAQsLIAILEgAgASACIAFBGHRBGHVBf0obCzMAA0AgASACRwRAIAQgASwAACIAIAMgAEF/Shs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAgsYACAAQdTRATYCACAAKAIQEIoFIAAQowgLDAAgABCtCCAAELcFCxUAIAAoAhAaIAFB/wFxEMcEQf8BcQsyACAAQRBqIQADQCABIAJHBEAgACgCABogASABLQAAEMcEOgAAIAFBAWohAQwBCwsgAgsVACAAKAIQGiABQf8BcRDKBEH/AXELMgAgAEEQaiEAA0AgASACRwRAIAAoAgAaIAEgAS0AABDKBDoAACABQQFqIQEMAQsLIAILEwAgAEGI0gE2AgAgACgCCBCKBQsMACAAELMIIAAQtwULngIBAX8gAUH//wNxIgNBgMAAcQR/IAIgACgCCBCXBUEARwVBAAshASADQYCAAXEEQCAAKAIIGiABIAIQxARBAEdyIQELIANBAnEEQCAAKAIIGiABIAIQwARBAEdyIQELIANBgAJxBEAgASACIAAoAggQlgVBAEdyIQELIANBgARxBEAgASACIAAoAggQmAVBAEdyIQELIANBgAhxBEAgACgCCBogASACEL0EQQBHciEBCyADQYAQcQRAIAEgAiAAKAIIEIwFQQBHciEBCyADQQRxBEAgACgCCBogASACEMYEQQBHciEBCyADQYAgcQRAIAEgAiAAKAIIEIkFQQBHciEBCyADQQFxBH8gACgCCBogASACEMgEQQBHcgUgAQsL9QIBAX8gAEEIaiEAA0AgASACRwRAAkACQCABKAIAIgRBgAFJBEBB4LMBKAIAIAEoAgBBAXRqLgEAIQQMAQUgA0EAOwEAIAQgACgCABCXBQRAIAMgAy4BAEGAwAByOwEACyAAKAIAGiAEEMQEBEAgAyADLgEAQYCAAXI7AQALIAAoAgAaIAQQwAQEQCADIAMuAQBBAnI7AQALIAQgACgCABCWBQRAIAMgAy4BAEGAAnI7AQALIAQgACgCABCYBQRAIAMgAy4BAEGABHI7AQALIAAoAgAaIAQQvQQEQCADIAMuAQBBgAhyOwEACyAEIAAoAgAQjAUEQCADIAMuAQBBgBBy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CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwoLCyAAQSUQqQkgAEH3ABCpCQwLCyAAQSUQqQkgAEH1ABCpCQwKCyAAQSUQqQkgAEHJABCpCQwJCyAAQSUQqQkgAEHtABCpCQwICyAAQSUQqQkgAEHIABCpCQwHCyAAQSUQqQkgAEHkABCpCQwGCyAAQSUQqQkgAEHNABCpCQwFCyAAQSUQqQkgAEHTABCpCQwECyAAQSUQqQkgAEH5ABCpCQwDCyAAQSUQqQkgAEHqABCpCQwCCyAAQSUQqQkgAEHZ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CSAAQSUQugkgBSAFKAIAQQRqNgIADAMFIAAgBSgCACgCABC6CSAFIAUoAgBBBGo2AgAMAwsACwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUgCiALIAMQ4whBBmsOiBAAAQsLCwIDCwsLCwsLCwsLCwQLCwsLCwsLBQsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLBgsLCwcLCAsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCQsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL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ACgCACEBBSADBH8gACgCAAUgAAshASACIgMEQCABQQFqIAEgAxChCRoLCyABQQFBIBCdCRogAkEBaiECIAUsAABBAEgEQCAAIAI2AgQFIAUgAjoAAAsgBEEAOgAAIAEgAmogBBCIBiAEJAkgAAuxAQEHfyMJIQUjCUEQaiQJIABBC2oiBywAACICQQBIIgMEfyAAKAIEBSACQf8BcQsiCCABSQRAECULIAMEfyAAKAIABSAACyEDIAggAWsiBEEBIARBAUkbIQYgBCAGayIEBEAgASADaiIBIAEgBmogBBChCRogBywAACECCyAIIAZrIQEgAkEASARAIAAgATYCBAUgByABOgAACyAFQQA6AAAgASADaiAFEIgGIAUkCSAAC3UBAn8jCSEEIwlBEGokCSADQW9LBEAQJQsgA0ELSQRAIAAgAjoACwUgACADQRBqQXBxIgUQlwkiAzYCACAAIAVBgICAgHhyNgIIIAAgAjYCBCADIQALIAAgASACEMkFGiAEQQA6AAAgACACaiAEEIgGIAQkCQs/ACAAQgA3AgAgAEEANgIIIAEsAAtBAEgEQCAAIAEoAgAgASgCBBCwCQUgACABKQIANwIAIAAgASgCCDYCCAsLjgEBA38jCSEDIwlBEGokCSACQe////8DSwRAECULIAJBAkkEQCAAIAI6AAsgACEEBSACQQRqQXxxIgVB/////wNLBEAQJQUgACAFQQJ0EJcJIgQ2AgAgACAFQYCAgIB4cjYCCCAAIAI2AgQLCyAEIAEgAhDPBRogA0EANgIAIAJBAnQgBGogAxCNBiADJAkLjgEBA38jCSEDIwlBEGokCSABQe////8DSwRAECULIAFBAkkEQCAAIAE6AAsgACEEBSABQQRqQXxxIgVB/////wNLBEAQJQUgACAFQQJ0EJcJIgQ2AgAgACAFQYCAgIB4cjYCCCAAIAE2AgQLCyAEIAEgAhCyCRogA0EANgIAIAFBAnQgBGogAxCNBiADJAkLFgAgAQR/IAAgAiABEK0FGiAABSAACwu5AQEGfyMJIQUjCUEQaiQJIAUhBCAAQQhqIgNBA2oiBiwAACIIQQBIIgcEfyADKAIAQf////8HcUF/agVBAQsiAyACSQRAIAAgAyACIANrIAcEfyAAKAIEBSAIQf8BcQsiBEEAIAQgAiABELUJBSAHBH8gACgC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A0AgACACSARAIAAgASwAADoAACAAIAEsAAE6AAEgACABLAACOgACIAAgASwAAzoAAyAAQQRqIQAgAUEEaiEBDAELCwsDQCAAIANIBEAgACABLAAAOgAAIABBAWohACABQQFqIQEMAQsLIAQLYAEBfyABIABIIAAgASACakhxBEAgACEDIAEgAmohASAAIAJqIQADQCACQQBKBEAgAkEBayECIABBAWsiACABQQFrIgEsAAA6AAAMAQsLIAMhAAUgACABIAIQ4QkaCyAAC5gCAQR/IAAgAmohBCABQf8BcSEBIAJBwwBOBEADQCAAQQNxBEAgACABOgAAIABBAWohAAwBCwsgBEF8cSIFQUBqIQYgAUEIdCABciABQRB0ciABQRh0ciEDA0AgACAGTARAIAAgAzYCACAAIAM2AgQgACADNgIIIAAgAzYCDCAAIAM2AhAgACADNgIUIAAgAzYCGCAAIAM2AhwgACADNgIgIAAgAzYCJCAAIAM2AiggACADNgIsIAAgAzYCMCAAIAM2AjQgACADNgI4IAAgAzYCPCAAQUBrIQAMAQsLA0AgACAFSARAIAAgAzYCACAAQQRqIQAMAQsLCwNAIAAgBEgEQCAAIAE6AAAgAEEBaiEADAELCyAEIAJrC1EBAn8gACMEKAIAIgFqIgIgAUggAEEASnEgAkEASHIEQBADGkEMEApBfw8LIwQgAjYCACACEAJKBEAQAUUEQCMEIAE2AgBBDBAKQX8PCwsgAQsMACABIABBB3ERDQALEQAgASACIABBD3FBCGoRCAALEQAgASACIABBD3FBGGoREAALEwAgASACIAMgAEEBcUEoahEXAAsQACABIABB/wFxQTpqEQUACxIAIAEgAiAAQQdxQboCahEYAAsUACABIAIgAyAAQQdxQcICahEZAAsWACABIAIgAyAEIABBB3FBygJqERoACxgAIAEgAiADIAQgBSAAQQFxQdICahEbAAsSACABIAIgAEE/cUHUAmoRAAALFAAgASACIAMgAEE/cUGUA2oRAQALFgAgASACIAMgBCAAQR9xQdQDahEJAAsYACABIAIgAyAEIAUgAEEHcUH0A2oREwALGAAgASACIAMgBCAFIABBH3FB/ANqEQYACxoAIAEgAiADIAQgBSAGIABBA3FBnARqERwACxoAIAEgAiADIAQgBSAGIABBP3FBoARqERIACxwAIAEgAiADIAQgBSAGIAcgAEEHcUHgBGoRHQALHgAgASACIAMgBCAFIAYgByAIIABBD3FB6ARqEQcACw4AIABBA3FBgAVqERQACxEAIAEgAEH/A3FBhAVqEQMACxIAIAEgAiAAQQ9xQYQJahEMAAsUACABIAIgAyAAQQNxQZQJahERAAsTACABIAIgAEH/AHFBmAlqEQQACxQAIAEgAiADIABBD3FBmApqEQ4ACxYAIAEgAiADIAQgAEEBcUGoCmoRHwALFAAgASACIAMgAEEfcUGqCmoRCwALFgAgASACIAMgBCAAQR9xQcoKahEKAAsYACABIAIgAyAEIAUgAEEDcUHqCmoRFgALGgAgASACIAMgBCAFIAYgAEEHcUHuCmoRFQALDwBBABAARAAAAAAAAAAACw8AQQEQAEQAAAAAAAAAAAsPAEECEABEAAAAAAAAAAALDwBBAxAARAAAAAAAAAAACwgAQQQQAEEACwgAQQUQAEEACwgAQQYQAEEACwgAQQcQAEEACwgAQQgQAEEACwgAQQkQAEEACwgAQQoQAEEACwgAQQsQAEEACwgAQQwQAEEACwgAQQ0QAEEACwgAQQ4QAEEACwgAQQ8QAEEACwgAQRAQAEEACwgAQREQAEEACwgAQRIQAEEACwgAQRMQAEEACwYAQRQQAAsGAEEVEAALBgBBFhAACwYAQRcQAAsGAEEYEAALBgBBGRAACwYAQRoQAAsGAEEbEAALBgBBHBAACwYAQR0QAAsGAEEeEAALBgBBHxAACyAAIAEgAiADIAQgBa0gBq1CIIaEIABBB3FB+ARqER4ACyAAIAEgAiADrSAErUIghoQgBSAGIABBB3FB9gpqEQIACwurkgKqAQBBgAgLQoBAAACITQAAiE0AAIhNAAAwTQAAkEAAAPA9AADwPQAAoEAAAIhNAACITQAAiE0AAKBAAACITQAAiE0AAIhNAADgPQBB0AgLMsBAAACITQAAiE0AAIhNAADgQAAA8D0AAPA9AADwPQAAuEEAAPA9AADwPQAA8D0AADBNAEGQCQukASBNAACgQgAAiE0AAOA9AACoQwAAiE0AAIhNAACITQAAyEMAAIhNAACITQAAiE0AACBNAAAgRAAAeE0AAEBEAAAwTQAA6EMAAHhNAABARAAAIE0AAJBEAAB4TQAAQD4AADBNAAB4RAAAeE0AAEA+AAAgTQAAyEQAAHhNAADwPQAAME0AAEBEAAB4TQAA8D0AAN4SBJUAAAAA////////////////AEHACgvMAQIAAMADAADABAAAwAUAAMAGAADABwAAwAgAAMAJAADACgAAwAsAAMAMAADADQAAwA4AAMAPAADAEAAAwBEAAMASAADAEwAAwBQAAMAVAADAFgAAwBcAAMAYAADAGQAAwBoAAMAbAADAHAAAwB0AAMAeAADAHwAAwAAAALMBAADDAgAAwwMAAMMEAADDBQAAwwYAAMMHAADDCAAAwwkAAMMKAADDCwAAwwwAAMMNAADTDgAAww8AAMMAAAy7AQAMwwIADMMDAAzDBAAM0wBBlBAL+QMBAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAA9AAAAPgAAAD8AAABAAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAdAAAAHUAAAB2AAAAdwAAAHgAAAB5AAAAegAAAHsAAAB8AAAAfQAAAH4AAAB/AEGQGAuABBIRExQVFhcYGRobHB0eHyAhESIjJBElJicoKSorLBEtLi8QEDAQEBAQEBAQMTIzEDQ1EBARERERERERERERERERERERERERERERERERNhERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERETcREREROBE5Ojs8PT4RERERERERERERERERERERERERERERERERERERERERERERERERERERERERPxAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBFAQRFCQ0RFRkdISRAQEEpLTE1OEBAQT1AQEBAQURAQEBAQEBAQEBEREVJTEBAQEBAQEBAQEBARERERVBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBERVRAQEBBWEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFcQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFhZWlsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQXBAQEBAQEBAQEBAQEBAQEBAQAEGwHAsg//////////////////////////////////////////8AQdgcCzb+//8H/v//BwAAAAAABCAE//9/////f//////////////////////////////////D/wMAH1AAQZgdC6QBIAAAAAAA3zxA1///+////////////7///////////////////////wP8/////////////////////////wD+////fwL+/////wAAAAAA/7+2AP///wcHAAAA/wf//////////v/D////////////////7x/+4f+fAAD///////8A4P///////////////wMA//////8HMAT////8/x8AAP///wEAQcQeC+QB/R8AAAAAAADwA/9//////////+//3+H/z//+/u6f+f///cXjn1mAsM//AwDuh/n///1tw4cZAl7A/z8A7r/7///97eO/GwEAz/8AAO6f+f///e3jnxnAsM//AgDsxz3WGMf/w8cdgQDA/wAA7t/9///97+PfHWADz/8AAOzf/f///e/j3x1gQM//BgDs3/3/////599dgADP/wD87P9//P//+y9/gF//AAAMAP7/////f/8HPyD/AwAAAACWJfD+ruz/O18g//MAAAAAAQAAAP8DAAD//v///x/+/wP///7///8fAEGwIAuVAv///////3/5/wP//+fB//9/QP8z/////78g///////3////////////PX89//////89/////z1/Pf9//////////z3//////////4cAAAAA//8AAP////////////8fAP7//////////////////////////////////////////////////////////5////7//wf////////////HAQD/3w8A//8PAP//DwD/3w0A////////z///AYAQ/wMAAAAA/wP//////////////wD//////wf//////////z8A////H/8P/wHA/////z8fAP//////D////wP/AwAAAAD///8P/////////3/+/x8A/wP/A4AAQdAiCzD////////v/+8P/wMAAAAA///////z////////v/8DAP///////z8A/+P//////z8AQY0jCxvebwD///////////////////////////////8AQbAjCyD//z8//////z8//6r///8/////////31/cH88P/x/cHwBB3iMLBgKAAAD/HwBB8CMLEoT8Lz5Qvf/z4EMAAP//////AQBBpiQLUMD///////8DAAD//////3///////3//////////////////////H3gMAP////+/IP////////+AAAD//38Af39/f39/f3//////AAAAAACAAEGQJQtX4AAAAP4DPh/+////////////f+D+//////////////fg/////z/+/////////////38AAP///wcAAAAAAAD///////////////////////////////8/AEHwJQsy/////////////////////////////////x8AAAAAAAD//////////////////////x8AQaomCzz//////z//H////w8AAP//////f/CP////gP////////////8AAAAAgP/8////////////////eQ8A/wcAQe8mC2f/u/f///8AAAD///////8PAP//////////DwD/AwAA/Aj//////wf/////BwD///8f////////9/8AgP8DAAAAAP///////38A/z//A///fwT/////////fwUAADj//zwAfn5+AH9/AEHoJwuIAf//////B/8D//////////////////////////8PAP//f/j//////w//////////////////P/////////////////8DAAAAAH8A+OD//X9f2/////////////////8DAAAA+P///////////////z8AAP///////////P///////wAAAAAA/w8AQf4oC1Lf/////////////////////x8AAP8D/v//B/7//wfA/////////////3/8/PwcAAAAAP/v//9///+3/z//PwAAAAD///////////////////8HAEHYKQsH////////HwBBgCoLRv///x////////8BAAAAAAD///9/AAD///8HAAAAAAAA////P/////8P/z4AAAAAAP////////////////////////8//wMAQdAqCws//f////+/kf//PwBB8CoLCP//PwD///8DAEGAKwsI/////////8AAQZArCxBv8O/+//8PAAAAAAD///8fAEGwKwsP////////PwD//z8A//8HAEHQKwsK////////////AQBB8CsLKP//////////PwAAAMD/AAD8////////AQAA////Af8D////////x/8AQaAsCwz//////////x4A/wMAQcAsCx7///////8/AP8DAAAAAAAA/////////////////38AQfAsCw3///////////////8HAEGQLQsG//////9/AEGwLQsI/////////wEAQdAtCxT//////////x8A//////9/AAD4/wBB8C0LAQMAQZAuC5gB/////////////9///////////99k3v/r7/////////+/59/f////e1/8/f//////////////////////////////////////////////////////P/////3///f////3///f////3///f////3/////9/////f//98/////////v////lv73CoTqlqqW9/de//v/D+77/w8AQbAvC1IgAAAACQAAAAoAAAANAAAACwAAAAwAAACFAAAAACAAAAEgAAACIAAAAyAAAAQgAAAFIAAABiAAAAggAAAJIAAACiAAACggAAApIAAAXyAAAAAwAEGQMAv0AUEAIBrAACAfAAEBLzIBAQU5AQEPSgEBLXkBAQVwAwEDkQMgEaMDIAkABFAQEAQgIGAEASGKBAE1wQQBDdAEAT8UBQETMQUwJqABAQWz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//////9/H/zxf/9/AAD///8DAAD/////AQB7A9DBr0IADB+8//8AAAAAAAL//////////////////////////////////////////////////////////w8A/////38AAAD/BwAA/////////////z8AAAAAAAD8///+/////////////////////////////////////////////////////x//AwBB/MIACwTghwP+AEGOwwALAgGAAEGgwwALCP//////f/8PAEGwwwALOP////v/////////////DwD//////////////////////////////////z8AAAD/Dx7///8B/MHgAEHzwwALAh4BAEH/wwALAQgAQZLEAAsu//8AAAAA/////w8AAAD///9/////////////////////////////////////fwBB2MQACwj//////////wBB8sQACxD///////9/AAAAAAAAwADgAEGNxQALA4APcABBnsUACwf/AP//fwADAEGxxQALAQYAQcDFAAsPRAgAAAAP/wMAAAAAAADwAEHYxQALFBDAAAD//wMHAAAAAAD4AAAAAAiAAEH2xQALBggA/z8AwABBi8YACxTwAACACwAAAAAAAACAAgAAwAAAQwBBvcYACwQ4AAABAEH/xgALB4AAAAAAAAIAQZbHAAsD/P8DAEGnxwALAcAAQb/HAAsPMP///wN/AP/////3/38PAEHfxwALDoD+/wD8AQAA+AEAAPg/AEH8xwALKX9/ADCH//////+P/wAAAAAAAOD//wf/DwAAAAAAAP//////PwAAAAAPAEGzyAALCIAAAAAAAAABAEHKyAALAoD/AEHiyAALBsCPAAAAgABBh8kACwmH/wD/AQAAAOAAQafJAAsJ/gAAAP8AAAD/AEHMyQALBP///38AQejJAAsRwD/8/z8AAAADAAAAAAAA/gMAQYbKAAsDGAAPAEGYygALAuEBAEG2ygALAcAAQc7KAAsBDwBB8coACwKABwBBgMsAC0n///////////////////////////////////////8/AP////9//v///////////////////////////z8AAAAA//////////8/AEHgywALD/////////////9/AP//AwBBmMwACyECAAAIAAAACAAAIAAAACAAAIAAAACAAAAAAgAAAAIAAAgAQd7MAAs2AwD//////w////////////////8PAP9//n/+//7/AAAAAP8H////f/////////8P//////8HAEGczQALD8D///8HAP//////B/8BAwBBwM0AC03/////AQC///////////8f//8PAP/////fBwAA//8BAP////////9//f////////////////////////////8e/////////z8PAP///wBBn84ACzD4///////////h/wAAAAAAAP//////////PwAAAAAAAAD//////////////////w8AQeDQAAv/AQIAAgACAAIAAgACAAIAAgACAAMgAiACIAIgAiACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgABYATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwAjYCNgI2AjYCNgI2AjYCNgI2AjYBMAEwATABMAEwATABMAI1QjVCNUI1QjVCNUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFBMAEwATABMAEwATACNYI1gjWCNYI1gjWCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgTABMAEwATAAgBB5NgAC/kDAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAAB7AAAAfAAAAH0AAAB+AAAAfwBB4OAAC6ECCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QX/////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBBkOMACxgRAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAQbDjAAshEQAPChEREQMKBwABEwkLCwAACQYLAAALAAYRAAAAERERAEHh4wALAQsAQerjAAsYEQAKChEREQAKAAACAAkLAAAACQALAAALAEGb5AALAQwAQafkAAsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEHV5AALAQ4AQeHkAAsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGP5QALARAAQZvlAAseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHS5QALDhIAAAASEhIAAAAAAAAJAEGD5gALAQsAQY/mAAsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEG95gALAQwAQcnmAAt+DAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AEHQ5wAL1w5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgAAAAAAAExDX0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUA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MFcAQeSuAQsFaFcAAAUAQfSuAQsBCwBBjK8BCwoKAAAACwAAANe3AEGkrwELAQIAQbOvAQsF//////8AQeSvAQsF6FcAAAkAQfSvAQsBCwBBiLABCxIMAAAAAAAAAAsAAAD4ngAAAAQAQbSwAQsE/////wBB5LABCwVoWAAABQBB9LABCwELAEGMsQELDg0AAAALAAAACKMAAAAEAEGksQELAQEAQbOxAQsFCv////8AQeSxAQsGaFgAABAIAEGoswELAtCvAEHgswELEGAoAABgLAAAX3CJAP8JLw8AQZS0AQsBDgBBu7QBCwX//////wBB7LQBC6kCDosAANe3AADXtwAA17cAANe3AADXtwAA17cAANe3AADXtwAA17cAAH9/f39/f39/f39/f39/AAAAAAAAqEUAAHEAAAByAAAAAAAAAMBFAABzAAAAdAAAAAEAAAABAAAAAwAAAAgAAAABAAAAAgAAAAIAAAAMAAAABAAAAAUAAAADAAAABgAAAAAAAADIRQAAdQAAAHYAAAAZAAAADwAAAAQAAAAJAAAADQAAAA4AAAAQAAAADwAAABAAAAAHAAAAEQAAAAgAAAAIAAAAAAAAANBFAAAeAAAAHwAAAPj////4////0EUAACAAAAAhAAAAQFsAAFRbAAAIAAAAAAAAAOhFAAB3AAAAeAAAAPj////4////6EUAAHkAAAB6AAAAcFsAAIRbAAAEAEGdtwEL4A5GAAAHAAAACAAAAPz////8////AEYAAAkAAAAKAAAAoFsAALRbAAAEAAAAAAAAABhGAAB7AAAAfAAAAPz////8////GEYAAH0AAAB+AAAA0FsAAORbAAAAAAAAMEYAAHUAAAB/AAAAGgAAAA8AAAAEAAAACQAAABEAAAAOAAAAEAAAAA8AAAAQAAAABwAAABIAAAAJAAAAAAAAAEBGAABzAAAAgAAAABsAAAABAAAAAwAAAAgAAAASAAAAAgAAAAIAAAAMAAAABAAAAAUAAAATAAAACgAAAAAAAABQRgAAdQAAAIEAAAAcAAAADwAAAAQAAAAJAAAADQAAAA4AAAAQAAAAEwAAABQAAAALAAAAEQAAAAgAAAAAAAAAYEYAAHMAAACCAAAAHQAAAAEAAAADAAAACAAAAAEAAAACAAAAAgAAABUAAAAWAAAADAAAAAMAAAAGAAAAAAAA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RVJST1IhOiBwMT0AIGFuZCAKAHBvaW50LmNwcDogeHlEaXN0YW5jZVRvTGluZSBFUlJPUiE6IHAyPQBwb2ludC5jcHA6IHh5RGlzdGFuY2VUb0xpbmUgRVJST1IhOiBpbiB0aGUgeHktcGxhbmUKAHBvaW50LmNwcDogeHlDbG9zZXN0UG9pbnQgRVJST1IhOiBjYW4ndCBjYWxjdWxhdGUgY2xvc2VzdCBwb2ludCBmcm9tIAoAcG9pbnQuY3BwOiB4eUNsb3Nlc3RQb2ludCBFUlJPUiE6ICp0aGlzID0AcG9pbnQuY3BwOiB4eUNsb3Nlc3RQb2ludCBFUlJPUiE6IHAxPQBwb2ludC5jcHA6IHh5Q2xvc2VzdFBvaW50IEVSUk9SITogcDI9AHBvaW50LmNwcDogeHlDbG9zZXN0UG9pbnQgRVJST1IhOiBpbiB0aGUgeHktcGxhbmUKAE4zb2NsOVNUTFJlYWRlckUAcmIAYWFhYWEAc29saWQAdmVydGUAZmFjZXQAZW5kZmEATlN0M19fMjE5YmFzaWNfaXN0cmluZ3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAE5TdDNfXzIxM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjE0YmFzaWNfaWZzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUATjNvY2w4VHJpYW5nbGVFAHRyaWFuZ2xlLmNwcDogenNsaWNlX3ZlcnRzKCkgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHotc2xpY2UKACB0cmlhbmdsZT0AVDogAG49ACB6Y3V0PQAgYWJvdmUgcG9pbnRzOgoAICAgACBiZWxvdyBwb2ludHM6CgBCYWxsQ3V0dGVyKGQ9ACwgcj0ATjNvY2wxMEJhbGxDdXR0ZXJFAFdBUk5JTkc6IEJ1bGxDdXR0ZXI6OnNpbmdsZUVkZ2VEcm9wQ2Fub25pY2FsKCkgaXRlcnM+MjAwICEhCgBCdWxsQ3V0dGVyKGQ9ACwgcjE9ACByMj0ATjNvY2wxMEJ1bGxDdXR0ZXJFAE4zb2NsOEludGVydmFsRQBOM29jbDVGaWJlckUAQ29tcG9zaXRlQ3V0dGVyIHdpdGggACBjdXR0ZXJzOgoAIAA6ACAgcmFkaXVzWwBdPQAgIGhlaWdodFsAICB6b2Zmc2V0WwAgRVJST1I6IG5vdCBpbXBsZW1lbnRlZC4KAE4zb2NsMTVDb21wb3NpdGVDdXR0ZXJFAE4zb2NsMTRCYWxsQ29uZUN1dHRlckUAQ29uZUN1dHRlciAoZD0ALCBhbmdsZT0ATjNvY2wxMENvbmVDdXR0ZXJFAE1pbGxpbmdDdXR0ZXI6OmZhY2V0UHVzaCgpIHR2YWw9IAAgZXJyb3IhPwoAIHRyaWFuZ2xlOiAAIGZpYmVyOiAAIChtb3N0IHByb2JhYmx5IGEgdXNlciBlcnJvciwgdGhlIGZpYmVyIGlzIHRvbyBzaG9ydCBjb21wYXJlZCB0byB0aGUgU1RMIG1vZGVsPykKAE4zb2NsMTNNaWxsaW5nQ3V0dGVyRQBDeWxDdXR0ZXIgKGQ9ACwgTD0ATjNvY2w5Q3lsQ3V0dGVyRQBOM29jbDdFbGxpcHNlRQBOM29jbDE0QWxpZ25lZEVsbGlwc2VFAEVsbGlwc2U6OmZpbmRfRWxsaXBzZVBvc2l0aW9uMiBjYW5ub3QgZmluZCBFbGxpcHNlUG9zaXRpb24yISAKAGVsbGlwc2U9IABFbGxpcHNlOiBjZW49ACBhPQAgYj0AIG9mcz0AMXN0OiAocywgdCk9IAAgb2VQb2ludCgpPSAAIGU9ADJuZDogKHMsIHQpPSAAIGJyZW50X3plcm8oKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGludGVydmFsIFthLGJdICEKACgAICwAKQBkcm9wQ3V0dGVyU1RMNSAAIGNsLXBvaW50cyBhbmQgACB0cmlhbmdsZXMuCgAKIAAgZHJvcEN1dHRlcigpIGNhbGxzLgoAMCUgICAxMCAgIDIwICAgMzAgICA0MCAgIDUwICAgNjAgICA3MCAgIDgwICAgOTAgICAxMDAlCgB8LS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwAYmRjOjpzZXRTVEwoKQoAYmRjOjpzZXRTVEwoKSBkb25lLgoARVJST1I6IEtEVHJlZTo6YnVpbGRfbm9kZSgpIGNhbGxlZCB3aXRoIHRyaXMtPnNpemUoKT09MCAhIAoATjNvY2w2S0ROb2RlSU5TXzhUcmlhbmdsZUVFRQAgRVJST1IsIEtEVHJlZTo6Y2FsY19zcHJlYWQoKSBjYWxsZWQgd2l0aCB0cmlzLT5zaXplKCk9PTAgISAKAE4zb2NsOU9wZXJhdGlvbkUATjNvY2wxNUJhdGNoRHJvcEN1dHRlckUATjNvY2w2S0RUcmVlSU5TXzhUcmlhbmdsZUVFRQBFUlJPUjogY2FuJ3QgY2FsbCBydW4oKSBvbiBQb2ludERyb3BDdXR0ZXIoKQoATjNvY2wxNVBvaW50RHJvcEN1dHRlckUATjNvY2wxNFBhdGhEcm9wQ3V0dGVyRQBOM29jbDIyQWRhcHRpdmVQYXRoRHJvcEN1dHRlckUARVJST1I6IHNldFhEaXJlY3Rpb24oKSBvciBzZXRZRGlyZWN0aW9uKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHNldFNUTCgpIAoATjNvY2wxNUJhdGNoUHVzaEN1dHRlckUAQlBDOjpzZXRTVEwoKSBCdWlsZGluZyBrZC10cmVlLi4uIGJ1Y2tldFNpemU9AC4uACBFUlJPUjogc2V0WERpcmVjdGlvbigpIG9yIHNldFlEaXJlY3Rpb24oKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc2V0U1RMKCkgCgBCUEM6OnNldFNUTCgpIHJvb3QtPmJ1aWxkKCkATjNvY2wxNUZpYmVyUHVzaEN1dHRlckUASSBbACBdACBmaWJlciBkaXI9ACBhbmQgACBpbnRlcnZhbHMKACBmaWJlci5wMT0AIGZpYmVyLnAyIABOM29jbDV3ZWF2ZTVXZWF2ZUUATjNvY2w5V2F0ZXJsaW5lRQAgWEZpYmVyIGFkYXB0aXZlIHNhbXBsZSAKACBZRmliZXIgYWRhcHRpdmUgc2FtcGxlIAoAfkFkYXB0aXZlV2F0ZXJsaW5lKCk6IHN1Yk9wLnNpemUoKT0gAE4zb2NsMTdBZGFwdGl2ZVdhdGVybGluZUUATjNvY2w1d2VhdmUxMVNpbXBsZVdlYXZlRQAgU2ltcGxlV2VhdmU6OmJ1aWxkKCkuLi4gCgAgU21hcnRXZWF2ZTo6YnVpbGQoKSBhZGRfYWxsX2VkZ2VzKCkuLi4gACBkb25lLgoAVGhlcmUgYXJlIAAgdmVydGljZXMuCgBOM29jbDV3ZWF2ZTEwU21hcnRXZWF2ZUUAbnVtZXJpYzo6eHlWZWN0b3JUb0RpYW5nbGUoKSBlcnJvciAoeCx5KT0gKAAgLCAAICkgYW5kIGRpYW5nbGU9AAoATjNvY2w4Q0xGaWx0ZXJFAE4zb2NsMTJMaW5lQ0xGaWx0ZXJFAGlpAHYAUG9pbnQAdmkAaWlkZGQAaWlkZABpaWkAbm9ybQBkaWkAeHlOb3JtAG5vcm1hbGl6ZQB2aWkAZG90AGRpaWkAY3Jvc3MAaWlpaQB4Um90YXRlAHZpaWQAeVJvdGF0ZQB6Um90YXRlAGlzUmlnaHQAaWlpaWkAeHlEaXN0YW5jZQBfX3N0cl9fAHgAeQB6AENMUG9pbnQAaWlkZGRpAGNjAGdldENDAENDUG9pbnQAVHJpYW5nbGUAQ0NUeXBlAE5PTkUAVkVSVEVYAFZFUlRFWF9DWUwARURHRQBFREdFX1NIQUZUAEVER0VfSE9SSVoARURHRV9DWUwARURHRV9CQUxMAEVER0VfQ09ORQBFREdFX0NPTkVfQkFTRQBFREdFX0hPUklaX0NZTABFREdFX0hPUklaX1RPUgBFREdFX1BPUwBFREdFX05FRwBGQUNFVABGQUNFVF9USVAARkFDRVRfQ1lMAEVSUk9SAFNUTFJlYWRlcgBTVExTdXJmAGFkZFRyaWFuZ2xlAHZpaWkAc2l6ZQBCYm94AGlzSW5zaWRlAG1heHB0AG1pbnB0AEVsbGlwc2VQb3NpdGlvbgBzAHQAc2V0RGlhbmdsZQBMaW5lAHAxAHAyAEFyYwBpaWlpaWkAYwBkaXIAU3BhblR5cGUATGluZVNwYW5UeXBlAEFyY1NwYW5UeXBlAFBhdGgAYXBwZW5kTGluZQBhcHBlbmRBcmMAT3BlcmF0aW9uAHNldEN1dHRlcgBnZXRDTFBvaW50cwBzZXRTVEwAc2V0U2FtcGxpbmcAQmF0Y2hEcm9wQ3V0dGVyAHJ1bgBQYXRoRHJvcEN1dHRlcgBzZXRQYXRoAGdldFoAc2V0WgBnZXRQb2ludHMAQWRhcHRpdmVQYXRoRHJvcEN1dHRlcgBzZXRNaW5TYW1wbGluZwBzZXRDb3NMaW1pdABCYXRjaFB1c2hDdXR0ZXIASW50ZXJ2YWwAdXBwZXIAbG93ZXIAbG93ZXJfY2MAdXBwZXJfY2MAdXBkYXRlVXBwZXIAdmlpZGkAdXBkYXRlTG93ZXIAZW1wdHkARmliZXIAc3RkOjp2ZWN0b3I8UG9pbnQ+AHN0ZDo6dmVjdG9yPENMUG9pbnQ+AHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFBvaW50Pj4AV2F0ZXJsaW5lAGdldExvb3BzAEFkYXB0aXZlV2F0ZXJsaW5lAFdlYXZlVmVydGV4VHlwZQBDTABDTF9ET05FAEFESgBUV09BREoASU5UAEZVTExJTlQATGluZUNMRmlsdGVyAE1pbGxpbmdDdXR0ZXIAQ3lsQ3V0dGVyAEJhbGxDdXR0ZXIAQnVsbEN1dHRlcgBDb25lQ3V0dGVyAFBLTjNvY2wxMENvbmVDdXR0ZXJFAFBOM29jbDEwQ29uZUN1dHRlckUAUEtOM29jbDEwQnVsbEN1dHRlckUAUE4zb2NsMTBCdWxsQ3V0dGVyRQBQS04zb2NsMTBCYWxsQ3V0dGVyRQBQTjNvY2wxMEJhbGxDdXR0ZXJFAFBLTjNvY2w5Q3lsQ3V0dGVyRQBQTjNvY2w5Q3lsQ3V0dGVyRQBQS04zb2NsMTNNaWxsaW5nQ3V0dGVyRQBQTjNvY2wxM01pbGxpbmdDdXR0ZXJFAFBLTjNvY2wxMkxpbmVDTEZpbHRlckUAUE4zb2NsMTJMaW5lQ0xGaWx0ZXJFAE4zb2NsNXdlYXZlMTBWZXJ0ZXhUeXBlRQBQS04zb2NsMTdBZGFwdGl2ZVdhdGVybGluZUUAUE4zb2NsMTdBZGFwdGl2ZVdhdGVybGluZUUATlN0M19fMjZ2ZWN0b3JJTlMwX0lOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUVOUzNfSVM1X0VFRUUATlN0M19fMjEzX192ZWN0b3JfYmFzZUlOU182dmVjdG9ySU4zb2NsNVBvaW50RU5TXzlhbGxvY2F0b3JJUzNfRUVFRU5TNF9JUzZfRUVFRQBOU3QzX18yMjBfX3ZlY3Rvcl9iYXNlX2NvbW1vbklMYjFFRUUAUEtOM29jbDlXYXRlcmxpbmVFAFBOM29jbDlXYXRlcmxpbmVFAHB1c2hfYmFjawByZXNpemUAdmlpaWkAZ2V0AHNldABOU3QzX18yNnZlY3RvcklOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATlN0M19fMjEzX192ZWN0b3JfYmFzZUlOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATjEwZW1zY3JpcHRlbjN2YWxFAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAUEtOU3QzX18yNnZlY3RvcklOUzBfSU4zb2NsNVBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRU5TM19JUzVfRUVFRQBQTlN0M19fMjZ2ZWN0b3JJTlMwX0lOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUVOUzNfSVM1X0VFRUUAUEtOU3QzX18yNnZlY3RvcklOM29jbDdDTFBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBQTlN0M19fMjZ2ZWN0b3JJTjNvY2w3Q0xQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATlN0M19fMjZ2ZWN0b3JJTjNvY2w3Q0xQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATlN0M19fMjEzX192ZWN0b3JfYmFzZUlOM29jbDdDTFBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBQS05TdDNfXzI2dmVjdG9ySU4zb2NsNVBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBQTlN0M19fMjZ2ZWN0b3JJTjNvY2w1UG9pbnRFTlNfOWFsbG9jYXRvcklTMl9FRUVFAFBLTjNvY2w1RmliZXJFAFBOM29jbDVGaWJlckUATlN0M19fMjEyYmFzaWNfc3RyaW5nSWNOU18xMWNoYXJfdHJhaXRzSWNFRU5TXzlhbGxvY2F0b3JJY0VFRUUATlN0M19fMjIxX19iYXNpY19zdHJpbmdfY29tbW9uSUxiMUVFRQBQS04zb2NsOEludGVydmFsRQBQTjNvY2w4SW50ZXJ2YWxFAFBLTjNvY2wxNUJhdGNoUHVzaEN1dHRlckUAUE4zb2NsMTVCYXRjaFB1c2hDdXR0ZXJFAFBLTjNvY2wyMkFkYXB0aXZlUGF0aERyb3BDdXR0ZXJFAFBOM29jbDIyQWRhcHRpdmVQYXRoRHJvcEN1dHRlckUAUEtOM29jbDE0UGF0aERyb3BDdXR0ZXJFAFBOM29jbDE0UGF0aERyb3BDdXR0ZXJFAFBLTjNvY2wxNUJhdGNoRHJvcEN1dHRlckUAUE4zb2NsMTVCYXRjaERyb3BDdXR0ZXJFAFBLTjNvY2w5T3BlcmF0aW9uRQBQTjNvY2w5T3BlcmF0aW9uRQBQS04zb2NsNFBhdGhFAFBOM29jbDRQYXRoRQBOM29jbDhTcGFuVHlwZUUAUEtOM29jbDNBcmNFAFBOM29jbDNBcmNFAFBLTjNvY2w0TGluZUUAUE4zb2NsNExpbmVFAFBLTjNvY2wxNUVsbGlwc2VQb3NpdGlvbkUAUE4zb2NsMTVFbGxpcHNlUG9zaXRpb25FAE4zb2NsMTVFbGxpcHNlUG9zaXRpb25FAFBLTjNvY2w0QmJveEUAUE4zb2NsNEJib3hFAFBLTjNvY2w3U1RMU3VyZkUAUE4zb2NsN1NUTFN1cmZFAE4zb2NsN1NUTFN1cmZFAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVOU185YWxsb2NhdG9ySXdFRUVFAFBLTjNvY2w5U1RMUmVhZGVyRQBQTjNvY2w5U1RMUmVhZGVyRQBOM29jbDZDQ1R5cGVFAFBLTjNvY2w4VHJpYW5nbGVFAFBOM29jbDhUcmlhbmdsZUUAUEtOM29jbDdDQ1BvaW50RQBQTjNvY2w3Q0NQb2ludEUAUEtOM29jbDdDTFBvaW50RQBQTjNvY2w3Q0xQb2ludEUAUEtOM29jbDVQb2ludEUAUE4zb2NsNVBvaW50RQB2b2lkAGJvb2wAY2hhcgBzaWduZWQgY2hhcgB1bnNpZ25lZCBjaGFyAHNob3J0AHVuc2lnbmVkIHNob3J0AGludAB1bnNpZ25lZCBpbnQAbG9uZwB1bnNpZ25lZCBsb25nAGZsb2F0AGRvdWJsZQBzdGQ6OnN0cmluZwBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBzdGQ6OndzdHJpbmcAZW1zY3JpcHRlbjo6dmFsAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZmxvYXQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGRvdWJsZT4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZyBkb3VibGU+AE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWVFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lkRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJZkVFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SW1FRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lsRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJakVFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWlFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0l0RUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJc0VFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWhFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lhRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJY0VFAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0loTlNfMTFjaGFyX3RyYWl0c0loRUVOU185YWxsb2NhdG9ySWhFRUVFAHJ3YQBpbmZpbml0eQAAAQIEBwMGBQAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAG5hbgBOQU4ALgBMQ19BTEwATEFORwBDLlVURi04AFBPU0lYAE1VU0xfTE9DUEFUSABOU3QzX18yOGlvc19iYXNlRQBOU3QzX18yOWJhc2ljX2lvc0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQBOU3QzX18yOWJhc2ljX2lvc0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRQBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjE1YmFzaWNfc3RyZWFtYnVmSXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFAE5TdDNfXzIxM2Jhc2ljX2lzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjEzYmFzaWNfaXN0cmVhbUl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRQBOU3QzX18yMTNiYXNpY19vc3RyZWFtSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAE5TdDNfXzIxM2Jhc2ljX29zdHJlYW1Jd05TXzExY2hhcl90cmFpdHNJd0VFRUUATlN0M19fMjExX19zdGRvdXRidWZJd0VFAE5TdDNfXzIxMV9fc3Rkb3V0YnVmSWNFRQB1bnN1cHBvcnRlZCBsb2NhbGUgZm9yIHN0YW5kYXJkIGlucHV0AE5TdDNfXzIxMF9fc3RkaW5idWZJd0VFAE5TdDNfXzIxMF9fc3RkaW5idWZJY0VFAE5TdDNfXzI3Y29sbGF0ZUljRUUATlN0M19fMjZsb2NhbGU1ZmFjZXRFAE5TdDNfXzI3Y29sbGF0ZUl3RUUAJXAAQwBOU3QzX18yN251bV9nZXRJY05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzI5X19udW1fZ2V0SWNFRQBOU3QzX18yMTRfX251bV9nZXRfYmFzZUUATlN0M19fMjdudW1fZ2V0SXdOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJd05TXzExY2hhcl90cmFpdHNJd0VFRUVFRQBOU3QzX18yOV9fbnVtX2dldEl3RUUAJXAAAAAATABsbAAlAAAAAABsAE5TdDNfXzI3bnVtX3B1dEljTlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjlfX251bV9wdXRJY0VFAE5TdDNfXzIxNF9fbnVtX3B1dF9iYXNlRQBOU3QzX18yN251bV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzI5X19udW1fcHV0SXdFRQAlSDolTTolUwAlbS8lZC8leQAlSTolTTolUyAlcAAlYSAlYiAlZCAlSDolTTolUyAlWQBBTQBQTQBKYW51YXJ5AEZlYnJ1YXJ5AE1hcmNoAEFwcmlsAE1heQBKdW5lAEp1bHkAQXVndXN0AFNlcHRlbWJlcgBPY3RvYmVyAE5vdmVtYmVyAERlY2VtYmVyAEphbgBGZWIATWFyAEFwcgBKdW4ASnVsAEF1ZwBTZXAAT2N0AE5vdgBEZWMAU3VuZGF5AE1vbmRheQBUdWVzZGF5AFdlZG5lc2RheQBUaHVyc2RheQBGcmlkYXkAU2F0dXJkYXkAU3VuAE1vbgBUdWUAV2VkAFRodQBGcmkAU2F0ACVtLyVkLyV5JVktJW0tJWQlSTolTTolUyAlcCVIOiVNJUg6JU06JVMlSDolTTolU05TdDNfXzI4dGltZV9nZXRJY05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzIyMF9fdGltZV9nZXRfY19zdG9yYWdlSWNFRQBOU3QzX18yOXRpbWVfYmFzZUUATlN0M19fMjh0aW1lX2dldEl3TlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFRUUATlN0M19fMjIwX190aW1lX2dldF9jX3N0b3JhZ2VJd0VFAE5TdDNfXzIxNXRpbWVfZ2V0X2J5bmFtZUljTlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjE4X190aW1lX2dldF9zdG9yYWdlSWNFRQBOU3QzX18yMTBfX3RpbWVfZ2V0RQBOU3QzX18yMTV0aW1lX2dldF9ieW5hbWVJd05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxOF9fdGltZV9nZXRfc3RvcmFnZUl3RUUATlN0M19fMjh0aW1lX3B1dEljTlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjEwX190aW1lX3B1dEUATlN0M19fMjh0aW1lX3B1dEl3TlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFRUUATlN0M19fMjE1dGltZV9wdXRfYnluYW1lSWNOU18xOW9zdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yMTV0aW1lX3B1dF9ieW5hbWVJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMG1vbmV5cHVuY3RJY0xiMEVFRQBOU3QzX18yMTBtb25leV9iYXNlRQBOU3QzX18yMTBtb25leXB1bmN0SWNMYjFFRUUATlN0M19fMjEwbW9uZXlwdW5jdEl3TGIwRUVFAE5TdDNfXzIxMG1vbmV5cHVuY3RJd0xiMUVFRQBOU3QzX18yMTdtb25leXB1bmN0X2J5bmFtZUljTGIwRUVFAE5TdDNfXzIxN21vbmV5cHVuY3RfYnluYW1lSWNMYjFFRUUATlN0M19fMjE3bW9uZXlwdW5jdF9ieW5hbWVJd0xiMEVFRQBOU3QzX18yMTdtb25leXB1bmN0X2J5bmFtZUl3TGIxRUVFADAxMjM0NTY3ODkAJUxmAE5TdDNfXzI5bW9uZXlfZ2V0SWNOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yMTFfX21vbmV5X2dldEljRUUAMDEyMzQ1Njc4OQBOU3QzX18yOW1vbmV5X2dldEl3TlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFRUUATlN0M19fMjExX19tb25leV9nZXRJd0VFACUuMExmAE5TdDNfXzI5bW9uZXlfcHV0SWNOU18xOW9zdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yMTFfX21vbmV5X3B1dEljRUUATlN0M19fMjltb25leV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMV9fbW9uZXlfcHV0SXdFRQBOU3QzX18yOG1lc3NhZ2VzSWNFRQBOU3QzX18yMTNtZXNzYWdlc19iYXNlRQBOU3QzX18yMTdfX3dpZGVuX2Zyb21fdXRmOElMbTMyRUVFAE5TdDNfXzI3Y29kZWN2dElEaWMxMV9fbWJzdGF0ZV90RUUATlN0M19fMjEyY29kZWN2dF9iYXNlRQBOU3QzX18yMTZfX25hcnJvd190b191dGY4SUxtMzJFRUUATlN0M19fMjhtZXNzYWdlc0l3RUUATlN0M19fMjE1bWVzc2FnZXNfYnluYW1lSWNFRQBOU3QzX18yMTVtZXNzYWdlc19ieW5hbWVJd0VFAE5TdDNfXzIxNGNvZGVjdnRfYnluYW1lSWNjMTFfX21ic3RhdGVfdEVFAE5TdDNfXzI3Y29kZWN2dEljYzExX19tYnN0YXRlX3RFRQBOU3QzX18yN2NvZGVjdnRJd2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjE0Y29kZWN2dF9ieW5hbWVJd2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjE0Y29kZWN2dF9ieW5hbWVJRHNjMTFfX21ic3RhdGVfdEVFAE5TdDNfXzI3Y29kZWN2dElEc2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjE0Y29kZWN2dF9ieW5hbWVJRGljMTFfX21ic3RhdGVfdEVFAE5TdDNfXzI2bG9jYWxlNV9faW1wRQBOU3QzX18yMTRjb2xsYXRlX2J5bmFtZUljRUUATlN0M19fMjE0Y29sbGF0ZV9ieW5hbWVJd0VFAE5TdDNfXzI1Y3R5cGVJY0VFAE5TdDNfXzIxMGN0eXBlX2Jhc2VFAE5TdDNfXzIxMmN0eXBlX2J5bmFtZUljRUUATlN0M19fMjEyY3R5cGVfYnluYW1lSXdFRQBOU3QzX18yNWN0eXBlSXdFRQBmYWxzZQB0cnVlAE5TdDNfXzI4bnVtcHVuY3RJY0VFAE5TdDNfXzI4bnVtcHVuY3RJd0VFAE5TdDNfXzIxNW51bXB1bmN0X2J5bmFtZUljRUUATlN0M19fMjE1bnVtcHVuY3RfYnluYW1lSXdFRQAlQQAlYQAlQgAlYgBOU3QzX18yMTVfX3RpbWVfZ2V0X3RlbXBJY0VFAGN0eXBlX2J5bmFtZTxjaGFyPjo6Y3R5cGVfYnluYW1lIGZhaWxlZCB0byBjb25zdHJ1Y3QgZm9yIAB0aW1lX2dldF9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAE5TdDNfXzIxNV9fdGltZV9nZXRfdGVtcEl3RUUAY3R5cGVfYnluYW1lPHdjaGFyX3Q+OjpjdHlwZV9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAHRpbWVfcHV0X2J5bmFtZSBmYWlsZWQgdG8gY29uc3RydWN0IGZvciAAbW9uZXlwdW5jdF9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgACgpAGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmNvZGVjdnRfYnluYW1lIGZhaWxlZCB0byBjb25zdHJ1Y3QgZm9yIABudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD46Om51bXB1bmN0X2J5bmFtZSBmYWlsZWQgdG8gY29uc3RydWN0IGZvciAAbnVtcHVuY3RfYnluYW1lPGNoYXI+OjpudW1wdW5jdF9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+Ojpjb2xsYXRlX2J5bmFtZShzaXplX3QgcmVmcykgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAGNvbGxhdGVfYnluYW1lPGNoYXI+Ojpjb2xsYXRlX2J5bmFtZSBmYWlsZWQgdG8gY29uc3RydWN0IGZvciAATlN0M19fMjE0X19zaGFyZWRfY291bnRFAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXM6ICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXMAdGVybWluYXRpbmcgd2l0aCAlcyBmb3JlaWduIGV4Y2VwdGlvbgB0ZXJtaW5hdGluZwB1bmNhdWdodABTdDlleGNlcHRpb24ATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAU3Q5dHlwZV9pbmZvAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAcHRocmVhZF9vbmNlIGZhaWx1cmUgaW4gX19jeGFfZ2V0X2dsb2JhbHNfZmFzdCgpAGNhbm5vdCBjcmVhdGUgcHRocmVhZCBrZXkgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAY2Fubm90IHplcm8gb3V0IHRocmVhZCB2YWx1ZSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQB0ZXJtaW5hdGVfaGFuZGxlciB1bmV4cGVjdGVkbHkgcmV0dXJuZWQAU3QxMWxvZ2ljX2Vycm9yAFN0MTJsZW5ndGhfZXJyb3IAc3RkOjpiYWRfY2FzdABTdDhiYWRfY2FzdABOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX3BiYXNlX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTIzX19mdW5kYW1lbnRhbF90eXBlX2luZm9FAHYARG4AYgBoAGEAaQBqAG0AZgBkAE4xMF9fY3h4YWJpdjExNl9fZW51bV90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0U=";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted.push(thrown);return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_uncaught_exception(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}function ___gxx_personality_v0(){}function ___lock(){}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function ___map_file(pathname,size){___setErrNo(1);return-1}var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={"1024":flags["O_APPEND"],"64":flags["O_CREAT"],"128":flags["O_EXCL"],"0":flags["O_RDONLY"],"2":flags["O_RDWR"],"4096":flags["O_SYNC"],"512":flags["O_TRUNC"],"1":flags["O_WRONLY"]}}),bufferFrom:(function(arrayBuffer){return Buffer.alloc?Buffer.from(arrayBuffer):new Buffer(arrayBuffer)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsForNode:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),write:(function(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(40)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(40)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 13}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 13}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 13}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return 13;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return 17}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return 20}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 16}}else{if(FS.isDir(node.mode)){return 21}}return 0}),mayOpen:(function(node,flags){if(!node){return 2}if(FS.isLink(node.mode)){return 40}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 21}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(24)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(29)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(16)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(16)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(20)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(22)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(22)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(1)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=UTF8ToString(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21509:case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21524:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___unlock(){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])}),destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}});clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function runDestructor(handle){var $$=handle.$$;if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}this.$$.count.value-=1;var toDelete=0===this.$$.count.value;if(toDelete){runDestructor(this)}if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=(function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)});proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register((function(){clonedHandle["delete"]()})));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return Object.create(prototype,{$$:{value:record}})}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}var destructors=[];var args=new Array(argCount);args[0]=rawConstructor;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>1])});case 2:return(function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])});default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":(function(c){return this.constructor.values[c]}),"toWireType":(function(destructors,c){return c.value}),"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,(function(){}))}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var endChar=HEAPU8[value+4+length];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAPU8[value+4+length]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0){var stringSegment=UTF8ToString(decodeStartPtr);if(str===undefined)str=stringSegment;else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}if(endCharSwap!=0)HEAPU8[value+4+length]=endCharSwap}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){Module["abort"]()}var ENV={};function _getenv(name){if(name===0)return 0;name=UTF8ToString(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLVM_SAVEDSTACKS[p];self.LLVM_SAVEDSTACKS.splice(p,1);stackRestore(ret)}function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDSTACKS){self.LLVM_SAVEDSTACKS=[]}self.LLVM_SAVEDSTACKS.push(stackSave());return self.LLVM_SAVEDSTACKS.length-1}function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _pthread_cond_wait(){return 0}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":(function(date){return WEEKDAYS[date.tm_wday].substring(0,3)}),"%A":(function(date){return WEEKDAYS[date.tm_wday]}),"%b":(function(date){return MONTHS[date.tm_mon].substring(0,3)}),"%B":(function(date){return MONTHS[date.tm_mon]}),"%C":(function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)}),"%d":(function(date){return leadingNulls(date.tm_mday,2)}),"%e":(function(date){return leadingSomething(date.tm_mday,2," ")}),"%g":(function(date){return getWeekBasedYear(date).toString().substring(2)}),"%G":(function(date){return getWeekBasedYear(date)}),"%H":(function(date){return leadingNulls(date.tm_hour,2)}),"%I":(function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)}),"%j":(function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)}),"%m":(function(date){return leadingNulls(date.tm_mon+1,2)}),"%M":(function(date){return leadingNulls(date.tm_min,2)}),"%n":(function(){return"\n"}),"%p":(function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}}),"%S":(function(date){return leadingNulls(date.tm_sec,2)}),"%t":(function(){return"\t"}),"%u":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7}),"%U":(function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"}),"%V":(function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)}),"%Z":(function(date){return date.tm_zone}),"%%":(function(){return"%"})};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();var workerResponded=false,workerCallbackId=-1;((function(){var messageBuffer=null,buffer=0,bufferSize=0;function flushMessages(){if(!messageBuffer)return;if(runtimeInitialized){var temp=messageBuffer;messageBuffer=null;temp.forEach((function(message){onmessage(message)}))}}function messageResender(){flushMessages();if(messageBuffer){setTimeout(messageResender,100)}}onmessage=function onmessage(msg){if(!runtimeInitialized){if(!messageBuffer){messageBuffer=[];setTimeout(messageResender,100)}messageBuffer.push(msg);return}flushMessages();var func=Module["_"+msg.data["funcName"]];if(!func)throw"invalid worker function to call: "+msg.data["funcName"];var data=msg.data["data"];if(data){if(!data.byteLength)data=new Uint8Array(data);if(!buffer||bufferSize> 6]; + var primitive = (tag & 0x20) === 0; + + // Multi-octet tag - load + if ((tag & 0x1f) === 0x1f) { + var oct = tag; + tag = 0; + while ((oct & 0x80) === 0x80) { + oct = buf.readUInt8(fail); + if (buf.isError(oct)) + return oct; + + tag <<= 7; + tag |= oct & 0x7f; + } + } else { + tag &= 0x1f; + } + var tagStr = der.tag[tag]; + + return { + cls: cls, + primitive: primitive, + tag: tag, + tagStr: tagStr + }; +} + +function derDecodeLen(buf, primitive, fail) { + var len = buf.readUInt8(fail); + if (buf.isError(len)) + return len; + + // Indefinite form + if (!primitive && len === 0x80) + return null; + + // Definite form + if ((len & 0x80) === 0) { + // Short form + return len; + } + + // Long form + var num = len & 0x7f; + if (num > 4) + return buf.error('length octect is too long'); + + len = 0; + for (var i = 0; i < num; i++) { + len <<= 8; + var j = buf.readUInt8(fail); + if (buf.isError(j)) + return j; + len |= j; + } + + return len; +} + +},{"../../asn1":2,"inherits":101}],11:[function(require,module,exports){ +var decoders = exports; + +decoders.der = require('./der'); +decoders.pem = require('./pem'); + +},{"./der":10,"./pem":12}],12:[function(require,module,exports){ +var inherits = require('inherits'); +var Buffer = require('buffer').Buffer; + +var DERDecoder = require('./der'); + +function PEMDecoder(entity) { + DERDecoder.call(this, entity); + this.enc = 'pem'; +}; +inherits(PEMDecoder, DERDecoder); +module.exports = PEMDecoder; + +PEMDecoder.prototype.decode = function decode(data, options) { + var lines = data.toString().split(/[\r\n]+/g); + + var label = options.label.toUpperCase(); + + var re = /^-----(BEGIN|END) ([^-]+)-----$/; + var start = -1; + var end = -1; + for (var i = 0; i < lines.length; i++) { + var match = lines[i].match(re); + if (match === null) + continue; + + if (match[2] !== label) + continue; + + if (start === -1) { + if (match[1] !== 'BEGIN') + break; + start = i; + } else { + if (match[1] !== 'END') + break; + end = i; + break; + } + } + if (start === -1 || end === -1) + throw new Error('PEM section not found for: ' + label); + + var base64 = lines.slice(start + 1, end).join(''); + // Remove excessive symbols + base64.replace(/[^a-z0-9\+\/=]+/gi, ''); + + var input = new Buffer(base64, 'base64'); + return DERDecoder.prototype.decode.call(this, input, options); +}; + +},{"./der":10,"buffer":49,"inherits":101}],13:[function(require,module,exports){ +var inherits = require('inherits'); +var Buffer = require('buffer').Buffer; + +var asn1 = require('../../asn1'); +var base = asn1.base; + +// Import DER constants +var der = asn1.constants.der; + +function DEREncoder(entity) { + this.enc = 'der'; + this.name = entity.name; + this.entity = entity; + + // Construct base tree + this.tree = new DERNode(); + this.tree._init(entity.body); +}; +module.exports = DEREncoder; + +DEREncoder.prototype.encode = function encode(data, reporter) { + return this.tree._encode(data, reporter).join(); +}; + +// Tree methods + +function DERNode(parent) { + base.Node.call(this, 'der', parent); +} +inherits(DERNode, base.Node); + +DERNode.prototype._encodeComposite = function encodeComposite(tag, + primitive, + cls, + content) { + var encodedTag = encodeTag(tag, primitive, cls, this.reporter); + + // Short form + if (content.length < 0x80) { + var header = new Buffer(2); + header[0] = encodedTag; + header[1] = content.length; + return this._createEncoderBuffer([ header, content ]); + } + + // Long form + // Count octets required to store length + var lenOctets = 1; + for (var i = content.length; i >= 0x100; i >>= 8) + lenOctets++; + + var header = new Buffer(1 + 1 + lenOctets); + header[0] = encodedTag; + header[1] = 0x80 | lenOctets; + + for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) + header[i] = j & 0xff; + + return this._createEncoderBuffer([ header, content ]); +}; + +DERNode.prototype._encodeStr = function encodeStr(str, tag) { + if (tag === 'bitstr') { + return this._createEncoderBuffer([ str.unused | 0, str.data ]); + } else if (tag === 'bmpstr') { + var buf = new Buffer(str.length * 2); + for (var i = 0; i < str.length; i++) { + buf.writeUInt16BE(str.charCodeAt(i), i * 2); + } + return this._createEncoderBuffer(buf); + } else if (tag === 'numstr') { + if (!this._isNumstr(str)) { + return this.reporter.error('Encoding of string type: numstr supports ' + + 'only digits and space'); + } + return this._createEncoderBuffer(str); + } else if (tag === 'printstr') { + if (!this._isPrintstr(str)) { + return this.reporter.error('Encoding of string type: printstr supports ' + + 'only latin upper and lower case letters, ' + + 'digits, space, apostrophe, left and rigth ' + + 'parenthesis, plus sign, comma, hyphen, ' + + 'dot, slash, colon, equal sign, ' + + 'question mark'); + } + return this._createEncoderBuffer(str); + } else if (/str$/.test(tag)) { + return this._createEncoderBuffer(str); + } else if (tag === 'objDesc') { + return this._createEncoderBuffer(str); + } else { + return this.reporter.error('Encoding of string type: ' + tag + + ' unsupported'); + } +}; + +DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { + if (typeof id === 'string') { + if (!values) + return this.reporter.error('string objid given, but no values map found'); + if (!values.hasOwnProperty(id)) + return this.reporter.error('objid not found in values map'); + id = values[id].split(/[\s\.]+/g); + for (var i = 0; i < id.length; i++) + id[i] |= 0; + } else if (Array.isArray(id)) { + id = id.slice(); + for (var i = 0; i < id.length; i++) + id[i] |= 0; + } + + if (!Array.isArray(id)) { + return this.reporter.error('objid() should be either array or string, ' + + 'got: ' + JSON.stringify(id)); + } + + if (!relative) { + if (id[1] >= 40) + return this.reporter.error('Second objid identifier OOB'); + id.splice(0, 2, id[0] * 40 + id[1]); + } + + // Count number of octets + var size = 0; + for (var i = 0; i < id.length; i++) { + var ident = id[i]; + for (size++; ident >= 0x80; ident >>= 7) + size++; + } + + var objid = new Buffer(size); + var offset = objid.length - 1; + for (var i = id.length - 1; i >= 0; i--) { + var ident = id[i]; + objid[offset--] = ident & 0x7f; + while ((ident >>= 7) > 0) + objid[offset--] = 0x80 | (ident & 0x7f); + } + + return this._createEncoderBuffer(objid); +}; + +function two(num) { + if (num < 10) + return '0' + num; + else + return num; +} + +DERNode.prototype._encodeTime = function encodeTime(time, tag) { + var str; + var date = new Date(time); + + if (tag === 'gentime') { + str = [ + two(date.getFullYear()), + two(date.getUTCMonth() + 1), + two(date.getUTCDate()), + two(date.getUTCHours()), + two(date.getUTCMinutes()), + two(date.getUTCSeconds()), + 'Z' + ].join(''); + } else if (tag === 'utctime') { + str = [ + two(date.getFullYear() % 100), + two(date.getUTCMonth() + 1), + two(date.getUTCDate()), + two(date.getUTCHours()), + two(date.getUTCMinutes()), + two(date.getUTCSeconds()), + 'Z' + ].join(''); + } else { + this.reporter.error('Encoding ' + tag + ' time is not supported yet'); + } + + return this._encodeStr(str, 'octstr'); +}; + +DERNode.prototype._encodeNull = function encodeNull() { + return this._createEncoderBuffer(''); +}; + +DERNode.prototype._encodeInt = function encodeInt(num, values) { + if (typeof num === 'string') { + if (!values) + return this.reporter.error('String int or enum given, but no values map'); + if (!values.hasOwnProperty(num)) { + return this.reporter.error('Values map doesn\'t contain: ' + + JSON.stringify(num)); + } + num = values[num]; + } + + // Bignum, assume big endian + if (typeof num !== 'number' && !Buffer.isBuffer(num)) { + var numArray = num.toArray(); + if (!num.sign && numArray[0] & 0x80) { + numArray.unshift(0); + } + num = new Buffer(numArray); + } + + if (Buffer.isBuffer(num)) { + var size = num.length; + if (num.length === 0) + size++; + + var out = new Buffer(size); + num.copy(out); + if (num.length === 0) + out[0] = 0 + return this._createEncoderBuffer(out); + } + + if (num < 0x80) + return this._createEncoderBuffer(num); + + if (num < 0x100) + return this._createEncoderBuffer([0, num]); + + var size = 1; + for (var i = num; i >= 0x100; i >>= 8) + size++; + + var out = new Array(size); + for (var i = out.length - 1; i >= 0; i--) { + out[i] = num & 0xff; + num >>= 8; + } + if(out[0] & 0x80) { + out.unshift(0); + } + + return this._createEncoderBuffer(new Buffer(out)); +}; + +DERNode.prototype._encodeBool = function encodeBool(value) { + return this._createEncoderBuffer(value ? 0xff : 0); +}; + +DERNode.prototype._use = function use(entity, obj) { + if (typeof entity === 'function') + entity = entity(obj); + return entity._getEncoder('der').tree; +}; + +DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) { + var state = this._baseState; + var i; + if (state['default'] === null) + return false; + + var data = dataBuffer.join(); + if (state.defaultBuffer === undefined) + state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join(); + + if (data.length !== state.defaultBuffer.length) + return false; + + for (i=0; i < data.length; i++) + if (data[i] !== state.defaultBuffer[i]) + return false; + + return true; +}; + +// Utility methods + +function encodeTag(tag, primitive, cls, reporter) { + var res; + + if (tag === 'seqof') + tag = 'seq'; + else if (tag === 'setof') + tag = 'set'; + + if (der.tagByName.hasOwnProperty(tag)) + res = der.tagByName[tag]; + else if (typeof tag === 'number' && (tag | 0) === tag) + res = tag; + else + return reporter.error('Unknown tag: ' + tag); + + if (res >= 0x1f) + return reporter.error('Multi-octet tag encoding unsupported'); + + if (!primitive) + res |= 0x20; + + res |= (der.tagClassByName[cls || 'universal'] << 6); + + return res; +} + +},{"../../asn1":2,"buffer":49,"inherits":101}],14:[function(require,module,exports){ +var encoders = exports; + +encoders.der = require('./der'); +encoders.pem = require('./pem'); + +},{"./der":13,"./pem":15}],15:[function(require,module,exports){ +var inherits = require('inherits'); + +var DEREncoder = require('./der'); + +function PEMEncoder(entity) { + DEREncoder.call(this, entity); + this.enc = 'pem'; +}; +inherits(PEMEncoder, DEREncoder); +module.exports = PEMEncoder; + +PEMEncoder.prototype.encode = function encode(data, options) { + var buf = DEREncoder.prototype.encode.call(this, data); + + var p = buf.toString('base64'); + var out = [ '-----BEGIN ' + options.label + '-----' ]; + for (var i = 0; i < p.length; i += 64) + out.push(p.slice(i, i + 64)); + out.push('-----END ' + options.label + '-----'); + return out.join('\n'); +}; + +},{"./der":13,"inherits":101}],16:[function(require,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function getLens (b64) { + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + for (var i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],17:[function(require,module,exports){ +(function (module, exports) { + 'use strict'; + + // Utils + function assert (val, msg) { + if (!val) throw new Error(msg || 'Assertion failed'); + } + + // Could use `inherits` module, but don't want to move from single file + // architecture yet. + function inherits (ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + + // BN + + function BN (number, base, endian) { + if (BN.isBN(number)) { + return number; + } + + this.negative = 0; + this.words = null; + this.length = 0; + + // Reduction context + this.red = null; + + if (number !== null) { + if (base === 'le' || base === 'be') { + endian = base; + base = 10; + } + + this._init(number || 0, base || 10, endian || 'be'); + } + } + if (typeof module === 'object') { + module.exports = BN; + } else { + exports.BN = BN; + } + + BN.BN = BN; + BN.wordSize = 26; + + var Buffer; + try { + Buffer = require('buffer').Buffer; + } catch (e) { + } + + BN.isBN = function isBN (num) { + if (num instanceof BN) { + return true; + } + + return num !== null && typeof num === 'object' && + num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + + BN.max = function max (left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + + BN.min = function min (left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + + BN.prototype._init = function init (number, base, endian) { + if (typeof number === 'number') { + return this._initNumber(number, base, endian); + } + + if (typeof number === 'object') { + return this._initArray(number, base, endian); + } + + if (base === 'hex') { + base = 16; + } + assert(base === (base | 0) && base >= 2 && base <= 36); + + number = number.toString().replace(/\s+/g, ''); + var start = 0; + if (number[0] === '-') { + start++; + } + + if (base === 16) { + this._parseHex(number, start); + } else { + this._parseBase(number, base, start); + } + + if (number[0] === '-') { + this.negative = 1; + } + + this.strip(); + + if (endian !== 'le') return; + + this._initArray(this.toArray(), base, endian); + }; + + BN.prototype._initNumber = function _initNumber (number, base, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 0x4000000) { + this.words = [ number & 0x3ffffff ]; + this.length = 1; + } else if (number < 0x10000000000000) { + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff + ]; + this.length = 2; + } else { + assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff, + 1 + ]; + this.length = 3; + } + + if (endian !== 'le') return; + + // Reverse the bytes + this._initArray(this.toArray(), base, endian); + }; + + BN.prototype._initArray = function _initArray (number, base, endian) { + // Perhaps a Uint8Array + assert(typeof number.length === 'number'); + if (number.length <= 0) { + this.words = [ 0 ]; + this.length = 1; + return this; + } + + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + + var j, w; + var off = 0; + if (endian === 'be') { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === 'le') { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + + function parseHex (str, start, end) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + + r <<= 4; + + // 'a' - 'f' + if (c >= 49 && c <= 54) { + r |= c - 49 + 0xa; + + // 'A' - 'F' + } else if (c >= 17 && c <= 22) { + r |= c - 17 + 0xa; + + // '0' - '9' + } else { + r |= c & 0xf; + } + } + return r; + } + + BN.prototype._parseHex = function _parseHex (number, start) { + // Create possibly bigger array to ensure that it fits the number + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + + var j, w; + // Scan 24-bit chunks and add them to the number + var off = 0; + for (i = number.length - 6, j = 0; i >= start; i -= 6) { + w = parseHex(number, i, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + if (i + 6 !== start) { + w = parseHex(number, start, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + } + this.strip(); + }; + + function parseBase (str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + + r *= mul; + + // 'a' + if (c >= 49) { + r += c - 49 + 0xa; + + // 'A' + } else if (c >= 17) { + r += c - 17 + 0xa; + + // '0' - '9' + } else { + r += c; + } + } + return r; + } + + BN.prototype._parseBase = function _parseBase (number, base, start) { + // Initialize as zero + this.words = [ 0 ]; + this.length = 1; + + // Find length of limb in base + for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { + limbLen++; + } + limbLen--; + limbPow = (limbPow / base) | 0; + + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base); + + this.imuln(limbPow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + + if (mod !== 0) { + var pow = 1; + word = parseBase(number, i, number.length, base); + + for (i = 0; i < mod; i++) { + pow *= base; + } + + this.imuln(pow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + }; + + BN.prototype.copy = function copy (dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + + BN.prototype.clone = function clone () { + var r = new BN(null); + this.copy(r); + return r; + }; + + BN.prototype._expand = function _expand (size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + + // Remove leading `0` from `this` + BN.prototype.strip = function strip () { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + + BN.prototype._normSign = function _normSign () { + // -0 = 0 + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + + BN.prototype.inspect = function inspect () { + return (this.red ? ''; + }; + + /* + + var zeros = []; + var groupSizes = []; + var groupBases = []; + + var s = ''; + var i = -1; + while (++i < BN.wordSize) { + zeros[i] = s; + s += '0'; + } + groupSizes[0] = 0; + groupSizes[1] = 0; + groupBases[0] = 0; + groupBases[1] = 0; + var base = 2 - 1; + while (++base < 36 + 1) { + var groupSize = 0; + var groupBase = 1; + while (groupBase < (1 << BN.wordSize) / base) { + groupBase *= base; + groupSize += 1; + } + groupSizes[base] = groupSize; + groupBases[base] = groupBase; + } + + */ + + var zeros = [ + '', + '0', + '00', + '000', + '0000', + '00000', + '000000', + '0000000', + '00000000', + '000000000', + '0000000000', + '00000000000', + '000000000000', + '0000000000000', + '00000000000000', + '000000000000000', + '0000000000000000', + '00000000000000000', + '000000000000000000', + '0000000000000000000', + '00000000000000000000', + '000000000000000000000', + '0000000000000000000000', + '00000000000000000000000', + '000000000000000000000000', + '0000000000000000000000000' + ]; + + var groupSizes = [ + 0, 0, + 25, 16, 12, 11, 10, 9, 8, + 8, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 5, 5, + 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5 + ]; + + var groupBases = [ + 0, 0, + 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, + 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, + 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, + 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, + 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 + ]; + + BN.prototype.toString = function toString (base, padding) { + base = base || 10; + padding = padding | 0 || 1; + + var out; + if (base === 16 || base === 'hex') { + out = ''; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = (((w << off) | carry) & 0xffffff).toString(16); + carry = (w >>> (24 - off)) & 0xffffff; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } + + if (base === (base | 0) && base >= 2 && base <= 36) { + // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); + var groupSize = groupSizes[base]; + // var groupBase = Math.pow(base, groupSize); + var groupBase = groupBases[base]; + out = ''; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base); + c = c.idivn(groupBase); + + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = '0' + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } + + assert(false, 'Base should be between 2 and 36'); + }; + + BN.prototype.toNumber = function toNumber () { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 0x4000000; + } else if (this.length === 3 && this.words[2] === 0x01) { + // NOTE: at this stage it is known that the top bit is set + ret += 0x10000000000000 + (this.words[1] * 0x4000000); + } else if (this.length > 2) { + assert(false, 'Number can only safely store up to 53 bits'); + } + return (this.negative !== 0) ? -ret : ret; + }; + + BN.prototype.toJSON = function toJSON () { + return this.toString(16); + }; + + BN.prototype.toBuffer = function toBuffer (endian, length) { + assert(typeof Buffer !== 'undefined'); + return this.toArrayLike(Buffer, endian, length); + }; + + BN.prototype.toArray = function toArray (endian, length) { + return this.toArrayLike(Array, endian, length); + }; + + BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert(byteLength <= reqLength, 'byte array longer than desired length'); + assert(reqLength > 0, 'Requested array length <= 0'); + + this.strip(); + var littleEndian = endian === 'le'; + var res = new ArrayType(reqLength); + + var b, i; + var q = this.clone(); + if (!littleEndian) { + // Assume big-endian + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); + + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); + + res[i] = b; + } + + for (; i < reqLength; i++) { + res[i] = 0; + } + } + + return res; + }; + + if (Math.clz32) { + BN.prototype._countBits = function _countBits (w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits (w) { + var t = w; + var r = 0; + if (t >= 0x1000) { + r += 13; + t >>>= 13; + } + if (t >= 0x40) { + r += 7; + t >>>= 7; + } + if (t >= 0x8) { + r += 4; + t >>>= 4; + } + if (t >= 0x02) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + + BN.prototype._zeroBits = function _zeroBits (w) { + // Short-cut + if (w === 0) return 26; + + var t = w; + var r = 0; + if ((t & 0x1fff) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 0x7f) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 0xf) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 0x3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 0x1) === 0) { + r++; + } + return r; + }; + + // Return number of used bits in a BN + BN.prototype.bitLength = function bitLength () { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + + function toBitArray (num) { + var w = new Array(num.bitLength()); + + for (var bit = 0; bit < w.length; bit++) { + var off = (bit / 26) | 0; + var wbit = bit % 26; + + w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; + } + + return w; + } + + // Number of trailing zero bits + BN.prototype.zeroBits = function zeroBits () { + if (this.isZero()) return 0; + + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + + BN.prototype.byteLength = function byteLength () { + return Math.ceil(this.bitLength() / 8); + }; + + BN.prototype.toTwos = function toTwos (width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + + BN.prototype.fromTwos = function fromTwos (width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + + BN.prototype.isNeg = function isNeg () { + return this.negative !== 0; + }; + + // Return negative clone of `this` + BN.prototype.neg = function neg () { + return this.clone().ineg(); + }; + + BN.prototype.ineg = function ineg () { + if (!this.isZero()) { + this.negative ^= 1; + } + + return this; + }; + + // Or `num` with `this` in-place + BN.prototype.iuor = function iuor (num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + + return this.strip(); + }; + + BN.prototype.ior = function ior (num) { + assert((this.negative | num.negative) === 0); + return this.iuor(num); + }; + + // Or `num` with `this` + BN.prototype.or = function or (num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + + BN.prototype.uor = function uor (num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + + // And `num` with `this` in-place + BN.prototype.iuand = function iuand (num) { + // b = min-length(num, this) + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + + this.length = b.length; + + return this.strip(); + }; + + BN.prototype.iand = function iand (num) { + assert((this.negative | num.negative) === 0); + return this.iuand(num); + }; + + // And `num` with `this` + BN.prototype.and = function and (num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + + BN.prototype.uand = function uand (num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + + // Xor `num` with `this` in-place + BN.prototype.iuxor = function iuxor (num) { + // a.length > b.length + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + this.length = a.length; + + return this.strip(); + }; + + BN.prototype.ixor = function ixor (num) { + assert((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + + // Xor `num` with `this` + BN.prototype.xor = function xor (num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + + BN.prototype.uxor = function uxor (num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + + // Not ``this`` with ``width`` bitwidth + BN.prototype.inotn = function inotn (width) { + assert(typeof width === 'number' && width >= 0); + + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + + // Extend the buffer with leading zeroes + this._expand(bytesNeeded); + + if (bitsLeft > 0) { + bytesNeeded--; + } + + // Handle complete words + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 0x3ffffff; + } + + // Handle the residue + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); + } + + // And remove leading zeroes + return this.strip(); + }; + + BN.prototype.notn = function notn (width) { + return this.clone().inotn(width); + }; + + // Set `bit` of `this` + BN.prototype.setn = function setn (bit, val) { + assert(typeof bit === 'number' && bit >= 0); + + var off = (bit / 26) | 0; + var wbit = bit % 26; + + this._expand(off + 1); + + if (val) { + this.words[off] = this.words[off] | (1 << wbit); + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + + return this.strip(); + }; + + // Add `num` to `this` in-place + BN.prototype.iadd = function iadd (num) { + var r; + + // negative + positive + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + + // positive + negative + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + + // a.length > b.length + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 0x3ffffff; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 0x3ffffff; + carry = r >>> 26; + } + + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + // Copy the rest of the words + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + return this; + }; + + // Add `num` to `this` + BN.prototype.add = function add (num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + + if (this.length > num.length) return this.clone().iadd(num); + + return num.clone().iadd(this); + }; + + // Subtract `num` from `this` in-place + BN.prototype.isub = function isub (num) { + // this - (-num) = this + num + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + + // -this - num = -(this + num) + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + + // At this point both numbers are positive + var cmp = this.cmp(num); + + // Optimization - zeroify + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + + // a > b + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 0x3ffffff; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 0x3ffffff; + } + + // Copy rest of the words + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + this.length = Math.max(this.length, i); + + if (a !== this) { + this.negative = 1; + } + + return this.strip(); + }; + + // Subtract `num` from `this` + BN.prototype.sub = function sub (num) { + return this.clone().isub(num); + }; + + function smallMulTo (self, num, out) { + out.negative = num.negative ^ self.negative; + var len = (self.length + num.length) | 0; + out.length = len; + len = (len - 1) | 0; + + // Peel one iteration (compiler can't do it, because of code complexity) + var a = self.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + + var lo = r & 0x3ffffff; + var carry = (r / 0x4000000) | 0; + out.words[0] = lo; + + for (var k = 1; k < len; k++) { + // Sum all words with the same `i + j = k` and accumulate `ncarry`, + // note that ncarry could be >= 0x3ffffff + var ncarry = carry >>> 26; + var rword = carry & 0x3ffffff; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { + var i = (k - j) | 0; + a = self.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += (r / 0x4000000) | 0; + rword = r & 0x3ffffff; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + + return out.strip(); + } + + // TODO(indutny): it may be reasonable to omit it for users who don't need + // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit + // multiplication (like elliptic secp256k1). + var comb10MulTo = function comb10MulTo (self, num, out) { + var a = self.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 0x1fff; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 0x1fff; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 0x1fff; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 0x1fff; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 0x1fff; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 0x1fff; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 0x1fff; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 0x1fff; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 0x1fff; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 0x1fff; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 0x1fff; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 0x1fff; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 0x1fff; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 0x1fff; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 0x1fff; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 0x1fff; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 0x1fff; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 0x1fff; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 0x1fff; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 0x1fff; + var bh9 = b9 >>> 13; + + out.negative = self.negative ^ num.negative; + out.length = 19; + /* k = 0 */ + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = (mid + Math.imul(ah0, bl0)) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0; + w0 &= 0x3ffffff; + /* k = 1 */ + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = (mid + Math.imul(ah1, bl0)) | 0; + hi = Math.imul(ah1, bh0); + lo = (lo + Math.imul(al0, bl1)) | 0; + mid = (mid + Math.imul(al0, bh1)) | 0; + mid = (mid + Math.imul(ah0, bl1)) | 0; + hi = (hi + Math.imul(ah0, bh1)) | 0; + var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0; + w1 &= 0x3ffffff; + /* k = 2 */ + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = (mid + Math.imul(ah2, bl0)) | 0; + hi = Math.imul(ah2, bh0); + lo = (lo + Math.imul(al1, bl1)) | 0; + mid = (mid + Math.imul(al1, bh1)) | 0; + mid = (mid + Math.imul(ah1, bl1)) | 0; + hi = (hi + Math.imul(ah1, bh1)) | 0; + lo = (lo + Math.imul(al0, bl2)) | 0; + mid = (mid + Math.imul(al0, bh2)) | 0; + mid = (mid + Math.imul(ah0, bl2)) | 0; + hi = (hi + Math.imul(ah0, bh2)) | 0; + var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0; + w2 &= 0x3ffffff; + /* k = 3 */ + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = (mid + Math.imul(ah3, bl0)) | 0; + hi = Math.imul(ah3, bh0); + lo = (lo + Math.imul(al2, bl1)) | 0; + mid = (mid + Math.imul(al2, bh1)) | 0; + mid = (mid + Math.imul(ah2, bl1)) | 0; + hi = (hi + Math.imul(ah2, bh1)) | 0; + lo = (lo + Math.imul(al1, bl2)) | 0; + mid = (mid + Math.imul(al1, bh2)) | 0; + mid = (mid + Math.imul(ah1, bl2)) | 0; + hi = (hi + Math.imul(ah1, bh2)) | 0; + lo = (lo + Math.imul(al0, bl3)) | 0; + mid = (mid + Math.imul(al0, bh3)) | 0; + mid = (mid + Math.imul(ah0, bl3)) | 0; + hi = (hi + Math.imul(ah0, bh3)) | 0; + var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0; + w3 &= 0x3ffffff; + /* k = 4 */ + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = (mid + Math.imul(ah4, bl0)) | 0; + hi = Math.imul(ah4, bh0); + lo = (lo + Math.imul(al3, bl1)) | 0; + mid = (mid + Math.imul(al3, bh1)) | 0; + mid = (mid + Math.imul(ah3, bl1)) | 0; + hi = (hi + Math.imul(ah3, bh1)) | 0; + lo = (lo + Math.imul(al2, bl2)) | 0; + mid = (mid + Math.imul(al2, bh2)) | 0; + mid = (mid + Math.imul(ah2, bl2)) | 0; + hi = (hi + Math.imul(ah2, bh2)) | 0; + lo = (lo + Math.imul(al1, bl3)) | 0; + mid = (mid + Math.imul(al1, bh3)) | 0; + mid = (mid + Math.imul(ah1, bl3)) | 0; + hi = (hi + Math.imul(ah1, bh3)) | 0; + lo = (lo + Math.imul(al0, bl4)) | 0; + mid = (mid + Math.imul(al0, bh4)) | 0; + mid = (mid + Math.imul(ah0, bl4)) | 0; + hi = (hi + Math.imul(ah0, bh4)) | 0; + var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0; + w4 &= 0x3ffffff; + /* k = 5 */ + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = (mid + Math.imul(ah5, bl0)) | 0; + hi = Math.imul(ah5, bh0); + lo = (lo + Math.imul(al4, bl1)) | 0; + mid = (mid + Math.imul(al4, bh1)) | 0; + mid = (mid + Math.imul(ah4, bl1)) | 0; + hi = (hi + Math.imul(ah4, bh1)) | 0; + lo = (lo + Math.imul(al3, bl2)) | 0; + mid = (mid + Math.imul(al3, bh2)) | 0; + mid = (mid + Math.imul(ah3, bl2)) | 0; + hi = (hi + Math.imul(ah3, bh2)) | 0; + lo = (lo + Math.imul(al2, bl3)) | 0; + mid = (mid + Math.imul(al2, bh3)) | 0; + mid = (mid + Math.imul(ah2, bl3)) | 0; + hi = (hi + Math.imul(ah2, bh3)) | 0; + lo = (lo + Math.imul(al1, bl4)) | 0; + mid = (mid + Math.imul(al1, bh4)) | 0; + mid = (mid + Math.imul(ah1, bl4)) | 0; + hi = (hi + Math.imul(ah1, bh4)) | 0; + lo = (lo + Math.imul(al0, bl5)) | 0; + mid = (mid + Math.imul(al0, bh5)) | 0; + mid = (mid + Math.imul(ah0, bl5)) | 0; + hi = (hi + Math.imul(ah0, bh5)) | 0; + var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0; + w5 &= 0x3ffffff; + /* k = 6 */ + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = (mid + Math.imul(ah6, bl0)) | 0; + hi = Math.imul(ah6, bh0); + lo = (lo + Math.imul(al5, bl1)) | 0; + mid = (mid + Math.imul(al5, bh1)) | 0; + mid = (mid + Math.imul(ah5, bl1)) | 0; + hi = (hi + Math.imul(ah5, bh1)) | 0; + lo = (lo + Math.imul(al4, bl2)) | 0; + mid = (mid + Math.imul(al4, bh2)) | 0; + mid = (mid + Math.imul(ah4, bl2)) | 0; + hi = (hi + Math.imul(ah4, bh2)) | 0; + lo = (lo + Math.imul(al3, bl3)) | 0; + mid = (mid + Math.imul(al3, bh3)) | 0; + mid = (mid + Math.imul(ah3, bl3)) | 0; + hi = (hi + Math.imul(ah3, bh3)) | 0; + lo = (lo + Math.imul(al2, bl4)) | 0; + mid = (mid + Math.imul(al2, bh4)) | 0; + mid = (mid + Math.imul(ah2, bl4)) | 0; + hi = (hi + Math.imul(ah2, bh4)) | 0; + lo = (lo + Math.imul(al1, bl5)) | 0; + mid = (mid + Math.imul(al1, bh5)) | 0; + mid = (mid + Math.imul(ah1, bl5)) | 0; + hi = (hi + Math.imul(ah1, bh5)) | 0; + lo = (lo + Math.imul(al0, bl6)) | 0; + mid = (mid + Math.imul(al0, bh6)) | 0; + mid = (mid + Math.imul(ah0, bl6)) | 0; + hi = (hi + Math.imul(ah0, bh6)) | 0; + var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0; + w6 &= 0x3ffffff; + /* k = 7 */ + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = (mid + Math.imul(ah7, bl0)) | 0; + hi = Math.imul(ah7, bh0); + lo = (lo + Math.imul(al6, bl1)) | 0; + mid = (mid + Math.imul(al6, bh1)) | 0; + mid = (mid + Math.imul(ah6, bl1)) | 0; + hi = (hi + Math.imul(ah6, bh1)) | 0; + lo = (lo + Math.imul(al5, bl2)) | 0; + mid = (mid + Math.imul(al5, bh2)) | 0; + mid = (mid + Math.imul(ah5, bl2)) | 0; + hi = (hi + Math.imul(ah5, bh2)) | 0; + lo = (lo + Math.imul(al4, bl3)) | 0; + mid = (mid + Math.imul(al4, bh3)) | 0; + mid = (mid + Math.imul(ah4, bl3)) | 0; + hi = (hi + Math.imul(ah4, bh3)) | 0; + lo = (lo + Math.imul(al3, bl4)) | 0; + mid = (mid + Math.imul(al3, bh4)) | 0; + mid = (mid + Math.imul(ah3, bl4)) | 0; + hi = (hi + Math.imul(ah3, bh4)) | 0; + lo = (lo + Math.imul(al2, bl5)) | 0; + mid = (mid + Math.imul(al2, bh5)) | 0; + mid = (mid + Math.imul(ah2, bl5)) | 0; + hi = (hi + Math.imul(ah2, bh5)) | 0; + lo = (lo + Math.imul(al1, bl6)) | 0; + mid = (mid + Math.imul(al1, bh6)) | 0; + mid = (mid + Math.imul(ah1, bl6)) | 0; + hi = (hi + Math.imul(ah1, bh6)) | 0; + lo = (lo + Math.imul(al0, bl7)) | 0; + mid = (mid + Math.imul(al0, bh7)) | 0; + mid = (mid + Math.imul(ah0, bl7)) | 0; + hi = (hi + Math.imul(ah0, bh7)) | 0; + var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0; + w7 &= 0x3ffffff; + /* k = 8 */ + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = (mid + Math.imul(ah8, bl0)) | 0; + hi = Math.imul(ah8, bh0); + lo = (lo + Math.imul(al7, bl1)) | 0; + mid = (mid + Math.imul(al7, bh1)) | 0; + mid = (mid + Math.imul(ah7, bl1)) | 0; + hi = (hi + Math.imul(ah7, bh1)) | 0; + lo = (lo + Math.imul(al6, bl2)) | 0; + mid = (mid + Math.imul(al6, bh2)) | 0; + mid = (mid + Math.imul(ah6, bl2)) | 0; + hi = (hi + Math.imul(ah6, bh2)) | 0; + lo = (lo + Math.imul(al5, bl3)) | 0; + mid = (mid + Math.imul(al5, bh3)) | 0; + mid = (mid + Math.imul(ah5, bl3)) | 0; + hi = (hi + Math.imul(ah5, bh3)) | 0; + lo = (lo + Math.imul(al4, bl4)) | 0; + mid = (mid + Math.imul(al4, bh4)) | 0; + mid = (mid + Math.imul(ah4, bl4)) | 0; + hi = (hi + Math.imul(ah4, bh4)) | 0; + lo = (lo + Math.imul(al3, bl5)) | 0; + mid = (mid + Math.imul(al3, bh5)) | 0; + mid = (mid + Math.imul(ah3, bl5)) | 0; + hi = (hi + Math.imul(ah3, bh5)) | 0; + lo = (lo + Math.imul(al2, bl6)) | 0; + mid = (mid + Math.imul(al2, bh6)) | 0; + mid = (mid + Math.imul(ah2, bl6)) | 0; + hi = (hi + Math.imul(ah2, bh6)) | 0; + lo = (lo + Math.imul(al1, bl7)) | 0; + mid = (mid + Math.imul(al1, bh7)) | 0; + mid = (mid + Math.imul(ah1, bl7)) | 0; + hi = (hi + Math.imul(ah1, bh7)) | 0; + lo = (lo + Math.imul(al0, bl8)) | 0; + mid = (mid + Math.imul(al0, bh8)) | 0; + mid = (mid + Math.imul(ah0, bl8)) | 0; + hi = (hi + Math.imul(ah0, bh8)) | 0; + var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0; + w8 &= 0x3ffffff; + /* k = 9 */ + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = (mid + Math.imul(ah9, bl0)) | 0; + hi = Math.imul(ah9, bh0); + lo = (lo + Math.imul(al8, bl1)) | 0; + mid = (mid + Math.imul(al8, bh1)) | 0; + mid = (mid + Math.imul(ah8, bl1)) | 0; + hi = (hi + Math.imul(ah8, bh1)) | 0; + lo = (lo + Math.imul(al7, bl2)) | 0; + mid = (mid + Math.imul(al7, bh2)) | 0; + mid = (mid + Math.imul(ah7, bl2)) | 0; + hi = (hi + Math.imul(ah7, bh2)) | 0; + lo = (lo + Math.imul(al6, bl3)) | 0; + mid = (mid + Math.imul(al6, bh3)) | 0; + mid = (mid + Math.imul(ah6, bl3)) | 0; + hi = (hi + Math.imul(ah6, bh3)) | 0; + lo = (lo + Math.imul(al5, bl4)) | 0; + mid = (mid + Math.imul(al5, bh4)) | 0; + mid = (mid + Math.imul(ah5, bl4)) | 0; + hi = (hi + Math.imul(ah5, bh4)) | 0; + lo = (lo + Math.imul(al4, bl5)) | 0; + mid = (mid + Math.imul(al4, bh5)) | 0; + mid = (mid + Math.imul(ah4, bl5)) | 0; + hi = (hi + Math.imul(ah4, bh5)) | 0; + lo = (lo + Math.imul(al3, bl6)) | 0; + mid = (mid + Math.imul(al3, bh6)) | 0; + mid = (mid + Math.imul(ah3, bl6)) | 0; + hi = (hi + Math.imul(ah3, bh6)) | 0; + lo = (lo + Math.imul(al2, bl7)) | 0; + mid = (mid + Math.imul(al2, bh7)) | 0; + mid = (mid + Math.imul(ah2, bl7)) | 0; + hi = (hi + Math.imul(ah2, bh7)) | 0; + lo = (lo + Math.imul(al1, bl8)) | 0; + mid = (mid + Math.imul(al1, bh8)) | 0; + mid = (mid + Math.imul(ah1, bl8)) | 0; + hi = (hi + Math.imul(ah1, bh8)) | 0; + lo = (lo + Math.imul(al0, bl9)) | 0; + mid = (mid + Math.imul(al0, bh9)) | 0; + mid = (mid + Math.imul(ah0, bl9)) | 0; + hi = (hi + Math.imul(ah0, bh9)) | 0; + var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0; + w9 &= 0x3ffffff; + /* k = 10 */ + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = (mid + Math.imul(ah9, bl1)) | 0; + hi = Math.imul(ah9, bh1); + lo = (lo + Math.imul(al8, bl2)) | 0; + mid = (mid + Math.imul(al8, bh2)) | 0; + mid = (mid + Math.imul(ah8, bl2)) | 0; + hi = (hi + Math.imul(ah8, bh2)) | 0; + lo = (lo + Math.imul(al7, bl3)) | 0; + mid = (mid + Math.imul(al7, bh3)) | 0; + mid = (mid + Math.imul(ah7, bl3)) | 0; + hi = (hi + Math.imul(ah7, bh3)) | 0; + lo = (lo + Math.imul(al6, bl4)) | 0; + mid = (mid + Math.imul(al6, bh4)) | 0; + mid = (mid + Math.imul(ah6, bl4)) | 0; + hi = (hi + Math.imul(ah6, bh4)) | 0; + lo = (lo + Math.imul(al5, bl5)) | 0; + mid = (mid + Math.imul(al5, bh5)) | 0; + mid = (mid + Math.imul(ah5, bl5)) | 0; + hi = (hi + Math.imul(ah5, bh5)) | 0; + lo = (lo + Math.imul(al4, bl6)) | 0; + mid = (mid + Math.imul(al4, bh6)) | 0; + mid = (mid + Math.imul(ah4, bl6)) | 0; + hi = (hi + Math.imul(ah4, bh6)) | 0; + lo = (lo + Math.imul(al3, bl7)) | 0; + mid = (mid + Math.imul(al3, bh7)) | 0; + mid = (mid + Math.imul(ah3, bl7)) | 0; + hi = (hi + Math.imul(ah3, bh7)) | 0; + lo = (lo + Math.imul(al2, bl8)) | 0; + mid = (mid + Math.imul(al2, bh8)) | 0; + mid = (mid + Math.imul(ah2, bl8)) | 0; + hi = (hi + Math.imul(ah2, bh8)) | 0; + lo = (lo + Math.imul(al1, bl9)) | 0; + mid = (mid + Math.imul(al1, bh9)) | 0; + mid = (mid + Math.imul(ah1, bl9)) | 0; + hi = (hi + Math.imul(ah1, bh9)) | 0; + var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0; + w10 &= 0x3ffffff; + /* k = 11 */ + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = (mid + Math.imul(ah9, bl2)) | 0; + hi = Math.imul(ah9, bh2); + lo = (lo + Math.imul(al8, bl3)) | 0; + mid = (mid + Math.imul(al8, bh3)) | 0; + mid = (mid + Math.imul(ah8, bl3)) | 0; + hi = (hi + Math.imul(ah8, bh3)) | 0; + lo = (lo + Math.imul(al7, bl4)) | 0; + mid = (mid + Math.imul(al7, bh4)) | 0; + mid = (mid + Math.imul(ah7, bl4)) | 0; + hi = (hi + Math.imul(ah7, bh4)) | 0; + lo = (lo + Math.imul(al6, bl5)) | 0; + mid = (mid + Math.imul(al6, bh5)) | 0; + mid = (mid + Math.imul(ah6, bl5)) | 0; + hi = (hi + Math.imul(ah6, bh5)) | 0; + lo = (lo + Math.imul(al5, bl6)) | 0; + mid = (mid + Math.imul(al5, bh6)) | 0; + mid = (mid + Math.imul(ah5, bl6)) | 0; + hi = (hi + Math.imul(ah5, bh6)) | 0; + lo = (lo + Math.imul(al4, bl7)) | 0; + mid = (mid + Math.imul(al4, bh7)) | 0; + mid = (mid + Math.imul(ah4, bl7)) | 0; + hi = (hi + Math.imul(ah4, bh7)) | 0; + lo = (lo + Math.imul(al3, bl8)) | 0; + mid = (mid + Math.imul(al3, bh8)) | 0; + mid = (mid + Math.imul(ah3, bl8)) | 0; + hi = (hi + Math.imul(ah3, bh8)) | 0; + lo = (lo + Math.imul(al2, bl9)) | 0; + mid = (mid + Math.imul(al2, bh9)) | 0; + mid = (mid + Math.imul(ah2, bl9)) | 0; + hi = (hi + Math.imul(ah2, bh9)) | 0; + var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0; + w11 &= 0x3ffffff; + /* k = 12 */ + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = (mid + Math.imul(ah9, bl3)) | 0; + hi = Math.imul(ah9, bh3); + lo = (lo + Math.imul(al8, bl4)) | 0; + mid = (mid + Math.imul(al8, bh4)) | 0; + mid = (mid + Math.imul(ah8, bl4)) | 0; + hi = (hi + Math.imul(ah8, bh4)) | 0; + lo = (lo + Math.imul(al7, bl5)) | 0; + mid = (mid + Math.imul(al7, bh5)) | 0; + mid = (mid + Math.imul(ah7, bl5)) | 0; + hi = (hi + Math.imul(ah7, bh5)) | 0; + lo = (lo + Math.imul(al6, bl6)) | 0; + mid = (mid + Math.imul(al6, bh6)) | 0; + mid = (mid + Math.imul(ah6, bl6)) | 0; + hi = (hi + Math.imul(ah6, bh6)) | 0; + lo = (lo + Math.imul(al5, bl7)) | 0; + mid = (mid + Math.imul(al5, bh7)) | 0; + mid = (mid + Math.imul(ah5, bl7)) | 0; + hi = (hi + Math.imul(ah5, bh7)) | 0; + lo = (lo + Math.imul(al4, bl8)) | 0; + mid = (mid + Math.imul(al4, bh8)) | 0; + mid = (mid + Math.imul(ah4, bl8)) | 0; + hi = (hi + Math.imul(ah4, bh8)) | 0; + lo = (lo + Math.imul(al3, bl9)) | 0; + mid = (mid + Math.imul(al3, bh9)) | 0; + mid = (mid + Math.imul(ah3, bl9)) | 0; + hi = (hi + Math.imul(ah3, bh9)) | 0; + var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0; + w12 &= 0x3ffffff; + /* k = 13 */ + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = (mid + Math.imul(ah9, bl4)) | 0; + hi = Math.imul(ah9, bh4); + lo = (lo + Math.imul(al8, bl5)) | 0; + mid = (mid + Math.imul(al8, bh5)) | 0; + mid = (mid + Math.imul(ah8, bl5)) | 0; + hi = (hi + Math.imul(ah8, bh5)) | 0; + lo = (lo + Math.imul(al7, bl6)) | 0; + mid = (mid + Math.imul(al7, bh6)) | 0; + mid = (mid + Math.imul(ah7, bl6)) | 0; + hi = (hi + Math.imul(ah7, bh6)) | 0; + lo = (lo + Math.imul(al6, bl7)) | 0; + mid = (mid + Math.imul(al6, bh7)) | 0; + mid = (mid + Math.imul(ah6, bl7)) | 0; + hi = (hi + Math.imul(ah6, bh7)) | 0; + lo = (lo + Math.imul(al5, bl8)) | 0; + mid = (mid + Math.imul(al5, bh8)) | 0; + mid = (mid + Math.imul(ah5, bl8)) | 0; + hi = (hi + Math.imul(ah5, bh8)) | 0; + lo = (lo + Math.imul(al4, bl9)) | 0; + mid = (mid + Math.imul(al4, bh9)) | 0; + mid = (mid + Math.imul(ah4, bl9)) | 0; + hi = (hi + Math.imul(ah4, bh9)) | 0; + var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0; + w13 &= 0x3ffffff; + /* k = 14 */ + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = (mid + Math.imul(ah9, bl5)) | 0; + hi = Math.imul(ah9, bh5); + lo = (lo + Math.imul(al8, bl6)) | 0; + mid = (mid + Math.imul(al8, bh6)) | 0; + mid = (mid + Math.imul(ah8, bl6)) | 0; + hi = (hi + Math.imul(ah8, bh6)) | 0; + lo = (lo + Math.imul(al7, bl7)) | 0; + mid = (mid + Math.imul(al7, bh7)) | 0; + mid = (mid + Math.imul(ah7, bl7)) | 0; + hi = (hi + Math.imul(ah7, bh7)) | 0; + lo = (lo + Math.imul(al6, bl8)) | 0; + mid = (mid + Math.imul(al6, bh8)) | 0; + mid = (mid + Math.imul(ah6, bl8)) | 0; + hi = (hi + Math.imul(ah6, bh8)) | 0; + lo = (lo + Math.imul(al5, bl9)) | 0; + mid = (mid + Math.imul(al5, bh9)) | 0; + mid = (mid + Math.imul(ah5, bl9)) | 0; + hi = (hi + Math.imul(ah5, bh9)) | 0; + var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0; + w14 &= 0x3ffffff; + /* k = 15 */ + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = (mid + Math.imul(ah9, bl6)) | 0; + hi = Math.imul(ah9, bh6); + lo = (lo + Math.imul(al8, bl7)) | 0; + mid = (mid + Math.imul(al8, bh7)) | 0; + mid = (mid + Math.imul(ah8, bl7)) | 0; + hi = (hi + Math.imul(ah8, bh7)) | 0; + lo = (lo + Math.imul(al7, bl8)) | 0; + mid = (mid + Math.imul(al7, bh8)) | 0; + mid = (mid + Math.imul(ah7, bl8)) | 0; + hi = (hi + Math.imul(ah7, bh8)) | 0; + lo = (lo + Math.imul(al6, bl9)) | 0; + mid = (mid + Math.imul(al6, bh9)) | 0; + mid = (mid + Math.imul(ah6, bl9)) | 0; + hi = (hi + Math.imul(ah6, bh9)) | 0; + var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0; + w15 &= 0x3ffffff; + /* k = 16 */ + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = (mid + Math.imul(ah9, bl7)) | 0; + hi = Math.imul(ah9, bh7); + lo = (lo + Math.imul(al8, bl8)) | 0; + mid = (mid + Math.imul(al8, bh8)) | 0; + mid = (mid + Math.imul(ah8, bl8)) | 0; + hi = (hi + Math.imul(ah8, bh8)) | 0; + lo = (lo + Math.imul(al7, bl9)) | 0; + mid = (mid + Math.imul(al7, bh9)) | 0; + mid = (mid + Math.imul(ah7, bl9)) | 0; + hi = (hi + Math.imul(ah7, bh9)) | 0; + var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0; + w16 &= 0x3ffffff; + /* k = 17 */ + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = (mid + Math.imul(ah9, bl8)) | 0; + hi = Math.imul(ah9, bh8); + lo = (lo + Math.imul(al8, bl9)) | 0; + mid = (mid + Math.imul(al8, bh9)) | 0; + mid = (mid + Math.imul(ah8, bl9)) | 0; + hi = (hi + Math.imul(ah8, bh9)) | 0; + var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0; + w17 &= 0x3ffffff; + /* k = 18 */ + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = (mid + Math.imul(ah9, bl9)) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0; + w18 &= 0x3ffffff; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + + // Polyfill comb + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + + function bigMulTo (self, num, out) { + out.negative = num.negative ^ self.negative; + out.length = self.length + num.length; + + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + // Sum all words with the same `i + j = k` and accumulate `ncarry`, + // note that ncarry could be >= 0x3ffffff + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 0x3ffffff; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + + var lo = r & 0x3ffffff; + ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; + lo = (lo + rword) | 0; + rword = lo & 0x3ffffff; + ncarry = (ncarry + (lo >>> 26)) | 0; + + hncarry += ncarry >>> 26; + ncarry &= 0x3ffffff; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + + return out.strip(); + } + + function jumboMulTo (self, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self, num, out); + } + + BN.prototype.mulTo = function mulTo (num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + + return res; + }; + + // Cooley-Tukey algorithm for FFT + // slightly revisited to rely on looping instead of recursion + + function FFTM (x, y) { + this.x = x; + this.y = y; + } + + FFTM.prototype.makeRBT = function makeRBT (N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + + return t; + }; + + // Returns binary-reversed representation of `x` + FFTM.prototype.revBin = function revBin (x, l, N) { + if (x === 0 || x === N - 1) return x; + + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << (l - i - 1); + x >>= 1; + } + + return rb; + }; + + // Performs "tweedling" phase, therefore 'emulating' + // behaviour of the recursive algorithm + FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + + FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + + for (var j = 0; j < s; j++) { + var re = rtws[p + j]; + var ie = itws[p + j]; + + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + + var rx = rtwdf_ * ro - itwdf_ * io; + + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + + rtws[p + j] = re + ro; + itws[p + j] = ie + io; + + rtws[p + j + s] = re - ro; + itws[p + j + s] = ie - io; + + /* jshint maxdepth : false */ + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + + FFTM.prototype.guessLen13b = function guessLen13b (n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + + return 1 << i + 1 + odd; + }; + + FFTM.prototype.conjugate = function conjugate (rws, iws, N) { + if (N <= 1) return; + + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + + t = iws[i]; + + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + + FFTM.prototype.normalize13b = function normalize13b (ws, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + + Math.round(ws[2 * i] / N) + + carry; + + ws[i] = w & 0x3ffffff; + + if (w < 0x4000000) { + carry = 0; + } else { + carry = w / 0x4000000 | 0; + } + } + + return ws; + }; + + FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws[i] | 0); + + rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; + rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; + } + + // Pad with zeroes + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + + assert(carry === 0); + assert((carry & ~0x1fff) === 0); + }; + + FFTM.prototype.stub = function stub (N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + + return ph; + }; + + FFTM.prototype.mulp = function mulp (x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + + var rbt = this.makeRBT(N); + + var _ = this.stub(N); + + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + + var rmws = out.words; + rmws.length = N; + + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + + // Multiply `this` by `num` + BN.prototype.mul = function mul (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + + // Multiply employing FFT + BN.prototype.mulf = function mulf (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + + // In-place Multiplication + BN.prototype.imul = function imul (num) { + return this.clone().mulTo(num, this); + }; + + BN.prototype.imuln = function imuln (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + + // Carry + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); + carry >>= 26; + carry += (w / 0x4000000) | 0; + // NOTE: lo is 27bit maximum + carry += lo >>> 26; + this.words[i] = lo & 0x3ffffff; + } + + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + + return this; + }; + + BN.prototype.muln = function muln (num) { + return this.clone().imuln(num); + }; + + // `this` * `this` + BN.prototype.sqr = function sqr () { + return this.mul(this); + }; + + // `this` * `this` in-place + BN.prototype.isqr = function isqr () { + return this.imul(this.clone()); + }; + + // Math.pow(`this`, `num`) + BN.prototype.pow = function pow (num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + + // Skip leading zeroes + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + + res = res.mul(q); + } + } + + return res; + }; + + // Shift-left in-place + BN.prototype.iushln = function iushln (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); + var i; + + if (r !== 0) { + var carry = 0; + + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = ((this.words[i] | 0) - newCarry) << r; + this.words[i] = c | carry; + carry = newCarry >>> (26 - r); + } + + if (carry) { + this.words[i] = carry; + this.length++; + } + } + + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + + this.length += s; + } + + return this.strip(); + }; + + BN.prototype.ishln = function ishln (bits) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushln(bits); + }; + + // Shift-right in-place + // NOTE: `hint` is a lowest bit before trailing zeroes + // NOTE: if `extended` is present - it will be filled with destroyed bits + BN.prototype.iushrn = function iushrn (bits, hint, extended) { + assert(typeof bits === 'number' && bits >= 0); + var h; + if (hint) { + h = (hint - (hint % 26)) / 26; + } else { + h = 0; + } + + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + var maskedWords = extended; + + h -= s; + h = Math.max(0, h); + + // Extended mode, copy masked part + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + + if (s === 0) { + // No-op, we should not move anything at all + } else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = (carry << (26 - r)) | (word >>> r); + carry = word & mask; + } + + // Push carried bits as a mask + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + + return this.strip(); + }; + + BN.prototype.ishrn = function ishrn (bits, hint, extended) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + + // Shift-left + BN.prototype.shln = function shln (bits) { + return this.clone().ishln(bits); + }; + + BN.prototype.ushln = function ushln (bits) { + return this.clone().iushln(bits); + }; + + // Shift-right + BN.prototype.shrn = function shrn (bits) { + return this.clone().ishrn(bits); + }; + + BN.prototype.ushrn = function ushrn (bits) { + return this.clone().iushrn(bits); + }; + + // Test if n bit is set + BN.prototype.testn = function testn (bit) { + assert(typeof bit === 'number' && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) return false; + + // Check bit and return + var w = this.words[s]; + + return !!(w & q); + }; + + // Return only lowers bits of number (in-place) + BN.prototype.imaskn = function imaskn (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + + assert(this.negative === 0, 'imaskn works only with positive numbers'); + + if (this.length <= s) { + return this; + } + + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + + if (r !== 0) { + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + this.words[this.length - 1] &= mask; + } + + return this.strip(); + }; + + // Return only lowers bits of number + BN.prototype.maskn = function maskn (bits) { + return this.clone().imaskn(bits); + }; + + // Add plain number `num` to `this` + BN.prototype.iaddn = function iaddn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.isubn(-num); + + // Possible sign change + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + + // Add without checks + return this._iaddn(num); + }; + + BN.prototype._iaddn = function _iaddn (num) { + this.words[0] += num; + + // Carry + for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { + this.words[i] -= 0x4000000; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + + return this; + }; + + // Subtract plain number `num` from `this` + BN.prototype.isubn = function isubn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.iaddn(-num); + + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + + this.words[0] -= num; + + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + // Carry + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 0x4000000; + this.words[i + 1] -= 1; + } + } + + return this.strip(); + }; + + BN.prototype.addn = function addn (num) { + return this.clone().iaddn(num); + }; + + BN.prototype.subn = function subn (num) { + return this.clone().isubn(num); + }; + + BN.prototype.iabs = function iabs () { + this.negative = 0; + + return this; + }; + + BN.prototype.abs = function abs () { + return this.clone().iabs(); + }; + + BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { + var len = num.length + shift; + var i; + + this._expand(len); + + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 0x3ffffff; + carry = (w >> 26) - ((right / 0x4000000) | 0); + this.words[i + shift] = w & 0x3ffffff; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 0x3ffffff; + } + + if (carry === 0) return this.strip(); + + // Subtraction overflow + assert(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 0x3ffffff; + } + this.negative = 1; + + return this.strip(); + }; + + BN.prototype._wordDiv = function _wordDiv (num, mode) { + var shift = this.length - num.length; + + var a = this.clone(); + var b = num; + + // Normalize + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + + // Initialize quotient + var m = a.length - b.length; + var q; + + if (mode !== 'mod') { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + + var diff = a.clone()._ishlnsubmul(b, 1, m); + if (diff.negative === 0) { + a = diff; + if (q) { + q.words[m] = 1; + } + } + + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 0x4000000 + + (a.words[b.length + j - 1] | 0); + + // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max + // (0x7ffffff) + qj = Math.min((qj / bhi) | 0, 0x3ffffff); + + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + + // Denormalize + if (mode !== 'div' && shift !== 0) { + a.iushrn(shift); + } + + return { + div: q || null, + mod: a + }; + }; + + // NOTE: 1) `mode` can be set to `mod` to request mod only, + // to `div` to request div only, or be absent to + // request both div & mod + // 2) `positive` is true if unsigned mod is requested + BN.prototype.divmod = function divmod (num, mode, positive) { + assert(!num.isZero()); + + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + + return { + div: div, + mod: mod + }; + } + + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + return { + div: div, + mod: res.mod + }; + } + + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + + return { + div: res.div, + mod: mod + }; + } + + // Both numbers are positive at this point + + // Strip both numbers to approximate shift value + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + + // Very short reduction + if (num.length === 1) { + if (mode === 'div') { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + + if (mode === 'mod') { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + + return this._wordDiv(num, mode); + }; + + // Find `this` / `num` + BN.prototype.div = function div (num) { + return this.divmod(num, 'div', false).div; + }; + + // Find `this` % `num` + BN.prototype.mod = function mod (num) { + return this.divmod(num, 'mod', false).mod; + }; + + BN.prototype.umod = function umod (num) { + return this.divmod(num, 'mod', true).mod; + }; + + // Find Round(`this` / `num`) + BN.prototype.divRound = function divRound (num) { + var dm = this.divmod(num); + + // Fast case - exact division + if (dm.mod.isZero()) return dm.div; + + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + + // Round down + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + + // Round up + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + + BN.prototype.modn = function modn (num) { + assert(num <= 0x3ffffff); + var p = (1 << 26) % num; + + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + + return acc; + }; + + // In-place division by number + BN.prototype.idivn = function idivn (num) { + assert(num <= 0x3ffffff); + + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 0x4000000; + this.words[i] = (w / num) | 0; + carry = w % num; + } + + return this.strip(); + }; + + BN.prototype.divn = function divn (num) { + return this.clone().idivn(num); + }; + + BN.prototype.egcd = function egcd (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var x = this; + var y = p.clone(); + + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + + // A * x + B * y = x + var A = new BN(1); + var B = new BN(0); + + // C * x + D * y = y + var C = new BN(0); + var D = new BN(1); + + var g = 0; + + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + + var yp = y.clone(); + var xp = x.clone(); + + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + + A.iushrn(1); + B.iushrn(1); + } + } + + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + + C.iushrn(1); + D.iushrn(1); + } + } + + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + + // This is reduced incarnation of the binary EEA + // above, designated to invert members of the + // _prime_ fields F(p) at a maximal speed + BN.prototype._invmp = function _invmp (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var a = this; + var b = p.clone(); + + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + + var x1 = new BN(1); + var x2 = new BN(0); + + var delta = b.clone(); + + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + + x1.iushrn(1); + } + } + + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + + x2.iushrn(1); + } + } + + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + + if (res.cmpn(0) < 0) { + res.iadd(p); + } + + return res; + }; + + BN.prototype.gcd = function gcd (num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + + // Remove common factor of two + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + + var r = a.cmp(b); + if (r < 0) { + // Swap `a` and `b` to make `a` always bigger than `b` + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + + a.isub(b); + } while (true); + + return b.iushln(shift); + }; + + // Invert number in the field F(num) + BN.prototype.invm = function invm (num) { + return this.egcd(num).a.umod(num); + }; + + BN.prototype.isEven = function isEven () { + return (this.words[0] & 1) === 0; + }; + + BN.prototype.isOdd = function isOdd () { + return (this.words[0] & 1) === 1; + }; + + // And first word and num + BN.prototype.andln = function andln (num) { + return this.words[0] & num; + }; + + // Increment at the bit position in-line + BN.prototype.bincn = function bincn (bit) { + assert(typeof bit === 'number'); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + + // Add bit and propagate, if needed + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 0x3ffffff; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + + BN.prototype.isZero = function isZero () { + return this.length === 1 && this.words[0] === 0; + }; + + BN.prototype.cmpn = function cmpn (num) { + var negative = num < 0; + + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + + this.strip(); + + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + + assert(num <= 0x3ffffff, 'Number is too big'); + + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Compare two numbers and return: + // 1 - if `this` > `num` + // 0 - if `this` == `num` + // -1 - if `this` < `num` + BN.prototype.cmp = function cmp (num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Unsigned comparison + BN.prototype.ucmp = function ucmp (num) { + // At this point both numbers have the same sign + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + + BN.prototype.gtn = function gtn (num) { + return this.cmpn(num) === 1; + }; + + BN.prototype.gt = function gt (num) { + return this.cmp(num) === 1; + }; + + BN.prototype.gten = function gten (num) { + return this.cmpn(num) >= 0; + }; + + BN.prototype.gte = function gte (num) { + return this.cmp(num) >= 0; + }; + + BN.prototype.ltn = function ltn (num) { + return this.cmpn(num) === -1; + }; + + BN.prototype.lt = function lt (num) { + return this.cmp(num) === -1; + }; + + BN.prototype.lten = function lten (num) { + return this.cmpn(num) <= 0; + }; + + BN.prototype.lte = function lte (num) { + return this.cmp(num) <= 0; + }; + + BN.prototype.eqn = function eqn (num) { + return this.cmpn(num) === 0; + }; + + BN.prototype.eq = function eq (num) { + return this.cmp(num) === 0; + }; + + // + // A reduce context, could be using montgomery or something better, depending + // on the `m` itself. + // + BN.red = function red (num) { + return new Red(num); + }; + + BN.prototype.toRed = function toRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + assert(this.negative === 0, 'red works only with positives'); + return ctx.convertTo(this)._forceRed(ctx); + }; + + BN.prototype.fromRed = function fromRed () { + assert(this.red, 'fromRed works only with numbers in reduction context'); + return this.red.convertFrom(this); + }; + + BN.prototype._forceRed = function _forceRed (ctx) { + this.red = ctx; + return this; + }; + + BN.prototype.forceRed = function forceRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + return this._forceRed(ctx); + }; + + BN.prototype.redAdd = function redAdd (num) { + assert(this.red, 'redAdd works only with red numbers'); + return this.red.add(this, num); + }; + + BN.prototype.redIAdd = function redIAdd (num) { + assert(this.red, 'redIAdd works only with red numbers'); + return this.red.iadd(this, num); + }; + + BN.prototype.redSub = function redSub (num) { + assert(this.red, 'redSub works only with red numbers'); + return this.red.sub(this, num); + }; + + BN.prototype.redISub = function redISub (num) { + assert(this.red, 'redISub works only with red numbers'); + return this.red.isub(this, num); + }; + + BN.prototype.redShl = function redShl (num) { + assert(this.red, 'redShl works only with red numbers'); + return this.red.shl(this, num); + }; + + BN.prototype.redMul = function redMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + + BN.prototype.redIMul = function redIMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + + BN.prototype.redSqr = function redSqr () { + assert(this.red, 'redSqr works only with red numbers'); + this.red._verify1(this); + return this.red.sqr(this); + }; + + BN.prototype.redISqr = function redISqr () { + assert(this.red, 'redISqr works only with red numbers'); + this.red._verify1(this); + return this.red.isqr(this); + }; + + // Square root over p + BN.prototype.redSqrt = function redSqrt () { + assert(this.red, 'redSqrt works only with red numbers'); + this.red._verify1(this); + return this.red.sqrt(this); + }; + + BN.prototype.redInvm = function redInvm () { + assert(this.red, 'redInvm works only with red numbers'); + this.red._verify1(this); + return this.red.invm(this); + }; + + // Return negative clone of `this` % `red modulo` + BN.prototype.redNeg = function redNeg () { + assert(this.red, 'redNeg works only with red numbers'); + this.red._verify1(this); + return this.red.neg(this); + }; + + BN.prototype.redPow = function redPow (num) { + assert(this.red && !num.red, 'redPow(normalNum)'); + this.red._verify1(this); + return this.red.pow(this, num); + }; + + // Prime numbers with efficient reduction + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + + // Pseudo-Mersenne prime + function MPrime (name, p) { + // P = 2 ^ N - K + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + + this.tmp = this._tmp(); + } + + MPrime.prototype._tmp = function _tmp () { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + + MPrime.prototype.ireduce = function ireduce (num) { + // Assumes that `num` is less than `P^2` + // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) + var r = num; + var rlen; + + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + r.strip(); + } + + return r; + }; + + MPrime.prototype.split = function split (input, out) { + input.iushrn(this.n, 0, out); + }; + + MPrime.prototype.imulK = function imulK (num) { + return num.imul(this.k); + }; + + function K256 () { + MPrime.call( + this, + 'k256', + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); + } + inherits(K256, MPrime); + + K256.prototype.split = function split (input, output) { + // 256 = 9 * 26 + 22 + var mask = 0x3fffff; + + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + + // Shift by 9 limbs + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + + K256.prototype.imulK = function imulK (num) { + // K = 0x1000003d1 = [ 0x40, 0x3d1 ] + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + + // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 0x3d1; + num.words[i] = lo & 0x3ffffff; + lo = w * 0x40 + ((lo / 0x4000000) | 0); + } + + // Fast length reduction + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + + function P224 () { + MPrime.call( + this, + 'p224', + 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); + } + inherits(P224, MPrime); + + function P192 () { + MPrime.call( + this, + 'p192', + 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); + } + inherits(P192, MPrime); + + function P25519 () { + // 2 ^ 255 - 19 + MPrime.call( + this, + '25519', + '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); + } + inherits(P25519, MPrime); + + P25519.prototype.imulK = function imulK (num) { + // K = 0x13 + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 0x13 + carry; + var lo = hi & 0x3ffffff; + hi >>>= 26; + + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + + // Exported mostly for testing purposes, use plain name instead + BN._prime = function prime (name) { + // Cached version of prime + if (primes[name]) return primes[name]; + + var prime; + if (name === 'k256') { + prime = new K256(); + } else if (name === 'p224') { + prime = new P224(); + } else if (name === 'p192') { + prime = new P192(); + } else if (name === 'p25519') { + prime = new P25519(); + } else { + throw new Error('Unknown prime ' + name); + } + primes[name] = prime; + + return prime; + }; + + // + // Base reduction engine + // + function Red (m) { + if (typeof m === 'string') { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert(m.gtn(1), 'modulus must be greater than 1'); + this.m = m; + this.prime = null; + } + } + + Red.prototype._verify1 = function _verify1 (a) { + assert(a.negative === 0, 'red works only with positives'); + assert(a.red, 'red works only with red numbers'); + }; + + Red.prototype._verify2 = function _verify2 (a, b) { + assert((a.negative | b.negative) === 0, 'red works only with positives'); + assert(a.red && a.red === b.red, + 'red works only with red numbers'); + }; + + Red.prototype.imod = function imod (a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + + Red.prototype.neg = function neg (a) { + if (a.isZero()) { + return a.clone(); + } + + return this.m.sub(a)._forceRed(this); + }; + + Red.prototype.add = function add (a, b) { + this._verify2(a, b); + + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.iadd = function iadd (a, b) { + this._verify2(a, b); + + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + + Red.prototype.sub = function sub (a, b) { + this._verify2(a, b); + + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.isub = function isub (a, b) { + this._verify2(a, b); + + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + + Red.prototype.shl = function shl (a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + + Red.prototype.imul = function imul (a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + + Red.prototype.mul = function mul (a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + + Red.prototype.isqr = function isqr (a) { + return this.imul(a, a.clone()); + }; + + Red.prototype.sqr = function sqr (a) { + return this.mul(a, a); + }; + + Red.prototype.sqrt = function sqrt (a) { + if (a.isZero()) return a.clone(); + + var mod3 = this.m.andln(3); + assert(mod3 % 2 === 1); + + // Fast case + if (mod3 === 3) { + var pow = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow); + } + + // Tonelli-Shanks algorithm (Totally unoptimized and slow) + // + // Find Q and S, that Q * 2 ^ S = (P - 1) + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert(!q.isZero()); + + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + + // Find quadratic non-residue + // NOTE: Max is such because of generalized Riemann hypothesis. + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + + return r; + }; + + Red.prototype.invm = function invm (a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + + Red.prototype.pow = function pow (a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + + var res = wnd[0]; + var current = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = (word >> j) & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + + if (bit === 0 && current === 0) { + currentLen = 0; + continue; + } + + current <<= 1; + current |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + + res = this.mul(res, wnd[current]); + currentLen = 0; + current = 0; + } + start = 26; + } + + return res; + }; + + Red.prototype.convertTo = function convertTo (num) { + var r = num.umod(this.m); + + return r === num ? r.clone() : r; + }; + + Red.prototype.convertFrom = function convertFrom (num) { + var res = num.clone(); + res.red = null; + return res; + }; + + // + // Montgomery method engine + // + + BN.mont = function mont (num) { + return new Mont(num); + }; + + function Mont (m) { + Red.call(this, m); + + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - (this.shift % 26); + } + + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + + Mont.prototype.convertTo = function convertTo (num) { + return this.imod(num.ushln(this.shift)); + }; + + Mont.prototype.convertFrom = function convertFrom (num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + + Mont.prototype.imul = function imul (a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + + return res._forceRed(this); + }; + + Mont.prototype.mul = function mul (a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + + return res._forceRed(this); + }; + + Mont.prototype.invm = function invm (a) { + // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; +})(typeof module === 'undefined' || module, this); + +},{"buffer":19}],18:[function(require,module,exports){ +var r; + +module.exports = function rand(len) { + if (!r) + r = new Rand(null); + + return r.generate(len); +}; + +function Rand(rand) { + this.rand = rand; +} +module.exports.Rand = Rand; + +Rand.prototype.generate = function generate(len) { + return this._rand(len); +}; + +// Emulate crypto API using randy +Rand.prototype._rand = function _rand(n) { + if (this.rand.getBytes) + return this.rand.getBytes(n); + + var res = new Uint8Array(n); + for (var i = 0; i < res.length; i++) + res[i] = this.rand.getByte(); + return res; +}; + +if (typeof self === 'object') { + if (self.crypto && self.crypto.getRandomValues) { + // Modern browsers + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.crypto.getRandomValues(arr); + return arr; + }; + } else if (self.msCrypto && self.msCrypto.getRandomValues) { + // IE + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.msCrypto.getRandomValues(arr); + return arr; + }; + + // Safari's WebWorkers do not have `crypto` + } else if (typeof window === 'object') { + // Old junk + Rand.prototype._rand = function() { + throw new Error('Not implemented yet'); + }; + } +} else { + // Node.js or Web worker with no crypto support + try { + var crypto = require('crypto'); + if (typeof crypto.randomBytes !== 'function') + throw new Error('Not supported'); + + Rand.prototype._rand = function _rand(n) { + return crypto.randomBytes(n); + }; + } catch (e) { + } +} + +},{"crypto":19}],19:[function(require,module,exports){ + +},{}],20:[function(require,module,exports){ +// based on the aes implimentation in triple sec +// https://github.com/keybase/triplesec +// which is in turn based on the one from crypto-js +// https://code.google.com/p/crypto-js/ + +var Buffer = require('safe-buffer').Buffer + +function asUInt32Array (buf) { + if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf) + + var len = (buf.length / 4) | 0 + var out = new Array(len) + + for (var i = 0; i < len; i++) { + out[i] = buf.readUInt32BE(i * 4) + } + + return out +} + +function scrubVec (v) { + for (var i = 0; i < v.length; v++) { + v[i] = 0 + } +} + +function cryptBlock (M, keySchedule, SUB_MIX, SBOX, nRounds) { + var SUB_MIX0 = SUB_MIX[0] + var SUB_MIX1 = SUB_MIX[1] + var SUB_MIX2 = SUB_MIX[2] + var SUB_MIX3 = SUB_MIX[3] + + var s0 = M[0] ^ keySchedule[0] + var s1 = M[1] ^ keySchedule[1] + var s2 = M[2] ^ keySchedule[2] + var s3 = M[3] ^ keySchedule[3] + var t0, t1, t2, t3 + var ksRow = 4 + + for (var round = 1; round < nRounds; round++) { + t0 = SUB_MIX0[s0 >>> 24] ^ SUB_MIX1[(s1 >>> 16) & 0xff] ^ SUB_MIX2[(s2 >>> 8) & 0xff] ^ SUB_MIX3[s3 & 0xff] ^ keySchedule[ksRow++] + t1 = SUB_MIX0[s1 >>> 24] ^ SUB_MIX1[(s2 >>> 16) & 0xff] ^ SUB_MIX2[(s3 >>> 8) & 0xff] ^ SUB_MIX3[s0 & 0xff] ^ keySchedule[ksRow++] + t2 = SUB_MIX0[s2 >>> 24] ^ SUB_MIX1[(s3 >>> 16) & 0xff] ^ SUB_MIX2[(s0 >>> 8) & 0xff] ^ SUB_MIX3[s1 & 0xff] ^ keySchedule[ksRow++] + t3 = SUB_MIX0[s3 >>> 24] ^ SUB_MIX1[(s0 >>> 16) & 0xff] ^ SUB_MIX2[(s1 >>> 8) & 0xff] ^ SUB_MIX3[s2 & 0xff] ^ keySchedule[ksRow++] + s0 = t0 + s1 = t1 + s2 = t2 + s3 = t3 + } + + t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++] + t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++] + t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++] + t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++] + t0 = t0 >>> 0 + t1 = t1 >>> 0 + t2 = t2 >>> 0 + t3 = t3 >>> 0 + + return [t0, t1, t2, t3] +} + +// AES constants +var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36] +var G = (function () { + // Compute double table + var d = new Array(256) + for (var j = 0; j < 256; j++) { + if (j < 128) { + d[j] = j << 1 + } else { + d[j] = (j << 1) ^ 0x11b + } + } + + var SBOX = [] + var INV_SBOX = [] + var SUB_MIX = [[], [], [], []] + var INV_SUB_MIX = [[], [], [], []] + + // Walk GF(2^8) + var x = 0 + var xi = 0 + for (var i = 0; i < 256; ++i) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4) + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63 + SBOX[x] = sx + INV_SBOX[sx] = x + + // Compute multiplication + var x2 = d[x] + var x4 = d[x2] + var x8 = d[x4] + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100) + SUB_MIX[0][x] = (t << 24) | (t >>> 8) + SUB_MIX[1][x] = (t << 16) | (t >>> 16) + SUB_MIX[2][x] = (t << 8) | (t >>> 24) + SUB_MIX[3][x] = t + + // Compute inv sub bytes, inv mix columns tables + t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100) + INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8) + INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16) + INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24) + INV_SUB_MIX[3][sx] = t + + if (x === 0) { + x = xi = 1 + } else { + x = x2 ^ d[d[d[x8 ^ x2]]] + xi ^= d[d[xi]] + } + } + + return { + SBOX: SBOX, + INV_SBOX: INV_SBOX, + SUB_MIX: SUB_MIX, + INV_SUB_MIX: INV_SUB_MIX + } +})() + +function AES (key) { + this._key = asUInt32Array(key) + this._reset() +} + +AES.blockSize = 4 * 4 +AES.keySize = 256 / 8 +AES.prototype.blockSize = AES.blockSize +AES.prototype.keySize = AES.keySize +AES.prototype._reset = function () { + var keyWords = this._key + var keySize = keyWords.length + var nRounds = keySize + 6 + var ksRows = (nRounds + 1) * 4 + + var keySchedule = [] + for (var k = 0; k < keySize; k++) { + keySchedule[k] = keyWords[k] + } + + for (k = keySize; k < ksRows; k++) { + var t = keySchedule[k - 1] + + if (k % keySize === 0) { + t = (t << 8) | (t >>> 24) + t = + (G.SBOX[t >>> 24] << 24) | + (G.SBOX[(t >>> 16) & 0xff] << 16) | + (G.SBOX[(t >>> 8) & 0xff] << 8) | + (G.SBOX[t & 0xff]) + + t ^= RCON[(k / keySize) | 0] << 24 + } else if (keySize > 6 && k % keySize === 4) { + t = + (G.SBOX[t >>> 24] << 24) | + (G.SBOX[(t >>> 16) & 0xff] << 16) | + (G.SBOX[(t >>> 8) & 0xff] << 8) | + (G.SBOX[t & 0xff]) + } + + keySchedule[k] = keySchedule[k - keySize] ^ t + } + + var invKeySchedule = [] + for (var ik = 0; ik < ksRows; ik++) { + var ksR = ksRows - ik + var tt = keySchedule[ksR - (ik % 4 ? 0 : 4)] + + if (ik < 4 || ksR <= 4) { + invKeySchedule[ik] = tt + } else { + invKeySchedule[ik] = + G.INV_SUB_MIX[0][G.SBOX[tt >>> 24]] ^ + G.INV_SUB_MIX[1][G.SBOX[(tt >>> 16) & 0xff]] ^ + G.INV_SUB_MIX[2][G.SBOX[(tt >>> 8) & 0xff]] ^ + G.INV_SUB_MIX[3][G.SBOX[tt & 0xff]] + } + } + + this._nRounds = nRounds + this._keySchedule = keySchedule + this._invKeySchedule = invKeySchedule +} + +AES.prototype.encryptBlockRaw = function (M) { + M = asUInt32Array(M) + return cryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX, this._nRounds) +} + +AES.prototype.encryptBlock = function (M) { + var out = this.encryptBlockRaw(M) + var buf = Buffer.allocUnsafe(16) + buf.writeUInt32BE(out[0], 0) + buf.writeUInt32BE(out[1], 4) + buf.writeUInt32BE(out[2], 8) + buf.writeUInt32BE(out[3], 12) + return buf +} + +AES.prototype.decryptBlock = function (M) { + M = asUInt32Array(M) + + // swap + var m1 = M[1] + M[1] = M[3] + M[3] = m1 + + var out = cryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX, this._nRounds) + var buf = Buffer.allocUnsafe(16) + buf.writeUInt32BE(out[0], 0) + buf.writeUInt32BE(out[3], 4) + buf.writeUInt32BE(out[2], 8) + buf.writeUInt32BE(out[1], 12) + return buf +} + +AES.prototype.scrub = function () { + scrubVec(this._keySchedule) + scrubVec(this._invKeySchedule) + scrubVec(this._key) +} + +module.exports.AES = AES + +},{"safe-buffer":144}],21:[function(require,module,exports){ +var aes = require('./aes') +var Buffer = require('safe-buffer').Buffer +var Transform = require('cipher-base') +var inherits = require('inherits') +var GHASH = require('./ghash') +var xor = require('buffer-xor') +var incr32 = require('./incr32') + +function xorTest (a, b) { + var out = 0 + if (a.length !== b.length) out++ + + var len = Math.min(a.length, b.length) + for (var i = 0; i < len; ++i) { + out += (a[i] ^ b[i]) + } + + return out +} + +function calcIv (self, iv, ck) { + if (iv.length === 12) { + self._finID = Buffer.concat([iv, Buffer.from([0, 0, 0, 1])]) + return Buffer.concat([iv, Buffer.from([0, 0, 0, 2])]) + } + var ghash = new GHASH(ck) + var len = iv.length + var toPad = len % 16 + ghash.update(iv) + if (toPad) { + toPad = 16 - toPad + ghash.update(Buffer.alloc(toPad, 0)) + } + ghash.update(Buffer.alloc(8, 0)) + var ivBits = len * 8 + var tail = Buffer.alloc(8) + tail.writeUIntBE(ivBits, 0, 8) + ghash.update(tail) + self._finID = ghash.state + var out = Buffer.from(self._finID) + incr32(out) + return out +} +function StreamCipher (mode, key, iv, decrypt) { + Transform.call(this) + + var h = Buffer.alloc(4, 0) + + this._cipher = new aes.AES(key) + var ck = this._cipher.encryptBlock(h) + this._ghash = new GHASH(ck) + iv = calcIv(this, iv, ck) + + this._prev = Buffer.from(iv) + this._cache = Buffer.allocUnsafe(0) + this._secCache = Buffer.allocUnsafe(0) + this._decrypt = decrypt + this._alen = 0 + this._len = 0 + this._mode = mode + + this._authTag = null + this._called = false +} + +inherits(StreamCipher, Transform) + +StreamCipher.prototype._update = function (chunk) { + if (!this._called && this._alen) { + var rump = 16 - (this._alen % 16) + if (rump < 16) { + rump = Buffer.alloc(rump, 0) + this._ghash.update(rump) + } + } + + this._called = true + var out = this._mode.encrypt(this, chunk) + if (this._decrypt) { + this._ghash.update(chunk) + } else { + this._ghash.update(out) + } + this._len += chunk.length + return out +} + +StreamCipher.prototype._final = function () { + if (this._decrypt && !this._authTag) throw new Error('Unsupported state or unable to authenticate data') + + var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID)) + if (this._decrypt && xorTest(tag, this._authTag)) throw new Error('Unsupported state or unable to authenticate data') + + this._authTag = tag + this._cipher.scrub() +} + +StreamCipher.prototype.getAuthTag = function getAuthTag () { + if (this._decrypt || !Buffer.isBuffer(this._authTag)) throw new Error('Attempting to get auth tag in unsupported state') + + return this._authTag +} + +StreamCipher.prototype.setAuthTag = function setAuthTag (tag) { + if (!this._decrypt) throw new Error('Attempting to set auth tag in unsupported state') + + this._authTag = tag +} + +StreamCipher.prototype.setAAD = function setAAD (buf) { + if (this._called) throw new Error('Attempting to set AAD in unsupported state') + + this._ghash.update(buf) + this._alen += buf.length +} + +module.exports = StreamCipher + +},{"./aes":20,"./ghash":25,"./incr32":26,"buffer-xor":48,"cipher-base":50,"inherits":101,"safe-buffer":144}],22:[function(require,module,exports){ +var ciphers = require('./encrypter') +var deciphers = require('./decrypter') +var modes = require('./modes/list.json') + +function getCiphers () { + return Object.keys(modes) +} + +exports.createCipher = exports.Cipher = ciphers.createCipher +exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv +exports.createDecipher = exports.Decipher = deciphers.createDecipher +exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv +exports.listCiphers = exports.getCiphers = getCiphers + +},{"./decrypter":23,"./encrypter":24,"./modes/list.json":34}],23:[function(require,module,exports){ +var AuthCipher = require('./authCipher') +var Buffer = require('safe-buffer').Buffer +var MODES = require('./modes') +var StreamCipher = require('./streamCipher') +var Transform = require('cipher-base') +var aes = require('./aes') +var ebtk = require('evp_bytestokey') +var inherits = require('inherits') + +function Decipher (mode, key, iv) { + Transform.call(this) + + this._cache = new Splitter() + this._last = void 0 + this._cipher = new aes.AES(key) + this._prev = Buffer.from(iv) + this._mode = mode + this._autopadding = true +} + +inherits(Decipher, Transform) + +Decipher.prototype._update = function (data) { + this._cache.add(data) + var chunk + var thing + var out = [] + while ((chunk = this._cache.get(this._autopadding))) { + thing = this._mode.decrypt(this, chunk) + out.push(thing) + } + return Buffer.concat(out) +} + +Decipher.prototype._final = function () { + var chunk = this._cache.flush() + if (this._autopadding) { + return unpad(this._mode.decrypt(this, chunk)) + } else if (chunk) { + throw new Error('data not multiple of block length') + } +} + +Decipher.prototype.setAutoPadding = function (setTo) { + this._autopadding = !!setTo + return this +} + +function Splitter () { + this.cache = Buffer.allocUnsafe(0) +} + +Splitter.prototype.add = function (data) { + this.cache = Buffer.concat([this.cache, data]) +} + +Splitter.prototype.get = function (autoPadding) { + var out + if (autoPadding) { + if (this.cache.length > 16) { + out = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + return out + } + } else { + if (this.cache.length >= 16) { + out = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + return out + } + } + + return null +} + +Splitter.prototype.flush = function () { + if (this.cache.length) return this.cache +} + +function unpad (last) { + var padded = last[15] + if (padded < 1 || padded > 16) { + throw new Error('unable to decrypt data') + } + var i = -1 + while (++i < padded) { + if (last[(i + (16 - padded))] !== padded) { + throw new Error('unable to decrypt data') + } + } + if (padded === 16) return + + return last.slice(0, 16 - padded) +} + +function createDecipheriv (suite, password, iv) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + if (typeof iv === 'string') iv = Buffer.from(iv) + if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) + + if (typeof password === 'string') password = Buffer.from(password) + if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) + + if (config.type === 'stream') { + return new StreamCipher(config.module, password, iv, true) + } else if (config.type === 'auth') { + return new AuthCipher(config.module, password, iv, true) + } + + return new Decipher(config.module, password, iv) +} + +function createDecipher (suite, password) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + var keys = ebtk(password, false, config.key, config.iv) + return createDecipheriv(suite, keys.key, keys.iv) +} + +exports.createDecipher = createDecipher +exports.createDecipheriv = createDecipheriv + +},{"./aes":20,"./authCipher":21,"./modes":33,"./streamCipher":36,"cipher-base":50,"evp_bytestokey":85,"inherits":101,"safe-buffer":144}],24:[function(require,module,exports){ +var MODES = require('./modes') +var AuthCipher = require('./authCipher') +var Buffer = require('safe-buffer').Buffer +var StreamCipher = require('./streamCipher') +var Transform = require('cipher-base') +var aes = require('./aes') +var ebtk = require('evp_bytestokey') +var inherits = require('inherits') + +function Cipher (mode, key, iv) { + Transform.call(this) + + this._cache = new Splitter() + this._cipher = new aes.AES(key) + this._prev = Buffer.from(iv) + this._mode = mode + this._autopadding = true +} + +inherits(Cipher, Transform) + +Cipher.prototype._update = function (data) { + this._cache.add(data) + var chunk + var thing + var out = [] + + while ((chunk = this._cache.get())) { + thing = this._mode.encrypt(this, chunk) + out.push(thing) + } + + return Buffer.concat(out) +} + +var PADDING = Buffer.alloc(16, 0x10) + +Cipher.prototype._final = function () { + var chunk = this._cache.flush() + if (this._autopadding) { + chunk = this._mode.encrypt(this, chunk) + this._cipher.scrub() + return chunk + } + + if (!chunk.equals(PADDING)) { + this._cipher.scrub() + throw new Error('data not multiple of block length') + } +} + +Cipher.prototype.setAutoPadding = function (setTo) { + this._autopadding = !!setTo + return this +} + +function Splitter () { + this.cache = Buffer.allocUnsafe(0) +} + +Splitter.prototype.add = function (data) { + this.cache = Buffer.concat([this.cache, data]) +} + +Splitter.prototype.get = function () { + if (this.cache.length > 15) { + var out = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + return out + } + return null +} + +Splitter.prototype.flush = function () { + var len = 16 - this.cache.length + var padBuff = Buffer.allocUnsafe(len) + + var i = -1 + while (++i < len) { + padBuff.writeUInt8(len, i) + } + + return Buffer.concat([this.cache, padBuff]) +} + +function createCipheriv (suite, password, iv) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + if (typeof password === 'string') password = Buffer.from(password) + if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) + + if (typeof iv === 'string') iv = Buffer.from(iv) + if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) + + if (config.type === 'stream') { + return new StreamCipher(config.module, password, iv) + } else if (config.type === 'auth') { + return new AuthCipher(config.module, password, iv) + } + + return new Cipher(config.module, password, iv) +} + +function createCipher (suite, password) { + var config = MODES[suite.toLowerCase()] + if (!config) throw new TypeError('invalid suite type') + + var keys = ebtk(password, false, config.key, config.iv) + return createCipheriv(suite, keys.key, keys.iv) +} + +exports.createCipheriv = createCipheriv +exports.createCipher = createCipher + +},{"./aes":20,"./authCipher":21,"./modes":33,"./streamCipher":36,"cipher-base":50,"evp_bytestokey":85,"inherits":101,"safe-buffer":144}],25:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var ZEROES = Buffer.alloc(16, 0) + +function toArray (buf) { + return [ + buf.readUInt32BE(0), + buf.readUInt32BE(4), + buf.readUInt32BE(8), + buf.readUInt32BE(12) + ] +} + +function fromArray (out) { + var buf = Buffer.allocUnsafe(16) + buf.writeUInt32BE(out[0] >>> 0, 0) + buf.writeUInt32BE(out[1] >>> 0, 4) + buf.writeUInt32BE(out[2] >>> 0, 8) + buf.writeUInt32BE(out[3] >>> 0, 12) + return buf +} + +function GHASH (key) { + this.h = key + this.state = Buffer.alloc(16, 0) + this.cache = Buffer.allocUnsafe(0) +} + +// from http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_gcm.js.html +// by Juho Vähä-Herttua +GHASH.prototype.ghash = function (block) { + var i = -1 + while (++i < block.length) { + this.state[i] ^= block[i] + } + this._multiply() +} + +GHASH.prototype._multiply = function () { + var Vi = toArray(this.h) + var Zi = [0, 0, 0, 0] + var j, xi, lsbVi + var i = -1 + while (++i < 128) { + xi = (this.state[~~(i / 8)] & (1 << (7 - (i % 8)))) !== 0 + if (xi) { + // Z_i+1 = Z_i ^ V_i + Zi[0] ^= Vi[0] + Zi[1] ^= Vi[1] + Zi[2] ^= Vi[2] + Zi[3] ^= Vi[3] + } + + // Store the value of LSB(V_i) + lsbVi = (Vi[3] & 1) !== 0 + + // V_i+1 = V_i >> 1 + for (j = 3; j > 0; j--) { + Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31) + } + Vi[0] = Vi[0] >>> 1 + + // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R + if (lsbVi) { + Vi[0] = Vi[0] ^ (0xe1 << 24) + } + } + this.state = fromArray(Zi) +} + +GHASH.prototype.update = function (buf) { + this.cache = Buffer.concat([this.cache, buf]) + var chunk + while (this.cache.length >= 16) { + chunk = this.cache.slice(0, 16) + this.cache = this.cache.slice(16) + this.ghash(chunk) + } +} + +GHASH.prototype.final = function (abl, bl) { + if (this.cache.length) { + this.ghash(Buffer.concat([this.cache, ZEROES], 16)) + } + + this.ghash(fromArray([0, abl, 0, bl])) + return this.state +} + +module.exports = GHASH + +},{"safe-buffer":144}],26:[function(require,module,exports){ +function incr32 (iv) { + var len = iv.length + var item + while (len--) { + item = iv.readUInt8(len) + if (item === 255) { + iv.writeUInt8(0, len) + } else { + item++ + iv.writeUInt8(item, len) + break + } + } +} +module.exports = incr32 + +},{}],27:[function(require,module,exports){ +var xor = require('buffer-xor') + +exports.encrypt = function (self, block) { + var data = xor(block, self._prev) + + self._prev = self._cipher.encryptBlock(data) + return self._prev +} + +exports.decrypt = function (self, block) { + var pad = self._prev + + self._prev = block + var out = self._cipher.decryptBlock(block) + + return xor(out, pad) +} + +},{"buffer-xor":48}],28:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var xor = require('buffer-xor') + +function encryptStart (self, data, decrypt) { + var len = data.length + var out = xor(data, self._cache) + self._cache = self._cache.slice(len) + self._prev = Buffer.concat([self._prev, decrypt ? data : out]) + return out +} + +exports.encrypt = function (self, data, decrypt) { + var out = Buffer.allocUnsafe(0) + var len + + while (data.length) { + if (self._cache.length === 0) { + self._cache = self._cipher.encryptBlock(self._prev) + self._prev = Buffer.allocUnsafe(0) + } + + if (self._cache.length <= data.length) { + len = self._cache.length + out = Buffer.concat([out, encryptStart(self, data.slice(0, len), decrypt)]) + data = data.slice(len) + } else { + out = Buffer.concat([out, encryptStart(self, data, decrypt)]) + break + } + } + + return out +} + +},{"buffer-xor":48,"safe-buffer":144}],29:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer + +function encryptByte (self, byteParam, decrypt) { + var pad + var i = -1 + var len = 8 + var out = 0 + var bit, value + while (++i < len) { + pad = self._cipher.encryptBlock(self._prev) + bit = (byteParam & (1 << (7 - i))) ? 0x80 : 0 + value = pad[0] ^ bit + out += ((value & 0x80) >> (i % 8)) + self._prev = shiftIn(self._prev, decrypt ? bit : value) + } + return out +} + +function shiftIn (buffer, value) { + var len = buffer.length + var i = -1 + var out = Buffer.allocUnsafe(buffer.length) + buffer = Buffer.concat([buffer, Buffer.from([value])]) + + while (++i < len) { + out[i] = buffer[i] << 1 | buffer[i + 1] >> (7) + } + + return out +} + +exports.encrypt = function (self, chunk, decrypt) { + var len = chunk.length + var out = Buffer.allocUnsafe(len) + var i = -1 + + while (++i < len) { + out[i] = encryptByte(self, chunk[i], decrypt) + } + + return out +} + +},{"safe-buffer":144}],30:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer + +function encryptByte (self, byteParam, decrypt) { + var pad = self._cipher.encryptBlock(self._prev) + var out = pad[0] ^ byteParam + + self._prev = Buffer.concat([ + self._prev.slice(1), + Buffer.from([decrypt ? byteParam : out]) + ]) + + return out +} + +exports.encrypt = function (self, chunk, decrypt) { + var len = chunk.length + var out = Buffer.allocUnsafe(len) + var i = -1 + + while (++i < len) { + out[i] = encryptByte(self, chunk[i], decrypt) + } + + return out +} + +},{"safe-buffer":144}],31:[function(require,module,exports){ +var xor = require('buffer-xor') +var Buffer = require('safe-buffer').Buffer +var incr32 = require('../incr32') + +function getBlock (self) { + var out = self._cipher.encryptBlockRaw(self._prev) + incr32(self._prev) + return out +} + +var blockSize = 16 +exports.encrypt = function (self, chunk) { + var chunkNum = Math.ceil(chunk.length / blockSize) + var start = self._cache.length + self._cache = Buffer.concat([ + self._cache, + Buffer.allocUnsafe(chunkNum * blockSize) + ]) + for (var i = 0; i < chunkNum; i++) { + var out = getBlock(self) + var offset = start + i * blockSize + self._cache.writeUInt32BE(out[0], offset + 0) + self._cache.writeUInt32BE(out[1], offset + 4) + self._cache.writeUInt32BE(out[2], offset + 8) + self._cache.writeUInt32BE(out[3], offset + 12) + } + var pad = self._cache.slice(0, chunk.length) + self._cache = self._cache.slice(chunk.length) + return xor(chunk, pad) +} + +},{"../incr32":26,"buffer-xor":48,"safe-buffer":144}],32:[function(require,module,exports){ +exports.encrypt = function (self, block) { + return self._cipher.encryptBlock(block) +} + +exports.decrypt = function (self, block) { + return self._cipher.decryptBlock(block) +} + +},{}],33:[function(require,module,exports){ +var modeModules = { + ECB: require('./ecb'), + CBC: require('./cbc'), + CFB: require('./cfb'), + CFB8: require('./cfb8'), + CFB1: require('./cfb1'), + OFB: require('./ofb'), + CTR: require('./ctr'), + GCM: require('./ctr') +} + +var modes = require('./list.json') + +for (var key in modes) { + modes[key].module = modeModules[modes[key].mode] +} + +module.exports = modes + +},{"./cbc":27,"./cfb":28,"./cfb1":29,"./cfb8":30,"./ctr":31,"./ecb":32,"./list.json":34,"./ofb":35}],34:[function(require,module,exports){ +module.exports={ + "aes-128-ecb": { + "cipher": "AES", + "key": 128, + "iv": 0, + "mode": "ECB", + "type": "block" + }, + "aes-192-ecb": { + "cipher": "AES", + "key": 192, + "iv": 0, + "mode": "ECB", + "type": "block" + }, + "aes-256-ecb": { + "cipher": "AES", + "key": 256, + "iv": 0, + "mode": "ECB", + "type": "block" + }, + "aes-128-cbc": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes-192-cbc": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes-256-cbc": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes128": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes192": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes256": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CBC", + "type": "block" + }, + "aes-128-cfb": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CFB", + "type": "stream" + }, + "aes-192-cfb": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CFB", + "type": "stream" + }, + "aes-256-cfb": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CFB", + "type": "stream" + }, + "aes-128-cfb8": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CFB8", + "type": "stream" + }, + "aes-192-cfb8": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CFB8", + "type": "stream" + }, + "aes-256-cfb8": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CFB8", + "type": "stream" + }, + "aes-128-cfb1": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CFB1", + "type": "stream" + }, + "aes-192-cfb1": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CFB1", + "type": "stream" + }, + "aes-256-cfb1": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CFB1", + "type": "stream" + }, + "aes-128-ofb": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "OFB", + "type": "stream" + }, + "aes-192-ofb": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "OFB", + "type": "stream" + }, + "aes-256-ofb": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "OFB", + "type": "stream" + }, + "aes-128-ctr": { + "cipher": "AES", + "key": 128, + "iv": 16, + "mode": "CTR", + "type": "stream" + }, + "aes-192-ctr": { + "cipher": "AES", + "key": 192, + "iv": 16, + "mode": "CTR", + "type": "stream" + }, + "aes-256-ctr": { + "cipher": "AES", + "key": 256, + "iv": 16, + "mode": "CTR", + "type": "stream" + }, + "aes-128-gcm": { + "cipher": "AES", + "key": 128, + "iv": 12, + "mode": "GCM", + "type": "auth" + }, + "aes-192-gcm": { + "cipher": "AES", + "key": 192, + "iv": 12, + "mode": "GCM", + "type": "auth" + }, + "aes-256-gcm": { + "cipher": "AES", + "key": 256, + "iv": 12, + "mode": "GCM", + "type": "auth" + } +} + +},{}],35:[function(require,module,exports){ +(function (Buffer){ +var xor = require('buffer-xor') + +function getBlock (self) { + self._prev = self._cipher.encryptBlock(self._prev) + return self._prev +} + +exports.encrypt = function (self, chunk) { + while (self._cache.length < chunk.length) { + self._cache = Buffer.concat([self._cache, getBlock(self)]) + } + + var pad = self._cache.slice(0, chunk.length) + self._cache = self._cache.slice(chunk.length) + return xor(chunk, pad) +} + +}).call(this,require("buffer").Buffer) +},{"buffer":49,"buffer-xor":48}],36:[function(require,module,exports){ +var aes = require('./aes') +var Buffer = require('safe-buffer').Buffer +var Transform = require('cipher-base') +var inherits = require('inherits') + +function StreamCipher (mode, key, iv, decrypt) { + Transform.call(this) + + this._cipher = new aes.AES(key) + this._prev = Buffer.from(iv) + this._cache = Buffer.allocUnsafe(0) + this._secCache = Buffer.allocUnsafe(0) + this._decrypt = decrypt + this._mode = mode +} + +inherits(StreamCipher, Transform) + +StreamCipher.prototype._update = function (chunk) { + return this._mode.encrypt(this, chunk, this._decrypt) +} + +StreamCipher.prototype._final = function () { + this._cipher.scrub() +} + +module.exports = StreamCipher + +},{"./aes":20,"cipher-base":50,"inherits":101,"safe-buffer":144}],37:[function(require,module,exports){ +var DES = require('browserify-des') +var aes = require('browserify-aes/browser') +var aesModes = require('browserify-aes/modes') +var desModes = require('browserify-des/modes') +var ebtk = require('evp_bytestokey') + +function createCipher (suite, password) { + suite = suite.toLowerCase() + + var keyLen, ivLen + if (aesModes[suite]) { + keyLen = aesModes[suite].key + ivLen = aesModes[suite].iv + } else if (desModes[suite]) { + keyLen = desModes[suite].key * 8 + ivLen = desModes[suite].iv + } else { + throw new TypeError('invalid suite type') + } + + var keys = ebtk(password, false, keyLen, ivLen) + return createCipheriv(suite, keys.key, keys.iv) +} + +function createDecipher (suite, password) { + suite = suite.toLowerCase() + + var keyLen, ivLen + if (aesModes[suite]) { + keyLen = aesModes[suite].key + ivLen = aesModes[suite].iv + } else if (desModes[suite]) { + keyLen = desModes[suite].key * 8 + ivLen = desModes[suite].iv + } else { + throw new TypeError('invalid suite type') + } + + var keys = ebtk(password, false, keyLen, ivLen) + return createDecipheriv(suite, keys.key, keys.iv) +} + +function createCipheriv (suite, key, iv) { + suite = suite.toLowerCase() + if (aesModes[suite]) return aes.createCipheriv(suite, key, iv) + if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite }) + + throw new TypeError('invalid suite type') +} + +function createDecipheriv (suite, key, iv) { + suite = suite.toLowerCase() + if (aesModes[suite]) return aes.createDecipheriv(suite, key, iv) + if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite, decrypt: true }) + + throw new TypeError('invalid suite type') +} + +function getCiphers () { + return Object.keys(desModes).concat(aes.getCiphers()) +} + +exports.createCipher = exports.Cipher = createCipher +exports.createCipheriv = exports.Cipheriv = createCipheriv +exports.createDecipher = exports.Decipher = createDecipher +exports.createDecipheriv = exports.Decipheriv = createDecipheriv +exports.listCiphers = exports.getCiphers = getCiphers + +},{"browserify-aes/browser":22,"browserify-aes/modes":33,"browserify-des":38,"browserify-des/modes":39,"evp_bytestokey":85}],38:[function(require,module,exports){ +var CipherBase = require('cipher-base') +var des = require('des.js') +var inherits = require('inherits') +var Buffer = require('safe-buffer').Buffer + +var modes = { + 'des-ede3-cbc': des.CBC.instantiate(des.EDE), + 'des-ede3': des.EDE, + 'des-ede-cbc': des.CBC.instantiate(des.EDE), + 'des-ede': des.EDE, + 'des-cbc': des.CBC.instantiate(des.DES), + 'des-ecb': des.DES +} +modes.des = modes['des-cbc'] +modes.des3 = modes['des-ede3-cbc'] +module.exports = DES +inherits(DES, CipherBase) +function DES (opts) { + CipherBase.call(this) + var modeName = opts.mode.toLowerCase() + var mode = modes[modeName] + var type + if (opts.decrypt) { + type = 'decrypt' + } else { + type = 'encrypt' + } + var key = opts.key + if (!Buffer.isBuffer(key)) { + key = Buffer.from(key) + } + if (modeName === 'des-ede' || modeName === 'des-ede-cbc') { + key = Buffer.concat([key, key.slice(0, 8)]) + } + var iv = opts.iv + if (!Buffer.isBuffer(iv)) { + iv = Buffer.from(iv) + } + this._des = mode.create({ + key: key, + iv: iv, + type: type + }) +} +DES.prototype._update = function (data) { + return Buffer.from(this._des.update(data)) +} +DES.prototype._final = function () { + return Buffer.from(this._des.final()) +} + +},{"cipher-base":50,"des.js":58,"inherits":101,"safe-buffer":144}],39:[function(require,module,exports){ +exports['des-ecb'] = { + key: 8, + iv: 0 +} +exports['des-cbc'] = exports.des = { + key: 8, + iv: 8 +} +exports['des-ede3-cbc'] = exports.des3 = { + key: 24, + iv: 8 +} +exports['des-ede3'] = { + key: 24, + iv: 0 +} +exports['des-ede-cbc'] = { + key: 16, + iv: 8 +} +exports['des-ede'] = { + key: 16, + iv: 0 +} + +},{}],40:[function(require,module,exports){ +(function (Buffer){ +var bn = require('bn.js'); +var randomBytes = require('randombytes'); +module.exports = crt; +function blind(priv) { + var r = getr(priv); + var blinder = r.toRed(bn.mont(priv.modulus)) + .redPow(new bn(priv.publicExponent)).fromRed(); + return { + blinder: blinder, + unblinder:r.invm(priv.modulus) + }; +} +function crt(msg, priv) { + var blinds = blind(priv); + var len = priv.modulus.byteLength(); + var mod = bn.mont(priv.modulus); + var blinded = new bn(msg).mul(blinds.blinder).umod(priv.modulus); + var c1 = blinded.toRed(bn.mont(priv.prime1)); + var c2 = blinded.toRed(bn.mont(priv.prime2)); + var qinv = priv.coefficient; + var p = priv.prime1; + var q = priv.prime2; + var m1 = c1.redPow(priv.exponent1); + var m2 = c2.redPow(priv.exponent2); + m1 = m1.fromRed(); + m2 = m2.fromRed(); + var h = m1.isub(m2).imul(qinv).umod(p); + h.imul(q); + m2.iadd(h); + return new Buffer(m2.imul(blinds.unblinder).umod(priv.modulus).toArray(false, len)); +} +crt.getr = getr; +function getr(priv) { + var len = priv.modulus.byteLength(); + var r = new bn(randomBytes(len)); + while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)) { + r = new bn(randomBytes(len)); + } + return r; +} + +}).call(this,require("buffer").Buffer) +},{"bn.js":17,"buffer":49,"randombytes":128}],41:[function(require,module,exports){ +module.exports = require('./browser/algorithms.json') + +},{"./browser/algorithms.json":42}],42:[function(require,module,exports){ +module.exports={ + "sha224WithRSAEncryption": { + "sign": "rsa", + "hash": "sha224", + "id": "302d300d06096086480165030402040500041c" + }, + "RSA-SHA224": { + "sign": "ecdsa/rsa", + "hash": "sha224", + "id": "302d300d06096086480165030402040500041c" + }, + "sha256WithRSAEncryption": { + "sign": "rsa", + "hash": "sha256", + "id": "3031300d060960864801650304020105000420" + }, + "RSA-SHA256": { + "sign": "ecdsa/rsa", + "hash": "sha256", + "id": "3031300d060960864801650304020105000420" + }, + "sha384WithRSAEncryption": { + "sign": "rsa", + "hash": "sha384", + "id": "3041300d060960864801650304020205000430" + }, + "RSA-SHA384": { + "sign": "ecdsa/rsa", + "hash": "sha384", + "id": "3041300d060960864801650304020205000430" + }, + "sha512WithRSAEncryption": { + "sign": "rsa", + "hash": "sha512", + "id": "3051300d060960864801650304020305000440" + }, + "RSA-SHA512": { + "sign": "ecdsa/rsa", + "hash": "sha512", + "id": "3051300d060960864801650304020305000440" + }, + "RSA-SHA1": { + "sign": "rsa", + "hash": "sha1", + "id": "3021300906052b0e03021a05000414" + }, + "ecdsa-with-SHA1": { + "sign": "ecdsa", + "hash": "sha1", + "id": "" + }, + "sha256": { + "sign": "ecdsa", + "hash": "sha256", + "id": "" + }, + "sha224": { + "sign": "ecdsa", + "hash": "sha224", + "id": "" + }, + "sha384": { + "sign": "ecdsa", + "hash": "sha384", + "id": "" + }, + "sha512": { + "sign": "ecdsa", + "hash": "sha512", + "id": "" + }, + "DSA-SHA": { + "sign": "dsa", + "hash": "sha1", + "id": "" + }, + "DSA-SHA1": { + "sign": "dsa", + "hash": "sha1", + "id": "" + }, + "DSA": { + "sign": "dsa", + "hash": "sha1", + "id": "" + }, + "DSA-WITH-SHA224": { + "sign": "dsa", + "hash": "sha224", + "id": "" + }, + "DSA-SHA224": { + "sign": "dsa", + "hash": "sha224", + "id": "" + }, + "DSA-WITH-SHA256": { + "sign": "dsa", + "hash": "sha256", + "id": "" + }, + "DSA-SHA256": { + "sign": "dsa", + "hash": "sha256", + "id": "" + }, + "DSA-WITH-SHA384": { + "sign": "dsa", + "hash": "sha384", + "id": "" + }, + "DSA-SHA384": { + "sign": "dsa", + "hash": "sha384", + "id": "" + }, + "DSA-WITH-SHA512": { + "sign": "dsa", + "hash": "sha512", + "id": "" + }, + "DSA-SHA512": { + "sign": "dsa", + "hash": "sha512", + "id": "" + }, + "DSA-RIPEMD160": { + "sign": "dsa", + "hash": "rmd160", + "id": "" + }, + "ripemd160WithRSA": { + "sign": "rsa", + "hash": "rmd160", + "id": "3021300906052b2403020105000414" + }, + "RSA-RIPEMD160": { + "sign": "rsa", + "hash": "rmd160", + "id": "3021300906052b2403020105000414" + }, + "md5WithRSAEncryption": { + "sign": "rsa", + "hash": "md5", + "id": "3020300c06082a864886f70d020505000410" + }, + "RSA-MD5": { + "sign": "rsa", + "hash": "md5", + "id": "3020300c06082a864886f70d020505000410" + } +} + +},{}],43:[function(require,module,exports){ +module.exports={ + "1.3.132.0.10": "secp256k1", + "1.3.132.0.33": "p224", + "1.2.840.10045.3.1.1": "p192", + "1.2.840.10045.3.1.7": "p256", + "1.3.132.0.34": "p384", + "1.3.132.0.35": "p521" +} + +},{}],44:[function(require,module,exports){ +(function (Buffer){ +var createHash = require('create-hash') +var stream = require('stream') +var inherits = require('inherits') +var sign = require('./sign') +var verify = require('./verify') + +var algorithms = require('./algorithms.json') +Object.keys(algorithms).forEach(function (key) { + algorithms[key].id = new Buffer(algorithms[key].id, 'hex') + algorithms[key.toLowerCase()] = algorithms[key] +}) + +function Sign (algorithm) { + stream.Writable.call(this) + + var data = algorithms[algorithm] + if (!data) throw new Error('Unknown message digest') + + this._hashType = data.hash + this._hash = createHash(data.hash) + this._tag = data.id + this._signType = data.sign +} +inherits(Sign, stream.Writable) + +Sign.prototype._write = function _write (data, _, done) { + this._hash.update(data) + done() +} + +Sign.prototype.update = function update (data, enc) { + if (typeof data === 'string') data = new Buffer(data, enc) + + this._hash.update(data) + return this +} + +Sign.prototype.sign = function signMethod (key, enc) { + this.end() + var hash = this._hash.digest() + var sig = sign(hash, key, this._hashType, this._signType, this._tag) + + return enc ? sig.toString(enc) : sig +} + +function Verify (algorithm) { + stream.Writable.call(this) + + var data = algorithms[algorithm] + if (!data) throw new Error('Unknown message digest') + + this._hash = createHash(data.hash) + this._tag = data.id + this._signType = data.sign +} +inherits(Verify, stream.Writable) + +Verify.prototype._write = function _write (data, _, done) { + this._hash.update(data) + done() +} + +Verify.prototype.update = function update (data, enc) { + if (typeof data === 'string') data = new Buffer(data, enc) + + this._hash.update(data) + return this +} + +Verify.prototype.verify = function verifyMethod (key, sig, enc) { + if (typeof sig === 'string') sig = new Buffer(sig, enc) + + this.end() + var hash = this._hash.digest() + return verify(sig, hash, key, this._signType, this._tag) +} + +function createSign (algorithm) { + return new Sign(algorithm) +} + +function createVerify (algorithm) { + return new Verify(algorithm) +} + +module.exports = { + Sign: createSign, + Verify: createVerify, + createSign: createSign, + createVerify: createVerify +} + +}).call(this,require("buffer").Buffer) +},{"./algorithms.json":42,"./sign":45,"./verify":46,"buffer":49,"create-hash":53,"inherits":101,"stream":155}],45:[function(require,module,exports){ +(function (Buffer){ +// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js +var createHmac = require('create-hmac') +var crt = require('browserify-rsa') +var EC = require('elliptic').ec +var BN = require('bn.js') +var parseKeys = require('parse-asn1') +var curves = require('./curves.json') + +function sign (hash, key, hashType, signType, tag) { + var priv = parseKeys(key) + if (priv.curve) { + // rsa keys can be interpreted as ecdsa ones in openssl + if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') + return ecSign(hash, priv) + } else if (priv.type === 'dsa') { + if (signType !== 'dsa') throw new Error('wrong private key type') + return dsaSign(hash, priv, hashType) + } else { + if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') + } + hash = Buffer.concat([tag, hash]) + var len = priv.modulus.byteLength() + var pad = [ 0, 1 ] + while (hash.length + pad.length + 1 < len) pad.push(0xff) + pad.push(0x00) + var i = -1 + while (++i < hash.length) pad.push(hash[i]) + + var out = crt(pad, priv) + return out +} + +function ecSign (hash, priv) { + var curveId = curves[priv.curve.join('.')] + if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.')) + + var curve = new EC(curveId) + var key = curve.keyFromPrivate(priv.privateKey) + var out = key.sign(hash) + + return new Buffer(out.toDER()) +} + +function dsaSign (hash, priv, algo) { + var x = priv.params.priv_key + var p = priv.params.p + var q = priv.params.q + var g = priv.params.g + var r = new BN(0) + var k + var H = bits2int(hash, q).mod(q) + var s = false + var kv = getKey(x, q, hash, algo) + while (s === false) { + k = makeKey(q, kv, algo) + r = makeR(g, k, p, q) + s = k.invm(q).imul(H.add(x.mul(r))).mod(q) + if (s.cmpn(0) === 0) { + s = false + r = new BN(0) + } + } + return toDER(r, s) +} + +function toDER (r, s) { + r = r.toArray() + s = s.toArray() + + // Pad values + if (r[0] & 0x80) r = [ 0 ].concat(r) + if (s[0] & 0x80) s = [ 0 ].concat(s) + + var total = r.length + s.length + 4 + var res = [ 0x30, total, 0x02, r.length ] + res = res.concat(r, [ 0x02, s.length ], s) + return new Buffer(res) +} + +function getKey (x, q, hash, algo) { + x = new Buffer(x.toArray()) + if (x.length < q.byteLength()) { + var zeros = new Buffer(q.byteLength() - x.length) + zeros.fill(0) + x = Buffer.concat([ zeros, x ]) + } + var hlen = hash.length + var hbits = bits2octets(hash, q) + var v = new Buffer(hlen) + v.fill(1) + var k = new Buffer(hlen) + k.fill(0) + k = createHmac(algo, k).update(v).update(new Buffer([ 0 ])).update(x).update(hbits).digest() + v = createHmac(algo, k).update(v).digest() + k = createHmac(algo, k).update(v).update(new Buffer([ 1 ])).update(x).update(hbits).digest() + v = createHmac(algo, k).update(v).digest() + return { k: k, v: v } +} + +function bits2int (obits, q) { + var bits = new BN(obits) + var shift = (obits.length << 3) - q.bitLength() + if (shift > 0) bits.ishrn(shift) + return bits +} + +function bits2octets (bits, q) { + bits = bits2int(bits, q) + bits = bits.mod(q) + var out = new Buffer(bits.toArray()) + if (out.length < q.byteLength()) { + var zeros = new Buffer(q.byteLength() - out.length) + zeros.fill(0) + out = Buffer.concat([ zeros, out ]) + } + return out +} + +function makeKey (q, kv, algo) { + var t + var k + + do { + t = new Buffer(0) + + while (t.length * 8 < q.bitLength()) { + kv.v = createHmac(algo, kv.k).update(kv.v).digest() + t = Buffer.concat([ t, kv.v ]) + } + + k = bits2int(t, q) + kv.k = createHmac(algo, kv.k).update(kv.v).update(new Buffer([ 0 ])).digest() + kv.v = createHmac(algo, kv.k).update(kv.v).digest() + } while (k.cmp(q) !== -1) + + return k +} + +function makeR (g, k, p, q) { + return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q) +} + +module.exports = sign +module.exports.getKey = getKey +module.exports.makeKey = makeKey + +}).call(this,require("buffer").Buffer) +},{"./curves.json":43,"bn.js":17,"browserify-rsa":40,"buffer":49,"create-hmac":55,"elliptic":68,"parse-asn1":113}],46:[function(require,module,exports){ +(function (Buffer){ +// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js +var BN = require('bn.js') +var EC = require('elliptic').ec +var parseKeys = require('parse-asn1') +var curves = require('./curves.json') + +function verify (sig, hash, key, signType, tag) { + var pub = parseKeys(key) + if (pub.type === 'ec') { + // rsa keys can be interpreted as ecdsa ones in openssl + if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') + return ecVerify(sig, hash, pub) + } else if (pub.type === 'dsa') { + if (signType !== 'dsa') throw new Error('wrong public key type') + return dsaVerify(sig, hash, pub) + } else { + if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') + } + hash = Buffer.concat([tag, hash]) + var len = pub.modulus.byteLength() + var pad = [ 1 ] + var padNum = 0 + while (hash.length + pad.length + 2 < len) { + pad.push(0xff) + padNum++ + } + pad.push(0x00) + var i = -1 + while (++i < hash.length) { + pad.push(hash[i]) + } + pad = new Buffer(pad) + var red = BN.mont(pub.modulus) + sig = new BN(sig).toRed(red) + + sig = sig.redPow(new BN(pub.publicExponent)) + sig = new Buffer(sig.fromRed().toArray()) + var out = padNum < 8 ? 1 : 0 + len = Math.min(sig.length, pad.length) + if (sig.length !== pad.length) out = 1 + + i = -1 + while (++i < len) out |= sig[i] ^ pad[i] + return out === 0 +} + +function ecVerify (sig, hash, pub) { + var curveId = curves[pub.data.algorithm.curve.join('.')] + if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.')) + + var curve = new EC(curveId) + var pubkey = pub.data.subjectPrivateKey.data + + return curve.verify(hash, sig, pubkey) +} + +function dsaVerify (sig, hash, pub) { + var p = pub.data.p + var q = pub.data.q + var g = pub.data.g + var y = pub.data.pub_key + var unpacked = parseKeys.signature.decode(sig, 'der') + var s = unpacked.s + var r = unpacked.r + checkValue(s, q) + checkValue(r, q) + var montp = BN.mont(p) + var w = s.invm(q) + var v = g.toRed(montp) + .redPow(new BN(hash).mul(w).mod(q)) + .fromRed() + .mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed()) + .mod(p) + .mod(q) + return v.cmp(r) === 0 +} + +function checkValue (b, q) { + if (b.cmpn(0) <= 0) throw new Error('invalid sig') + if (b.cmp(q) >= q) throw new Error('invalid sig') +} + +module.exports = verify + +}).call(this,require("buffer").Buffer) +},{"./curves.json":43,"bn.js":17,"buffer":49,"elliptic":68,"parse-asn1":113}],47:[function(require,module,exports){ +arguments[4][19][0].apply(exports,arguments) +},{"dup":19}],48:[function(require,module,exports){ +(function (Buffer){ +module.exports = function xor (a, b) { + var length = Math.min(a.length, b.length) + var buffer = new Buffer(length) + + for (var i = 0; i < length; ++i) { + buffer[i] = a[i] ^ b[i] + } + + return buffer +} + +}).call(this,require("buffer").Buffer) +},{"buffer":49}],49:[function(require,module,exports){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} + +function typedArraySupport () { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1) + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } + return arr.foo() === 42 + } catch (e) { + return false + } +} + +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.buffer + } +}) + +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.byteOffset + } +}) + +function createBuffer (length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"') + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf +} + +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ) + } + return allocUnsafe(arg) + } + return from(arg, encodingOrOffset, length) +} + +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species != null && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) +} + +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } + + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } + + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } + + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } + + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length) +} + +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number') + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } +} + +function alloc (size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) + } + return createBuffer(size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding) +} + +function allocUnsafe (size) { + assertSize(size) + return createBuffer(size < 0 ? 0 : checked(size) | 0) +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + + var length = byteLength(string, encoding) | 0 + var buf = createBuffer(length) + + var actual = buf.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual) + } + + return buf +} + +function fromArrayLike (array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + var buf = createBuffer(length) + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255 + } + return buf +} + +function fromArrayBuffer (array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds') + } + + var buf + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array) + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset) + } else { + buf = new Uint8Array(array, byteOffset, length) + } + + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf +} + +function fromObject (obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + var buf = createBuffer(len) + + if (buf.length === 0) { + return buf + } + + obj.copy(buf, 0, 0, len) + return buf + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) + } + return fromArrayLike(obj) + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } +} + +function checked (length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false +} + +Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf) + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) + } + + var len = string.length + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.toLocaleString = Buffer.prototype.toString + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + var strLen = string.length + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (numberIsNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0 + if (isFinite(length)) { + length = length >>> 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('Index out of range') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end) + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if ((encoding === 'utf8' && code < 128) || + encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code + } + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding) + var len = bytes.length + if (len === 0) { + throw new TypeError('The value "' + val + + '" is invalid for argument "value"') + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0] + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) +} +function numberIsNaN (obj) { + // For IE11 support + return obj !== obj // eslint-disable-line no-self-compare +} + +},{"base64-js":16,"ieee754":100}],50:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var Transform = require('stream').Transform +var StringDecoder = require('string_decoder').StringDecoder +var inherits = require('inherits') + +function CipherBase (hashMode) { + Transform.call(this) + this.hashMode = typeof hashMode === 'string' + if (this.hashMode) { + this[hashMode] = this._finalOrDigest + } else { + this.final = this._finalOrDigest + } + if (this._final) { + this.__final = this._final + this._final = null + } + this._decoder = null + this._encoding = null +} +inherits(CipherBase, Transform) + +CipherBase.prototype.update = function (data, inputEnc, outputEnc) { + if (typeof data === 'string') { + data = Buffer.from(data, inputEnc) + } + + var outData = this._update(data) + if (this.hashMode) return this + + if (outputEnc) { + outData = this._toString(outData, outputEnc) + } + + return outData +} + +CipherBase.prototype.setAutoPadding = function () {} +CipherBase.prototype.getAuthTag = function () { + throw new Error('trying to get auth tag in unsupported state') +} + +CipherBase.prototype.setAuthTag = function () { + throw new Error('trying to set auth tag in unsupported state') +} + +CipherBase.prototype.setAAD = function () { + throw new Error('trying to set aad in unsupported state') +} + +CipherBase.prototype._transform = function (data, _, next) { + var err + try { + if (this.hashMode) { + this._update(data) + } else { + this.push(this._update(data)) + } + } catch (e) { + err = e + } finally { + next(err) + } +} +CipherBase.prototype._flush = function (done) { + var err + try { + this.push(this.__final()) + } catch (e) { + err = e + } + + done(err) +} +CipherBase.prototype._finalOrDigest = function (outputEnc) { + var outData = this.__final() || Buffer.alloc(0) + if (outputEnc) { + outData = this._toString(outData, outputEnc, true) + } + return outData +} + +CipherBase.prototype._toString = function (value, enc, fin) { + if (!this._decoder) { + this._decoder = new StringDecoder(enc) + this._encoding = enc + } + + if (this._encoding !== enc) throw new Error('can\'t switch encodings') + + var out = this._decoder.write(value) + if (fin) { + out += this._decoder.end() + } + + return out +} + +module.exports = CipherBase + +},{"inherits":101,"safe-buffer":144,"stream":155,"string_decoder":158}],51:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":102}],52:[function(require,module,exports){ +(function (Buffer){ +var elliptic = require('elliptic') +var BN = require('bn.js') + +module.exports = function createECDH (curve) { + return new ECDH(curve) +} + +var aliases = { + secp256k1: { + name: 'secp256k1', + byteLength: 32 + }, + secp224r1: { + name: 'p224', + byteLength: 28 + }, + prime256v1: { + name: 'p256', + byteLength: 32 + }, + prime192v1: { + name: 'p192', + byteLength: 24 + }, + ed25519: { + name: 'ed25519', + byteLength: 32 + }, + secp384r1: { + name: 'p384', + byteLength: 48 + }, + secp521r1: { + name: 'p521', + byteLength: 66 + } +} + +aliases.p224 = aliases.secp224r1 +aliases.p256 = aliases.secp256r1 = aliases.prime256v1 +aliases.p192 = aliases.secp192r1 = aliases.prime192v1 +aliases.p384 = aliases.secp384r1 +aliases.p521 = aliases.secp521r1 + +function ECDH (curve) { + this.curveType = aliases[curve] + if (!this.curveType) { + this.curveType = { + name: curve + } + } + this.curve = new elliptic.ec(this.curveType.name) // eslint-disable-line new-cap + this.keys = void 0 +} + +ECDH.prototype.generateKeys = function (enc, format) { + this.keys = this.curve.genKeyPair() + return this.getPublicKey(enc, format) +} + +ECDH.prototype.computeSecret = function (other, inenc, enc) { + inenc = inenc || 'utf8' + if (!Buffer.isBuffer(other)) { + other = new Buffer(other, inenc) + } + var otherPub = this.curve.keyFromPublic(other).getPublic() + var out = otherPub.mul(this.keys.getPrivate()).getX() + return formatReturnValue(out, enc, this.curveType.byteLength) +} + +ECDH.prototype.getPublicKey = function (enc, format) { + var key = this.keys.getPublic(format === 'compressed', true) + if (format === 'hybrid') { + if (key[key.length - 1] % 2) { + key[0] = 7 + } else { + key[0] = 6 + } + } + return formatReturnValue(key, enc) +} + +ECDH.prototype.getPrivateKey = function (enc) { + return formatReturnValue(this.keys.getPrivate(), enc) +} + +ECDH.prototype.setPublicKey = function (pub, enc) { + enc = enc || 'utf8' + if (!Buffer.isBuffer(pub)) { + pub = new Buffer(pub, enc) + } + this.keys._importPublic(pub) + return this +} + +ECDH.prototype.setPrivateKey = function (priv, enc) { + enc = enc || 'utf8' + if (!Buffer.isBuffer(priv)) { + priv = new Buffer(priv, enc) + } + + var _priv = new BN(priv) + _priv = _priv.toString(16) + this.keys = this.curve.genKeyPair() + this.keys._importPrivate(_priv) + return this +} + +function formatReturnValue (bn, enc, len) { + if (!Array.isArray(bn)) { + bn = bn.toArray() + } + var buf = new Buffer(bn) + if (len && buf.length < len) { + var zeros = new Buffer(len - buf.length) + zeros.fill(0) + buf = Buffer.concat([zeros, buf]) + } + if (!enc) { + return buf + } else { + return buf.toString(enc) + } +} + +}).call(this,require("buffer").Buffer) +},{"bn.js":17,"buffer":49,"elliptic":68}],53:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var MD5 = require('md5.js') +var RIPEMD160 = require('ripemd160') +var sha = require('sha.js') +var Base = require('cipher-base') + +function Hash (hash) { + Base.call(this, 'digest') + + this._hash = hash +} + +inherits(Hash, Base) + +Hash.prototype._update = function (data) { + this._hash.update(data) +} + +Hash.prototype._final = function () { + return this._hash.digest() +} + +module.exports = function createHash (alg) { + alg = alg.toLowerCase() + if (alg === 'md5') return new MD5() + if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160() + + return new Hash(sha(alg)) +} + +},{"cipher-base":50,"inherits":101,"md5.js":105,"ripemd160":143,"sha.js":146}],54:[function(require,module,exports){ +var MD5 = require('md5.js') + +module.exports = function (buffer) { + return new MD5().update(buffer).digest() +} + +},{"md5.js":105}],55:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var Legacy = require('./legacy') +var Base = require('cipher-base') +var Buffer = require('safe-buffer').Buffer +var md5 = require('create-hash/md5') +var RIPEMD160 = require('ripemd160') + +var sha = require('sha.js') + +var ZEROS = Buffer.alloc(128) + +function Hmac (alg, key) { + Base.call(this, 'digest') + if (typeof key === 'string') { + key = Buffer.from(key) + } + + var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 + + this._alg = alg + this._key = key + if (key.length > blocksize) { + var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) + key = hash.update(key).digest() + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) + } + + var ipad = this._ipad = Buffer.allocUnsafe(blocksize) + var opad = this._opad = Buffer.allocUnsafe(blocksize) + + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) + this._hash.update(ipad) +} + +inherits(Hmac, Base) + +Hmac.prototype._update = function (data) { + this._hash.update(data) +} + +Hmac.prototype._final = function () { + var h = this._hash.digest() + var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg) + return hash.update(this._opad).update(h).digest() +} + +module.exports = function createHmac (alg, key) { + alg = alg.toLowerCase() + if (alg === 'rmd160' || alg === 'ripemd160') { + return new Hmac('rmd160', key) + } + if (alg === 'md5') { + return new Legacy(md5, key) + } + return new Hmac(alg, key) +} + +},{"./legacy":56,"cipher-base":50,"create-hash/md5":54,"inherits":101,"ripemd160":143,"safe-buffer":144,"sha.js":146}],56:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var Buffer = require('safe-buffer').Buffer + +var Base = require('cipher-base') + +var ZEROS = Buffer.alloc(128) +var blocksize = 64 + +function Hmac (alg, key) { + Base.call(this, 'digest') + if (typeof key === 'string') { + key = Buffer.from(key) + } + + this._alg = alg + this._key = key + + if (key.length > blocksize) { + key = alg(key) + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) + } + + var ipad = this._ipad = Buffer.allocUnsafe(blocksize) + var opad = this._opad = Buffer.allocUnsafe(blocksize) + + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + + this._hash = [ipad] +} + +inherits(Hmac, Base) + +Hmac.prototype._update = function (data) { + this._hash.push(data) +} + +Hmac.prototype._final = function () { + var h = this._alg(Buffer.concat(this._hash)) + return this._alg(Buffer.concat([this._opad, h])) +} +module.exports = Hmac + +},{"cipher-base":50,"inherits":101,"safe-buffer":144}],57:[function(require,module,exports){ +'use strict' + +exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes') +exports.createHash = exports.Hash = require('create-hash') +exports.createHmac = exports.Hmac = require('create-hmac') + +var algos = require('browserify-sign/algos') +var algoKeys = Object.keys(algos) +var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(algoKeys) +exports.getHashes = function () { + return hashes +} + +var p = require('pbkdf2') +exports.pbkdf2 = p.pbkdf2 +exports.pbkdf2Sync = p.pbkdf2Sync + +var aes = require('browserify-cipher') + +exports.Cipher = aes.Cipher +exports.createCipher = aes.createCipher +exports.Cipheriv = aes.Cipheriv +exports.createCipheriv = aes.createCipheriv +exports.Decipher = aes.Decipher +exports.createDecipher = aes.createDecipher +exports.Decipheriv = aes.Decipheriv +exports.createDecipheriv = aes.createDecipheriv +exports.getCiphers = aes.getCiphers +exports.listCiphers = aes.listCiphers + +var dh = require('diffie-hellman') + +exports.DiffieHellmanGroup = dh.DiffieHellmanGroup +exports.createDiffieHellmanGroup = dh.createDiffieHellmanGroup +exports.getDiffieHellman = dh.getDiffieHellman +exports.createDiffieHellman = dh.createDiffieHellman +exports.DiffieHellman = dh.DiffieHellman + +var sign = require('browserify-sign') + +exports.createSign = sign.createSign +exports.Sign = sign.Sign +exports.createVerify = sign.createVerify +exports.Verify = sign.Verify + +exports.createECDH = require('create-ecdh') + +var publicEncrypt = require('public-encrypt') + +exports.publicEncrypt = publicEncrypt.publicEncrypt +exports.privateEncrypt = publicEncrypt.privateEncrypt +exports.publicDecrypt = publicEncrypt.publicDecrypt +exports.privateDecrypt = publicEncrypt.privateDecrypt + +// the least I can do is make error messages for the rest of the node.js/crypto api. +// ;[ +// 'createCredentials' +// ].forEach(function (name) { +// exports[name] = function () { +// throw new Error([ +// 'sorry, ' + name + ' is not implemented yet', +// 'we accept pull requests', +// 'https://github.com/crypto-browserify/crypto-browserify' +// ].join('\n')) +// } +// }) + +var rf = require('randomfill') + +exports.randomFill = rf.randomFill +exports.randomFillSync = rf.randomFillSync + +exports.createCredentials = function () { + throw new Error([ + 'sorry, createCredentials is not implemented yet', + 'we accept pull requests', + 'https://github.com/crypto-browserify/crypto-browserify' + ].join('\n')) +} + +exports.constants = { + 'DH_CHECK_P_NOT_SAFE_PRIME': 2, + 'DH_CHECK_P_NOT_PRIME': 1, + 'DH_UNABLE_TO_CHECK_GENERATOR': 4, + 'DH_NOT_SUITABLE_GENERATOR': 8, + 'NPN_ENABLED': 1, + 'ALPN_ENABLED': 1, + 'RSA_PKCS1_PADDING': 1, + 'RSA_SSLV23_PADDING': 2, + 'RSA_NO_PADDING': 3, + 'RSA_PKCS1_OAEP_PADDING': 4, + 'RSA_X931_PADDING': 5, + 'RSA_PKCS1_PSS_PADDING': 6, + 'POINT_CONVERSION_COMPRESSED': 2, + 'POINT_CONVERSION_UNCOMPRESSED': 4, + 'POINT_CONVERSION_HYBRID': 6 +} + +},{"browserify-cipher":37,"browserify-sign":44,"browserify-sign/algos":41,"create-ecdh":52,"create-hash":53,"create-hmac":55,"diffie-hellman":64,"pbkdf2":115,"public-encrypt":122,"randombytes":128,"randomfill":129}],58:[function(require,module,exports){ +'use strict'; + +exports.utils = require('./des/utils'); +exports.Cipher = require('./des/cipher'); +exports.DES = require('./des/des'); +exports.CBC = require('./des/cbc'); +exports.EDE = require('./des/ede'); + +},{"./des/cbc":59,"./des/cipher":60,"./des/des":61,"./des/ede":62,"./des/utils":63}],59:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +var proto = {}; + +function CBCState(iv) { + assert.equal(iv.length, 8, 'Invalid IV length'); + + this.iv = new Array(8); + for (var i = 0; i < this.iv.length; i++) + this.iv[i] = iv[i]; +} + +function instantiate(Base) { + function CBC(options) { + Base.call(this, options); + this._cbcInit(); + } + inherits(CBC, Base); + + var keys = Object.keys(proto); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + CBC.prototype[key] = proto[key]; + } + + CBC.create = function create(options) { + return new CBC(options); + }; + + return CBC; +} + +exports.instantiate = instantiate; + +proto._cbcInit = function _cbcInit() { + var state = new CBCState(this.options.iv); + this._cbcState = state; +}; + +proto._update = function _update(inp, inOff, out, outOff) { + var state = this._cbcState; + var superProto = this.constructor.super_.prototype; + + var iv = state.iv; + if (this.type === 'encrypt') { + for (var i = 0; i < this.blockSize; i++) + iv[i] ^= inp[inOff + i]; + + superProto._update.call(this, iv, 0, out, outOff); + + for (var i = 0; i < this.blockSize; i++) + iv[i] = out[outOff + i]; + } else { + superProto._update.call(this, inp, inOff, out, outOff); + + for (var i = 0; i < this.blockSize; i++) + out[outOff + i] ^= iv[i]; + + for (var i = 0; i < this.blockSize; i++) + iv[i] = inp[inOff + i]; + } +}; + +},{"inherits":101,"minimalistic-assert":107}],60:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); + +function Cipher(options) { + this.options = options; + + this.type = this.options.type; + this.blockSize = 8; + this._init(); + + this.buffer = new Array(this.blockSize); + this.bufferOff = 0; +} +module.exports = Cipher; + +Cipher.prototype._init = function _init() { + // Might be overrided +}; + +Cipher.prototype.update = function update(data) { + if (data.length === 0) + return []; + + if (this.type === 'decrypt') + return this._updateDecrypt(data); + else + return this._updateEncrypt(data); +}; + +Cipher.prototype._buffer = function _buffer(data, off) { + // Append data to buffer + var min = Math.min(this.buffer.length - this.bufferOff, data.length - off); + for (var i = 0; i < min; i++) + this.buffer[this.bufferOff + i] = data[off + i]; + this.bufferOff += min; + + // Shift next + return min; +}; + +Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { + this._update(this.buffer, 0, out, off); + this.bufferOff = 0; + return this.blockSize; +}; + +Cipher.prototype._updateEncrypt = function _updateEncrypt(data) { + var inputOff = 0; + var outputOff = 0; + + var count = ((this.bufferOff + data.length) / this.blockSize) | 0; + var out = new Array(count * this.blockSize); + + if (this.bufferOff !== 0) { + inputOff += this._buffer(data, inputOff); + + if (this.bufferOff === this.buffer.length) + outputOff += this._flushBuffer(out, outputOff); + } + + // Write blocks + var max = data.length - ((data.length - inputOff) % this.blockSize); + for (; inputOff < max; inputOff += this.blockSize) { + this._update(data, inputOff, out, outputOff); + outputOff += this.blockSize; + } + + // Queue rest + for (; inputOff < data.length; inputOff++, this.bufferOff++) + this.buffer[this.bufferOff] = data[inputOff]; + + return out; +}; + +Cipher.prototype._updateDecrypt = function _updateDecrypt(data) { + var inputOff = 0; + var outputOff = 0; + + var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1; + var out = new Array(count * this.blockSize); + + // TODO(indutny): optimize it, this is far from optimal + for (; count > 0; count--) { + inputOff += this._buffer(data, inputOff); + outputOff += this._flushBuffer(out, outputOff); + } + + // Buffer rest of the input + inputOff += this._buffer(data, inputOff); + + return out; +}; + +Cipher.prototype.final = function final(buffer) { + var first; + if (buffer) + first = this.update(buffer); + + var last; + if (this.type === 'encrypt') + last = this._finalEncrypt(); + else + last = this._finalDecrypt(); + + if (first) + return first.concat(last); + else + return last; +}; + +Cipher.prototype._pad = function _pad(buffer, off) { + if (off === 0) + return false; + + while (off < buffer.length) + buffer[off++] = 0; + + return true; +}; + +Cipher.prototype._finalEncrypt = function _finalEncrypt() { + if (!this._pad(this.buffer, this.bufferOff)) + return []; + + var out = new Array(this.blockSize); + this._update(this.buffer, 0, out, 0); + return out; +}; + +Cipher.prototype._unpad = function _unpad(buffer) { + return buffer; +}; + +Cipher.prototype._finalDecrypt = function _finalDecrypt() { + assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt'); + var out = new Array(this.blockSize); + this._flushBuffer(out, 0); + + return this._unpad(out); +}; + +},{"minimalistic-assert":107}],61:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +var des = require('../des'); +var utils = des.utils; +var Cipher = des.Cipher; + +function DESState() { + this.tmp = new Array(2); + this.keys = null; +} + +function DES(options) { + Cipher.call(this, options); + + var state = new DESState(); + this._desState = state; + + this.deriveKeys(state, options.key); +} +inherits(DES, Cipher); +module.exports = DES; + +DES.create = function create(options) { + return new DES(options); +}; + +var shiftTable = [ + 1, 1, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 1 +]; + +DES.prototype.deriveKeys = function deriveKeys(state, key) { + state.keys = new Array(16 * 2); + + assert.equal(key.length, this.blockSize, 'Invalid key length'); + + var kL = utils.readUInt32BE(key, 0); + var kR = utils.readUInt32BE(key, 4); + + utils.pc1(kL, kR, state.tmp, 0); + kL = state.tmp[0]; + kR = state.tmp[1]; + for (var i = 0; i < state.keys.length; i += 2) { + var shift = shiftTable[i >>> 1]; + kL = utils.r28shl(kL, shift); + kR = utils.r28shl(kR, shift); + utils.pc2(kL, kR, state.keys, i); + } +}; + +DES.prototype._update = function _update(inp, inOff, out, outOff) { + var state = this._desState; + + var l = utils.readUInt32BE(inp, inOff); + var r = utils.readUInt32BE(inp, inOff + 4); + + // Initial Permutation + utils.ip(l, r, state.tmp, 0); + l = state.tmp[0]; + r = state.tmp[1]; + + if (this.type === 'encrypt') + this._encrypt(state, l, r, state.tmp, 0); + else + this._decrypt(state, l, r, state.tmp, 0); + + l = state.tmp[0]; + r = state.tmp[1]; + + utils.writeUInt32BE(out, l, outOff); + utils.writeUInt32BE(out, r, outOff + 4); +}; + +DES.prototype._pad = function _pad(buffer, off) { + var value = buffer.length - off; + for (var i = off; i < buffer.length; i++) + buffer[i] = value; + + return true; +}; + +DES.prototype._unpad = function _unpad(buffer) { + var pad = buffer[buffer.length - 1]; + for (var i = buffer.length - pad; i < buffer.length; i++) + assert.equal(buffer[i], pad); + + return buffer.slice(0, buffer.length - pad); +}; + +DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) { + var l = lStart; + var r = rStart; + + // Apply f() x16 times + for (var i = 0; i < state.keys.length; i += 2) { + var keyL = state.keys[i]; + var keyR = state.keys[i + 1]; + + // f(r, k) + utils.expand(r, state.tmp, 0); + + keyL ^= state.tmp[0]; + keyR ^= state.tmp[1]; + var s = utils.substitute(keyL, keyR); + var f = utils.permute(s); + + var t = r; + r = (l ^ f) >>> 0; + l = t; + } + + // Reverse Initial Permutation + utils.rip(r, l, out, off); +}; + +DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) { + var l = rStart; + var r = lStart; + + // Apply f() x16 times + for (var i = state.keys.length - 2; i >= 0; i -= 2) { + var keyL = state.keys[i]; + var keyR = state.keys[i + 1]; + + // f(r, k) + utils.expand(l, state.tmp, 0); + + keyL ^= state.tmp[0]; + keyR ^= state.tmp[1]; + var s = utils.substitute(keyL, keyR); + var f = utils.permute(s); + + var t = l; + l = (r ^ f) >>> 0; + r = t; + } + + // Reverse Initial Permutation + utils.rip(l, r, out, off); +}; + +},{"../des":58,"inherits":101,"minimalistic-assert":107}],62:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +var des = require('../des'); +var Cipher = des.Cipher; +var DES = des.DES; + +function EDEState(type, key) { + assert.equal(key.length, 24, 'Invalid key length'); + + var k1 = key.slice(0, 8); + var k2 = key.slice(8, 16); + var k3 = key.slice(16, 24); + + if (type === 'encrypt') { + this.ciphers = [ + DES.create({ type: 'encrypt', key: k1 }), + DES.create({ type: 'decrypt', key: k2 }), + DES.create({ type: 'encrypt', key: k3 }) + ]; + } else { + this.ciphers = [ + DES.create({ type: 'decrypt', key: k3 }), + DES.create({ type: 'encrypt', key: k2 }), + DES.create({ type: 'decrypt', key: k1 }) + ]; + } +} + +function EDE(options) { + Cipher.call(this, options); + + var state = new EDEState(this.type, this.options.key); + this._edeState = state; +} +inherits(EDE, Cipher); + +module.exports = EDE; + +EDE.create = function create(options) { + return new EDE(options); +}; + +EDE.prototype._update = function _update(inp, inOff, out, outOff) { + var state = this._edeState; + + state.ciphers[0]._update(inp, inOff, out, outOff); + state.ciphers[1]._update(out, outOff, out, outOff); + state.ciphers[2]._update(out, outOff, out, outOff); +}; + +EDE.prototype._pad = DES.prototype._pad; +EDE.prototype._unpad = DES.prototype._unpad; + +},{"../des":58,"inherits":101,"minimalistic-assert":107}],63:[function(require,module,exports){ +'use strict'; + +exports.readUInt32BE = function readUInt32BE(bytes, off) { + var res = (bytes[0 + off] << 24) | + (bytes[1 + off] << 16) | + (bytes[2 + off] << 8) | + bytes[3 + off]; + return res >>> 0; +}; + +exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) { + bytes[0 + off] = value >>> 24; + bytes[1 + off] = (value >>> 16) & 0xff; + bytes[2 + off] = (value >>> 8) & 0xff; + bytes[3 + off] = value & 0xff; +}; + +exports.ip = function ip(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + for (var i = 6; i >= 0; i -= 2) { + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inR >>> (j + i)) & 1; + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inL >>> (j + i)) & 1; + } + } + + for (var i = 6; i >= 0; i -= 2) { + for (var j = 1; j <= 25; j += 8) { + outR <<= 1; + outR |= (inR >>> (j + i)) & 1; + } + for (var j = 1; j <= 25; j += 8) { + outR <<= 1; + outR |= (inL >>> (j + i)) & 1; + } + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.rip = function rip(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + for (var i = 0; i < 4; i++) { + for (var j = 24; j >= 0; j -= 8) { + outL <<= 1; + outL |= (inR >>> (j + i)) & 1; + outL <<= 1; + outL |= (inL >>> (j + i)) & 1; + } + } + for (var i = 4; i < 8; i++) { + for (var j = 24; j >= 0; j -= 8) { + outR <<= 1; + outR |= (inR >>> (j + i)) & 1; + outR <<= 1; + outR |= (inL >>> (j + i)) & 1; + } + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.pc1 = function pc1(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + // 7, 15, 23, 31, 39, 47, 55, 63 + // 6, 14, 22, 30, 39, 47, 55, 63 + // 5, 13, 21, 29, 39, 47, 55, 63 + // 4, 12, 20, 28 + for (var i = 7; i >= 5; i--) { + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inR >> (j + i)) & 1; + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inL >> (j + i)) & 1; + } + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= (inR >> (j + i)) & 1; + } + + // 1, 9, 17, 25, 33, 41, 49, 57 + // 2, 10, 18, 26, 34, 42, 50, 58 + // 3, 11, 19, 27, 35, 43, 51, 59 + // 36, 44, 52, 60 + for (var i = 1; i <= 3; i++) { + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= (inR >> (j + i)) & 1; + } + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= (inL >> (j + i)) & 1; + } + } + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= (inL >> (j + i)) & 1; + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.r28shl = function r28shl(num, shift) { + return ((num << shift) & 0xfffffff) | (num >>> (28 - shift)); +}; + +var pc2table = [ + // inL => outL + 14, 11, 17, 4, 27, 23, 25, 0, + 13, 22, 7, 18, 5, 9, 16, 24, + 2, 20, 12, 21, 1, 8, 15, 26, + + // inR => outR + 15, 4, 25, 19, 9, 1, 26, 16, + 5, 11, 23, 8, 12, 7, 17, 0, + 22, 3, 10, 14, 6, 20, 27, 24 +]; + +exports.pc2 = function pc2(inL, inR, out, off) { + var outL = 0; + var outR = 0; + + var len = pc2table.length >>> 1; + for (var i = 0; i < len; i++) { + outL <<= 1; + outL |= (inL >>> pc2table[i]) & 0x1; + } + for (var i = len; i < pc2table.length; i++) { + outR <<= 1; + outR |= (inR >>> pc2table[i]) & 0x1; + } + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +exports.expand = function expand(r, out, off) { + var outL = 0; + var outR = 0; + + outL = ((r & 1) << 5) | (r >>> 27); + for (var i = 23; i >= 15; i -= 4) { + outL <<= 6; + outL |= (r >>> i) & 0x3f; + } + for (var i = 11; i >= 3; i -= 4) { + outR |= (r >>> i) & 0x3f; + outR <<= 6; + } + outR |= ((r & 0x1f) << 1) | (r >>> 31); + + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; +}; + +var sTable = [ + 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, + 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, + 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, + 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, + + 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, + 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, + 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, + 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, + + 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, + 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, + 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, + 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, + + 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, + 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, + 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, + 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, + + 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, + 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, + 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, + 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, + + 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, + 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, + 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, + 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, + + 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, + 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, + 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, + 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, + + 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, + 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, + 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, + 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 +]; + +exports.substitute = function substitute(inL, inR) { + var out = 0; + for (var i = 0; i < 4; i++) { + var b = (inL >>> (18 - i * 6)) & 0x3f; + var sb = sTable[i * 0x40 + b]; + + out <<= 4; + out |= sb; + } + for (var i = 0; i < 4; i++) { + var b = (inR >>> (18 - i * 6)) & 0x3f; + var sb = sTable[4 * 0x40 + i * 0x40 + b]; + + out <<= 4; + out |= sb; + } + return out >>> 0; +}; + +var permuteTable = [ + 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, + 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7 +]; + +exports.permute = function permute(num) { + var out = 0; + for (var i = 0; i < permuteTable.length; i++) { + out <<= 1; + out |= (num >>> permuteTable[i]) & 0x1; + } + return out >>> 0; +}; + +exports.padSplit = function padSplit(num, size, group) { + var str = num.toString(2); + while (str.length < size) + str = '0' + str; + + var out = []; + for (var i = 0; i < size; i += group) + out.push(str.slice(i, i + group)); + return out.join(' '); +}; + +},{}],64:[function(require,module,exports){ +(function (Buffer){ +var generatePrime = require('./lib/generatePrime') +var primes = require('./lib/primes.json') + +var DH = require('./lib/dh') + +function getDiffieHellman (mod) { + var prime = new Buffer(primes[mod].prime, 'hex') + var gen = new Buffer(primes[mod].gen, 'hex') + + return new DH(prime, gen) +} + +var ENCODINGS = { + 'binary': true, 'hex': true, 'base64': true +} + +function createDiffieHellman (prime, enc, generator, genc) { + if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) { + return createDiffieHellman(prime, 'binary', enc, generator) + } + + enc = enc || 'binary' + genc = genc || 'binary' + generator = generator || new Buffer([2]) + + if (!Buffer.isBuffer(generator)) { + generator = new Buffer(generator, genc) + } + + if (typeof prime === 'number') { + return new DH(generatePrime(prime, generator), generator, true) + } + + if (!Buffer.isBuffer(prime)) { + prime = new Buffer(prime, enc) + } + + return new DH(prime, generator, true) +} + +exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman +exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman + +}).call(this,require("buffer").Buffer) +},{"./lib/dh":65,"./lib/generatePrime":66,"./lib/primes.json":67,"buffer":49}],65:[function(require,module,exports){ +(function (Buffer){ +var BN = require('bn.js'); +var MillerRabin = require('miller-rabin'); +var millerRabin = new MillerRabin(); +var TWENTYFOUR = new BN(24); +var ELEVEN = new BN(11); +var TEN = new BN(10); +var THREE = new BN(3); +var SEVEN = new BN(7); +var primes = require('./generatePrime'); +var randomBytes = require('randombytes'); +module.exports = DH; + +function setPublicKey(pub, enc) { + enc = enc || 'utf8'; + if (!Buffer.isBuffer(pub)) { + pub = new Buffer(pub, enc); + } + this._pub = new BN(pub); + return this; +} + +function setPrivateKey(priv, enc) { + enc = enc || 'utf8'; + if (!Buffer.isBuffer(priv)) { + priv = new Buffer(priv, enc); + } + this._priv = new BN(priv); + return this; +} + +var primeCache = {}; +function checkPrime(prime, generator) { + var gen = generator.toString('hex'); + var hex = [gen, prime.toString(16)].join('_'); + if (hex in primeCache) { + return primeCache[hex]; + } + var error = 0; + + if (prime.isEven() || + !primes.simpleSieve || + !primes.fermatTest(prime) || + !millerRabin.test(prime)) { + //not a prime so +1 + error += 1; + + if (gen === '02' || gen === '05') { + // we'd be able to check the generator + // it would fail so +8 + error += 8; + } else { + //we wouldn't be able to test the generator + // so +4 + error += 4; + } + primeCache[hex] = error; + return error; + } + if (!millerRabin.test(prime.shrn(1))) { + //not a safe prime + error += 2; + } + var rem; + switch (gen) { + case '02': + if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { + // unsuidable generator + error += 8; + } + break; + case '05': + rem = prime.mod(TEN); + if (rem.cmp(THREE) && rem.cmp(SEVEN)) { + // prime mod 10 needs to equal 3 or 7 + error += 8; + } + break; + default: + error += 4; + } + primeCache[hex] = error; + return error; +} + +function DH(prime, generator, malleable) { + this.setGenerator(generator); + this.__prime = new BN(prime); + this._prime = BN.mont(this.__prime); + this._primeLen = prime.length; + this._pub = undefined; + this._priv = undefined; + this._primeCode = undefined; + if (malleable) { + this.setPublicKey = setPublicKey; + this.setPrivateKey = setPrivateKey; + } else { + this._primeCode = 8; + } +} +Object.defineProperty(DH.prototype, 'verifyError', { + enumerable: true, + get: function () { + if (typeof this._primeCode !== 'number') { + this._primeCode = checkPrime(this.__prime, this.__gen); + } + return this._primeCode; + } +}); +DH.prototype.generateKeys = function () { + if (!this._priv) { + this._priv = new BN(randomBytes(this._primeLen)); + } + this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(); + return this.getPublicKey(); +}; + +DH.prototype.computeSecret = function (other) { + other = new BN(other); + other = other.toRed(this._prime); + var secret = other.redPow(this._priv).fromRed(); + var out = new Buffer(secret.toArray()); + var prime = this.getPrime(); + if (out.length < prime.length) { + var front = new Buffer(prime.length - out.length); + front.fill(0); + out = Buffer.concat([front, out]); + } + return out; +}; + +DH.prototype.getPublicKey = function getPublicKey(enc) { + return formatReturnValue(this._pub, enc); +}; + +DH.prototype.getPrivateKey = function getPrivateKey(enc) { + return formatReturnValue(this._priv, enc); +}; + +DH.prototype.getPrime = function (enc) { + return formatReturnValue(this.__prime, enc); +}; + +DH.prototype.getGenerator = function (enc) { + return formatReturnValue(this._gen, enc); +}; + +DH.prototype.setGenerator = function (gen, enc) { + enc = enc || 'utf8'; + if (!Buffer.isBuffer(gen)) { + gen = new Buffer(gen, enc); + } + this.__gen = gen; + this._gen = new BN(gen); + return this; +}; + +function formatReturnValue(bn, enc) { + var buf = new Buffer(bn.toArray()); + if (!enc) { + return buf; + } else { + return buf.toString(enc); + } +} + +}).call(this,require("buffer").Buffer) +},{"./generatePrime":66,"bn.js":17,"buffer":49,"miller-rabin":106,"randombytes":128}],66:[function(require,module,exports){ +var randomBytes = require('randombytes'); +module.exports = findPrime; +findPrime.simpleSieve = simpleSieve; +findPrime.fermatTest = fermatTest; +var BN = require('bn.js'); +var TWENTYFOUR = new BN(24); +var MillerRabin = require('miller-rabin'); +var millerRabin = new MillerRabin(); +var ONE = new BN(1); +var TWO = new BN(2); +var FIVE = new BN(5); +var SIXTEEN = new BN(16); +var EIGHT = new BN(8); +var TEN = new BN(10); +var THREE = new BN(3); +var SEVEN = new BN(7); +var ELEVEN = new BN(11); +var FOUR = new BN(4); +var TWELVE = new BN(12); +var primes = null; + +function _getPrimes() { + if (primes !== null) + return primes; + + var limit = 0x100000; + var res = []; + res[0] = 2; + for (var i = 1, k = 3; k < limit; k += 2) { + var sqrt = Math.ceil(Math.sqrt(k)); + for (var j = 0; j < i && res[j] <= sqrt; j++) + if (k % res[j] === 0) + break; + + if (i !== j && res[j] <= sqrt) + continue; + + res[i++] = k; + } + primes = res; + return res; +} + +function simpleSieve(p) { + var primes = _getPrimes(); + + for (var i = 0; i < primes.length; i++) + if (p.modn(primes[i]) === 0) { + if (p.cmpn(primes[i]) === 0) { + return true; + } else { + return false; + } + } + + return true; +} + +function fermatTest(p) { + var red = BN.mont(p); + return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0; +} + +function findPrime(bits, gen) { + if (bits < 16) { + // this is what openssl does + if (gen === 2 || gen === 5) { + return new BN([0x8c, 0x7b]); + } else { + return new BN([0x8c, 0x27]); + } + } + gen = new BN(gen); + + var num, n2; + + while (true) { + num = new BN(randomBytes(Math.ceil(bits / 8))); + while (num.bitLength() > bits) { + num.ishrn(1); + } + if (num.isEven()) { + num.iadd(ONE); + } + if (!num.testn(1)) { + num.iadd(TWO); + } + if (!gen.cmp(TWO)) { + while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { + num.iadd(FOUR); + } + } else if (!gen.cmp(FIVE)) { + while (num.mod(TEN).cmp(THREE)) { + num.iadd(FOUR); + } + } + n2 = num.shrn(1); + if (simpleSieve(n2) && simpleSieve(num) && + fermatTest(n2) && fermatTest(num) && + millerRabin.test(n2) && millerRabin.test(num)) { + return num; + } + } + +} + +},{"bn.js":17,"miller-rabin":106,"randombytes":128}],67:[function(require,module,exports){ +module.exports={ + "modp1": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" + }, + "modp2": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" + }, + "modp5": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" + }, + "modp14": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" + }, + "modp15": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" + }, + "modp16": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" + }, + "modp17": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" + }, + "modp18": { + "gen": "02", + "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" + } +} +},{}],68:[function(require,module,exports){ +'use strict'; + +var elliptic = exports; + +elliptic.version = require('../package.json').version; +elliptic.utils = require('./elliptic/utils'); +elliptic.rand = require('brorand'); +elliptic.curve = require('./elliptic/curve'); +elliptic.curves = require('./elliptic/curves'); + +// Protocols +elliptic.ec = require('./elliptic/ec'); +elliptic.eddsa = require('./elliptic/eddsa'); + +},{"../package.json":83,"./elliptic/curve":71,"./elliptic/curves":74,"./elliptic/ec":75,"./elliptic/eddsa":78,"./elliptic/utils":82,"brorand":18}],69:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var getNAF = utils.getNAF; +var getJSF = utils.getJSF; +var assert = utils.assert; + +function BaseCurve(type, conf) { + this.type = type; + this.p = new BN(conf.p, 16); + + // Use Montgomery, when there is no fast reduction for the prime + this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); + + // Useful for many curves + this.zero = new BN(0).toRed(this.red); + this.one = new BN(1).toRed(this.red); + this.two = new BN(2).toRed(this.red); + + // Curve configuration, optional + this.n = conf.n && new BN(conf.n, 16); + this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); + + // Temporary arrays + this._wnafT1 = new Array(4); + this._wnafT2 = new Array(4); + this._wnafT3 = new Array(4); + this._wnafT4 = new Array(4); + + // Generalized Greg Maxwell's trick + var adjustCount = this.n && this.p.div(this.n); + if (!adjustCount || adjustCount.cmpn(100) > 0) { + this.redN = null; + } else { + this._maxwellTrick = true; + this.redN = this.n.toRed(this.red); + } +} +module.exports = BaseCurve; + +BaseCurve.prototype.point = function point() { + throw new Error('Not implemented'); +}; + +BaseCurve.prototype.validate = function validate() { + throw new Error('Not implemented'); +}; + +BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { + assert(p.precomputed); + var doubles = p._getDoubles(); + + var naf = getNAF(k, 1); + var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); + I /= 3; + + // Translate into more windowed form + var repr = []; + for (var j = 0; j < naf.length; j += doubles.step) { + var nafW = 0; + for (var k = j + doubles.step - 1; k >= j; k--) + nafW = (nafW << 1) + naf[k]; + repr.push(nafW); + } + + var a = this.jpoint(null, null, null); + var b = this.jpoint(null, null, null); + for (var i = I; i > 0; i--) { + for (var j = 0; j < repr.length; j++) { + var nafW = repr[j]; + if (nafW === i) + b = b.mixedAdd(doubles.points[j]); + else if (nafW === -i) + b = b.mixedAdd(doubles.points[j].neg()); + } + a = a.add(b); + } + return a.toP(); +}; + +BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { + var w = 4; + + // Precompute window + var nafPoints = p._getNAFPoints(w); + w = nafPoints.wnd; + var wnd = nafPoints.points; + + // Get NAF form + var naf = getNAF(k, w); + + // Add `this`*(N+1) for every w-NAF index + var acc = this.jpoint(null, null, null); + for (var i = naf.length - 1; i >= 0; i--) { + // Count zeroes + for (var k = 0; i >= 0 && naf[i] === 0; i--) + k++; + if (i >= 0) + k++; + acc = acc.dblp(k); + + if (i < 0) + break; + var z = naf[i]; + assert(z !== 0); + if (p.type === 'affine') { + // J +- P + if (z > 0) + acc = acc.mixedAdd(wnd[(z - 1) >> 1]); + else + acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); + } else { + // J +- J + if (z > 0) + acc = acc.add(wnd[(z - 1) >> 1]); + else + acc = acc.add(wnd[(-z - 1) >> 1].neg()); + } + } + return p.type === 'affine' ? acc.toP() : acc; +}; + +BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, + points, + coeffs, + len, + jacobianResult) { + var wndWidth = this._wnafT1; + var wnd = this._wnafT2; + var naf = this._wnafT3; + + // Fill all arrays + var max = 0; + for (var i = 0; i < len; i++) { + var p = points[i]; + var nafPoints = p._getNAFPoints(defW); + wndWidth[i] = nafPoints.wnd; + wnd[i] = nafPoints.points; + } + + // Comb small window NAFs + for (var i = len - 1; i >= 1; i -= 2) { + var a = i - 1; + var b = i; + if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { + naf[a] = getNAF(coeffs[a], wndWidth[a]); + naf[b] = getNAF(coeffs[b], wndWidth[b]); + max = Math.max(naf[a].length, max); + max = Math.max(naf[b].length, max); + continue; + } + + var comb = [ + points[a], /* 1 */ + null, /* 3 */ + null, /* 5 */ + points[b] /* 7 */ + ]; + + // Try to avoid Projective points, if possible + if (points[a].y.cmp(points[b].y) === 0) { + comb[1] = points[a].add(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].add(points[b].neg()); + } else { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } + + var index = [ + -3, /* -1 -1 */ + -1, /* -1 0 */ + -5, /* -1 1 */ + -7, /* 0 -1 */ + 0, /* 0 0 */ + 7, /* 0 1 */ + 5, /* 1 -1 */ + 1, /* 1 0 */ + 3 /* 1 1 */ + ]; + + var jsf = getJSF(coeffs[a], coeffs[b]); + max = Math.max(jsf[0].length, max); + naf[a] = new Array(max); + naf[b] = new Array(max); + for (var j = 0; j < max; j++) { + var ja = jsf[0][j] | 0; + var jb = jsf[1][j] | 0; + + naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; + naf[b][j] = 0; + wnd[a] = comb; + } + } + + var acc = this.jpoint(null, null, null); + var tmp = this._wnafT4; + for (var i = max; i >= 0; i--) { + var k = 0; + + while (i >= 0) { + var zero = true; + for (var j = 0; j < len; j++) { + tmp[j] = naf[j][i] | 0; + if (tmp[j] !== 0) + zero = false; + } + if (!zero) + break; + k++; + i--; + } + if (i >= 0) + k++; + acc = acc.dblp(k); + if (i < 0) + break; + + for (var j = 0; j < len; j++) { + var z = tmp[j]; + var p; + if (z === 0) + continue; + else if (z > 0) + p = wnd[j][(z - 1) >> 1]; + else if (z < 0) + p = wnd[j][(-z - 1) >> 1].neg(); + + if (p.type === 'affine') + acc = acc.mixedAdd(p); + else + acc = acc.add(p); + } + } + // Zeroify references + for (var i = 0; i < len; i++) + wnd[i] = null; + + if (jacobianResult) + return acc; + else + return acc.toP(); +}; + +function BasePoint(curve, type) { + this.curve = curve; + this.type = type; + this.precomputed = null; +} +BaseCurve.BasePoint = BasePoint; + +BasePoint.prototype.eq = function eq(/*other*/) { + throw new Error('Not implemented'); +}; + +BasePoint.prototype.validate = function validate() { + return this.curve.validate(this); +}; + +BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + bytes = utils.toArray(bytes, enc); + + var len = this.p.byteLength(); + + // uncompressed, hybrid-odd, hybrid-even + if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) && + bytes.length - 1 === 2 * len) { + if (bytes[0] === 0x06) + assert(bytes[bytes.length - 1] % 2 === 0); + else if (bytes[0] === 0x07) + assert(bytes[bytes.length - 1] % 2 === 1); + + var res = this.point(bytes.slice(1, 1 + len), + bytes.slice(1 + len, 1 + 2 * len)); + + return res; + } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && + bytes.length - 1 === len) { + return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); + } + throw new Error('Unknown point format'); +}; + +BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { + return this.encode(enc, true); +}; + +BasePoint.prototype._encode = function _encode(compact) { + var len = this.curve.p.byteLength(); + var x = this.getX().toArray('be', len); + + if (compact) + return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); + + return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ; +}; + +BasePoint.prototype.encode = function encode(enc, compact) { + return utils.encode(this._encode(compact), enc); +}; + +BasePoint.prototype.precompute = function precompute(power) { + if (this.precomputed) + return this; + + var precomputed = { + doubles: null, + naf: null, + beta: null + }; + precomputed.naf = this._getNAFPoints(8); + precomputed.doubles = this._getDoubles(4, power); + precomputed.beta = this._getBeta(); + this.precomputed = precomputed; + + return this; +}; + +BasePoint.prototype._hasDoubles = function _hasDoubles(k) { + if (!this.precomputed) + return false; + + var doubles = this.precomputed.doubles; + if (!doubles) + return false; + + return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); +}; + +BasePoint.prototype._getDoubles = function _getDoubles(step, power) { + if (this.precomputed && this.precomputed.doubles) + return this.precomputed.doubles; + + var doubles = [ this ]; + var acc = this; + for (var i = 0; i < power; i += step) { + for (var j = 0; j < step; j++) + acc = acc.dbl(); + doubles.push(acc); + } + return { + step: step, + points: doubles + }; +}; + +BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { + if (this.precomputed && this.precomputed.naf) + return this.precomputed.naf; + + var res = [ this ]; + var max = (1 << wnd) - 1; + var dbl = max === 1 ? null : this.dbl(); + for (var i = 1; i < max; i++) + res[i] = res[i - 1].add(dbl); + return { + wnd: wnd, + points: res + }; +}; + +BasePoint.prototype._getBeta = function _getBeta() { + return null; +}; + +BasePoint.prototype.dblp = function dblp(k) { + var r = this; + for (var i = 0; i < k; i++) + r = r.dbl(); + return r; +}; + +},{"../../elliptic":68,"bn.js":17}],70:[function(require,module,exports){ +'use strict'; + +var curve = require('../curve'); +var elliptic = require('../../elliptic'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = curve.base; + +var assert = elliptic.utils.assert; + +function EdwardsCurve(conf) { + // NOTE: Important as we are creating point in Base.call() + this.twisted = (conf.a | 0) !== 1; + this.mOneA = this.twisted && (conf.a | 0) === -1; + this.extended = this.mOneA; + + Base.call(this, 'edwards', conf); + + this.a = new BN(conf.a, 16).umod(this.red.m); + this.a = this.a.toRed(this.red); + this.c = new BN(conf.c, 16).toRed(this.red); + this.c2 = this.c.redSqr(); + this.d = new BN(conf.d, 16).toRed(this.red); + this.dd = this.d.redAdd(this.d); + + assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); + this.oneC = (conf.c | 0) === 1; +} +inherits(EdwardsCurve, Base); +module.exports = EdwardsCurve; + +EdwardsCurve.prototype._mulA = function _mulA(num) { + if (this.mOneA) + return num.redNeg(); + else + return this.a.redMul(num); +}; + +EdwardsCurve.prototype._mulC = function _mulC(num) { + if (this.oneC) + return num; + else + return this.c.redMul(num); +}; + +// Just for compatibility with Short curve +EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { + return this.point(x, y, z, t); +}; + +EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); + + var x2 = x.redSqr(); + var rhs = this.c2.redSub(this.a.redMul(x2)); + var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); + + var y2 = rhs.redMul(lhs.redInvm()); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + + return this.point(x, y); +}; + +EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { + y = new BN(y, 16); + if (!y.red) + y = y.toRed(this.red); + + // x^2 = (y^2 - c^2) / (c^2 d y^2 - a) + var y2 = y.redSqr(); + var lhs = y2.redSub(this.c2); + var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a); + var x2 = lhs.redMul(rhs.redInvm()); + + if (x2.cmp(this.zero) === 0) { + if (odd) + throw new Error('invalid point'); + else + return this.point(this.zero, y); + } + + var x = x2.redSqrt(); + if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + if (x.fromRed().isOdd() !== odd) + x = x.redNeg(); + + return this.point(x, y); +}; + +EdwardsCurve.prototype.validate = function validate(point) { + if (point.isInfinity()) + return true; + + // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2) + point.normalize(); + + var x2 = point.x.redSqr(); + var y2 = point.y.redSqr(); + var lhs = x2.redMul(this.a).redAdd(y2); + var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); + + return lhs.cmp(rhs) === 0; +}; + +function Point(curve, x, y, z, t) { + Base.BasePoint.call(this, curve, 'projective'); + if (x === null && y === null && z === null) { + this.x = this.curve.zero; + this.y = this.curve.one; + this.z = this.curve.one; + this.t = this.curve.zero; + this.zOne = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = z ? new BN(z, 16) : this.curve.one; + this.t = t && new BN(t, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + if (this.t && !this.t.red) + this.t = this.t.toRed(this.curve.red); + this.zOne = this.z === this.curve.one; + + // Use extended coordinates + if (this.curve.extended && !this.t) { + this.t = this.x.redMul(this.y); + if (!this.zOne) + this.t = this.t.redMul(this.z.redInvm()); + } + } +} +inherits(Point, Base.BasePoint); + +EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); +}; + +EdwardsCurve.prototype.point = function point(x, y, z, t) { + return new Point(this, x, y, z, t); +}; + +Point.fromJSON = function fromJSON(curve, obj) { + return new Point(curve, obj[0], obj[1], obj[2]); +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +Point.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.x.cmpn(0) === 0 && + (this.y.cmp(this.z) === 0 || + (this.zOne && this.y.cmp(this.curve.c) === 0)); +}; + +Point.prototype._extDbl = function _extDbl() { + // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html + // #doubling-dbl-2008-hwcd + // 4M + 4S + + // A = X1^2 + var a = this.x.redSqr(); + // B = Y1^2 + var b = this.y.redSqr(); + // C = 2 * Z1^2 + var c = this.z.redSqr(); + c = c.redIAdd(c); + // D = a * A + var d = this.curve._mulA(a); + // E = (X1 + Y1)^2 - A - B + var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); + // G = D + B + var g = d.redAdd(b); + // F = G - C + var f = g.redSub(c); + // H = D - B + var h = d.redSub(b); + // X3 = E * F + var nx = e.redMul(f); + // Y3 = G * H + var ny = g.redMul(h); + // T3 = E * H + var nt = e.redMul(h); + // Z3 = F * G + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); +}; + +Point.prototype._projDbl = function _projDbl() { + // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html + // #doubling-dbl-2008-bbjlp + // #doubling-dbl-2007-bl + // and others + // Generally 3M + 4S or 2M + 4S + + // B = (X1 + Y1)^2 + var b = this.x.redAdd(this.y).redSqr(); + // C = X1^2 + var c = this.x.redSqr(); + // D = Y1^2 + var d = this.y.redSqr(); + + var nx; + var ny; + var nz; + if (this.curve.twisted) { + // E = a * C + var e = this.curve._mulA(c); + // F = E + D + var f = e.redAdd(d); + if (this.zOne) { + // X3 = (B - C - D) * (F - 2) + nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); + // Y3 = F * (E - D) + ny = f.redMul(e.redSub(d)); + // Z3 = F^2 - 2 * F + nz = f.redSqr().redSub(f).redSub(f); + } else { + // H = Z1^2 + var h = this.z.redSqr(); + // J = F - 2 * H + var j = f.redSub(h).redISub(h); + // X3 = (B-C-D)*J + nx = b.redSub(c).redISub(d).redMul(j); + // Y3 = F * (E - D) + ny = f.redMul(e.redSub(d)); + // Z3 = F * J + nz = f.redMul(j); + } + } else { + // E = C + D + var e = c.redAdd(d); + // H = (c * Z1)^2 + var h = this.curve._mulC(this.z).redSqr(); + // J = E - 2 * H + var j = e.redSub(h).redSub(h); + // X3 = c * (B - E) * J + nx = this.curve._mulC(b.redISub(e)).redMul(j); + // Y3 = c * E * (C - D) + ny = this.curve._mulC(e).redMul(c.redISub(d)); + // Z3 = E * J + nz = e.redMul(j); + } + return this.curve.point(nx, ny, nz); +}; + +Point.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + + // Double in extended coordinates + if (this.curve.extended) + return this._extDbl(); + else + return this._projDbl(); +}; + +Point.prototype._extAdd = function _extAdd(p) { + // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html + // #addition-add-2008-hwcd-3 + // 8M + + // A = (Y1 - X1) * (Y2 - X2) + var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); + // B = (Y1 + X1) * (Y2 + X2) + var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); + // C = T1 * k * T2 + var c = this.t.redMul(this.curve.dd).redMul(p.t); + // D = Z1 * 2 * Z2 + var d = this.z.redMul(p.z.redAdd(p.z)); + // E = B - A + var e = b.redSub(a); + // F = D - C + var f = d.redSub(c); + // G = D + C + var g = d.redAdd(c); + // H = B + A + var h = b.redAdd(a); + // X3 = E * F + var nx = e.redMul(f); + // Y3 = G * H + var ny = g.redMul(h); + // T3 = E * H + var nt = e.redMul(h); + // Z3 = F * G + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); +}; + +Point.prototype._projAdd = function _projAdd(p) { + // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html + // #addition-add-2008-bbjlp + // #addition-add-2007-bl + // 10M + 1S + + // A = Z1 * Z2 + var a = this.z.redMul(p.z); + // B = A^2 + var b = a.redSqr(); + // C = X1 * X2 + var c = this.x.redMul(p.x); + // D = Y1 * Y2 + var d = this.y.redMul(p.y); + // E = d * C * D + var e = this.curve.d.redMul(c).redMul(d); + // F = B - E + var f = b.redSub(e); + // G = B + E + var g = b.redAdd(e); + // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D) + var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); + var nx = a.redMul(f).redMul(tmp); + var ny; + var nz; + if (this.curve.twisted) { + // Y3 = A * G * (D - a * C) + ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); + // Z3 = F * G + nz = f.redMul(g); + } else { + // Y3 = A * G * (D - C) + ny = a.redMul(g).redMul(d.redSub(c)); + // Z3 = c * F * G + nz = this.curve._mulC(f).redMul(g); + } + return this.curve.point(nx, ny, nz); +}; + +Point.prototype.add = function add(p) { + if (this.isInfinity()) + return p; + if (p.isInfinity()) + return this; + + if (this.curve.extended) + return this._extAdd(p); + else + return this._projAdd(p); +}; + +Point.prototype.mul = function mul(k) { + if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else + return this.curve._wnafMul(this, k); +}; + +Point.prototype.mulAdd = function mulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false); +}; + +Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true); +}; + +Point.prototype.normalize = function normalize() { + if (this.zOne) + return this; + + // Normalize coordinates + var zi = this.z.redInvm(); + this.x = this.x.redMul(zi); + this.y = this.y.redMul(zi); + if (this.t) + this.t = this.t.redMul(zi); + this.z = this.curve.one; + this.zOne = true; + return this; +}; + +Point.prototype.neg = function neg() { + return this.curve.point(this.x.redNeg(), + this.y, + this.z, + this.t && this.t.redNeg()); +}; + +Point.prototype.getX = function getX() { + this.normalize(); + return this.x.fromRed(); +}; + +Point.prototype.getY = function getY() { + this.normalize(); + return this.y.fromRed(); +}; + +Point.prototype.eq = function eq(other) { + return this === other || + this.getX().cmp(other.getX()) === 0 && + this.getY().cmp(other.getY()) === 0; +}; + +Point.prototype.eqXToP = function eqXToP(x) { + var rx = x.toRed(this.curve.red).redMul(this.z); + if (this.x.cmp(rx) === 0) + return true; + + var xc = x.clone(); + var t = this.curve.redN.redMul(this.z); + for (;;) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } +}; + +// Compatibility with BaseCurve +Point.prototype.toP = Point.prototype.normalize; +Point.prototype.mixedAdd = Point.prototype.add; + +},{"../../elliptic":68,"../curve":71,"bn.js":17,"inherits":101}],71:[function(require,module,exports){ +'use strict'; + +var curve = exports; + +curve.base = require('./base'); +curve.short = require('./short'); +curve.mont = require('./mont'); +curve.edwards = require('./edwards'); + +},{"./base":69,"./edwards":70,"./mont":72,"./short":73}],72:[function(require,module,exports){ +'use strict'; + +var curve = require('../curve'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = curve.base; + +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; + +function MontCurve(conf) { + Base.call(this, 'mont', conf); + + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.i4 = new BN(4).toRed(this.red).redInvm(); + this.two = new BN(2).toRed(this.red); + this.a24 = this.i4.redMul(this.a.redAdd(this.two)); +} +inherits(MontCurve, Base); +module.exports = MontCurve; + +MontCurve.prototype.validate = function validate(point) { + var x = point.normalize().x; + var x2 = x.redSqr(); + var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); + var y = rhs.redSqrt(); + + return y.redSqr().cmp(rhs) === 0; +}; + +function Point(curve, x, z) { + Base.BasePoint.call(this, curve, 'projective'); + if (x === null && z === null) { + this.x = this.curve.one; + this.z = this.curve.zero; + } else { + this.x = new BN(x, 16); + this.z = new BN(z, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + } +} +inherits(Point, Base.BasePoint); + +MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + return this.point(utils.toArray(bytes, enc), 1); +}; + +MontCurve.prototype.point = function point(x, z) { + return new Point(this, x, z); +}; + +MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); +}; + +Point.prototype.precompute = function precompute() { + // No-op +}; + +Point.prototype._encode = function _encode() { + return this.getX().toArray('be', this.curve.p.byteLength()); +}; + +Point.fromJSON = function fromJSON(curve, obj) { + return new Point(curve, obj[0], obj[1] || curve.one); +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +Point.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.z.cmpn(0) === 0; +}; + +Point.prototype.dbl = function dbl() { + // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3 + // 2M + 2S + 4A + + // A = X1 + Z1 + var a = this.x.redAdd(this.z); + // AA = A^2 + var aa = a.redSqr(); + // B = X1 - Z1 + var b = this.x.redSub(this.z); + // BB = B^2 + var bb = b.redSqr(); + // C = AA - BB + var c = aa.redSub(bb); + // X3 = AA * BB + var nx = aa.redMul(bb); + // Z3 = C * (BB + A24 * C) + var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); + return this.curve.point(nx, nz); +}; + +Point.prototype.add = function add() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.diffAdd = function diffAdd(p, diff) { + // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3 + // 4M + 2S + 6A + + // A = X2 + Z2 + var a = this.x.redAdd(this.z); + // B = X2 - Z2 + var b = this.x.redSub(this.z); + // C = X3 + Z3 + var c = p.x.redAdd(p.z); + // D = X3 - Z3 + var d = p.x.redSub(p.z); + // DA = D * A + var da = d.redMul(a); + // CB = C * B + var cb = c.redMul(b); + // X5 = Z1 * (DA + CB)^2 + var nx = diff.z.redMul(da.redAdd(cb).redSqr()); + // Z5 = X1 * (DA - CB)^2 + var nz = diff.x.redMul(da.redISub(cb).redSqr()); + return this.curve.point(nx, nz); +}; + +Point.prototype.mul = function mul(k) { + var t = k.clone(); + var a = this; // (N / 2) * Q + Q + var b = this.curve.point(null, null); // (N / 2) * Q + var c = this; // Q + + for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) + bits.push(t.andln(1)); + + for (var i = bits.length - 1; i >= 0; i--) { + if (bits[i] === 0) { + // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q + a = a.diffAdd(b, c); + // N * Q = 2 * ((N / 2) * Q + Q)) + b = b.dbl(); + } else { + // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q) + b = a.diffAdd(b, c); + // N * Q + Q = 2 * ((N / 2) * Q + Q) + a = a.dbl(); + } + } + return b; +}; + +Point.prototype.mulAdd = function mulAdd() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.jumlAdd = function jumlAdd() { + throw new Error('Not supported on Montgomery curve'); +}; + +Point.prototype.eq = function eq(other) { + return this.getX().cmp(other.getX()) === 0; +}; + +Point.prototype.normalize = function normalize() { + this.x = this.x.redMul(this.z.redInvm()); + this.z = this.curve.one; + return this; +}; + +Point.prototype.getX = function getX() { + // Normalize coordinates + this.normalize(); + + return this.x.fromRed(); +}; + +},{"../../elliptic":68,"../curve":71,"bn.js":17,"inherits":101}],73:[function(require,module,exports){ +'use strict'; + +var curve = require('../curve'); +var elliptic = require('../../elliptic'); +var BN = require('bn.js'); +var inherits = require('inherits'); +var Base = curve.base; + +var assert = elliptic.utils.assert; + +function ShortCurve(conf) { + Base.call(this, 'short', conf); + + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.tinv = this.two.redInvm(); + + this.zeroA = this.a.fromRed().cmpn(0) === 0; + this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; + + // If the curve is endomorphic, precalculate beta and lambda + this.endo = this._getEndomorphism(conf); + this._endoWnafT1 = new Array(4); + this._endoWnafT2 = new Array(4); +} +inherits(ShortCurve, Base); +module.exports = ShortCurve; + +ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { + // No efficient endomorphism + if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) + return; + + // Compute beta and lambda, that lambda * P = (beta * Px; Py) + var beta; + var lambda; + if (conf.beta) { + beta = new BN(conf.beta, 16).toRed(this.red); + } else { + var betas = this._getEndoRoots(this.p); + // Choose the smallest beta + beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; + beta = beta.toRed(this.red); + } + if (conf.lambda) { + lambda = new BN(conf.lambda, 16); + } else { + // Choose the lambda that is matching selected beta + var lambdas = this._getEndoRoots(this.n); + if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { + lambda = lambdas[0]; + } else { + lambda = lambdas[1]; + assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); + } + } + + // Get basis vectors, used for balanced length-two representation + var basis; + if (conf.basis) { + basis = conf.basis.map(function(vec) { + return { + a: new BN(vec.a, 16), + b: new BN(vec.b, 16) + }; + }); + } else { + basis = this._getEndoBasis(lambda); + } + + return { + beta: beta, + lambda: lambda, + basis: basis + }; +}; + +ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { + // Find roots of for x^2 + x + 1 in F + // Root = (-1 +- Sqrt(-3)) / 2 + // + var red = num === this.p ? this.red : BN.mont(num); + var tinv = new BN(2).toRed(red).redInvm(); + var ntinv = tinv.redNeg(); + + var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); + + var l1 = ntinv.redAdd(s).fromRed(); + var l2 = ntinv.redSub(s).fromRed(); + return [ l1, l2 ]; +}; + +ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { + // aprxSqrt >= sqrt(this.n) + var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); + + // 3.74 + // Run EGCD, until r(L + 1) < aprxSqrt + var u = lambda; + var v = this.n.clone(); + var x1 = new BN(1); + var y1 = new BN(0); + var x2 = new BN(0); + var y2 = new BN(1); + + // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) + var a0; + var b0; + // First vector + var a1; + var b1; + // Second vector + var a2; + var b2; + + var prevR; + var i = 0; + var r; + var x; + while (u.cmpn(0) !== 0) { + var q = v.div(u); + r = v.sub(q.mul(u)); + x = x2.sub(q.mul(x1)); + var y = y2.sub(q.mul(y1)); + + if (!a1 && r.cmp(aprxSqrt) < 0) { + a0 = prevR.neg(); + b0 = x1; + a1 = r.neg(); + b1 = x; + } else if (a1 && ++i === 2) { + break; + } + prevR = r; + + v = u; + u = r; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + a2 = r.neg(); + b2 = x; + + var len1 = a1.sqr().add(b1.sqr()); + var len2 = a2.sqr().add(b2.sqr()); + if (len2.cmp(len1) >= 0) { + a2 = a0; + b2 = b0; + } + + // Normalize signs + if (a1.negative) { + a1 = a1.neg(); + b1 = b1.neg(); + } + if (a2.negative) { + a2 = a2.neg(); + b2 = b2.neg(); + } + + return [ + { a: a1, b: b1 }, + { a: a2, b: b2 } + ]; +}; + +ShortCurve.prototype._endoSplit = function _endoSplit(k) { + var basis = this.endo.basis; + var v1 = basis[0]; + var v2 = basis[1]; + + var c1 = v2.b.mul(k).divRound(this.n); + var c2 = v1.b.neg().mul(k).divRound(this.n); + + var p1 = c1.mul(v1.a); + var p2 = c2.mul(v2.a); + var q1 = c1.mul(v1.b); + var q2 = c2.mul(v2.b); + + // Calculate answer + var k1 = k.sub(p1).sub(p2); + var k2 = q1.add(q2).neg(); + return { k1: k1, k2: k2 }; +}; + +ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); + + var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + // XXX Is there any way to tell if the number is odd without converting it + // to non-red form? + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + + return this.point(x, y); +}; + +ShortCurve.prototype.validate = function validate(point) { + if (point.inf) + return true; + + var x = point.x; + var y = point.y; + + var ax = this.a.redMul(x); + var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); + return y.redSqr().redISub(rhs).cmpn(0) === 0; +}; + +ShortCurve.prototype._endoWnafMulAdd = + function _endoWnafMulAdd(points, coeffs, jacobianResult) { + var npoints = this._endoWnafT1; + var ncoeffs = this._endoWnafT2; + for (var i = 0; i < points.length; i++) { + var split = this._endoSplit(coeffs[i]); + var p = points[i]; + var beta = p._getBeta(); + + if (split.k1.negative) { + split.k1.ineg(); + p = p.neg(true); + } + if (split.k2.negative) { + split.k2.ineg(); + beta = beta.neg(true); + } + + npoints[i * 2] = p; + npoints[i * 2 + 1] = beta; + ncoeffs[i * 2] = split.k1; + ncoeffs[i * 2 + 1] = split.k2; + } + var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); + + // Clean-up references to points and coefficients + for (var j = 0; j < i * 2; j++) { + npoints[j] = null; + ncoeffs[j] = null; + } + return res; +}; + +function Point(curve, x, y, isRed) { + Base.BasePoint.call(this, curve, 'affine'); + if (x === null && y === null) { + this.x = null; + this.y = null; + this.inf = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + // Force redgomery representation when loading from JSON + if (isRed) { + this.x.forceRed(this.curve.red); + this.y.forceRed(this.curve.red); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + this.inf = false; + } +} +inherits(Point, Base.BasePoint); + +ShortCurve.prototype.point = function point(x, y, isRed) { + return new Point(this, x, y, isRed); +}; + +ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { + return Point.fromJSON(this, obj, red); +}; + +Point.prototype._getBeta = function _getBeta() { + if (!this.curve.endo) + return; + + var pre = this.precomputed; + if (pre && pre.beta) + return pre.beta; + + var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); + if (pre) { + var curve = this.curve; + var endoMul = function(p) { + return curve.point(p.x.redMul(curve.endo.beta), p.y); + }; + pre.beta = beta; + beta.precomputed = { + beta: null, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(endoMul) + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(endoMul) + } + }; + } + return beta; +}; + +Point.prototype.toJSON = function toJSON() { + if (!this.precomputed) + return [ this.x, this.y ]; + + return [ this.x, this.y, this.precomputed && { + doubles: this.precomputed.doubles && { + step: this.precomputed.doubles.step, + points: this.precomputed.doubles.points.slice(1) + }, + naf: this.precomputed.naf && { + wnd: this.precomputed.naf.wnd, + points: this.precomputed.naf.points.slice(1) + } + } ]; +}; + +Point.fromJSON = function fromJSON(curve, obj, red) { + if (typeof obj === 'string') + obj = JSON.parse(obj); + var res = curve.point(obj[0], obj[1], red); + if (!obj[2]) + return res; + + function obj2point(obj) { + return curve.point(obj[0], obj[1], red); + } + + var pre = obj[2]; + res.precomputed = { + beta: null, + doubles: pre.doubles && { + step: pre.doubles.step, + points: [ res ].concat(pre.doubles.points.map(obj2point)) + }, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: [ res ].concat(pre.naf.points.map(obj2point)) + } + }; + return res; +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +Point.prototype.isInfinity = function isInfinity() { + return this.inf; +}; + +Point.prototype.add = function add(p) { + // O + P = P + if (this.inf) + return p; + + // P + O = P + if (p.inf) + return this; + + // P + P = 2P + if (this.eq(p)) + return this.dbl(); + + // P + (-P) = O + if (this.neg().eq(p)) + return this.curve.point(null, null); + + // P + Q = O + if (this.x.cmp(p.x) === 0) + return this.curve.point(null, null); + + var c = this.y.redSub(p.y); + if (c.cmpn(0) !== 0) + c = c.redMul(this.x.redSub(p.x).redInvm()); + var nx = c.redSqr().redISub(this.x).redISub(p.x); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.dbl = function dbl() { + if (this.inf) + return this; + + // 2P = O + var ys1 = this.y.redAdd(this.y); + if (ys1.cmpn(0) === 0) + return this.curve.point(null, null); + + var a = this.curve.a; + + var x2 = this.x.redSqr(); + var dyinv = ys1.redInvm(); + var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); + + var nx = c.redSqr().redISub(this.x.redAdd(this.x)); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.getX = function getX() { + return this.x.fromRed(); +}; + +Point.prototype.getY = function getY() { + return this.y.fromRed(); +}; + +Point.prototype.mul = function mul(k) { + k = new BN(k, 16); + + if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else if (this.curve.endo) + return this.curve._endoWnafMulAdd([ this ], [ k ]); + else + return this.curve._wnafMul(this, k); +}; + +Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2); +}; + +Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs, true); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2, true); +}; + +Point.prototype.eq = function eq(p) { + return this === p || + this.inf === p.inf && + (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); +}; + +Point.prototype.neg = function neg(_precompute) { + if (this.inf) + return this; + + var res = this.curve.point(this.x, this.y.redNeg()); + if (_precompute && this.precomputed) { + var pre = this.precomputed; + var negate = function(p) { + return p.neg(); + }; + res.precomputed = { + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(negate) + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(negate) + } + }; + } + return res; +}; + +Point.prototype.toJ = function toJ() { + if (this.inf) + return this.curve.jpoint(null, null, null); + + var res = this.curve.jpoint(this.x, this.y, this.curve.one); + return res; +}; + +function JPoint(curve, x, y, z) { + Base.BasePoint.call(this, curve, 'jacobian'); + if (x === null && y === null && z === null) { + this.x = this.curve.one; + this.y = this.curve.one; + this.z = new BN(0); + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = new BN(z, 16); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + + this.zOne = this.z === this.curve.one; +} +inherits(JPoint, Base.BasePoint); + +ShortCurve.prototype.jpoint = function jpoint(x, y, z) { + return new JPoint(this, x, y, z); +}; + +JPoint.prototype.toP = function toP() { + if (this.isInfinity()) + return this.curve.point(null, null); + + var zinv = this.z.redInvm(); + var zinv2 = zinv.redSqr(); + var ax = this.x.redMul(zinv2); + var ay = this.y.redMul(zinv2).redMul(zinv); + + return this.curve.point(ax, ay); +}; + +JPoint.prototype.neg = function neg() { + return this.curve.jpoint(this.x, this.y.redNeg(), this.z); +}; + +JPoint.prototype.add = function add(p) { + // O + P = P + if (this.isInfinity()) + return p; + + // P + O = P + if (p.isInfinity()) + return this; + + // 12M + 4S + 7A + var pz2 = p.z.redSqr(); + var z2 = this.z.redSqr(); + var u1 = this.x.redMul(pz2); + var u2 = p.x.redMul(z2); + var s1 = this.y.redMul(pz2.redMul(p.z)); + var s2 = p.y.redMul(z2.redMul(this.z)); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(p.z).redMul(h); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mixedAdd = function mixedAdd(p) { + // O + P = P + if (this.isInfinity()) + return p.toJ(); + + // P + O = P + if (p.isInfinity()) + return this; + + // 8M + 3S + 7A + var z2 = this.z.redSqr(); + var u1 = this.x; + var u2 = p.x.redMul(z2); + var s1 = this.y; + var s2 = p.y.redMul(z2).redMul(this.z); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(h); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.dblp = function dblp(pow) { + if (pow === 0) + return this; + if (this.isInfinity()) + return this; + if (!pow) + return this.dbl(); + + if (this.curve.zeroA || this.curve.threeA) { + var r = this; + for (var i = 0; i < pow; i++) + r = r.dbl(); + return r; + } + + // 1M + 2S + 1A + N * (4S + 5M + 8A) + // N = 1 => 6M + 6S + 9A + var a = this.curve.a; + var tinv = this.curve.tinv; + + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + + // Reuse results + var jyd = jy.redAdd(jy); + for (var i = 0; i < pow; i++) { + var jx2 = jx.redSqr(); + var jyd2 = jyd.redSqr(); + var jyd4 = jyd2.redSqr(); + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + + var t1 = jx.redMul(jyd2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + var dny = c.redMul(t2); + dny = dny.redIAdd(dny).redISub(jyd4); + var nz = jyd.redMul(jz); + if (i + 1 < pow) + jz4 = jz4.redMul(jyd4); + + jx = nx; + jz = nz; + jyd = dny; + } + + return this.curve.jpoint(jx, jyd.redMul(tinv), jz); +}; + +JPoint.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + + if (this.curve.zeroA) + return this._zeroDbl(); + else if (this.curve.threeA) + return this._threeDbl(); + else + return this._dbl(); +}; + +JPoint.prototype._zeroDbl = function _zeroDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 14A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // T = M ^ 2 - 2*S + var t = m.redSqr().redISub(s).redISub(s); + + // 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2*Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-dbl-2009-l + // 2M + 5S + 13A + + // A = X1^2 + var a = this.x.redSqr(); + // B = Y1^2 + var b = this.y.redSqr(); + // C = B^2 + var c = b.redSqr(); + // D = 2 * ((X1 + B)^2 - A - C) + var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); + d = d.redIAdd(d); + // E = 3 * A + var e = a.redAdd(a).redIAdd(a); + // F = E^2 + var f = e.redSqr(); + + // 8 * C + var c8 = c.redIAdd(c); + c8 = c8.redIAdd(c8); + c8 = c8.redIAdd(c8); + + // X3 = F - 2 * D + nx = f.redISub(d).redISub(d); + // Y3 = E * (D - X3) - 8 * C + ny = e.redMul(d.redISub(nx)).redISub(c8); + // Z3 = 2 * Y1 * Z1 + nz = this.y.redMul(this.z); + nz = nz.redIAdd(nz); + } + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype._threeDbl = function _threeDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 15A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a + var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); + // T = M^2 - 2 * S + var t = m.redSqr().redISub(s).redISub(s); + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2 * Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b + // 3M + 5S + + // delta = Z1^2 + var delta = this.z.redSqr(); + // gamma = Y1^2 + var gamma = this.y.redSqr(); + // beta = X1 * gamma + var beta = this.x.redMul(gamma); + // alpha = 3 * (X1 - delta) * (X1 + delta) + var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); + alpha = alpha.redAdd(alpha).redIAdd(alpha); + // X3 = alpha^2 - 8 * beta + var beta4 = beta.redIAdd(beta); + beta4 = beta4.redIAdd(beta4); + var beta8 = beta4.redAdd(beta4); + nx = alpha.redSqr().redISub(beta8); + // Z3 = (Y1 + Z1)^2 - gamma - delta + nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); + // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 + var ggamma8 = gamma.redSqr(); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); + } + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype._dbl = function _dbl() { + var a = this.curve.a; + + // 4M + 6S + 10A + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + + var jx2 = jx.redSqr(); + var jy2 = jy.redSqr(); + + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + + var jxd4 = jx.redAdd(jx); + jxd4 = jxd4.redIAdd(jxd4); + var t1 = jxd4.redMul(jy2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + + var jyd8 = jy2.redSqr(); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + var ny = c.redMul(t2).redISub(jyd8); + var nz = jy.redAdd(jy).redMul(jz); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.trpl = function trpl() { + if (!this.curve.zeroA) + return this.dbl().add(this); + + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl + // 5M + 10S + ... + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // ZZ = Z1^2 + var zz = this.z.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // M = 3 * XX + a * ZZ2; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // MM = M^2 + var mm = m.redSqr(); + // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM + var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + e = e.redIAdd(e); + e = e.redAdd(e).redIAdd(e); + e = e.redISub(mm); + // EE = E^2 + var ee = e.redSqr(); + // T = 16*YYYY + var t = yyyy.redIAdd(yyyy); + t = t.redIAdd(t); + t = t.redIAdd(t); + t = t.redIAdd(t); + // U = (M + E)^2 - MM - EE - T + var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); + // X3 = 4 * (X1 * EE - 4 * YY * U) + var yyu4 = yy.redMul(u); + yyu4 = yyu4.redIAdd(yyu4); + yyu4 = yyu4.redIAdd(yyu4); + var nx = this.x.redMul(ee).redISub(yyu4); + nx = nx.redIAdd(nx); + nx = nx.redIAdd(nx); + // Y3 = 8 * Y1 * (U * (T - U) - E * EE) + var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + // Z3 = (Z1 + E)^2 - ZZ - EE + var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mul = function mul(k, kbase) { + k = new BN(k, kbase); + + return this.curve._wnafMul(this, k); +}; + +JPoint.prototype.eq = function eq(p) { + if (p.type === 'affine') + return this.eq(p.toJ()); + + if (this === p) + return true; + + // x1 * z2^2 == x2 * z1^2 + var z2 = this.z.redSqr(); + var pz2 = p.z.redSqr(); + if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) + return false; + + // y1 * z2^3 == y2 * z1^3 + var z3 = z2.redMul(this.z); + var pz3 = pz2.redMul(p.z); + return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; +}; + +JPoint.prototype.eqXToP = function eqXToP(x) { + var zs = this.z.redSqr(); + var rx = x.toRed(this.curve.red).redMul(zs); + if (this.x.cmp(rx) === 0) + return true; + + var xc = x.clone(); + var t = this.curve.redN.redMul(zs); + for (;;) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } +}; + +JPoint.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ''; + return ''; +}; + +JPoint.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.z.cmpn(0) === 0; +}; + +},{"../../elliptic":68,"../curve":71,"bn.js":17,"inherits":101}],74:[function(require,module,exports){ +'use strict'; + +var curves = exports; + +var hash = require('hash.js'); +var elliptic = require('../elliptic'); + +var assert = elliptic.utils.assert; + +function PresetCurve(options) { + if (options.type === 'short') + this.curve = new elliptic.curve.short(options); + else if (options.type === 'edwards') + this.curve = new elliptic.curve.edwards(options); + else + this.curve = new elliptic.curve.mont(options); + this.g = this.curve.g; + this.n = this.curve.n; + this.hash = options.hash; + + assert(this.g.validate(), 'Invalid curve'); + assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); +} +curves.PresetCurve = PresetCurve; + +function defineCurve(name, options) { + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + get: function() { + var curve = new PresetCurve(options); + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + value: curve + }); + return curve; + } + }); +} + +defineCurve('p192', { + type: 'short', + prime: 'p192', + p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', + b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', + n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', + hash: hash.sha256, + gRed: false, + g: [ + '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', + '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811' + ] +}); + +defineCurve('p224', { + type: 'short', + prime: 'p224', + p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', + b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', + n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', + hash: hash.sha256, + gRed: false, + g: [ + 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', + 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34' + ] +}); + +defineCurve('p256', { + type: 'short', + prime: null, + p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', + a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', + b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', + n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', + hash: hash.sha256, + gRed: false, + g: [ + '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5' + ] +}); + +defineCurve('p384', { + type: 'short', + prime: null, + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 ffffffff', + a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 fffffffc', + b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + + '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', + n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + + 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', + hash: hash.sha384, + gRed: false, + g: [ + 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + + '5502f25d bf55296c 3a545e38 72760ab7', + '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' + ] +}); + +defineCurve('p521', { + type: 'short', + prime: null, + p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff', + a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff fffffffc', + b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + + '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + + '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', + n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + + 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', + hash: hash.sha512, + gRed: false, + g: [ + '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + + '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + + 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', + '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + + '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + + '3fad0761 353c7086 a272c240 88be9476 9fd16650' + ] +}); + +defineCurve('curve25519', { + type: 'mont', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '76d06', + b: '1', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash.sha256, + gRed: false, + g: [ + '9' + ] +}); + +defineCurve('ed25519', { + type: 'edwards', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '-1', + c: '1', + // -121665 * (121666^(-1)) (mod P) + d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash.sha256, + gRed: false, + g: [ + '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', + + // 4/5 + '6666666666666666666666666666666666666666666666666666666666666658' + ] +}); + +var pre; +try { + pre = require('./precomputed/secp256k1'); +} catch (e) { + pre = undefined; +} + +defineCurve('secp256k1', { + type: 'short', + prime: 'k256', + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', + a: '0', + b: '7', + n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', + h: '1', + hash: hash.sha256, + + // Precomputed endomorphism + beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', + lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', + basis: [ + { + a: '3086d221a7d46bcde86c90e49284eb15', + b: '-e4437ed6010e88286f547fa90abfe4c3' + }, + { + a: '114ca50f7a8e2f3f657c1108d9d44cfd8', + b: '3086d221a7d46bcde86c90e49284eb15' + } + ], + + gRed: false, + g: [ + '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', + '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', + pre + ] +}); + +},{"../elliptic":68,"./precomputed/secp256k1":81,"hash.js":87}],75:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var HmacDRBG = require('hmac-drbg'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; + +var KeyPair = require('./key'); +var Signature = require('./signature'); + +function EC(options) { + if (!(this instanceof EC)) + return new EC(options); + + // Shortcut `elliptic.ec(curve-name)` + if (typeof options === 'string') { + assert(elliptic.curves.hasOwnProperty(options), 'Unknown curve ' + options); + + options = elliptic.curves[options]; + } + + // Shortcut for `elliptic.ec(elliptic.curves.curveName)` + if (options instanceof elliptic.curves.PresetCurve) + options = { curve: options }; + + this.curve = options.curve.curve; + this.n = this.curve.n; + this.nh = this.n.ushrn(1); + this.g = this.curve.g; + + // Point on curve + this.g = options.curve.g; + this.g.precompute(options.curve.n.bitLength() + 1); + + // Hash for function for DRBG + this.hash = options.hash || options.curve.hash; +} +module.exports = EC; + +EC.prototype.keyPair = function keyPair(options) { + return new KeyPair(this, options); +}; + +EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { + return KeyPair.fromPrivate(this, priv, enc); +}; + +EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { + return KeyPair.fromPublic(this, pub, enc); +}; + +EC.prototype.genKeyPair = function genKeyPair(options) { + if (!options) + options = {}; + + // Instantiate Hmac_DRBG + var drbg = new HmacDRBG({ + hash: this.hash, + pers: options.pers, + persEnc: options.persEnc || 'utf8', + entropy: options.entropy || elliptic.rand(this.hash.hmacStrength), + entropyEnc: options.entropy && options.entropyEnc || 'utf8', + nonce: this.n.toArray() + }); + + var bytes = this.n.byteLength(); + var ns2 = this.n.sub(new BN(2)); + do { + var priv = new BN(drbg.generate(bytes)); + if (priv.cmp(ns2) > 0) + continue; + + priv.iaddn(1); + return this.keyFromPrivate(priv); + } while (true); +}; + +EC.prototype._truncateToN = function truncateToN(msg, truncOnly) { + var delta = msg.byteLength() * 8 - this.n.bitLength(); + if (delta > 0) + msg = msg.ushrn(delta); + if (!truncOnly && msg.cmp(this.n) >= 0) + return msg.sub(this.n); + else + return msg; +}; + +EC.prototype.sign = function sign(msg, key, enc, options) { + if (typeof enc === 'object') { + options = enc; + enc = null; + } + if (!options) + options = {}; + + key = this.keyFromPrivate(key, enc); + msg = this._truncateToN(new BN(msg, 16)); + + // Zero-extend key to provide enough entropy + var bytes = this.n.byteLength(); + var bkey = key.getPrivate().toArray('be', bytes); + + // Zero-extend nonce to have the same byte size as N + var nonce = msg.toArray('be', bytes); + + // Instantiate Hmac_DRBG + var drbg = new HmacDRBG({ + hash: this.hash, + entropy: bkey, + nonce: nonce, + pers: options.pers, + persEnc: options.persEnc || 'utf8' + }); + + // Number of bytes to generate + var ns1 = this.n.sub(new BN(1)); + + for (var iter = 0; true; iter++) { + var k = options.k ? + options.k(iter) : + new BN(drbg.generate(this.n.byteLength())); + k = this._truncateToN(k, true); + if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) + continue; + + var kp = this.g.mul(k); + if (kp.isInfinity()) + continue; + + var kpX = kp.getX(); + var r = kpX.umod(this.n); + if (r.cmpn(0) === 0) + continue; + + var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); + s = s.umod(this.n); + if (s.cmpn(0) === 0) + continue; + + var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | + (kpX.cmp(r) !== 0 ? 2 : 0); + + // Use complement of `s`, if it is > `n / 2` + if (options.canonical && s.cmp(this.nh) > 0) { + s = this.n.sub(s); + recoveryParam ^= 1; + } + + return new Signature({ r: r, s: s, recoveryParam: recoveryParam }); + } +}; + +EC.prototype.verify = function verify(msg, signature, key, enc) { + msg = this._truncateToN(new BN(msg, 16)); + key = this.keyFromPublic(key, enc); + signature = new Signature(signature, 'hex'); + + // Perform primitive values validation + var r = signature.r; + var s = signature.s; + if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) + return false; + if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) + return false; + + // Validate signature + var sinv = s.invm(this.n); + var u1 = sinv.mul(msg).umod(this.n); + var u2 = sinv.mul(r).umod(this.n); + + if (!this.curve._maxwellTrick) { + var p = this.g.mulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; + + return p.getX().umod(this.n).cmp(r) === 0; + } + + // NOTE: Greg Maxwell's trick, inspired by: + // https://git.io/vad3K + + var p = this.g.jmulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; + + // Compare `p.x` of Jacobian point with `r`, + // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the + // inverse of `p.z^2` + return p.eqXToP(r); +}; + +EC.prototype.recoverPubKey = function(msg, signature, j, enc) { + assert((3 & j) === j, 'The recovery param is more than two bits'); + signature = new Signature(signature, enc); + + var n = this.n; + var e = new BN(msg); + var r = signature.r; + var s = signature.s; + + // A set LSB signifies that the y-coordinate is odd + var isYOdd = j & 1; + var isSecondKey = j >> 1; + if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) + throw new Error('Unable to find sencond key candinate'); + + // 1.1. Let x = r + jn. + if (isSecondKey) + r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); + else + r = this.curve.pointFromX(r, isYOdd); + + var rInv = signature.r.invm(n); + var s1 = n.sub(e).mul(rInv).umod(n); + var s2 = s.mul(rInv).umod(n); + + // 1.6.1 Compute Q = r^-1 (sR - eG) + // Q = r^-1 (sR + -eG) + return this.g.mulAdd(s1, r, s2); +}; + +EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) { + signature = new Signature(signature, enc); + if (signature.recoveryParam !== null) + return signature.recoveryParam; + + for (var i = 0; i < 4; i++) { + var Qprime; + try { + Qprime = this.recoverPubKey(e, signature, i); + } catch (e) { + continue; + } + + if (Qprime.eq(Q)) + return i; + } + throw new Error('Unable to find valid recovery factor'); +}; + +},{"../../elliptic":68,"./key":76,"./signature":77,"bn.js":17,"hmac-drbg":99}],76:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; + +function KeyPair(ec, options) { + this.ec = ec; + this.priv = null; + this.pub = null; + + // KeyPair(ec, { priv: ..., pub: ... }) + if (options.priv) + this._importPrivate(options.priv, options.privEnc); + if (options.pub) + this._importPublic(options.pub, options.pubEnc); +} +module.exports = KeyPair; + +KeyPair.fromPublic = function fromPublic(ec, pub, enc) { + if (pub instanceof KeyPair) + return pub; + + return new KeyPair(ec, { + pub: pub, + pubEnc: enc + }); +}; + +KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { + if (priv instanceof KeyPair) + return priv; + + return new KeyPair(ec, { + priv: priv, + privEnc: enc + }); +}; + +KeyPair.prototype.validate = function validate() { + var pub = this.getPublic(); + + if (pub.isInfinity()) + return { result: false, reason: 'Invalid public key' }; + if (!pub.validate()) + return { result: false, reason: 'Public key is not a point' }; + if (!pub.mul(this.ec.curve.n).isInfinity()) + return { result: false, reason: 'Public key * N != O' }; + + return { result: true, reason: null }; +}; + +KeyPair.prototype.getPublic = function getPublic(compact, enc) { + // compact is optional argument + if (typeof compact === 'string') { + enc = compact; + compact = null; + } + + if (!this.pub) + this.pub = this.ec.g.mul(this.priv); + + if (!enc) + return this.pub; + + return this.pub.encode(enc, compact); +}; + +KeyPair.prototype.getPrivate = function getPrivate(enc) { + if (enc === 'hex') + return this.priv.toString(16, 2); + else + return this.priv; +}; + +KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { + this.priv = new BN(key, enc || 16); + + // Ensure that the priv won't be bigger than n, otherwise we may fail + // in fixed multiplication method + this.priv = this.priv.umod(this.ec.curve.n); +}; + +KeyPair.prototype._importPublic = function _importPublic(key, enc) { + if (key.x || key.y) { + // Montgomery points only have an `x` coordinate. + // Weierstrass/Edwards points on the other hand have both `x` and + // `y` coordinates. + if (this.ec.curve.type === 'mont') { + assert(key.x, 'Need x coordinate'); + } else if (this.ec.curve.type === 'short' || + this.ec.curve.type === 'edwards') { + assert(key.x && key.y, 'Need both x and y coordinate'); + } + this.pub = this.ec.curve.point(key.x, key.y); + return; + } + this.pub = this.ec.curve.decodePoint(key, enc); +}; + +// ECDH +KeyPair.prototype.derive = function derive(pub) { + return pub.mul(this.priv).getX(); +}; + +// ECDSA +KeyPair.prototype.sign = function sign(msg, enc, options) { + return this.ec.sign(msg, this, enc, options); +}; + +KeyPair.prototype.verify = function verify(msg, signature) { + return this.ec.verify(msg, signature, this); +}; + +KeyPair.prototype.inspect = function inspect() { + return ''; +}; + +},{"../../elliptic":68,"bn.js":17}],77:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); + +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; + +function Signature(options, enc) { + if (options instanceof Signature) + return options; + + if (this._importDER(options, enc)) + return; + + assert(options.r && options.s, 'Signature without r or s'); + this.r = new BN(options.r, 16); + this.s = new BN(options.s, 16); + if (options.recoveryParam === undefined) + this.recoveryParam = null; + else + this.recoveryParam = options.recoveryParam; +} +module.exports = Signature; + +function Position() { + this.place = 0; +} + +function getLength(buf, p) { + var initial = buf[p.place++]; + if (!(initial & 0x80)) { + return initial; + } + var octetLen = initial & 0xf; + var val = 0; + for (var i = 0, off = p.place; i < octetLen; i++, off++) { + val <<= 8; + val |= buf[off]; + } + p.place = off; + return val; +} + +function rmPadding(buf) { + var i = 0; + var len = buf.length - 1; + while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) { + i++; + } + if (i === 0) { + return buf; + } + return buf.slice(i); +} + +Signature.prototype._importDER = function _importDER(data, enc) { + data = utils.toArray(data, enc); + var p = new Position(); + if (data[p.place++] !== 0x30) { + return false; + } + var len = getLength(data, p); + if ((len + p.place) !== data.length) { + return false; + } + if (data[p.place++] !== 0x02) { + return false; + } + var rlen = getLength(data, p); + var r = data.slice(p.place, rlen + p.place); + p.place += rlen; + if (data[p.place++] !== 0x02) { + return false; + } + var slen = getLength(data, p); + if (data.length !== slen + p.place) { + return false; + } + var s = data.slice(p.place, slen + p.place); + if (r[0] === 0 && (r[1] & 0x80)) { + r = r.slice(1); + } + if (s[0] === 0 && (s[1] & 0x80)) { + s = s.slice(1); + } + + this.r = new BN(r); + this.s = new BN(s); + this.recoveryParam = null; + + return true; +}; + +function constructLength(arr, len) { + if (len < 0x80) { + arr.push(len); + return; + } + var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); + arr.push(octets | 0x80); + while (--octets) { + arr.push((len >>> (octets << 3)) & 0xff); + } + arr.push(len); +} + +Signature.prototype.toDER = function toDER(enc) { + var r = this.r.toArray(); + var s = this.s.toArray(); + + // Pad values + if (r[0] & 0x80) + r = [ 0 ].concat(r); + // Pad values + if (s[0] & 0x80) + s = [ 0 ].concat(s); + + r = rmPadding(r); + s = rmPadding(s); + + while (!s[0] && !(s[1] & 0x80)) { + s = s.slice(1); + } + var arr = [ 0x02 ]; + constructLength(arr, r.length); + arr = arr.concat(r); + arr.push(0x02); + constructLength(arr, s.length); + var backHalf = arr.concat(s); + var res = [ 0x30 ]; + constructLength(res, backHalf.length); + res = res.concat(backHalf); + return utils.encode(res, enc); +}; + +},{"../../elliptic":68,"bn.js":17}],78:[function(require,module,exports){ +'use strict'; + +var hash = require('hash.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; +var parseBytes = utils.parseBytes; +var KeyPair = require('./key'); +var Signature = require('./signature'); + +function EDDSA(curve) { + assert(curve === 'ed25519', 'only tested with ed25519 so far'); + + if (!(this instanceof EDDSA)) + return new EDDSA(curve); + + var curve = elliptic.curves[curve].curve; + this.curve = curve; + this.g = curve.g; + this.g.precompute(curve.n.bitLength() + 1); + + this.pointClass = curve.point().constructor; + this.encodingLength = Math.ceil(curve.n.bitLength() / 8); + this.hash = hash.sha512; +} + +module.exports = EDDSA; + +/** +* @param {Array|String} message - message bytes +* @param {Array|String|KeyPair} secret - secret bytes or a keypair +* @returns {Signature} - signature +*/ +EDDSA.prototype.sign = function sign(message, secret) { + message = parseBytes(message); + var key = this.keyFromSecret(secret); + var r = this.hashInt(key.messagePrefix(), message); + var R = this.g.mul(r); + var Rencoded = this.encodePoint(R); + var s_ = this.hashInt(Rencoded, key.pubBytes(), message) + .mul(key.priv()); + var S = r.add(s_).umod(this.curve.n); + return this.makeSignature({ R: R, S: S, Rencoded: Rencoded }); +}; + +/** +* @param {Array} message - message bytes +* @param {Array|String|Signature} sig - sig bytes +* @param {Array|String|Point|KeyPair} pub - public key +* @returns {Boolean} - true if public key matches sig of message +*/ +EDDSA.prototype.verify = function verify(message, sig, pub) { + message = parseBytes(message); + sig = this.makeSignature(sig); + var key = this.keyFromPublic(pub); + var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); + var SG = this.g.mul(sig.S()); + var RplusAh = sig.R().add(key.pub().mul(h)); + return RplusAh.eq(SG); +}; + +EDDSA.prototype.hashInt = function hashInt() { + var hash = this.hash(); + for (var i = 0; i < arguments.length; i++) + hash.update(arguments[i]); + return utils.intFromLE(hash.digest()).umod(this.curve.n); +}; + +EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { + return KeyPair.fromPublic(this, pub); +}; + +EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { + return KeyPair.fromSecret(this, secret); +}; + +EDDSA.prototype.makeSignature = function makeSignature(sig) { + if (sig instanceof Signature) + return sig; + return new Signature(this, sig); +}; + +/** +* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2 +* +* EDDSA defines methods for encoding and decoding points and integers. These are +* helper convenience methods, that pass along to utility functions implied +* parameters. +* +*/ +EDDSA.prototype.encodePoint = function encodePoint(point) { + var enc = point.getY().toArray('le', this.encodingLength); + enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0; + return enc; +}; + +EDDSA.prototype.decodePoint = function decodePoint(bytes) { + bytes = utils.parseBytes(bytes); + + var lastIx = bytes.length - 1; + var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80); + var xIsOdd = (bytes[lastIx] & 0x80) !== 0; + + var y = utils.intFromLE(normed); + return this.curve.pointFromY(y, xIsOdd); +}; + +EDDSA.prototype.encodeInt = function encodeInt(num) { + return num.toArray('le', this.encodingLength); +}; + +EDDSA.prototype.decodeInt = function decodeInt(bytes) { + return utils.intFromLE(bytes); +}; + +EDDSA.prototype.isPoint = function isPoint(val) { + return val instanceof this.pointClass; +}; + +},{"../../elliptic":68,"./key":79,"./signature":80,"hash.js":87}],79:[function(require,module,exports){ +'use strict'; + +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; +var parseBytes = utils.parseBytes; +var cachedProperty = utils.cachedProperty; + +/** +* @param {EDDSA} eddsa - instance +* @param {Object} params - public/private key parameters +* +* @param {Array} [params.secret] - secret seed bytes +* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms) +* @param {Array} [params.pub] - public key point encoded as bytes +* +*/ +function KeyPair(eddsa, params) { + this.eddsa = eddsa; + this._secret = parseBytes(params.secret); + if (eddsa.isPoint(params.pub)) + this._pub = params.pub; + else + this._pubBytes = parseBytes(params.pub); +} + +KeyPair.fromPublic = function fromPublic(eddsa, pub) { + if (pub instanceof KeyPair) + return pub; + return new KeyPair(eddsa, { pub: pub }); +}; + +KeyPair.fromSecret = function fromSecret(eddsa, secret) { + if (secret instanceof KeyPair) + return secret; + return new KeyPair(eddsa, { secret: secret }); +}; + +KeyPair.prototype.secret = function secret() { + return this._secret; +}; + +cachedProperty(KeyPair, 'pubBytes', function pubBytes() { + return this.eddsa.encodePoint(this.pub()); +}); + +cachedProperty(KeyPair, 'pub', function pub() { + if (this._pubBytes) + return this.eddsa.decodePoint(this._pubBytes); + return this.eddsa.g.mul(this.priv()); +}); + +cachedProperty(KeyPair, 'privBytes', function privBytes() { + var eddsa = this.eddsa; + var hash = this.hash(); + var lastIx = eddsa.encodingLength - 1; + + var a = hash.slice(0, eddsa.encodingLength); + a[0] &= 248; + a[lastIx] &= 127; + a[lastIx] |= 64; + + return a; +}); + +cachedProperty(KeyPair, 'priv', function priv() { + return this.eddsa.decodeInt(this.privBytes()); +}); + +cachedProperty(KeyPair, 'hash', function hash() { + return this.eddsa.hash().update(this.secret()).digest(); +}); + +cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() { + return this.hash().slice(this.eddsa.encodingLength); +}); + +KeyPair.prototype.sign = function sign(message) { + assert(this._secret, 'KeyPair can only verify'); + return this.eddsa.sign(message, this); +}; + +KeyPair.prototype.verify = function verify(message, sig) { + return this.eddsa.verify(message, sig, this); +}; + +KeyPair.prototype.getSecret = function getSecret(enc) { + assert(this._secret, 'KeyPair is public only'); + return utils.encode(this.secret(), enc); +}; + +KeyPair.prototype.getPublic = function getPublic(enc) { + return utils.encode(this.pubBytes(), enc); +}; + +module.exports = KeyPair; + +},{"../../elliptic":68}],80:[function(require,module,exports){ +'use strict'; + +var BN = require('bn.js'); +var elliptic = require('../../elliptic'); +var utils = elliptic.utils; +var assert = utils.assert; +var cachedProperty = utils.cachedProperty; +var parseBytes = utils.parseBytes; + +/** +* @param {EDDSA} eddsa - eddsa instance +* @param {Array|Object} sig - +* @param {Array|Point} [sig.R] - R point as Point or bytes +* @param {Array|bn} [sig.S] - S scalar as bn or bytes +* @param {Array} [sig.Rencoded] - R point encoded +* @param {Array} [sig.Sencoded] - S scalar encoded +*/ +function Signature(eddsa, sig) { + this.eddsa = eddsa; + + if (typeof sig !== 'object') + sig = parseBytes(sig); + + if (Array.isArray(sig)) { + sig = { + R: sig.slice(0, eddsa.encodingLength), + S: sig.slice(eddsa.encodingLength) + }; + } + + assert(sig.R && sig.S, 'Signature without R or S'); + + if (eddsa.isPoint(sig.R)) + this._R = sig.R; + if (sig.S instanceof BN) + this._S = sig.S; + + this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; + this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; +} + +cachedProperty(Signature, 'S', function S() { + return this.eddsa.decodeInt(this.Sencoded()); +}); + +cachedProperty(Signature, 'R', function R() { + return this.eddsa.decodePoint(this.Rencoded()); +}); + +cachedProperty(Signature, 'Rencoded', function Rencoded() { + return this.eddsa.encodePoint(this.R()); +}); + +cachedProperty(Signature, 'Sencoded', function Sencoded() { + return this.eddsa.encodeInt(this.S()); +}); + +Signature.prototype.toBytes = function toBytes() { + return this.Rencoded().concat(this.Sencoded()); +}; + +Signature.prototype.toHex = function toHex() { + return utils.encode(this.toBytes(), 'hex').toUpperCase(); +}; + +module.exports = Signature; + +},{"../../elliptic":68,"bn.js":17}],81:[function(require,module,exports){ +module.exports = { + doubles: { + step: 4, + points: [ + [ + 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a', + 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821' + ], + [ + '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508', + '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf' + ], + [ + '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739', + 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695' + ], + [ + '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640', + '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9' + ], + [ + '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c', + '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36' + ], + [ + '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda', + '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f' + ], + [ + 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa', + '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999' + ], + [ + '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0', + 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09' + ], + [ + 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d', + '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d' + ], + [ + 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d', + 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088' + ], + [ + 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1', + '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d' + ], + [ + '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0', + '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8' + ], + [ + '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047', + '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a' + ], + [ + '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862', + '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453' + ], + [ + '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7', + '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160' + ], + [ + '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd', + '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0' + ], + [ + '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83', + '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6' + ], + [ + '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a', + '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589' + ], + [ + '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8', + 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17' + ], + [ + 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d', + '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda' + ], + [ + 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725', + '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd' + ], + [ + '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754', + '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2' + ], + [ + '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c', + '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6' + ], + [ + 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6', + '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f' + ], + [ + '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39', + 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01' + ], + [ + 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891', + '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3' + ], + [ + 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b', + 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f' + ], + [ + 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03', + '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7' + ], + [ + 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d', + 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78' + ], + [ + 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070', + '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1' + ], + [ + '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4', + 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150' + ], + [ + '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da', + '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82' + ], + [ + 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11', + '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc' + ], + [ + '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e', + 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b' + ], + [ + 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41', + '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51' + ], + [ + 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef', + '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45' + ], + [ + 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8', + 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120' + ], + [ + '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d', + '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84' + ], + [ + '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96', + '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d' + ], + [ + '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd', + 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d' + ], + [ + '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5', + '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8' + ], + [ + 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266', + '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8' + ], + [ + '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71', + '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac' + ], + [ + '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac', + 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f' + ], + [ + '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751', + '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962' + ], + [ + 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e', + '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907' + ], + [ + '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241', + 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec' + ], + [ + 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3', + 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d' + ], + [ + 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f', + '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414' + ], + [ + '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19', + 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd' + ], + [ + '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be', + 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0' + ], + [ + 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9', + '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811' + ], + [ + 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2', + '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1' + ], + [ + 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13', + '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c' + ], + [ + '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c', + 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73' + ], + [ + '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba', + '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd' + ], + [ + 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151', + 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405' + ], + [ + '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073', + 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589' + ], + [ + '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458', + '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e' + ], + [ + '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b', + '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27' + ], + [ + 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366', + 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1' + ], + [ + '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa', + '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482' + ], + [ + '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0', + '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945' + ], + [ + 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787', + '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573' + ], + [ + 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e', + 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82' + ] + ] + }, + naf: { + wnd: 7, + points: [ + [ + 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9', + '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672' + ], + [ + '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4', + 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6' + ], + [ + '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc', + '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da' + ], + [ + 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe', + 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37' + ], + [ + '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb', + 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b' + ], + [ + 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8', + 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81' + ], + [ + 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e', + '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58' + ], + [ + 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34', + '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77' + ], + [ + '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c', + '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a' + ], + [ + '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5', + '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c' + ], + [ + '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f', + '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67' + ], + [ + '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714', + '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402' + ], + [ + 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729', + 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55' + ], + [ + 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db', + '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482' + ], + [ + '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4', + 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82' + ], + [ + '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5', + 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396' + ], + [ + '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479', + '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49' + ], + [ + '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d', + '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf' + ], + [ + '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f', + '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a' + ], + [ + '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb', + 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7' + ], + [ + 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9', + 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933' + ], + [ + '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963', + '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a' + ], + [ + '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74', + '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6' + ], + [ + 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530', + 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37' + ], + [ + '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b', + '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e' + ], + [ + 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247', + 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6' + ], + [ + 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1', + 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476' + ], + [ + '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120', + '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40' + ], + [ + '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435', + '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61' + ], + [ + '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18', + '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683' + ], + [ + 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8', + '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5' + ], + [ + '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb', + '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b' + ], + [ + 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f', + '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417' + ], + [ + '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143', + 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868' + ], + [ + '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba', + 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a' + ], + [ + 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45', + 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6' + ], + [ + '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a', + '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996' + ], + [ + '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e', + 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e' + ], + [ + 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8', + 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d' + ], + [ + '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c', + '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2' + ], + [ + '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519', + 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e' + ], + [ + '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab', + '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437' + ], + [ + '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca', + 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311' + ], + [ + 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf', + '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4' + ], + [ + '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610', + '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575' + ], + [ + '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4', + 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d' + ], + [ + '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c', + 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d' + ], + [ + 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940', + 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629' + ], + [ + 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980', + 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06' + ], + [ + '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3', + '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374' + ], + [ + '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf', + '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee' + ], + [ + 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63', + '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1' + ], + [ + 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448', + 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b' + ], + [ + '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf', + '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661' + ], + [ + '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5', + '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6' + ], + [ + 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6', + '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e' + ], + [ + '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5', + '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d' + ], + [ + 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99', + 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc' + ], + [ + '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51', + 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4' + ], + [ + '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5', + '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c' + ], + [ + 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5', + '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b' + ], + [ + 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997', + '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913' + ], + [ + '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881', + '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154' + ], + [ + '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5', + '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865' + ], + [ + '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66', + 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc' + ], + [ + '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726', + 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224' + ], + [ + '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede', + '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e' + ], + [ + '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94', + '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6' + ], + [ + '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31', + '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511' + ], + [ + '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51', + 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b' + ], + [ + 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252', + 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2' + ], + [ + '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5', + 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c' + ], + [ + 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b', + '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3' + ], + [ + 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4', + '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d' + ], + [ + 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f', + '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700' + ], + [ + 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889', + '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4' + ], + [ + '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246', + 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196' + ], + [ + '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984', + '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4' + ], + [ + '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a', + 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257' + ], + [ + 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030', + 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13' + ], + [ + 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197', + '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096' + ], + [ + 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593', + 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38' + ], + [ + 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef', + '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f' + ], + [ + '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38', + '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448' + ], + [ + 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a', + '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a' + ], + [ + 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111', + '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4' + ], + [ + '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502', + '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437' + ], + [ + '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea', + 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7' + ], + [ + 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26', + '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d' + ], + [ + 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986', + '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a' + ], + [ + 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e', + '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54' + ], + [ + '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4', + '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77' + ], + [ + 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda', + 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517' + ], + [ + '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859', + 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10' + ], + [ + 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f', + 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125' + ], + [ + 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c', + '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e' + ], + [ + '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942', + 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1' + ], + [ + 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a', + '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2' + ], + [ + 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80', + '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423' + ], + [ + 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d', + '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8' + ], + [ + '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1', + 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758' + ], + [ + '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63', + 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375' + ], + [ + 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352', + '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d' + ], + [ + '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193', + 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec' + ], + [ + '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00', + '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0' + ], + [ + '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58', + 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c' + ], + [ + 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7', + 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4' + ], + [ + '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8', + 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f' + ], + [ + '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e', + '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649' + ], + [ + '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d', + 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826' + ], + [ + '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b', + '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5' + ], + [ + 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f', + 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87' + ], + [ + '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6', + '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b' + ], + [ + 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297', + '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc' + ], + [ + '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a', + '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c' + ], + [ + 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c', + 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f' + ], + [ + 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52', + '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a' + ], + [ + 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb', + 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46' + ], + [ + '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065', + 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f' + ], + [ + '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917', + '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03' + ], + [ + '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9', + 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08' + ], + [ + '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3', + '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8' + ], + [ + '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57', + '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373' + ], + [ + '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66', + 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3' + ], + [ + '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8', + '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8' + ], + [ + '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721', + '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1' + ], + [ + '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180', + '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9' + ] + ] + } +}; + +},{}],82:[function(require,module,exports){ +'use strict'; + +var utils = exports; +var BN = require('bn.js'); +var minAssert = require('minimalistic-assert'); +var minUtils = require('minimalistic-crypto-utils'); + +utils.assert = minAssert; +utils.toArray = minUtils.toArray; +utils.zero2 = minUtils.zero2; +utils.toHex = minUtils.toHex; +utils.encode = minUtils.encode; + +// Represent num in a w-NAF form +function getNAF(num, w) { + var naf = []; + var ws = 1 << (w + 1); + var k = num.clone(); + while (k.cmpn(1) >= 0) { + var z; + if (k.isOdd()) { + var mod = k.andln(ws - 1); + if (mod > (ws >> 1) - 1) + z = (ws >> 1) - mod; + else + z = mod; + k.isubn(z); + } else { + z = 0; + } + naf.push(z); + + // Optimization, shift by word if possible + var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1; + for (var i = 1; i < shift; i++) + naf.push(0); + k.iushrn(shift); + } + + return naf; +} +utils.getNAF = getNAF; + +// Represent k1, k2 in a Joint Sparse Form +function getJSF(k1, k2) { + var jsf = [ + [], + [] + ]; + + k1 = k1.clone(); + k2 = k2.clone(); + var d1 = 0; + var d2 = 0; + while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { + + // First phase + var m14 = (k1.andln(3) + d1) & 3; + var m24 = (k2.andln(3) + d2) & 3; + if (m14 === 3) + m14 = -1; + if (m24 === 3) + m24 = -1; + var u1; + if ((m14 & 1) === 0) { + u1 = 0; + } else { + var m8 = (k1.andln(7) + d1) & 7; + if ((m8 === 3 || m8 === 5) && m24 === 2) + u1 = -m14; + else + u1 = m14; + } + jsf[0].push(u1); + + var u2; + if ((m24 & 1) === 0) { + u2 = 0; + } else { + var m8 = (k2.andln(7) + d2) & 7; + if ((m8 === 3 || m8 === 5) && m14 === 2) + u2 = -m24; + else + u2 = m24; + } + jsf[1].push(u2); + + // Second phase + if (2 * d1 === u1 + 1) + d1 = 1 - d1; + if (2 * d2 === u2 + 1) + d2 = 1 - d2; + k1.iushrn(1); + k2.iushrn(1); + } + + return jsf; +} +utils.getJSF = getJSF; + +function cachedProperty(obj, name, computer) { + var key = '_' + name; + obj.prototype[name] = function cachedProperty() { + return this[key] !== undefined ? this[key] : + this[key] = computer.call(this); + }; +} +utils.cachedProperty = cachedProperty; + +function parseBytes(bytes) { + return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : + bytes; +} +utils.parseBytes = parseBytes; + +function intFromLE(bytes) { + return new BN(bytes, 'hex', 'le'); +} +utils.intFromLE = intFromLE; + + +},{"bn.js":17,"minimalistic-assert":107,"minimalistic-crypto-utils":108}],83:[function(require,module,exports){ +module.exports={ + "_from": "elliptic@^6.0.0", + "_id": "elliptic@6.4.1", + "_inBundle": false, + "_integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "_location": "/elliptic", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "elliptic@^6.0.0", + "name": "elliptic", + "escapedName": "elliptic", + "rawSpec": "^6.0.0", + "saveSpec": null, + "fetchSpec": "^6.0.0" + }, + "_requiredBy": [ + "/browserify-sign", + "/create-ecdh" + ], + "_resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "_shasum": "c2d0b7776911b86722c632c3c06c60f2f819939a", + "_spec": "elliptic@^6.0.0", + "_where": "/Users/koen/Projects/opencamlib/src/emscriptenlib/node_modules/browserify-sign", + "author": { + "name": "Fedor Indutny", + "email": "fedor@indutny.com" + }, + "bugs": { + "url": "https://github.com/indutny/elliptic/issues" + }, + "bundleDependencies": false, + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "deprecated": false, + "description": "EC cryptography", + "devDependencies": { + "brfs": "^1.4.3", + "coveralls": "^2.11.3", + "grunt": "^0.4.5", + "grunt-browserify": "^5.0.0", + "grunt-cli": "^1.2.0", + "grunt-contrib-connect": "^1.0.0", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-uglify": "^1.0.1", + "grunt-mocha-istanbul": "^3.0.1", + "grunt-saucelabs": "^8.6.2", + "istanbul": "^0.4.2", + "jscs": "^2.9.0", + "jshint": "^2.6.0", + "mocha": "^2.1.0" + }, + "files": [ + "lib" + ], + "homepage": "https://github.com/indutny/elliptic", + "keywords": [ + "EC", + "Elliptic", + "curve", + "Cryptography" + ], + "license": "MIT", + "main": "lib/elliptic.js", + "name": "elliptic", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/indutny/elliptic.git" + }, + "scripts": { + "jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", + "jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", + "lint": "npm run jscs && npm run jshint", + "test": "npm run lint && npm run unit", + "unit": "istanbul test _mocha --reporter=spec test/index.js", + "version": "grunt dist && git add dist/" + }, + "version": "6.4.1" +} + +},{}],84:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var objectCreate = Object.create || objectCreatePolyfill +var objectKeys = Object.keys || objectKeysPolyfill +var bind = Function.prototype.bind || functionBindPolyfill + +function EventEmitter() { + if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { + this._events = objectCreate(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +var hasDefineProperty; +try { + var o = {}; + if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); + hasDefineProperty = o.x === 0; +} catch (err) { hasDefineProperty = false } +if (hasDefineProperty) { + Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + // check whether the input is a positive number (whose value is zero or + // greater and not a NaN). + if (typeof arg !== 'number' || arg < 0 || arg !== arg) + throw new TypeError('"defaultMaxListeners" must be a positive number'); + defaultMaxListeners = arg; + } + }); +} else { + EventEmitter.defaultMaxListeners = defaultMaxListeners; +} + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; +}; + +function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); +}; + +// These standalone emit* functions are used to optimize calling of event +// handlers for fast cases because emit() itself often has a variable number of +// arguments and can be deoptimized because of that. These functions always have +// the same number of arguments and thus do not get deoptimized, so the code +// inside them can execute faster. +function emitNone(handler, isFn, self) { + if (isFn) + handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self); + } +} +function emitOne(handler, isFn, self, arg1) { + if (isFn) + handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1); + } +} +function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) + handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2); + } +} +function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) + handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } +} + +function emitMany(handler, isFn, self, args) { + if (isFn) + handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].apply(self, args); + } +} + +EventEmitter.prototype.emit = function emit(type) { + var er, handler, len, args, i, events; + var doError = (type === 'error'); + + events = this._events; + if (events) + doError = (doError && events.error == null); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + if (arguments.length > 1) + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Unhandled "error" event. (' + er + ')'); + err.context = er; + throw err; + } + return false; + } + + handler = events[type]; + + if (!handler) + return false; + + var isFn = typeof handler === 'function'; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = target._events; + if (!events) { + events = target._events = objectCreate(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } + + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' "' + String(type) + '" listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit.'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + if (typeof console === 'object' && console.warn) { + console.warn('%s: %s', w.name, w.message); + } + } + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + switch (arguments.length) { + case 0: + return this.listener.call(this.target); + case 1: + return this.listener.call(this.target, arguments[0]); + case 2: + return this.listener.call(this.target, arguments[0], arguments[1]); + case 3: + return this.listener.call(this.target, arguments[0], arguments[1], + arguments[2]); + default: + var args = new Array(arguments.length); + for (var i = 0; i < args.length; ++i) + args[i] = arguments[i]; + this.listener.apply(this.target, args); + } + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = bind.call(onceWrapper, state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = this._events; + if (!events) + return this; + + list = events[type]; + if (!list) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else + spliceOne(list, position); + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (!events) + return this; + + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = objectCreate(null); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = objectKeys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = objectCreate(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (!events) + return []; + + var evlistener = events[type]; + if (!evlistener) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; +}; + +// About 1.5x faster than the two-arg version of Array#splice(). +function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); +} + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function objectCreatePolyfill(proto) { + var F = function() {}; + F.prototype = proto; + return new F; +} +function objectKeysPolyfill(obj) { + var keys = []; + for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { + keys.push(k); + } + return k; +} +function functionBindPolyfill(context) { + var fn = this; + return function () { + return fn.apply(context, arguments); + }; +} + +},{}],85:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer +var MD5 = require('md5.js') + +/* eslint-disable camelcase */ +function EVP_BytesToKey (password, salt, keyBits, ivLen) { + if (!Buffer.isBuffer(password)) password = Buffer.from(password, 'binary') + if (salt) { + if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, 'binary') + if (salt.length !== 8) throw new RangeError('salt should be Buffer with 8 byte length') + } + + var keyLen = keyBits / 8 + var key = Buffer.alloc(keyLen) + var iv = Buffer.alloc(ivLen || 0) + var tmp = Buffer.alloc(0) + + while (keyLen > 0 || ivLen > 0) { + var hash = new MD5() + hash.update(tmp) + hash.update(password) + if (salt) hash.update(salt) + tmp = hash.digest() + + var used = 0 + + if (keyLen > 0) { + var keyStart = key.length - keyLen + used = Math.min(keyLen, tmp.length) + tmp.copy(key, keyStart, 0, used) + keyLen -= used + } + + if (used < tmp.length && ivLen > 0) { + var ivStart = iv.length - ivLen + var length = Math.min(ivLen, tmp.length - used) + tmp.copy(iv, ivStart, used, used + length) + ivLen -= length + } + } + + tmp.fill(0) + return { key: key, iv: iv } +} + +module.exports = EVP_BytesToKey + +},{"md5.js":105,"safe-buffer":144}],86:[function(require,module,exports){ +'use strict' +var Buffer = require('safe-buffer').Buffer +var Transform = require('stream').Transform +var inherits = require('inherits') + +function throwIfNotStringOrBuffer (val, prefix) { + if (!Buffer.isBuffer(val) && typeof val !== 'string') { + throw new TypeError(prefix + ' must be a string or a buffer') + } +} + +function HashBase (blockSize) { + Transform.call(this) + + this._block = Buffer.allocUnsafe(blockSize) + this._blockSize = blockSize + this._blockOffset = 0 + this._length = [0, 0, 0, 0] + + this._finalized = false +} + +inherits(HashBase, Transform) + +HashBase.prototype._transform = function (chunk, encoding, callback) { + var error = null + try { + this.update(chunk, encoding) + } catch (err) { + error = err + } + + callback(error) +} + +HashBase.prototype._flush = function (callback) { + var error = null + try { + this.push(this.digest()) + } catch (err) { + error = err + } + + callback(error) +} + +HashBase.prototype.update = function (data, encoding) { + throwIfNotStringOrBuffer(data, 'Data') + if (this._finalized) throw new Error('Digest already called') + if (!Buffer.isBuffer(data)) data = Buffer.from(data, encoding) + + // consume data + var block = this._block + var offset = 0 + while (this._blockOffset + data.length - offset >= this._blockSize) { + for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++] + this._update() + this._blockOffset = 0 + } + while (offset < data.length) block[this._blockOffset++] = data[offset++] + + // update length + for (var j = 0, carry = data.length * 8; carry > 0; ++j) { + this._length[j] += carry + carry = (this._length[j] / 0x0100000000) | 0 + if (carry > 0) this._length[j] -= 0x0100000000 * carry + } + + return this +} + +HashBase.prototype._update = function () { + throw new Error('_update is not implemented') +} + +HashBase.prototype.digest = function (encoding) { + if (this._finalized) throw new Error('Digest already called') + this._finalized = true + + var digest = this._digest() + if (encoding !== undefined) digest = digest.toString(encoding) + + // reset state + this._block.fill(0) + this._blockOffset = 0 + for (var i = 0; i < 4; ++i) this._length[i] = 0 + + return digest +} + +HashBase.prototype._digest = function () { + throw new Error('_digest is not implemented') +} + +module.exports = HashBase + +},{"inherits":101,"safe-buffer":144,"stream":155}],87:[function(require,module,exports){ +var hash = exports; + +hash.utils = require('./hash/utils'); +hash.common = require('./hash/common'); +hash.sha = require('./hash/sha'); +hash.ripemd = require('./hash/ripemd'); +hash.hmac = require('./hash/hmac'); + +// Proxy hash functions to the main object +hash.sha1 = hash.sha.sha1; +hash.sha256 = hash.sha.sha256; +hash.sha224 = hash.sha.sha224; +hash.sha384 = hash.sha.sha384; +hash.sha512 = hash.sha.sha512; +hash.ripemd160 = hash.ripemd.ripemd160; + +},{"./hash/common":88,"./hash/hmac":89,"./hash/ripemd":90,"./hash/sha":91,"./hash/utils":98}],88:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var assert = require('minimalistic-assert'); + +function BlockHash() { + this.pending = null; + this.pendingTotal = 0; + this.blockSize = this.constructor.blockSize; + this.outSize = this.constructor.outSize; + this.hmacStrength = this.constructor.hmacStrength; + this.padLength = this.constructor.padLength / 8; + this.endian = 'big'; + + this._delta8 = this.blockSize / 8; + this._delta32 = this.blockSize / 32; +} +exports.BlockHash = BlockHash; + +BlockHash.prototype.update = function update(msg, enc) { + // Convert message to array, pad it, and join into 32bit blocks + msg = utils.toArray(msg, enc); + if (!this.pending) + this.pending = msg; + else + this.pending = this.pending.concat(msg); + this.pendingTotal += msg.length; + + // Enough data, try updating + if (this.pending.length >= this._delta8) { + msg = this.pending; + + // Process pending data in blocks + var r = msg.length % this._delta8; + this.pending = msg.slice(msg.length - r, msg.length); + if (this.pending.length === 0) + this.pending = null; + + msg = utils.join32(msg, 0, msg.length - r, this.endian); + for (var i = 0; i < msg.length; i += this._delta32) + this._update(msg, i, i + this._delta32); + } + + return this; +}; + +BlockHash.prototype.digest = function digest(enc) { + this.update(this._pad()); + assert(this.pending === null); + + return this._digest(enc); +}; + +BlockHash.prototype._pad = function pad() { + var len = this.pendingTotal; + var bytes = this._delta8; + var k = bytes - ((len + this.padLength) % bytes); + var res = new Array(k + this.padLength); + res[0] = 0x80; + for (var i = 1; i < k; i++) + res[i] = 0; + + // Append length + len <<= 3; + if (this.endian === 'big') { + for (var t = 8; t < this.padLength; t++) + res[i++] = 0; + + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = (len >>> 24) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = len & 0xff; + } else { + res[i++] = len & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 24) & 0xff; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + + for (t = 8; t < this.padLength; t++) + res[i++] = 0; + } + + return res; +}; + +},{"./utils":98,"minimalistic-assert":107}],89:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var assert = require('minimalistic-assert'); + +function Hmac(hash, key, enc) { + if (!(this instanceof Hmac)) + return new Hmac(hash, key, enc); + this.Hash = hash; + this.blockSize = hash.blockSize / 8; + this.outSize = hash.outSize / 8; + this.inner = null; + this.outer = null; + + this._init(utils.toArray(key, enc)); +} +module.exports = Hmac; + +Hmac.prototype._init = function init(key) { + // Shorten key, if needed + if (key.length > this.blockSize) + key = new this.Hash().update(key).digest(); + assert(key.length <= this.blockSize); + + // Add padding to key + for (var i = key.length; i < this.blockSize; i++) + key.push(0); + + for (i = 0; i < key.length; i++) + key[i] ^= 0x36; + this.inner = new this.Hash().update(key); + + // 0x36 ^ 0x5c = 0x6a + for (i = 0; i < key.length; i++) + key[i] ^= 0x6a; + this.outer = new this.Hash().update(key); +}; + +Hmac.prototype.update = function update(msg, enc) { + this.inner.update(msg, enc); + return this; +}; + +Hmac.prototype.digest = function digest(enc) { + this.outer.update(this.inner.digest()); + return this.outer.digest(enc); +}; + +},{"./utils":98,"minimalistic-assert":107}],90:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var common = require('./common'); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_3 = utils.sum32_3; +var sum32_4 = utils.sum32_4; +var BlockHash = common.BlockHash; + +function RIPEMD160() { + if (!(this instanceof RIPEMD160)) + return new RIPEMD160(); + + BlockHash.call(this); + + this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; + this.endian = 'little'; +} +utils.inherits(RIPEMD160, BlockHash); +exports.ripemd160 = RIPEMD160; + +RIPEMD160.blockSize = 512; +RIPEMD160.outSize = 160; +RIPEMD160.hmacStrength = 192; +RIPEMD160.padLength = 64; + +RIPEMD160.prototype._update = function update(msg, start) { + var A = this.h[0]; + var B = this.h[1]; + var C = this.h[2]; + var D = this.h[3]; + var E = this.h[4]; + var Ah = A; + var Bh = B; + var Ch = C; + var Dh = D; + var Eh = E; + for (var j = 0; j < 80; j++) { + var T = sum32( + rotl32( + sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), + s[j]), + E); + A = E; + E = D; + D = rotl32(C, 10); + C = B; + B = T; + T = sum32( + rotl32( + sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), + sh[j]), + Eh); + Ah = Eh; + Eh = Dh; + Dh = rotl32(Ch, 10); + Ch = Bh; + Bh = T; + } + T = sum32_3(this.h[1], C, Dh); + this.h[1] = sum32_3(this.h[2], D, Eh); + this.h[2] = sum32_3(this.h[3], E, Ah); + this.h[3] = sum32_3(this.h[4], A, Bh); + this.h[4] = sum32_3(this.h[0], B, Ch); + this.h[0] = T; +}; + +RIPEMD160.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'little'); + else + return utils.split32(this.h, 'little'); +}; + +function f(j, x, y, z) { + if (j <= 15) + return x ^ y ^ z; + else if (j <= 31) + return (x & y) | ((~x) & z); + else if (j <= 47) + return (x | (~y)) ^ z; + else if (j <= 63) + return (x & z) | (y & (~z)); + else + return x ^ (y | (~z)); +} + +function K(j) { + if (j <= 15) + return 0x00000000; + else if (j <= 31) + return 0x5a827999; + else if (j <= 47) + return 0x6ed9eba1; + else if (j <= 63) + return 0x8f1bbcdc; + else + return 0xa953fd4e; +} + +function Kh(j) { + if (j <= 15) + return 0x50a28be6; + else if (j <= 31) + return 0x5c4dd124; + else if (j <= 47) + return 0x6d703ef3; + else if (j <= 63) + return 0x7a6d76e9; + else + return 0x00000000; +} + +var r = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +]; + +var rh = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +]; + +var s = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +]; + +var sh = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +]; + +},{"./common":88,"./utils":98}],91:[function(require,module,exports){ +'use strict'; + +exports.sha1 = require('./sha/1'); +exports.sha224 = require('./sha/224'); +exports.sha256 = require('./sha/256'); +exports.sha384 = require('./sha/384'); +exports.sha512 = require('./sha/512'); + +},{"./sha/1":92,"./sha/224":93,"./sha/256":94,"./sha/384":95,"./sha/512":96}],92:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var shaCommon = require('./common'); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_5 = utils.sum32_5; +var ft_1 = shaCommon.ft_1; +var BlockHash = common.BlockHash; + +var sha1_K = [ + 0x5A827999, 0x6ED9EBA1, + 0x8F1BBCDC, 0xCA62C1D6 +]; + +function SHA1() { + if (!(this instanceof SHA1)) + return new SHA1(); + + BlockHash.call(this); + this.h = [ + 0x67452301, 0xefcdab89, 0x98badcfe, + 0x10325476, 0xc3d2e1f0 ]; + this.W = new Array(80); +} + +utils.inherits(SHA1, BlockHash); +module.exports = SHA1; + +SHA1.blockSize = 512; +SHA1.outSize = 160; +SHA1.hmacStrength = 80; +SHA1.padLength = 64; + +SHA1.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + + for(; i < W.length; i++) + W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + + for (i = 0; i < W.length; i++) { + var s = ~~(i / 20); + var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); + e = d; + d = c; + c = rotl32(b, 30); + b = a; + a = t; + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); +}; + +SHA1.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +},{"../common":88,"../utils":98,"./common":97}],93:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var SHA256 = require('./256'); + +function SHA224() { + if (!(this instanceof SHA224)) + return new SHA224(); + + SHA256.call(this); + this.h = [ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; +} +utils.inherits(SHA224, SHA256); +module.exports = SHA224; + +SHA224.blockSize = 512; +SHA224.outSize = 224; +SHA224.hmacStrength = 192; +SHA224.padLength = 64; + +SHA224.prototype._digest = function digest(enc) { + // Just truncate output + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 7), 'big'); + else + return utils.split32(this.h.slice(0, 7), 'big'); +}; + + +},{"../utils":98,"./256":94}],94:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var shaCommon = require('./common'); +var assert = require('minimalistic-assert'); + +var sum32 = utils.sum32; +var sum32_4 = utils.sum32_4; +var sum32_5 = utils.sum32_5; +var ch32 = shaCommon.ch32; +var maj32 = shaCommon.maj32; +var s0_256 = shaCommon.s0_256; +var s1_256 = shaCommon.s1_256; +var g0_256 = shaCommon.g0_256; +var g1_256 = shaCommon.g1_256; + +var BlockHash = common.BlockHash; + +var sha256_K = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +]; + +function SHA256() { + if (!(this instanceof SHA256)) + return new SHA256(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ]; + this.k = sha256_K; + this.W = new Array(64); +} +utils.inherits(SHA256, BlockHash); +module.exports = SHA256; + +SHA256.blockSize = 512; +SHA256.outSize = 256; +SHA256.hmacStrength = 192; +SHA256.padLength = 64; + +SHA256.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + for (; i < W.length; i++) + W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + var f = this.h[5]; + var g = this.h[6]; + var h = this.h[7]; + + assert(this.k.length === W.length); + for (i = 0; i < W.length; i++) { + var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); + var T2 = sum32(s0_256(a), maj32(a, b, c)); + h = g; + g = f; + f = e; + e = sum32(d, T1); + d = c; + c = b; + b = a; + a = sum32(T1, T2); + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); + this.h[5] = sum32(this.h[5], f); + this.h[6] = sum32(this.h[6], g); + this.h[7] = sum32(this.h[7], h); +}; + +SHA256.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +},{"../common":88,"../utils":98,"./common":97,"minimalistic-assert":107}],95:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); + +var SHA512 = require('./512'); + +function SHA384() { + if (!(this instanceof SHA384)) + return new SHA384(); + + SHA512.call(this); + this.h = [ + 0xcbbb9d5d, 0xc1059ed8, + 0x629a292a, 0x367cd507, + 0x9159015a, 0x3070dd17, + 0x152fecd8, 0xf70e5939, + 0x67332667, 0xffc00b31, + 0x8eb44a87, 0x68581511, + 0xdb0c2e0d, 0x64f98fa7, + 0x47b5481d, 0xbefa4fa4 ]; +} +utils.inherits(SHA384, SHA512); +module.exports = SHA384; + +SHA384.blockSize = 1024; +SHA384.outSize = 384; +SHA384.hmacStrength = 192; +SHA384.padLength = 128; + +SHA384.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 12), 'big'); + else + return utils.split32(this.h.slice(0, 12), 'big'); +}; + +},{"../utils":98,"./512":96}],96:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var common = require('../common'); +var assert = require('minimalistic-assert'); + +var rotr64_hi = utils.rotr64_hi; +var rotr64_lo = utils.rotr64_lo; +var shr64_hi = utils.shr64_hi; +var shr64_lo = utils.shr64_lo; +var sum64 = utils.sum64; +var sum64_hi = utils.sum64_hi; +var sum64_lo = utils.sum64_lo; +var sum64_4_hi = utils.sum64_4_hi; +var sum64_4_lo = utils.sum64_4_lo; +var sum64_5_hi = utils.sum64_5_hi; +var sum64_5_lo = utils.sum64_5_lo; + +var BlockHash = common.BlockHash; + +var sha512_K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function SHA512() { + if (!(this instanceof SHA512)) + return new SHA512(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xf3bcc908, + 0xbb67ae85, 0x84caa73b, + 0x3c6ef372, 0xfe94f82b, + 0xa54ff53a, 0x5f1d36f1, + 0x510e527f, 0xade682d1, + 0x9b05688c, 0x2b3e6c1f, + 0x1f83d9ab, 0xfb41bd6b, + 0x5be0cd19, 0x137e2179 ]; + this.k = sha512_K; + this.W = new Array(160); +} +utils.inherits(SHA512, BlockHash); +module.exports = SHA512; + +SHA512.blockSize = 1024; +SHA512.outSize = 512; +SHA512.hmacStrength = 192; +SHA512.padLength = 128; + +SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { + var W = this.W; + + // 32 x 32bit words + for (var i = 0; i < 32; i++) + W[i] = msg[start + i]; + for (; i < W.length; i += 2) { + var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 + var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); + var c1_hi = W[i - 14]; // i - 7 + var c1_lo = W[i - 13]; + var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 + var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); + var c3_hi = W[i - 32]; // i - 16 + var c3_lo = W[i - 31]; + + W[i] = sum64_4_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + W[i + 1] = sum64_4_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + } +}; + +SHA512.prototype._update = function _update(msg, start) { + this._prepareBlock(msg, start); + + var W = this.W; + + var ah = this.h[0]; + var al = this.h[1]; + var bh = this.h[2]; + var bl = this.h[3]; + var ch = this.h[4]; + var cl = this.h[5]; + var dh = this.h[6]; + var dl = this.h[7]; + var eh = this.h[8]; + var el = this.h[9]; + var fh = this.h[10]; + var fl = this.h[11]; + var gh = this.h[12]; + var gl = this.h[13]; + var hh = this.h[14]; + var hl = this.h[15]; + + assert(this.k.length === W.length); + for (var i = 0; i < W.length; i += 2) { + var c0_hi = hh; + var c0_lo = hl; + var c1_hi = s1_512_hi(eh, el); + var c1_lo = s1_512_lo(eh, el); + var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); + var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); + var c3_hi = this.k[i]; + var c3_lo = this.k[i + 1]; + var c4_hi = W[i]; + var c4_lo = W[i + 1]; + + var T1_hi = sum64_5_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + var T1_lo = sum64_5_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + + c0_hi = s0_512_hi(ah, al); + c0_lo = s0_512_lo(ah, al); + c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); + c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); + + var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); + var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); + + hh = gh; + hl = gl; + + gh = fh; + gl = fl; + + fh = eh; + fl = el; + + eh = sum64_hi(dh, dl, T1_hi, T1_lo); + el = sum64_lo(dl, dl, T1_hi, T1_lo); + + dh = ch; + dl = cl; + + ch = bh; + cl = bl; + + bh = ah; + bl = al; + + ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); + al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); + } + + sum64(this.h, 0, ah, al); + sum64(this.h, 2, bh, bl); + sum64(this.h, 4, ch, cl); + sum64(this.h, 6, dh, dl); + sum64(this.h, 8, eh, el); + sum64(this.h, 10, fh, fl); + sum64(this.h, 12, gh, gl); + sum64(this.h, 14, hh, hl); +}; + +SHA512.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +function ch64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ ((~xh) & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function ch64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ ((~xl) & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 28); + var c1_hi = rotr64_hi(xl, xh, 2); // 34 + var c2_hi = rotr64_hi(xl, xh, 7); // 39 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 28); + var c1_lo = rotr64_lo(xl, xh, 2); // 34 + var c2_lo = rotr64_lo(xl, xh, 7); // 39 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 14); + var c1_hi = rotr64_hi(xh, xl, 18); + var c2_hi = rotr64_hi(xl, xh, 9); // 41 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 14); + var c1_lo = rotr64_lo(xh, xl, 18); + var c2_lo = rotr64_lo(xl, xh, 9); // 41 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 1); + var c1_hi = rotr64_hi(xh, xl, 8); + var c2_hi = shr64_hi(xh, xl, 7); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 1); + var c1_lo = rotr64_lo(xh, xl, 8); + var c2_lo = shr64_lo(xh, xl, 7); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 19); + var c1_hi = rotr64_hi(xl, xh, 29); // 61 + var c2_hi = shr64_hi(xh, xl, 6); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 19); + var c1_lo = rotr64_lo(xl, xh, 29); // 61 + var c2_lo = shr64_lo(xh, xl, 6); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +},{"../common":88,"../utils":98,"minimalistic-assert":107}],97:[function(require,module,exports){ +'use strict'; + +var utils = require('../utils'); +var rotr32 = utils.rotr32; + +function ft_1(s, x, y, z) { + if (s === 0) + return ch32(x, y, z); + if (s === 1 || s === 3) + return p32(x, y, z); + if (s === 2) + return maj32(x, y, z); +} +exports.ft_1 = ft_1; + +function ch32(x, y, z) { + return (x & y) ^ ((~x) & z); +} +exports.ch32 = ch32; + +function maj32(x, y, z) { + return (x & y) ^ (x & z) ^ (y & z); +} +exports.maj32 = maj32; + +function p32(x, y, z) { + return x ^ y ^ z; +} +exports.p32 = p32; + +function s0_256(x) { + return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); +} +exports.s0_256 = s0_256; + +function s1_256(x) { + return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); +} +exports.s1_256 = s1_256; + +function g0_256(x) { + return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); +} +exports.g0_256 = g0_256; + +function g1_256(x) { + return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); +} +exports.g1_256 = g1_256; + +},{"../utils":98}],98:[function(require,module,exports){ +'use strict'; + +var assert = require('minimalistic-assert'); +var inherits = require('inherits'); + +exports.inherits = inherits; + +function isSurrogatePair(msg, i) { + if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) { + return false; + } + if (i < 0 || i + 1 >= msg.length) { + return false; + } + return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00; +} + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg === 'string') { + if (!enc) { + // Inspired by stringToUtf8ByteArray() in closure-library by Google + // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143 + // Apache License 2.0 + // https://github.com/google/closure-library/blob/master/LICENSE + var p = 0; + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + if (c < 128) { + res[p++] = c; + } else if (c < 2048) { + res[p++] = (c >> 6) | 192; + res[p++] = (c & 63) | 128; + } else if (isSurrogatePair(msg, i)) { + c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF); + res[p++] = (c >> 18) | 240; + res[p++] = ((c >> 12) & 63) | 128; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; + } else { + res[p++] = (c >> 12) | 224; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; + } + } + } else if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } + } else { + for (i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + } + return res; +} +exports.toArray = toArray; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +exports.toHex = toHex; + +function htonl(w) { + var res = (w >>> 24) | + ((w >>> 8) & 0xff00) | + ((w << 8) & 0xff0000) | + ((w & 0xff) << 24); + return res >>> 0; +} +exports.htonl = htonl; + +function toHex32(msg, endian) { + var res = ''; + for (var i = 0; i < msg.length; i++) { + var w = msg[i]; + if (endian === 'little') + w = htonl(w); + res += zero8(w.toString(16)); + } + return res; +} +exports.toHex32 = toHex32; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +exports.zero2 = zero2; + +function zero8(word) { + if (word.length === 7) + return '0' + word; + else if (word.length === 6) + return '00' + word; + else if (word.length === 5) + return '000' + word; + else if (word.length === 4) + return '0000' + word; + else if (word.length === 3) + return '00000' + word; + else if (word.length === 2) + return '000000' + word; + else if (word.length === 1) + return '0000000' + word; + else + return word; +} +exports.zero8 = zero8; + +function join32(msg, start, end, endian) { + var len = end - start; + assert(len % 4 === 0); + var res = new Array(len / 4); + for (var i = 0, k = start; i < res.length; i++, k += 4) { + var w; + if (endian === 'big') + w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; + else + w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; + res[i] = w >>> 0; + } + return res; +} +exports.join32 = join32; + +function split32(msg, endian) { + var res = new Array(msg.length * 4); + for (var i = 0, k = 0; i < msg.length; i++, k += 4) { + var m = msg[i]; + if (endian === 'big') { + res[k] = m >>> 24; + res[k + 1] = (m >>> 16) & 0xff; + res[k + 2] = (m >>> 8) & 0xff; + res[k + 3] = m & 0xff; + } else { + res[k + 3] = m >>> 24; + res[k + 2] = (m >>> 16) & 0xff; + res[k + 1] = (m >>> 8) & 0xff; + res[k] = m & 0xff; + } + } + return res; +} +exports.split32 = split32; + +function rotr32(w, b) { + return (w >>> b) | (w << (32 - b)); +} +exports.rotr32 = rotr32; + +function rotl32(w, b) { + return (w << b) | (w >>> (32 - b)); +} +exports.rotl32 = rotl32; + +function sum32(a, b) { + return (a + b) >>> 0; +} +exports.sum32 = sum32; + +function sum32_3(a, b, c) { + return (a + b + c) >>> 0; +} +exports.sum32_3 = sum32_3; + +function sum32_4(a, b, c, d) { + return (a + b + c + d) >>> 0; +} +exports.sum32_4 = sum32_4; + +function sum32_5(a, b, c, d, e) { + return (a + b + c + d + e) >>> 0; +} +exports.sum32_5 = sum32_5; + +function sum64(buf, pos, ah, al) { + var bh = buf[pos]; + var bl = buf[pos + 1]; + + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + buf[pos] = hi >>> 0; + buf[pos + 1] = lo; +} +exports.sum64 = sum64; + +function sum64_hi(ah, al, bh, bl) { + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + return hi >>> 0; +} +exports.sum64_hi = sum64_hi; + +function sum64_lo(ah, al, bh, bl) { + var lo = al + bl; + return lo >>> 0; +} +exports.sum64_lo = sum64_lo; + +function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + + var hi = ah + bh + ch + dh + carry; + return hi >>> 0; +} +exports.sum64_4_hi = sum64_4_hi; + +function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { + var lo = al + bl + cl + dl; + return lo >>> 0; +} +exports.sum64_4_lo = sum64_4_lo; + +function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + lo = (lo + el) >>> 0; + carry += lo < el ? 1 : 0; + + var hi = ah + bh + ch + dh + eh + carry; + return hi >>> 0; +} +exports.sum64_5_hi = sum64_5_hi; + +function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var lo = al + bl + cl + dl + el; + + return lo >>> 0; +} +exports.sum64_5_lo = sum64_5_lo; + +function rotr64_hi(ah, al, num) { + var r = (al << (32 - num)) | (ah >>> num); + return r >>> 0; +} +exports.rotr64_hi = rotr64_hi; + +function rotr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.rotr64_lo = rotr64_lo; + +function shr64_hi(ah, al, num) { + return ah >>> num; +} +exports.shr64_hi = shr64_hi; + +function shr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.shr64_lo = shr64_lo; + +},{"inherits":101,"minimalistic-assert":107}],99:[function(require,module,exports){ +'use strict'; + +var hash = require('hash.js'); +var utils = require('minimalistic-crypto-utils'); +var assert = require('minimalistic-assert'); + +function HmacDRBG(options) { + if (!(this instanceof HmacDRBG)) + return new HmacDRBG(options); + this.hash = options.hash; + this.predResist = !!options.predResist; + + this.outLen = this.hash.outSize; + this.minEntropy = options.minEntropy || this.hash.hmacStrength; + + this._reseed = null; + this.reseedInterval = null; + this.K = null; + this.V = null; + + var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex'); + var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex'); + var pers = utils.toArray(options.pers, options.persEnc || 'hex'); + assert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + this._init(entropy, nonce, pers); +} +module.exports = HmacDRBG; + +HmacDRBG.prototype._init = function init(entropy, nonce, pers) { + var seed = entropy.concat(nonce).concat(pers); + + this.K = new Array(this.outLen / 8); + this.V = new Array(this.outLen / 8); + for (var i = 0; i < this.V.length; i++) { + this.K[i] = 0x00; + this.V[i] = 0x01; + } + + this._update(seed); + this._reseed = 1; + this.reseedInterval = 0x1000000000000; // 2^48 +}; + +HmacDRBG.prototype._hmac = function hmac() { + return new hash.hmac(this.hash, this.K); +}; + +HmacDRBG.prototype._update = function update(seed) { + var kmac = this._hmac() + .update(this.V) + .update([ 0x00 ]); + if (seed) + kmac = kmac.update(seed); + this.K = kmac.digest(); + this.V = this._hmac().update(this.V).digest(); + if (!seed) + return; + + this.K = this._hmac() + .update(this.V) + .update([ 0x01 ]) + .update(seed) + .digest(); + this.V = this._hmac().update(this.V).digest(); +}; + +HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { + // Optional entropy enc + if (typeof entropyEnc !== 'string') { + addEnc = add; + add = entropyEnc; + entropyEnc = null; + } + + entropy = utils.toArray(entropy, entropyEnc); + add = utils.toArray(add, addEnc); + + assert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + + this._update(entropy.concat(add || [])); + this._reseed = 1; +}; + +HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { + if (this._reseed > this.reseedInterval) + throw new Error('Reseed is required'); + + // Optional encoding + if (typeof enc !== 'string') { + addEnc = add; + add = enc; + enc = null; + } + + // Optional additional data + if (add) { + add = utils.toArray(add, addEnc || 'hex'); + this._update(add); + } + + var temp = []; + while (temp.length < len) { + this.V = this._hmac().update(this.V).digest(); + temp = temp.concat(this.V); + } + + var res = temp.slice(0, len); + this._update(add); + this._reseed++; + return utils.encode(res, enc); +}; + +},{"hash.js":87,"minimalistic-assert":107,"minimalistic-crypto-utils":108}],100:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],101:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],102:[function(require,module,exports){ +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + +},{}],103:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + +},{}],104:[function(require,module,exports){ +// the whatwg-fetch polyfill installs the fetch() function +// on the global object (window or self) +// +// Return that as the export for use in Webpack, Browserify etc. +require('whatwg-fetch'); +module.exports = self.fetch.bind(self); + +},{"whatwg-fetch":164}],105:[function(require,module,exports){ +'use strict' +var inherits = require('inherits') +var HashBase = require('hash-base') +var Buffer = require('safe-buffer').Buffer + +var ARRAY16 = new Array(16) + +function MD5 () { + HashBase.call(this, 64) + + // state + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 +} + +inherits(MD5, HashBase) + +MD5.prototype._update = function () { + var M = ARRAY16 + for (var i = 0; i < 16; ++i) M[i] = this._block.readInt32LE(i * 4) + + var a = this._a + var b = this._b + var c = this._c + var d = this._d + + a = fnF(a, b, c, d, M[0], 0xd76aa478, 7) + d = fnF(d, a, b, c, M[1], 0xe8c7b756, 12) + c = fnF(c, d, a, b, M[2], 0x242070db, 17) + b = fnF(b, c, d, a, M[3], 0xc1bdceee, 22) + a = fnF(a, b, c, d, M[4], 0xf57c0faf, 7) + d = fnF(d, a, b, c, M[5], 0x4787c62a, 12) + c = fnF(c, d, a, b, M[6], 0xa8304613, 17) + b = fnF(b, c, d, a, M[7], 0xfd469501, 22) + a = fnF(a, b, c, d, M[8], 0x698098d8, 7) + d = fnF(d, a, b, c, M[9], 0x8b44f7af, 12) + c = fnF(c, d, a, b, M[10], 0xffff5bb1, 17) + b = fnF(b, c, d, a, M[11], 0x895cd7be, 22) + a = fnF(a, b, c, d, M[12], 0x6b901122, 7) + d = fnF(d, a, b, c, M[13], 0xfd987193, 12) + c = fnF(c, d, a, b, M[14], 0xa679438e, 17) + b = fnF(b, c, d, a, M[15], 0x49b40821, 22) + + a = fnG(a, b, c, d, M[1], 0xf61e2562, 5) + d = fnG(d, a, b, c, M[6], 0xc040b340, 9) + c = fnG(c, d, a, b, M[11], 0x265e5a51, 14) + b = fnG(b, c, d, a, M[0], 0xe9b6c7aa, 20) + a = fnG(a, b, c, d, M[5], 0xd62f105d, 5) + d = fnG(d, a, b, c, M[10], 0x02441453, 9) + c = fnG(c, d, a, b, M[15], 0xd8a1e681, 14) + b = fnG(b, c, d, a, M[4], 0xe7d3fbc8, 20) + a = fnG(a, b, c, d, M[9], 0x21e1cde6, 5) + d = fnG(d, a, b, c, M[14], 0xc33707d6, 9) + c = fnG(c, d, a, b, M[3], 0xf4d50d87, 14) + b = fnG(b, c, d, a, M[8], 0x455a14ed, 20) + a = fnG(a, b, c, d, M[13], 0xa9e3e905, 5) + d = fnG(d, a, b, c, M[2], 0xfcefa3f8, 9) + c = fnG(c, d, a, b, M[7], 0x676f02d9, 14) + b = fnG(b, c, d, a, M[12], 0x8d2a4c8a, 20) + + a = fnH(a, b, c, d, M[5], 0xfffa3942, 4) + d = fnH(d, a, b, c, M[8], 0x8771f681, 11) + c = fnH(c, d, a, b, M[11], 0x6d9d6122, 16) + b = fnH(b, c, d, a, M[14], 0xfde5380c, 23) + a = fnH(a, b, c, d, M[1], 0xa4beea44, 4) + d = fnH(d, a, b, c, M[4], 0x4bdecfa9, 11) + c = fnH(c, d, a, b, M[7], 0xf6bb4b60, 16) + b = fnH(b, c, d, a, M[10], 0xbebfbc70, 23) + a = fnH(a, b, c, d, M[13], 0x289b7ec6, 4) + d = fnH(d, a, b, c, M[0], 0xeaa127fa, 11) + c = fnH(c, d, a, b, M[3], 0xd4ef3085, 16) + b = fnH(b, c, d, a, M[6], 0x04881d05, 23) + a = fnH(a, b, c, d, M[9], 0xd9d4d039, 4) + d = fnH(d, a, b, c, M[12], 0xe6db99e5, 11) + c = fnH(c, d, a, b, M[15], 0x1fa27cf8, 16) + b = fnH(b, c, d, a, M[2], 0xc4ac5665, 23) + + a = fnI(a, b, c, d, M[0], 0xf4292244, 6) + d = fnI(d, a, b, c, M[7], 0x432aff97, 10) + c = fnI(c, d, a, b, M[14], 0xab9423a7, 15) + b = fnI(b, c, d, a, M[5], 0xfc93a039, 21) + a = fnI(a, b, c, d, M[12], 0x655b59c3, 6) + d = fnI(d, a, b, c, M[3], 0x8f0ccc92, 10) + c = fnI(c, d, a, b, M[10], 0xffeff47d, 15) + b = fnI(b, c, d, a, M[1], 0x85845dd1, 21) + a = fnI(a, b, c, d, M[8], 0x6fa87e4f, 6) + d = fnI(d, a, b, c, M[15], 0xfe2ce6e0, 10) + c = fnI(c, d, a, b, M[6], 0xa3014314, 15) + b = fnI(b, c, d, a, M[13], 0x4e0811a1, 21) + a = fnI(a, b, c, d, M[4], 0xf7537e82, 6) + d = fnI(d, a, b, c, M[11], 0xbd3af235, 10) + c = fnI(c, d, a, b, M[2], 0x2ad7d2bb, 15) + b = fnI(b, c, d, a, M[9], 0xeb86d391, 21) + + this._a = (this._a + a) | 0 + this._b = (this._b + b) | 0 + this._c = (this._c + c) | 0 + this._d = (this._d + d) | 0 +} + +MD5.prototype._digest = function () { + // create padding and handle blocks + this._block[this._blockOffset++] = 0x80 + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64) + this._update() + this._blockOffset = 0 + } + + this._block.fill(0, this._blockOffset, 56) + this._block.writeUInt32LE(this._length[0], 56) + this._block.writeUInt32LE(this._length[1], 60) + this._update() + + // produce result + var buffer = Buffer.allocUnsafe(16) + buffer.writeInt32LE(this._a, 0) + buffer.writeInt32LE(this._b, 4) + buffer.writeInt32LE(this._c, 8) + buffer.writeInt32LE(this._d, 12) + return buffer +} + +function rotl (x, n) { + return (x << n) | (x >>> (32 - n)) +} + +function fnF (a, b, c, d, m, k, s) { + return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + b) | 0 +} + +function fnG (a, b, c, d, m, k, s) { + return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + b) | 0 +} + +function fnH (a, b, c, d, m, k, s) { + return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + b) | 0 +} + +function fnI (a, b, c, d, m, k, s) { + return (rotl((a + ((c ^ (b | (~d)))) + m + k) | 0, s) + b) | 0 +} + +module.exports = MD5 + +},{"hash-base":86,"inherits":101,"safe-buffer":144}],106:[function(require,module,exports){ +var bn = require('bn.js'); +var brorand = require('brorand'); + +function MillerRabin(rand) { + this.rand = rand || new brorand.Rand(); +} +module.exports = MillerRabin; + +MillerRabin.create = function create(rand) { + return new MillerRabin(rand); +}; + +MillerRabin.prototype._randbelow = function _randbelow(n) { + var len = n.bitLength(); + var min_bytes = Math.ceil(len / 8); + + // Generage random bytes until a number less than n is found. + // This ensures that 0..n-1 have an equal probability of being selected. + do + var a = new bn(this.rand.generate(min_bytes)); + while (a.cmp(n) >= 0); + + return a; +}; + +MillerRabin.prototype._randrange = function _randrange(start, stop) { + // Generate a random number greater than or equal to start and less than stop. + var size = stop.sub(start); + return start.add(this._randbelow(size)); +}; + +MillerRabin.prototype.test = function test(n, k, cb) { + var len = n.bitLength(); + var red = bn.mont(n); + var rone = new bn(1).toRed(red); + + if (!k) + k = Math.max(1, (len / 48) | 0); + + // Find d and s, (n - 1) = (2 ^ s) * d; + var n1 = n.subn(1); + for (var s = 0; !n1.testn(s); s++) {} + var d = n.shrn(s); + + var rn1 = n1.toRed(red); + + var prime = true; + for (; k > 0; k--) { + var a = this._randrange(new bn(2), n1); + if (cb) + cb(a); + + var x = a.toRed(red).redPow(d); + if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) + continue; + + for (var i = 1; i < s; i++) { + x = x.redSqr(); + + if (x.cmp(rone) === 0) + return false; + if (x.cmp(rn1) === 0) + break; + } + + if (i === s) + return false; + } + + return prime; +}; + +MillerRabin.prototype.getDivisor = function getDivisor(n, k) { + var len = n.bitLength(); + var red = bn.mont(n); + var rone = new bn(1).toRed(red); + + if (!k) + k = Math.max(1, (len / 48) | 0); + + // Find d and s, (n - 1) = (2 ^ s) * d; + var n1 = n.subn(1); + for (var s = 0; !n1.testn(s); s++) {} + var d = n.shrn(s); + + var rn1 = n1.toRed(red); + + for (; k > 0; k--) { + var a = this._randrange(new bn(2), n1); + + var g = n.gcd(a); + if (g.cmpn(1) !== 0) + return g; + + var x = a.toRed(red).redPow(d); + if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) + continue; + + for (var i = 1; i < s; i++) { + x = x.redSqr(); + + if (x.cmp(rone) === 0) + return x.fromRed().subn(1).gcd(n); + if (x.cmp(rn1) === 0) + break; + } + + if (i === s) { + x = x.redSqr(); + return x.fromRed().subn(1).gcd(n); + } + } + + return false; +}; + +},{"bn.js":17,"brorand":18}],107:[function(require,module,exports){ +module.exports = assert; + +function assert(val, msg) { + if (!val) + throw new Error(msg || 'Assertion failed'); +} + +assert.equal = function assertEqual(l, r, msg) { + if (l != r) + throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); +}; + +},{}],108:[function(require,module,exports){ +'use strict'; + +var utils = exports; + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg !== 'string') { + for (var i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + return res; + } + if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (var i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } else { + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + var hi = c >> 8; + var lo = c & 0xff; + if (hi) + res.push(hi, lo); + else + res.push(lo); + } + } + return res; +} +utils.toArray = toArray; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +utils.zero2 = zero2; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +utils.toHex = toHex; + +utils.encode = function encode(arr, enc) { + if (enc === 'hex') + return toHex(arr); + else + return arr; +}; + +},{}],109:[function(require,module,exports){ +module.exports={"2.16.840.1.101.3.4.1.1": "aes-128-ecb", +"2.16.840.1.101.3.4.1.2": "aes-128-cbc", +"2.16.840.1.101.3.4.1.3": "aes-128-ofb", +"2.16.840.1.101.3.4.1.4": "aes-128-cfb", +"2.16.840.1.101.3.4.1.21": "aes-192-ecb", +"2.16.840.1.101.3.4.1.22": "aes-192-cbc", +"2.16.840.1.101.3.4.1.23": "aes-192-ofb", +"2.16.840.1.101.3.4.1.24": "aes-192-cfb", +"2.16.840.1.101.3.4.1.41": "aes-256-ecb", +"2.16.840.1.101.3.4.1.42": "aes-256-cbc", +"2.16.840.1.101.3.4.1.43": "aes-256-ofb", +"2.16.840.1.101.3.4.1.44": "aes-256-cfb" +} +},{}],110:[function(require,module,exports){ +// from https://github.com/indutny/self-signed/blob/gh-pages/lib/asn1.js +// Fedor, you are amazing. +'use strict' + +var asn1 = require('asn1.js') + +exports.certificate = require('./certificate') + +var RSAPrivateKey = asn1.define('RSAPrivateKey', function () { + this.seq().obj( + this.key('version').int(), + this.key('modulus').int(), + this.key('publicExponent').int(), + this.key('privateExponent').int(), + this.key('prime1').int(), + this.key('prime2').int(), + this.key('exponent1').int(), + this.key('exponent2').int(), + this.key('coefficient').int() + ) +}) +exports.RSAPrivateKey = RSAPrivateKey + +var RSAPublicKey = asn1.define('RSAPublicKey', function () { + this.seq().obj( + this.key('modulus').int(), + this.key('publicExponent').int() + ) +}) +exports.RSAPublicKey = RSAPublicKey + +var PublicKey = asn1.define('SubjectPublicKeyInfo', function () { + this.seq().obj( + this.key('algorithm').use(AlgorithmIdentifier), + this.key('subjectPublicKey').bitstr() + ) +}) +exports.PublicKey = PublicKey + +var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () { + this.seq().obj( + this.key('algorithm').objid(), + this.key('none').null_().optional(), + this.key('curve').objid().optional(), + this.key('params').seq().obj( + this.key('p').int(), + this.key('q').int(), + this.key('g').int() + ).optional() + ) +}) + +var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () { + this.seq().obj( + this.key('version').int(), + this.key('algorithm').use(AlgorithmIdentifier), + this.key('subjectPrivateKey').octstr() + ) +}) +exports.PrivateKey = PrivateKeyInfo +var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () { + this.seq().obj( + this.key('algorithm').seq().obj( + this.key('id').objid(), + this.key('decrypt').seq().obj( + this.key('kde').seq().obj( + this.key('id').objid(), + this.key('kdeparams').seq().obj( + this.key('salt').octstr(), + this.key('iters').int() + ) + ), + this.key('cipher').seq().obj( + this.key('algo').objid(), + this.key('iv').octstr() + ) + ) + ), + this.key('subjectPrivateKey').octstr() + ) +}) + +exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo + +var DSAPrivateKey = asn1.define('DSAPrivateKey', function () { + this.seq().obj( + this.key('version').int(), + this.key('p').int(), + this.key('q').int(), + this.key('g').int(), + this.key('pub_key').int(), + this.key('priv_key').int() + ) +}) +exports.DSAPrivateKey = DSAPrivateKey + +exports.DSAparam = asn1.define('DSAparam', function () { + this.int() +}) + +var ECPrivateKey = asn1.define('ECPrivateKey', function () { + this.seq().obj( + this.key('version').int(), + this.key('privateKey').octstr(), + this.key('parameters').optional().explicit(0).use(ECParameters), + this.key('publicKey').optional().explicit(1).bitstr() + ) +}) +exports.ECPrivateKey = ECPrivateKey + +var ECParameters = asn1.define('ECParameters', function () { + this.choice({ + namedCurve: this.objid() + }) +}) + +exports.signature = asn1.define('signature', function () { + this.seq().obj( + this.key('r').int(), + this.key('s').int() + ) +}) + +},{"./certificate":111,"asn1.js":2}],111:[function(require,module,exports){ +// from https://github.com/Rantanen/node-dtls/blob/25a7dc861bda38cfeac93a723500eea4f0ac2e86/Certificate.js +// thanks to @Rantanen + +'use strict' + +var asn = require('asn1.js') + +var Time = asn.define('Time', function () { + this.choice({ + utcTime: this.utctime(), + generalTime: this.gentime() + }) +}) + +var AttributeTypeValue = asn.define('AttributeTypeValue', function () { + this.seq().obj( + this.key('type').objid(), + this.key('value').any() + ) +}) + +var AlgorithmIdentifier = asn.define('AlgorithmIdentifier', function () { + this.seq().obj( + this.key('algorithm').objid(), + this.key('parameters').optional(), + this.key('curve').objid().optional() + ) +}) + +var SubjectPublicKeyInfo = asn.define('SubjectPublicKeyInfo', function () { + this.seq().obj( + this.key('algorithm').use(AlgorithmIdentifier), + this.key('subjectPublicKey').bitstr() + ) +}) + +var RelativeDistinguishedName = asn.define('RelativeDistinguishedName', function () { + this.setof(AttributeTypeValue) +}) + +var RDNSequence = asn.define('RDNSequence', function () { + this.seqof(RelativeDistinguishedName) +}) + +var Name = asn.define('Name', function () { + this.choice({ + rdnSequence: this.use(RDNSequence) + }) +}) + +var Validity = asn.define('Validity', function () { + this.seq().obj( + this.key('notBefore').use(Time), + this.key('notAfter').use(Time) + ) +}) + +var Extension = asn.define('Extension', function () { + this.seq().obj( + this.key('extnID').objid(), + this.key('critical').bool().def(false), + this.key('extnValue').octstr() + ) +}) + +var TBSCertificate = asn.define('TBSCertificate', function () { + this.seq().obj( + this.key('version').explicit(0).int().optional(), + this.key('serialNumber').int(), + this.key('signature').use(AlgorithmIdentifier), + this.key('issuer').use(Name), + this.key('validity').use(Validity), + this.key('subject').use(Name), + this.key('subjectPublicKeyInfo').use(SubjectPublicKeyInfo), + this.key('issuerUniqueID').implicit(1).bitstr().optional(), + this.key('subjectUniqueID').implicit(2).bitstr().optional(), + this.key('extensions').explicit(3).seqof(Extension).optional() + ) +}) + +var X509Certificate = asn.define('X509Certificate', function () { + this.seq().obj( + this.key('tbsCertificate').use(TBSCertificate), + this.key('signatureAlgorithm').use(AlgorithmIdentifier), + this.key('signatureValue').bitstr() + ) +}) + +module.exports = X509Certificate + +},{"asn1.js":2}],112:[function(require,module,exports){ +(function (Buffer){ +// adapted from https://github.com/apatil/pemstrip +var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r\+\/\=]+)[\n\r]+/m +var startRegex = /^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----/m +var fullRegex = /^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----([0-9A-z\n\r\+\/\=]+)-----END \1-----$/m +var evp = require('evp_bytestokey') +var ciphers = require('browserify-aes') +module.exports = function (okey, password) { + var key = okey.toString() + var match = key.match(findProc) + var decrypted + if (!match) { + var match2 = key.match(fullRegex) + decrypted = new Buffer(match2[2].replace(/[\r\n]/g, ''), 'base64') + } else { + var suite = 'aes' + match[1] + var iv = new Buffer(match[2], 'hex') + var cipherText = new Buffer(match[3].replace(/[\r\n]/g, ''), 'base64') + var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key + var out = [] + var cipher = ciphers.createDecipheriv(suite, cipherKey, iv) + out.push(cipher.update(cipherText)) + out.push(cipher.final()) + decrypted = Buffer.concat(out) + } + var tag = key.match(startRegex)[1] + return { + tag: tag, + data: decrypted + } +} + +}).call(this,require("buffer").Buffer) +},{"browserify-aes":22,"buffer":49,"evp_bytestokey":85}],113:[function(require,module,exports){ +var asn1 = require('./asn1') +var aesid = require('./aesid.json') +var fixProc = require('./fixProc') +var ciphers = require('browserify-aes') +var compat = require('pbkdf2') +var Buffer = require('safe-buffer').Buffer +module.exports = parseKeys + +function parseKeys (buffer) { + var password + if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) { + password = buffer.passphrase + buffer = buffer.key + } + if (typeof buffer === 'string') { + buffer = Buffer.from(buffer) + } + + var stripped = fixProc(buffer, password) + + var type = stripped.tag + var data = stripped.data + var subtype, ndata + switch (type) { + case 'CERTIFICATE': + ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo + // falls through + case 'PUBLIC KEY': + if (!ndata) { + ndata = asn1.PublicKey.decode(data, 'der') + } + subtype = ndata.algorithm.algorithm.join('.') + switch (subtype) { + case '1.2.840.113549.1.1.1': + return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der') + case '1.2.840.10045.2.1': + ndata.subjectPrivateKey = ndata.subjectPublicKey + return { + type: 'ec', + data: ndata + } + case '1.2.840.10040.4.1': + ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der') + return { + type: 'dsa', + data: ndata.algorithm.params + } + default: throw new Error('unknown key id ' + subtype) + } + throw new Error('unknown key type ' + type) + case 'ENCRYPTED PRIVATE KEY': + data = asn1.EncryptedPrivateKey.decode(data, 'der') + data = decrypt(data, password) + // falls through + case 'PRIVATE KEY': + ndata = asn1.PrivateKey.decode(data, 'der') + subtype = ndata.algorithm.algorithm.join('.') + switch (subtype) { + case '1.2.840.113549.1.1.1': + return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der') + case '1.2.840.10045.2.1': + return { + curve: ndata.algorithm.curve, + privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey + } + case '1.2.840.10040.4.1': + ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der') + return { + type: 'dsa', + params: ndata.algorithm.params + } + default: throw new Error('unknown key id ' + subtype) + } + throw new Error('unknown key type ' + type) + case 'RSA PUBLIC KEY': + return asn1.RSAPublicKey.decode(data, 'der') + case 'RSA PRIVATE KEY': + return asn1.RSAPrivateKey.decode(data, 'der') + case 'DSA PRIVATE KEY': + return { + type: 'dsa', + params: asn1.DSAPrivateKey.decode(data, 'der') + } + case 'EC PRIVATE KEY': + data = asn1.ECPrivateKey.decode(data, 'der') + return { + curve: data.parameters.value, + privateKey: data.privateKey + } + default: throw new Error('unknown key type ' + type) + } +} +parseKeys.signature = asn1.signature +function decrypt (data, password) { + var salt = data.algorithm.decrypt.kde.kdeparams.salt + var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10) + var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')] + var iv = data.algorithm.decrypt.cipher.iv + var cipherText = data.subjectPrivateKey + var keylen = parseInt(algo.split('-')[1], 10) / 8 + var key = compat.pbkdf2Sync(password, salt, iters, keylen, 'sha1') + var cipher = ciphers.createDecipheriv(algo, key, iv) + var out = [] + out.push(cipher.update(cipherText)) + out.push(cipher.final()) + return Buffer.concat(out) +} + +},{"./aesid.json":109,"./asn1":110,"./fixProc":112,"browserify-aes":22,"pbkdf2":115,"safe-buffer":144}],114:[function(require,module,exports){ +(function (process){ +// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, +// backported and transplited with Babel, with backwards-compat fixes + +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function (path) { + if (typeof path !== 'string') path = path + ''; + if (path.length === 0) return '.'; + var code = path.charCodeAt(0); + var hasRoot = code === 47 /*/*/; + var end = -1; + var matchedSlash = true; + for (var i = path.length - 1; i >= 1; --i) { + code = path.charCodeAt(i); + if (code === 47 /*/*/) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) return hasRoot ? '/' : '.'; + if (hasRoot && end === 1) { + // return '//'; + // Backwards-compat fix: + return '/'; + } + return path.slice(0, end); +}; + +function basename(path) { + if (typeof path !== 'string') path = path + ''; + + var start = 0; + var end = -1; + var matchedSlash = true; + var i; + + for (i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // path component + matchedSlash = false; + end = i + 1; + } + } + + if (end === -1) return ''; + return path.slice(start, end); +} + +// Uses a mixed approach for backwards-compatibility, as ext behavior changed +// in new Node.js versions, so only basename() above is backported here +exports.basename = function (path, ext) { + var f = basename(path); + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + +exports.extname = function (path) { + if (typeof path !== 'string') path = path + ''; + var startDot = -1; + var startPart = 0; + var end = -1; + var matchedSlash = true; + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + var preDotState = 0; + for (var i = path.length - 1; i >= 0; --i) { + var code = path.charCodeAt(i); + if (code === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === 46 /*.*/) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) + startDot = i; + else if (preDotState !== 1) + preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if (startDot === -1 || end === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + return ''; + } + return path.slice(startDot, end); +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":121}],115:[function(require,module,exports){ +exports.pbkdf2 = require('./lib/async') +exports.pbkdf2Sync = require('./lib/sync') + +},{"./lib/async":116,"./lib/sync":119}],116:[function(require,module,exports){ +(function (process,global){ +var checkParameters = require('./precondition') +var defaultEncoding = require('./default-encoding') +var sync = require('./sync') +var Buffer = require('safe-buffer').Buffer + +var ZERO_BUF +var subtle = global.crypto && global.crypto.subtle +var toBrowser = { + 'sha': 'SHA-1', + 'sha-1': 'SHA-1', + 'sha1': 'SHA-1', + 'sha256': 'SHA-256', + 'sha-256': 'SHA-256', + 'sha384': 'SHA-384', + 'sha-384': 'SHA-384', + 'sha-512': 'SHA-512', + 'sha512': 'SHA-512' +} +var checks = [] +function checkNative (algo) { + if (global.process && !global.process.browser) { + return Promise.resolve(false) + } + if (!subtle || !subtle.importKey || !subtle.deriveBits) { + return Promise.resolve(false) + } + if (checks[algo] !== undefined) { + return checks[algo] + } + ZERO_BUF = ZERO_BUF || Buffer.alloc(8) + var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo) + .then(function () { + return true + }).catch(function () { + return false + }) + checks[algo] = prom + return prom +} + +function browserPbkdf2 (password, salt, iterations, length, algo) { + return subtle.importKey( + 'raw', password, {name: 'PBKDF2'}, false, ['deriveBits'] + ).then(function (key) { + return subtle.deriveBits({ + name: 'PBKDF2', + salt: salt, + iterations: iterations, + hash: { + name: algo + } + }, key, length << 3) + }).then(function (res) { + return Buffer.from(res) + }) +} + +function resolvePromise (promise, callback) { + promise.then(function (out) { + process.nextTick(function () { + callback(null, out) + }) + }, function (e) { + process.nextTick(function () { + callback(e) + }) + }) +} +module.exports = function (password, salt, iterations, keylen, digest, callback) { + if (typeof digest === 'function') { + callback = digest + digest = undefined + } + + digest = digest || 'sha1' + var algo = toBrowser[digest.toLowerCase()] + + if (!algo || typeof global.Promise !== 'function') { + return process.nextTick(function () { + var out + try { + out = sync(password, salt, iterations, keylen, digest) + } catch (e) { + return callback(e) + } + callback(null, out) + }) + } + + checkParameters(password, salt, iterations, keylen) + if (typeof callback !== 'function') throw new Error('No callback provided to pbkdf2') + if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding) + if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding) + + resolvePromise(checkNative(algo).then(function (resp) { + if (resp) return browserPbkdf2(password, salt, iterations, keylen, algo) + + return sync(password, salt, iterations, keylen, digest) + }), callback) +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./default-encoding":117,"./precondition":118,"./sync":119,"_process":121,"safe-buffer":144}],117:[function(require,module,exports){ +(function (process){ +var defaultEncoding +/* istanbul ignore next */ +if (process.browser) { + defaultEncoding = 'utf-8' +} else { + var pVersionMajor = parseInt(process.version.split('.')[0].slice(1), 10) + + defaultEncoding = pVersionMajor >= 6 ? 'utf-8' : 'binary' +} +module.exports = defaultEncoding + +}).call(this,require('_process')) +},{"_process":121}],118:[function(require,module,exports){ +(function (Buffer){ +var MAX_ALLOC = Math.pow(2, 30) - 1 // default in iojs + +function checkBuffer (buf, name) { + if (typeof buf !== 'string' && !Buffer.isBuffer(buf)) { + throw new TypeError(name + ' must be a buffer or string') + } +} + +module.exports = function (password, salt, iterations, keylen) { + checkBuffer(password, 'Password') + checkBuffer(salt, 'Salt') + + if (typeof iterations !== 'number') { + throw new TypeError('Iterations not a number') + } + + if (iterations < 0) { + throw new TypeError('Bad iterations') + } + + if (typeof keylen !== 'number') { + throw new TypeError('Key length not a number') + } + + if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { /* eslint no-self-compare: 0 */ + throw new TypeError('Bad key length') + } +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":102}],119:[function(require,module,exports){ +var md5 = require('create-hash/md5') +var RIPEMD160 = require('ripemd160') +var sha = require('sha.js') + +var checkParameters = require('./precondition') +var defaultEncoding = require('./default-encoding') +var Buffer = require('safe-buffer').Buffer +var ZEROS = Buffer.alloc(128) +var sizes = { + md5: 16, + sha1: 20, + sha224: 28, + sha256: 32, + sha384: 48, + sha512: 64, + rmd160: 20, + ripemd160: 20 +} + +function Hmac (alg, key, saltLen) { + var hash = getDigest(alg) + var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 + + if (key.length > blocksize) { + key = hash(key) + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) + } + + var ipad = Buffer.allocUnsafe(blocksize + sizes[alg]) + var opad = Buffer.allocUnsafe(blocksize + sizes[alg]) + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + + var ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4) + ipad.copy(ipad1, 0, 0, blocksize) + this.ipad1 = ipad1 + this.ipad2 = ipad + this.opad = opad + this.alg = alg + this.blocksize = blocksize + this.hash = hash + this.size = sizes[alg] +} + +Hmac.prototype.run = function (data, ipad) { + data.copy(ipad, this.blocksize) + var h = this.hash(ipad) + h.copy(this.opad, this.blocksize) + return this.hash(this.opad) +} + +function getDigest (alg) { + function shaFunc (data) { + return sha(alg).update(data).digest() + } + function rmd160Func (data) { + return new RIPEMD160().update(data).digest() + } + + if (alg === 'rmd160' || alg === 'ripemd160') return rmd160Func + if (alg === 'md5') return md5 + return shaFunc +} + +function pbkdf2 (password, salt, iterations, keylen, digest) { + checkParameters(password, salt, iterations, keylen) + + if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding) + if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding) + + digest = digest || 'sha1' + + var hmac = new Hmac(digest, password, salt.length) + + var DK = Buffer.allocUnsafe(keylen) + var block1 = Buffer.allocUnsafe(salt.length + 4) + salt.copy(block1, 0, 0, salt.length) + + var destPos = 0 + var hLen = sizes[digest] + var l = Math.ceil(keylen / hLen) + + for (var i = 1; i <= l; i++) { + block1.writeUInt32BE(i, salt.length) + + var T = hmac.run(block1, hmac.ipad1) + var U = T + + for (var j = 1; j < iterations; j++) { + U = hmac.run(U, hmac.ipad2) + for (var k = 0; k < hLen; k++) T[k] ^= U[k] + } + + T.copy(DK, destPos) + destPos += hLen + } + + return DK +} + +module.exports = pbkdf2 + +},{"./default-encoding":117,"./precondition":118,"create-hash/md5":54,"ripemd160":143,"safe-buffer":144,"sha.js":146}],120:[function(require,module,exports){ +(function (process){ +'use strict'; + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + + +}).call(this,require('_process')) +},{"_process":121}],121:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],122:[function(require,module,exports){ +exports.publicEncrypt = require('./publicEncrypt') +exports.privateDecrypt = require('./privateDecrypt') + +exports.privateEncrypt = function privateEncrypt (key, buf) { + return exports.publicEncrypt(key, buf, true) +} + +exports.publicDecrypt = function publicDecrypt (key, buf) { + return exports.privateDecrypt(key, buf, true) +} + +},{"./privateDecrypt":124,"./publicEncrypt":125}],123:[function(require,module,exports){ +var createHash = require('create-hash') +var Buffer = require('safe-buffer').Buffer + +module.exports = function (seed, len) { + var t = Buffer.alloc(0) + var i = 0 + var c + while (t.length < len) { + c = i2ops(i++) + t = Buffer.concat([t, createHash('sha1').update(seed).update(c).digest()]) + } + return t.slice(0, len) +} + +function i2ops (c) { + var out = Buffer.allocUnsafe(4) + out.writeUInt32BE(c, 0) + return out +} + +},{"create-hash":53,"safe-buffer":144}],124:[function(require,module,exports){ +var parseKeys = require('parse-asn1') +var mgf = require('./mgf') +var xor = require('./xor') +var BN = require('bn.js') +var crt = require('browserify-rsa') +var createHash = require('create-hash') +var withPublic = require('./withPublic') +var Buffer = require('safe-buffer').Buffer + +module.exports = function privateDecrypt (privateKey, enc, reverse) { + var padding + if (privateKey.padding) { + padding = privateKey.padding + } else if (reverse) { + padding = 1 + } else { + padding = 4 + } + + var key = parseKeys(privateKey) + var k = key.modulus.byteLength() + if (enc.length > k || new BN(enc).cmp(key.modulus) >= 0) { + throw new Error('decryption error') + } + var msg + if (reverse) { + msg = withPublic(new BN(enc), key) + } else { + msg = crt(enc, key) + } + var zBuffer = Buffer.alloc(k - msg.length) + msg = Buffer.concat([zBuffer, msg], k) + if (padding === 4) { + return oaep(key, msg) + } else if (padding === 1) { + return pkcs1(key, msg, reverse) + } else if (padding === 3) { + return msg + } else { + throw new Error('unknown padding') + } +} + +function oaep (key, msg) { + var k = key.modulus.byteLength() + var iHash = createHash('sha1').update(Buffer.alloc(0)).digest() + var hLen = iHash.length + if (msg[0] !== 0) { + throw new Error('decryption error') + } + var maskedSeed = msg.slice(1, hLen + 1) + var maskedDb = msg.slice(hLen + 1) + var seed = xor(maskedSeed, mgf(maskedDb, hLen)) + var db = xor(maskedDb, mgf(seed, k - hLen - 1)) + if (compare(iHash, db.slice(0, hLen))) { + throw new Error('decryption error') + } + var i = hLen + while (db[i] === 0) { + i++ + } + if (db[i++] !== 1) { + throw new Error('decryption error') + } + return db.slice(i) +} + +function pkcs1 (key, msg, reverse) { + var p1 = msg.slice(0, 2) + var i = 2 + var status = 0 + while (msg[i++] !== 0) { + if (i >= msg.length) { + status++ + break + } + } + var ps = msg.slice(2, i - 1) + + if ((p1.toString('hex') !== '0002' && !reverse) || (p1.toString('hex') !== '0001' && reverse)) { + status++ + } + if (ps.length < 8) { + status++ + } + if (status) { + throw new Error('decryption error') + } + return msg.slice(i) +} +function compare (a, b) { + a = Buffer.from(a) + b = Buffer.from(b) + var dif = 0 + var len = a.length + if (a.length !== b.length) { + dif++ + len = Math.min(a.length, b.length) + } + var i = -1 + while (++i < len) { + dif += (a[i] ^ b[i]) + } + return dif +} + +},{"./mgf":123,"./withPublic":126,"./xor":127,"bn.js":17,"browserify-rsa":40,"create-hash":53,"parse-asn1":113,"safe-buffer":144}],125:[function(require,module,exports){ +var parseKeys = require('parse-asn1') +var randomBytes = require('randombytes') +var createHash = require('create-hash') +var mgf = require('./mgf') +var xor = require('./xor') +var BN = require('bn.js') +var withPublic = require('./withPublic') +var crt = require('browserify-rsa') +var Buffer = require('safe-buffer').Buffer + +module.exports = function publicEncrypt (publicKey, msg, reverse) { + var padding + if (publicKey.padding) { + padding = publicKey.padding + } else if (reverse) { + padding = 1 + } else { + padding = 4 + } + var key = parseKeys(publicKey) + var paddedMsg + if (padding === 4) { + paddedMsg = oaep(key, msg) + } else if (padding === 1) { + paddedMsg = pkcs1(key, msg, reverse) + } else if (padding === 3) { + paddedMsg = new BN(msg) + if (paddedMsg.cmp(key.modulus) >= 0) { + throw new Error('data too long for modulus') + } + } else { + throw new Error('unknown padding') + } + if (reverse) { + return crt(paddedMsg, key) + } else { + return withPublic(paddedMsg, key) + } +} + +function oaep (key, msg) { + var k = key.modulus.byteLength() + var mLen = msg.length + var iHash = createHash('sha1').update(Buffer.alloc(0)).digest() + var hLen = iHash.length + var hLen2 = 2 * hLen + if (mLen > k - hLen2 - 2) { + throw new Error('message too long') + } + var ps = Buffer.alloc(k - mLen - hLen2 - 2) + var dblen = k - hLen - 1 + var seed = randomBytes(hLen) + var maskedDb = xor(Buffer.concat([iHash, ps, Buffer.alloc(1, 1), msg], dblen), mgf(seed, dblen)) + var maskedSeed = xor(seed, mgf(maskedDb, hLen)) + return new BN(Buffer.concat([Buffer.alloc(1), maskedSeed, maskedDb], k)) +} +function pkcs1 (key, msg, reverse) { + var mLen = msg.length + var k = key.modulus.byteLength() + if (mLen > k - 11) { + throw new Error('message too long') + } + var ps + if (reverse) { + ps = Buffer.alloc(k - mLen - 3, 0xff) + } else { + ps = nonZero(k - mLen - 3) + } + return new BN(Buffer.concat([Buffer.from([0, reverse ? 1 : 2]), ps, Buffer.alloc(1), msg], k)) +} +function nonZero (len) { + var out = Buffer.allocUnsafe(len) + var i = 0 + var cache = randomBytes(len * 2) + var cur = 0 + var num + while (i < len) { + if (cur === cache.length) { + cache = randomBytes(len * 2) + cur = 0 + } + num = cache[cur++] + if (num) { + out[i++] = num + } + } + return out +} + +},{"./mgf":123,"./withPublic":126,"./xor":127,"bn.js":17,"browserify-rsa":40,"create-hash":53,"parse-asn1":113,"randombytes":128,"safe-buffer":144}],126:[function(require,module,exports){ +var BN = require('bn.js') +var Buffer = require('safe-buffer').Buffer + +function withPublic (paddedMsg, key) { + return Buffer.from(paddedMsg + .toRed(BN.mont(key.modulus)) + .redPow(new BN(key.publicExponent)) + .fromRed() + .toArray()) +} + +module.exports = withPublic + +},{"bn.js":17,"safe-buffer":144}],127:[function(require,module,exports){ +module.exports = function xor (a, b) { + var len = a.length + var i = -1 + while (++i < len) { + a[i] ^= b[i] + } + return a +} + +},{}],128:[function(require,module,exports){ +(function (process,global){ +'use strict' + +function oldBrowser () { + throw new Error('Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11') +} + +var Buffer = require('safe-buffer').Buffer +var crypto = global.crypto || global.msCrypto + +if (crypto && crypto.getRandomValues) { + module.exports = randomBytes +} else { + module.exports = oldBrowser +} + +function randomBytes (size, cb) { + // phantomjs needs to throw + if (size > 65536) throw new Error('requested too many random bytes') + // in case browserify isn't using the Uint8Array version + var rawBytes = new global.Uint8Array(size) + + // This will not work in older browsers. + // See https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues + if (size > 0) { // getRandomValues fails on IE if size == 0 + crypto.getRandomValues(rawBytes) + } + + // XXX: phantomjs doesn't like a buffer being passed here + var bytes = Buffer.from(rawBytes.buffer) + + if (typeof cb === 'function') { + return process.nextTick(function () { + cb(null, bytes) + }) + } + + return bytes +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":121,"safe-buffer":144}],129:[function(require,module,exports){ +(function (process,global){ +'use strict' + +function oldBrowser () { + throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11') +} +var safeBuffer = require('safe-buffer') +var randombytes = require('randombytes') +var Buffer = safeBuffer.Buffer +var kBufferMaxLength = safeBuffer.kMaxLength +var crypto = global.crypto || global.msCrypto +var kMaxUint32 = Math.pow(2, 32) - 1 +function assertOffset (offset, length) { + if (typeof offset !== 'number' || offset !== offset) { // eslint-disable-line no-self-compare + throw new TypeError('offset must be a number') + } + + if (offset > kMaxUint32 || offset < 0) { + throw new TypeError('offset must be a uint32') + } + + if (offset > kBufferMaxLength || offset > length) { + throw new RangeError('offset out of range') + } +} + +function assertSize (size, offset, length) { + if (typeof size !== 'number' || size !== size) { // eslint-disable-line no-self-compare + throw new TypeError('size must be a number') + } + + if (size > kMaxUint32 || size < 0) { + throw new TypeError('size must be a uint32') + } + + if (size + offset > length || size > kBufferMaxLength) { + throw new RangeError('buffer too small') + } +} +if ((crypto && crypto.getRandomValues) || !process.browser) { + exports.randomFill = randomFill + exports.randomFillSync = randomFillSync +} else { + exports.randomFill = oldBrowser + exports.randomFillSync = oldBrowser +} +function randomFill (buf, offset, size, cb) { + if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) { + throw new TypeError('"buf" argument must be a Buffer or Uint8Array') + } + + if (typeof offset === 'function') { + cb = offset + offset = 0 + size = buf.length + } else if (typeof size === 'function') { + cb = size + size = buf.length - offset + } else if (typeof cb !== 'function') { + throw new TypeError('"cb" argument must be a function') + } + assertOffset(offset, buf.length) + assertSize(size, offset, buf.length) + return actualFill(buf, offset, size, cb) +} + +function actualFill (buf, offset, size, cb) { + if (process.browser) { + var ourBuf = buf.buffer + var uint = new Uint8Array(ourBuf, offset, size) + crypto.getRandomValues(uint) + if (cb) { + process.nextTick(function () { + cb(null, buf) + }) + return + } + return buf + } + if (cb) { + randombytes(size, function (err, bytes) { + if (err) { + return cb(err) + } + bytes.copy(buf, offset) + cb(null, buf) + }) + return + } + var bytes = randombytes(size) + bytes.copy(buf, offset) + return buf +} +function randomFillSync (buf, offset, size) { + if (typeof offset === 'undefined') { + offset = 0 + } + if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) { + throw new TypeError('"buf" argument must be a Buffer or Uint8Array') + } + + assertOffset(offset, buf.length) + + if (size === undefined) size = buf.length - offset + + assertSize(size, offset, buf.length) + + return actualFill(buf, offset, size) +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":121,"randombytes":128,"safe-buffer":144}],130:[function(require,module,exports){ +module.exports = require('./lib/_stream_duplex.js'); + +},{"./lib/_stream_duplex.js":131}],131:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; +},{"./_stream_readable":133,"./_stream_writable":135,"core-util-is":51,"inherits":101,"process-nextick-args":120}],132:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":134,"core-util-is":51,"inherits":101}],133:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./_stream_duplex":131,"./internal/streams/BufferList":136,"./internal/streams/destroy":137,"./internal/streams/stream":138,"_process":121,"core-util-is":51,"events":84,"inherits":101,"isarray":103,"process-nextick-args":120,"safe-buffer":144,"string_decoder/":158,"util":19}],134:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} +},{"./_stream_duplex":131,"core-util-is":51,"inherits":101}],135:[function(require,module,exports){ +(function (process,global,setImmediate){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) +},{"./_stream_duplex":131,"./internal/streams/destroy":137,"./internal/streams/stream":138,"_process":121,"core-util-is":51,"inherits":101,"process-nextick-args":120,"safe-buffer":144,"timers":160,"util-deprecate":162}],136:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} +},{"safe-buffer":144,"util":19}],137:[function(require,module,exports){ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; +},{"process-nextick-args":120}],138:[function(require,module,exports){ +module.exports = require('events').EventEmitter; + +},{"events":84}],139:[function(require,module,exports){ +module.exports = require('./readable').PassThrough + +},{"./readable":140}],140:[function(require,module,exports){ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); + +},{"./lib/_stream_duplex.js":131,"./lib/_stream_passthrough.js":132,"./lib/_stream_readable.js":133,"./lib/_stream_transform.js":134,"./lib/_stream_writable.js":135}],141:[function(require,module,exports){ +module.exports = require('./readable').Transform + +},{"./readable":140}],142:[function(require,module,exports){ +module.exports = require('./lib/_stream_writable.js'); + +},{"./lib/_stream_writable.js":135}],143:[function(require,module,exports){ +'use strict' +var Buffer = require('buffer').Buffer +var inherits = require('inherits') +var HashBase = require('hash-base') + +var ARRAY16 = new Array(16) + +var zl = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +] + +var zr = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +] + +var sl = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +] + +var sr = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +] + +var hl = [0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e] +var hr = [0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000] + +function RIPEMD160 () { + HashBase.call(this, 64) + + // state + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 +} + +inherits(RIPEMD160, HashBase) + +RIPEMD160.prototype._update = function () { + var words = ARRAY16 + for (var j = 0; j < 16; ++j) words[j] = this._block.readInt32LE(j * 4) + + var al = this._a | 0 + var bl = this._b | 0 + var cl = this._c | 0 + var dl = this._d | 0 + var el = this._e | 0 + + var ar = this._a | 0 + var br = this._b | 0 + var cr = this._c | 0 + var dr = this._d | 0 + var er = this._e | 0 + + // computation + for (var i = 0; i < 80; i += 1) { + var tl + var tr + if (i < 16) { + tl = fn1(al, bl, cl, dl, el, words[zl[i]], hl[0], sl[i]) + tr = fn5(ar, br, cr, dr, er, words[zr[i]], hr[0], sr[i]) + } else if (i < 32) { + tl = fn2(al, bl, cl, dl, el, words[zl[i]], hl[1], sl[i]) + tr = fn4(ar, br, cr, dr, er, words[zr[i]], hr[1], sr[i]) + } else if (i < 48) { + tl = fn3(al, bl, cl, dl, el, words[zl[i]], hl[2], sl[i]) + tr = fn3(ar, br, cr, dr, er, words[zr[i]], hr[2], sr[i]) + } else if (i < 64) { + tl = fn4(al, bl, cl, dl, el, words[zl[i]], hl[3], sl[i]) + tr = fn2(ar, br, cr, dr, er, words[zr[i]], hr[3], sr[i]) + } else { // if (i<80) { + tl = fn5(al, bl, cl, dl, el, words[zl[i]], hl[4], sl[i]) + tr = fn1(ar, br, cr, dr, er, words[zr[i]], hr[4], sr[i]) + } + + al = el + el = dl + dl = rotl(cl, 10) + cl = bl + bl = tl + + ar = er + er = dr + dr = rotl(cr, 10) + cr = br + br = tr + } + + // update state + var t = (this._b + cl + dr) | 0 + this._b = (this._c + dl + er) | 0 + this._c = (this._d + el + ar) | 0 + this._d = (this._e + al + br) | 0 + this._e = (this._a + bl + cr) | 0 + this._a = t +} + +RIPEMD160.prototype._digest = function () { + // create padding and handle blocks + this._block[this._blockOffset++] = 0x80 + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64) + this._update() + this._blockOffset = 0 + } + + this._block.fill(0, this._blockOffset, 56) + this._block.writeUInt32LE(this._length[0], 56) + this._block.writeUInt32LE(this._length[1], 60) + this._update() + + // produce result + var buffer = Buffer.alloc ? Buffer.alloc(20) : new Buffer(20) + buffer.writeInt32LE(this._a, 0) + buffer.writeInt32LE(this._b, 4) + buffer.writeInt32LE(this._c, 8) + buffer.writeInt32LE(this._d, 12) + buffer.writeInt32LE(this._e, 16) + return buffer +} + +function rotl (x, n) { + return (x << n) | (x >>> (32 - n)) +} + +function fn1 (a, b, c, d, e, m, k, s) { + return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0 +} + +function fn2 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0 +} + +function fn3 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0 +} + +function fn4 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0 +} + +function fn5 (a, b, c, d, e, m, k, s) { + return (rotl((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0 +} + +module.exports = RIPEMD160 + +},{"buffer":49,"hash-base":86,"inherits":101}],144:[function(require,module,exports){ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + +},{"buffer":49}],145:[function(require,module,exports){ +var Buffer = require('safe-buffer').Buffer + +// prototype class for hash functions +function Hash (blockSize, finalSize) { + this._block = Buffer.alloc(blockSize) + this._finalSize = finalSize + this._blockSize = blockSize + this._len = 0 +} + +Hash.prototype.update = function (data, enc) { + if (typeof data === 'string') { + enc = enc || 'utf8' + data = Buffer.from(data, enc) + } + + var block = this._block + var blockSize = this._blockSize + var length = data.length + var accum = this._len + + for (var offset = 0; offset < length;) { + var assigned = accum % blockSize + var remainder = Math.min(length - offset, blockSize - assigned) + + for (var i = 0; i < remainder; i++) { + block[assigned + i] = data[offset + i] + } + + accum += remainder + offset += remainder + + if ((accum % blockSize) === 0) { + this._update(block) + } + } + + this._len += length + return this +} + +Hash.prototype.digest = function (enc) { + var rem = this._len % this._blockSize + + this._block[rem] = 0x80 + + // zero (rem + 1) trailing bits, where (rem + 1) is the smallest + // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize + this._block.fill(0, rem + 1) + + if (rem >= this._finalSize) { + this._update(this._block) + this._block.fill(0) + } + + var bits = this._len * 8 + + // uint32 + if (bits <= 0xffffffff) { + this._block.writeUInt32BE(bits, this._blockSize - 4) + + // uint64 + } else { + var lowBits = (bits & 0xffffffff) >>> 0 + var highBits = (bits - lowBits) / 0x100000000 + + this._block.writeUInt32BE(highBits, this._blockSize - 8) + this._block.writeUInt32BE(lowBits, this._blockSize - 4) + } + + this._update(this._block) + var hash = this._hash() + + return enc ? hash.toString(enc) : hash +} + +Hash.prototype._update = function () { + throw new Error('_update must be implemented by subclass') +} + +module.exports = Hash + +},{"safe-buffer":144}],146:[function(require,module,exports){ +var exports = module.exports = function SHA (algorithm) { + algorithm = algorithm.toLowerCase() + + var Algorithm = exports[algorithm] + if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)') + + return new Algorithm() +} + +exports.sha = require('./sha') +exports.sha1 = require('./sha1') +exports.sha224 = require('./sha224') +exports.sha256 = require('./sha256') +exports.sha384 = require('./sha384') +exports.sha512 = require('./sha512') + +},{"./sha":147,"./sha1":148,"./sha224":149,"./sha256":150,"./sha384":151,"./sha512":152}],147:[function(require,module,exports){ +/* + * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined + * in FIPS PUB 180-1 + * This source code is derived from sha1.js of the same repository. + * The difference between SHA-0 and SHA-1 is just a bitwise rotate left + * operation was added. + */ + +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 +] + +var W = new Array(80) + +function Sha () { + this.init() + this._w = W + + Hash.call(this, 64, 56) +} + +inherits(Sha, Hash) + +Sha.prototype.init = function () { + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 + + return this +} + +function rotl5 (num) { + return (num << 5) | (num >>> 27) +} + +function rotl30 (num) { + return (num << 30) | (num >>> 2) +} + +function ft (s, b, c, d) { + if (s === 0) return (b & c) | ((~b) & d) + if (s === 2) return (b & c) | (b & d) | (c & d) + return b ^ c ^ d +} + +Sha.prototype._update = function (M) { + var W = this._w + + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 + + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 80; ++i) W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16] + + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20) + var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 + + e = d + d = c + c = rotl30(b) + b = a + a = t + } + + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 +} + +Sha.prototype._hash = function () { + var H = Buffer.allocUnsafe(20) + + H.writeInt32BE(this._a | 0, 0) + H.writeInt32BE(this._b | 0, 4) + H.writeInt32BE(this._c | 0, 8) + H.writeInt32BE(this._d | 0, 12) + H.writeInt32BE(this._e | 0, 16) + + return H +} + +module.exports = Sha + +},{"./hash":145,"inherits":101,"safe-buffer":144}],148:[function(require,module,exports){ +/* + * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined + * in FIPS PUB 180-1 + * Version 2.1a Copyright Paul Johnston 2000 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for details. + */ + +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 +] + +var W = new Array(80) + +function Sha1 () { + this.init() + this._w = W + + Hash.call(this, 64, 56) +} + +inherits(Sha1, Hash) + +Sha1.prototype.init = function () { + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 + + return this +} + +function rotl1 (num) { + return (num << 1) | (num >>> 31) +} + +function rotl5 (num) { + return (num << 5) | (num >>> 27) +} + +function rotl30 (num) { + return (num << 30) | (num >>> 2) +} + +function ft (s, b, c, d) { + if (s === 0) return (b & c) | ((~b) & d) + if (s === 2) return (b & c) | (b & d) | (c & d) + return b ^ c ^ d +} + +Sha1.prototype._update = function (M) { + var W = this._w + + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 + + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 80; ++i) W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]) + + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20) + var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 + + e = d + d = c + c = rotl30(b) + b = a + a = t + } + + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 +} + +Sha1.prototype._hash = function () { + var H = Buffer.allocUnsafe(20) + + H.writeInt32BE(this._a | 0, 0) + H.writeInt32BE(this._b | 0, 4) + H.writeInt32BE(this._c | 0, 8) + H.writeInt32BE(this._d | 0, 12) + H.writeInt32BE(this._e | 0, 16) + + return H +} + +module.exports = Sha1 + +},{"./hash":145,"inherits":101,"safe-buffer":144}],149:[function(require,module,exports){ +/** + * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined + * in FIPS 180-2 + * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * + */ + +var inherits = require('inherits') +var Sha256 = require('./sha256') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var W = new Array(64) + +function Sha224 () { + this.init() + + this._w = W // new Array(64) + + Hash.call(this, 64, 56) +} + +inherits(Sha224, Sha256) + +Sha224.prototype.init = function () { + this._a = 0xc1059ed8 + this._b = 0x367cd507 + this._c = 0x3070dd17 + this._d = 0xf70e5939 + this._e = 0xffc00b31 + this._f = 0x68581511 + this._g = 0x64f98fa7 + this._h = 0xbefa4fa4 + + return this +} + +Sha224.prototype._hash = function () { + var H = Buffer.allocUnsafe(28) + + H.writeInt32BE(this._a, 0) + H.writeInt32BE(this._b, 4) + H.writeInt32BE(this._c, 8) + H.writeInt32BE(this._d, 12) + H.writeInt32BE(this._e, 16) + H.writeInt32BE(this._f, 20) + H.writeInt32BE(this._g, 24) + + return H +} + +module.exports = Sha224 + +},{"./hash":145,"./sha256":150,"inherits":101,"safe-buffer":144}],150:[function(require,module,exports){ +/** + * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined + * in FIPS 180-2 + * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * + */ + +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 +] + +var W = new Array(64) + +function Sha256 () { + this.init() + + this._w = W // new Array(64) + + Hash.call(this, 64, 56) +} + +inherits(Sha256, Hash) + +Sha256.prototype.init = function () { + this._a = 0x6a09e667 + this._b = 0xbb67ae85 + this._c = 0x3c6ef372 + this._d = 0xa54ff53a + this._e = 0x510e527f + this._f = 0x9b05688c + this._g = 0x1f83d9ab + this._h = 0x5be0cd19 + + return this +} + +function ch (x, y, z) { + return z ^ (x & (y ^ z)) +} + +function maj (x, y, z) { + return (x & y) | (z & (x | y)) +} + +function sigma0 (x) { + return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10) +} + +function sigma1 (x) { + return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7) +} + +function gamma0 (x) { + return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3) +} + +function gamma1 (x) { + return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10) +} + +Sha256.prototype._update = function (M) { + var W = this._w + + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 + var f = this._f | 0 + var g = this._g | 0 + var h = this._h | 0 + + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 64; ++i) W[i] = (gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16]) | 0 + + for (var j = 0; j < 64; ++j) { + var T1 = (h + sigma1(e) + ch(e, f, g) + K[j] + W[j]) | 0 + var T2 = (sigma0(a) + maj(a, b, c)) | 0 + + h = g + g = f + f = e + e = (d + T1) | 0 + d = c + c = b + b = a + a = (T1 + T2) | 0 + } + + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 + this._f = (f + this._f) | 0 + this._g = (g + this._g) | 0 + this._h = (h + this._h) | 0 +} + +Sha256.prototype._hash = function () { + var H = Buffer.allocUnsafe(32) + + H.writeInt32BE(this._a, 0) + H.writeInt32BE(this._b, 4) + H.writeInt32BE(this._c, 8) + H.writeInt32BE(this._d, 12) + H.writeInt32BE(this._e, 16) + H.writeInt32BE(this._f, 20) + H.writeInt32BE(this._g, 24) + H.writeInt32BE(this._h, 28) + + return H +} + +module.exports = Sha256 + +},{"./hash":145,"inherits":101,"safe-buffer":144}],151:[function(require,module,exports){ +var inherits = require('inherits') +var SHA512 = require('./sha512') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var W = new Array(160) + +function Sha384 () { + this.init() + this._w = W + + Hash.call(this, 128, 112) +} + +inherits(Sha384, SHA512) + +Sha384.prototype.init = function () { + this._ah = 0xcbbb9d5d + this._bh = 0x629a292a + this._ch = 0x9159015a + this._dh = 0x152fecd8 + this._eh = 0x67332667 + this._fh = 0x8eb44a87 + this._gh = 0xdb0c2e0d + this._hh = 0x47b5481d + + this._al = 0xc1059ed8 + this._bl = 0x367cd507 + this._cl = 0x3070dd17 + this._dl = 0xf70e5939 + this._el = 0xffc00b31 + this._fl = 0x68581511 + this._gl = 0x64f98fa7 + this._hl = 0xbefa4fa4 + + return this +} + +Sha384.prototype._hash = function () { + var H = Buffer.allocUnsafe(48) + + function writeInt64BE (h, l, offset) { + H.writeInt32BE(h, offset) + H.writeInt32BE(l, offset + 4) + } + + writeInt64BE(this._ah, this._al, 0) + writeInt64BE(this._bh, this._bl, 8) + writeInt64BE(this._ch, this._cl, 16) + writeInt64BE(this._dh, this._dl, 24) + writeInt64BE(this._eh, this._el, 32) + writeInt64BE(this._fh, this._fl, 40) + + return H +} + +module.exports = Sha384 + +},{"./hash":145,"./sha512":152,"inherits":101,"safe-buffer":144}],152:[function(require,module,exports){ +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer + +var K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +] + +var W = new Array(160) + +function Sha512 () { + this.init() + this._w = W + + Hash.call(this, 128, 112) +} + +inherits(Sha512, Hash) + +Sha512.prototype.init = function () { + this._ah = 0x6a09e667 + this._bh = 0xbb67ae85 + this._ch = 0x3c6ef372 + this._dh = 0xa54ff53a + this._eh = 0x510e527f + this._fh = 0x9b05688c + this._gh = 0x1f83d9ab + this._hh = 0x5be0cd19 + + this._al = 0xf3bcc908 + this._bl = 0x84caa73b + this._cl = 0xfe94f82b + this._dl = 0x5f1d36f1 + this._el = 0xade682d1 + this._fl = 0x2b3e6c1f + this._gl = 0xfb41bd6b + this._hl = 0x137e2179 + + return this +} + +function Ch (x, y, z) { + return z ^ (x & (y ^ z)) +} + +function maj (x, y, z) { + return (x & y) | (z & (x | y)) +} + +function sigma0 (x, xl) { + return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25) +} + +function sigma1 (x, xl) { + return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23) +} + +function Gamma0 (x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7) +} + +function Gamma0l (x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25) +} + +function Gamma1 (x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6) +} + +function Gamma1l (x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26) +} + +function getCarry (a, b) { + return (a >>> 0) < (b >>> 0) ? 1 : 0 +} + +Sha512.prototype._update = function (M) { + var W = this._w + + var ah = this._ah | 0 + var bh = this._bh | 0 + var ch = this._ch | 0 + var dh = this._dh | 0 + var eh = this._eh | 0 + var fh = this._fh | 0 + var gh = this._gh | 0 + var hh = this._hh | 0 + + var al = this._al | 0 + var bl = this._bl | 0 + var cl = this._cl | 0 + var dl = this._dl | 0 + var el = this._el | 0 + var fl = this._fl | 0 + var gl = this._gl | 0 + var hl = this._hl | 0 + + for (var i = 0; i < 32; i += 2) { + W[i] = M.readInt32BE(i * 4) + W[i + 1] = M.readInt32BE(i * 4 + 4) + } + for (; i < 160; i += 2) { + var xh = W[i - 15 * 2] + var xl = W[i - 15 * 2 + 1] + var gamma0 = Gamma0(xh, xl) + var gamma0l = Gamma0l(xl, xh) + + xh = W[i - 2 * 2] + xl = W[i - 2 * 2 + 1] + var gamma1 = Gamma1(xh, xl) + var gamma1l = Gamma1l(xl, xh) + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7h = W[i - 7 * 2] + var Wi7l = W[i - 7 * 2 + 1] + + var Wi16h = W[i - 16 * 2] + var Wi16l = W[i - 16 * 2 + 1] + + var Wil = (gamma0l + Wi7l) | 0 + var Wih = (gamma0 + Wi7h + getCarry(Wil, gamma0l)) | 0 + Wil = (Wil + gamma1l) | 0 + Wih = (Wih + gamma1 + getCarry(Wil, gamma1l)) | 0 + Wil = (Wil + Wi16l) | 0 + Wih = (Wih + Wi16h + getCarry(Wil, Wi16l)) | 0 + + W[i] = Wih + W[i + 1] = Wil + } + + for (var j = 0; j < 160; j += 2) { + Wih = W[j] + Wil = W[j + 1] + + var majh = maj(ah, bh, ch) + var majl = maj(al, bl, cl) + + var sigma0h = sigma0(ah, al) + var sigma0l = sigma0(al, ah) + var sigma1h = sigma1(eh, el) + var sigma1l = sigma1(el, eh) + + // t1 = h + sigma1 + ch + K[j] + W[j] + var Kih = K[j] + var Kil = K[j + 1] + + var chh = Ch(eh, fh, gh) + var chl = Ch(el, fl, gl) + + var t1l = (hl + sigma1l) | 0 + var t1h = (hh + sigma1h + getCarry(t1l, hl)) | 0 + t1l = (t1l + chl) | 0 + t1h = (t1h + chh + getCarry(t1l, chl)) | 0 + t1l = (t1l + Kil) | 0 + t1h = (t1h + Kih + getCarry(t1l, Kil)) | 0 + t1l = (t1l + Wil) | 0 + t1h = (t1h + Wih + getCarry(t1l, Wil)) | 0 + + // t2 = sigma0 + maj + var t2l = (sigma0l + majl) | 0 + var t2h = (sigma0h + majh + getCarry(t2l, sigma0l)) | 0 + + hh = gh + hl = gl + gh = fh + gl = fl + fh = eh + fl = el + el = (dl + t1l) | 0 + eh = (dh + t1h + getCarry(el, dl)) | 0 + dh = ch + dl = cl + ch = bh + cl = bl + bh = ah + bl = al + al = (t1l + t2l) | 0 + ah = (t1h + t2h + getCarry(al, t1l)) | 0 + } + + this._al = (this._al + al) | 0 + this._bl = (this._bl + bl) | 0 + this._cl = (this._cl + cl) | 0 + this._dl = (this._dl + dl) | 0 + this._el = (this._el + el) | 0 + this._fl = (this._fl + fl) | 0 + this._gl = (this._gl + gl) | 0 + this._hl = (this._hl + hl) | 0 + + this._ah = (this._ah + ah + getCarry(this._al, al)) | 0 + this._bh = (this._bh + bh + getCarry(this._bl, bl)) | 0 + this._ch = (this._ch + ch + getCarry(this._cl, cl)) | 0 + this._dh = (this._dh + dh + getCarry(this._dl, dl)) | 0 + this._eh = (this._eh + eh + getCarry(this._el, el)) | 0 + this._fh = (this._fh + fh + getCarry(this._fl, fl)) | 0 + this._gh = (this._gh + gh + getCarry(this._gl, gl)) | 0 + this._hh = (this._hh + hh + getCarry(this._hl, hl)) | 0 +} + +Sha512.prototype._hash = function () { + var H = Buffer.allocUnsafe(64) + + function writeInt64BE (h, l, offset) { + H.writeInt32BE(h, offset) + H.writeInt32BE(l, offset + 4) + } + + writeInt64BE(this._ah, this._al, 0) + writeInt64BE(this._bh, this._bl, 8) + writeInt64BE(this._ch, this._cl, 16) + writeInt64BE(this._dh, this._dl, 24) + writeInt64BE(this._eh, this._el, 32) + writeInt64BE(this._fh, this._fl, 40) + writeInt64BE(this._gh, this._gl, 48) + writeInt64BE(this._hh, this._hl, 56) + + return H +} + +module.exports = Sha512 + +},{"./hash":145,"inherits":101,"safe-buffer":144}],153:[function(require,module,exports){ +//filter will reemit the data if cb(err,pass) pass is truthy + +// reduce is more tricky +// maybe we want to group the reductions or emit progress updates occasionally +// the most basic reduce just emits one 'data' event after it has recieved 'end' + + +var through = require('through') +var Decoder = require('string_decoder').StringDecoder + +module.exports = split + +//TODO pass in a function to map across the lines. + +function split (matcher, mapper, options) { + var decoder = new Decoder() + var soFar = '' + var maxLength = options && options.maxLength; + if('function' === typeof matcher) + mapper = matcher, matcher = null + if (!matcher) + matcher = /\r?\n/ + + function emit(stream, piece) { + if(mapper) { + try { + piece = mapper(piece) + } + catch (err) { + return stream.emit('error', err) + } + if('undefined' !== typeof piece) + stream.queue(piece) + } + else + stream.queue(piece) + } + + function next (stream, buffer) { + var pieces = ((soFar != null ? soFar : '') + buffer).split(matcher) + soFar = pieces.pop() + + if (maxLength && soFar.length > maxLength) + stream.emit('error', new Error('maximum buffer reached')) + + for (var i = 0; i < pieces.length; i++) { + var piece = pieces[i] + emit(stream, piece) + } + } + + return through(function (b) { + next(this, decoder.write(b)) + }, + function () { + if(decoder.end) + next(this, decoder.end()) + if(soFar != null) + emit(this, soFar) + this.queue(null) + }) +} + + +},{"string_decoder":158,"through":159}],154:[function(require,module,exports){ +(function (Buffer){ +var fsm = require('stream-fsm'); +var split = require('split'); +var normalize = require('triangle-normal'); + +function trim(a) { + var nullTerm = a.indexOf('\u0000'); + if (nullTerm > -1) { + a = a.substr(0, nullTerm); + } + return a.trim(); +}; + +function computeNormal(facet) { + var v = facet.verts; + return normalize( + v[0][0], v[0][1], v[0][2], + v[1][0], v[1][1], v[1][2], + v[2][0], v[2][1], v[2][2] + ); +} + +function exp(a) { + return a.toExponential(); +} + +module.exports = { + facetNormal : computeNormal, + + + // `stl` may be binary or ascii + toObject : function(stl) { + + var ret = { + description: '', + facets : [] + }; + + var s = this.createParseStream(); + s.on('data', function(d) { + if (!d.verts) { + if (!ret.description) { + ret.description = d.description; + } + } else { + ret.facets.push(d); + } + }); + s.write(!Buffer.isBuffer(stl) ? new Buffer(stl) : stl); + s.end(); + + return ret; + }, + + // Convert the incoming object into the stl + // file format. Passing a truthy value for + // binary causes a binary stl to be created. + fromObject: function(obj, binary) { + + if (!binary) { + var str = [ + 'solid ' + obj.description.trim() + ]; + + var fl = obj.facets.length; + + for (var j = 0; j -1) { + facetCount = data.readUInt32LE(80); + this.change('ascii'); + } else { + this.change('binary'); + } + + return 0; + }), + + binary : fsm.want(80, function(data) { + description = trim(data.toString()); + this.change('count'); + }), + + count : fsm.want(4, function(data) { + facetCount = data.readUInt32LE(0); + this.queue({ + description : description, + facetCount: facetCount + }); + + this.change('normal'); + }), + + normal : fsm.want(12, function(data) { + currentFacet = { + normal : [ + data.readFloatLE(0), + data.readFloatLE(4), + data.readFloatLE(8) + ], + verts : [] + }; + + this.change('verts'); + }), + + verts : fsm.want(36, function(data) { + + for (var i=0; i<36; i+=12) { + currentFacet.verts.push([ + data.readFloatLE(i), + data.readFloatLE(i+4), + data.readFloatLE(i+8) + ]); + } + + this.change('attributeBytes'); + }), + + attributeBytes : fsm.want(2, function(data) { + currentFacet.attributeByteCount = data.readUInt16LE(0); + this.queue(currentFacet); + + currentFacet = null; + facetCount--; + + if (facetCount <= 0) { + this.done(); + } else { + this.change('normal'); + } + + }), + + ascii : function(pending) { + if (!splitter) { + splitter = split(); + + stream.on('end', function() { + splitter.end(); + }); + + var inFacet = false; + var facet; + var that = this; + splitter.on('data', function(data) { + if (!data.trim().length) { + return; + } + + if (data.indexOf('solid') > -1) { + stream.queue({ + description : data.trim().split(' ').slice(1).join(' ') + }); + + } else if (data.indexOf('endfacet') > -1) { + if (!facet.normal.length) { + // facet.normal = computeNormal(facet); + } + inFacet = false; + stream.queue(facet); + facet = null + } else if (data.indexOf('facet') > -1) { + // This is not fool proof, but far better than + // "OH LOOK I NAMED MY STL 'solid'" *sigh* + + asciiValid = true; + var normal = data.replace(/ +/g, ' ').trim().split(' ').slice(2).map(parseFloat); + + facet = { + normal : normal, + verts : [], + attributeByteCount: 0 + }; + + } else if (data.indexOf('vertex') > -1) { + var coords = data.replace(/ +/g, ' ').trim().split(' ').slice(1).map(parseFloat); + facet.verts.push(coords); + } else if (!asciiValid) { + that.mode('binary'); + } + }); + + stream.originalWrite = stream.write; + } + + splitter.write(pending); + ended && stream.end(); + + // Returning false here buffers the data. + // If we are not "sure" this is an ascii stl file then + // we need to continue buffering + + return (asciiValid) ? pending.length : false; + } + + }, function() { + }); + + stream.originalEnd = stream.end; + stream.end = function(d) { + + var mode = stream.fsm.mode(); + var cache = stream.fsm.cache(); + if (mode === 'ascii' && !asciiValid && cache) { + // this is a binary file that has the description: "solid ..." + // send the complete file through binary mode + stream.fsm.change('binary'); + + // trigger a write since we have the entire file buffered in memory + stream.fsm(); + + stream.originalEnd(); + } else { + ended = true; + stream.originalEnd(); + } + }; + + return stream; + } +}; + +}).call(this,require("buffer").Buffer) +},{"buffer":49,"split":153,"stream-fsm":156,"triangle-normal":161}],155:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":84,"inherits":101,"readable-stream/duplex.js":130,"readable-stream/passthrough.js":139,"readable-stream/readable.js":140,"readable-stream/transform.js":141,"readable-stream/writable.js":142}],156:[function(require,module,exports){ +(function (Buffer){ +var through = require('through'); + +var join = function(a, b) { + if (!a) { + return b; + } else if (!b) { + return a; + } else if (Buffer.isBuffer(a)) { + return Buffer.concat([a,b], a.length + b.length); + } else { + return a+b; + } +}; + +var slice = function(b, start, end) { + if (Buffer.isBuffer(b)) { + return b.slice(start, end); + } else { + return b.substring(start, end); + } +}; + +module.exports = function(states, callback) { + var state = typeof states.init !== 'undefined' ? + 'init' : + Object.keys(states)[0]; + + var cache = null, stateFn = states[state]; + var ret = function(data) { + + var consumed; + + if (cache) { + data = join(cache, data); + cache = null; + } + + if (!data) { return; } + + do { + consumed = stateFn.call(ret, data); + + // pending more data + if (consumed === false) { + cache = data; + break; + } + + if (typeof consumed === 'function') { + stateFn = consumed; + continue; + } + + if (typeof consumed !== 'undefined') { + data = slice(data, consumed); + } else { + throw new Error('Please return the number of bytes consumed'); + } + } while (data.length); + }; + + ret.change = function(newState) { + state = newState; + stateFn = states[state]; + }; + + ret.done = function() { + if (callback) { + callback.apply(this, arguments); + } + }; + + ret.mode = function() { + return state; + }; + + ret.cache = function() { + return cache; + }; + + var t = through(ret); + + t.fsm = ret; + + ret.queue = t.queue.bind(t); + return t; +}; + + +module.exports.want = function(count, fn) { + + fn.callCount = 0; + + return function(data) { + if (data.length >= count) { + + var ret = fn.call(this, slice(data, 0, count), fn.callCount); + fn.callCount++; + if (typeof ret === 'undefined') { + return count; + } + return ret; + + } else { + return false; + } + }; +}; + +}).call(this,require("buffer").Buffer) +},{"buffer":49,"through":157}],157:[function(require,module,exports){ +(function (process){ +var Stream = require('stream') + +// through +// +// a stream that does nothing but re-emit the input. +// useful for aggregating a series of changing but not ending streams into one stream) + + + +exports = module.exports = through +through.through = through + +//create a readable writable stream. + +function through (write, end) { + write = write || function (data) { this.queue(data) } + end = end || function () { this.queue(null) } + + var ended = false, destroyed = false, buffer = [] + var stream = new Stream() + stream.readable = stream.writable = true + stream.paused = false + + stream.write = function (data) { + write.call(this, data) + return !stream.paused + } + + function drain() { + while(buffer.length && !stream.paused) { + var data = buffer.shift() + if(null === data) + return stream.emit('end') + else + stream.emit('data', data) + } + } + + stream.queue = function (data) { + buffer.push(data) + drain() + return stream + } + + //this will be registered as the first 'end' listener + //must call destroy next tick, to make sure we're after any + //stream piped from here. + //this is only a problem if end is not emitted synchronously. + //a nicer way to do this is to make sure this is the last listener for 'end' + + stream.on('end', function () { + stream.readable = false + if(!stream.writable) + process.nextTick(function () { + stream.destroy() + }) + }) + + function _end () { + stream.writable = false + end.call(stream) + if(!stream.readable) + stream.destroy() + } + + stream.end = function (data) { + if(ended) return + ended = true + if(arguments.length) stream.write(data) + _end() // will emit or queue + return stream + } + + stream.destroy = function () { + if(destroyed) return + destroyed = true + ended = true + buffer.length = 0 + stream.writable = stream.readable = false + stream.emit('close') + return stream + } + + stream.pause = function () { + if(stream.paused) return + stream.paused = true + stream.emit('pause') + return stream + } + stream.resume = function () { + if(stream.paused) { + stream.paused = false + } + drain() + //may have become paused again, + //as drain emits 'data'. + if(!stream.paused) + stream.emit('drain') + return stream + } + return stream +} + + +}).call(this,require('_process')) +},{"_process":121,"stream":155}],158:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} +},{"safe-buffer":144}],159:[function(require,module,exports){ +(function (process){ +var Stream = require('stream') + +// through +// +// a stream that does nothing but re-emit the input. +// useful for aggregating a series of changing but not ending streams into one stream) + +exports = module.exports = through +through.through = through + +//create a readable writable stream. + +function through (write, end, opts) { + write = write || function (data) { this.queue(data) } + end = end || function () { this.queue(null) } + + var ended = false, destroyed = false, buffer = [], _ended = false + var stream = new Stream() + stream.readable = stream.writable = true + stream.paused = false + +// stream.autoPause = !(opts && opts.autoPause === false) + stream.autoDestroy = !(opts && opts.autoDestroy === false) + + stream.write = function (data) { + write.call(this, data) + return !stream.paused + } + + function drain() { + while(buffer.length && !stream.paused) { + var data = buffer.shift() + if(null === data) + return stream.emit('end') + else + stream.emit('data', data) + } + } + + stream.queue = stream.push = function (data) { +// console.error(ended) + if(_ended) return stream + if(data === null) _ended = true + buffer.push(data) + drain() + return stream + } + + //this will be registered as the first 'end' listener + //must call destroy next tick, to make sure we're after any + //stream piped from here. + //this is only a problem if end is not emitted synchronously. + //a nicer way to do this is to make sure this is the last listener for 'end' + + stream.on('end', function () { + stream.readable = false + if(!stream.writable && stream.autoDestroy) + process.nextTick(function () { + stream.destroy() + }) + }) + + function _end () { + stream.writable = false + end.call(stream) + if(!stream.readable && stream.autoDestroy) + stream.destroy() + } + + stream.end = function (data) { + if(ended) return + ended = true + if(arguments.length) stream.write(data) + _end() // will emit or queue + return stream + } + + stream.destroy = function () { + if(destroyed) return + destroyed = true + ended = true + buffer.length = 0 + stream.writable = stream.readable = false + stream.emit('close') + return stream + } + + stream.pause = function () { + if(stream.paused) return + stream.paused = true + return stream + } + + stream.resume = function () { + if(stream.paused) { + stream.paused = false + stream.emit('resume') + } + drain() + //may have become paused again, + //as drain emits 'data'. + if(!stream.paused) + stream.emit('drain') + return stream + } + return stream +} + + +}).call(this,require('_process')) +},{"_process":121,"stream":155}],160:[function(require,module,exports){ +(function (setImmediate,clearImmediate){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":121,"timers":160}],161:[function(require,module,exports){ +module.exports = triangleNormal + +function triangleNormal(x0, y0, z0, x1, y1, z1, x2, y2, z2, output) { + if (!output) output = [] + + var p1x = x1 - x0 + var p1y = y1 - y0 + var p1z = z1 - z0 + + var p2x = x2 - x0 + var p2y = y2 - y0 + var p2z = z2 - z0 + + var p3x = p1y * p2z - p1z * p2y + var p3y = p1z * p2x - p1x * p2z + var p3z = p1x * p2y - p1y * p2x + + var mag = Math.sqrt(p3x * p3x + p3y * p3y + p3z * p3z) + if (mag === 0) { + output[0] = 0 + output[1] = 0 + output[2] = 0 + } else { + output[0] = p3x / mag + output[1] = p3y / mag + output[2] = p3z / mag + } + + return output +} + +},{}],162:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],163:[function(require,module,exports){ +var indexOf = function (xs, item) { + if (xs.indexOf) return xs.indexOf(item); + else for (var i = 0; i < xs.length; i++) { + if (xs[i] === item) return i; + } + return -1; +}; +var Object_keys = function (obj) { + if (Object.keys) return Object.keys(obj) + else { + var res = []; + for (var key in obj) res.push(key) + return res; + } +}; + +var forEach = function (xs, fn) { + if (xs.forEach) return xs.forEach(fn) + else for (var i = 0; i < xs.length; i++) { + fn(xs[i], i, xs); + } +}; + +var defineProp = (function() { + try { + Object.defineProperty({}, '_', {}); + return function(obj, name, value) { + Object.defineProperty(obj, name, { + writable: true, + enumerable: false, + configurable: true, + value: value + }) + }; + } catch(e) { + return function(obj, name, value) { + obj[name] = value; + }; + } +}()); + +var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', +'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', +'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', +'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', +'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape']; + +function Context() {} +Context.prototype = {}; + +var Script = exports.Script = function NodeScript (code) { + if (!(this instanceof Script)) return new Script(code); + this.code = code; +}; + +Script.prototype.runInContext = function (context) { + if (!(context instanceof Context)) { + throw new TypeError("needs a 'context' argument."); + } + + var iframe = document.createElement('iframe'); + if (!iframe.style) iframe.style = {}; + iframe.style.display = 'none'; + + document.body.appendChild(iframe); + + var win = iframe.contentWindow; + var wEval = win.eval, wExecScript = win.execScript; + + if (!wEval && wExecScript) { + // win.eval() magically appears when this is called in IE: + wExecScript.call(win, 'null'); + wEval = win.eval; + } + + forEach(Object_keys(context), function (key) { + win[key] = context[key]; + }); + forEach(globals, function (key) { + if (context[key]) { + win[key] = context[key]; + } + }); + + var winKeys = Object_keys(win); + + var res = wEval.call(win, this.code); + + forEach(Object_keys(win), function (key) { + // Avoid copying circular objects like `top` and `window` by only + // updating existing context properties or new properties in the `win` + // that was only introduced after the eval. + if (key in context || indexOf(winKeys, key) === -1) { + context[key] = win[key]; + } + }); + + forEach(globals, function (key) { + if (!(key in context)) { + defineProp(context, key, win[key]); + } + }); + + document.body.removeChild(iframe); + + return res; +}; + +Script.prototype.runInThisContext = function () { + return eval(this.code); // maybe... +}; + +Script.prototype.runInNewContext = function (context) { + var ctx = Script.createContext(context); + var res = this.runInContext(ctx); + + if (context) { + forEach(Object_keys(ctx), function (key) { + context[key] = ctx[key]; + }); + } + + return res; +}; + +forEach(Object_keys(Script.prototype), function (name) { + exports[name] = Script[name] = function (code) { + var s = Script(code); + return s[name].apply(s, [].slice.call(arguments, 1)); + }; +}); + +exports.isContext = function (context) { + return context instanceof Context; +}; + +exports.createScript = function (code) { + return exports.Script(code); +}; + +exports.createContext = Script.createContext = function (context) { + var copy = new Context(); + if(typeof context === 'object') { + forEach(Object_keys(context), function (key) { + copy[key] = context[key]; + }); + } + return copy; +}; + +},{}],164:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.WHATWGFetch = {}))); +}(this, (function (exports) { 'use strict'; + + var support = { + searchParams: 'URLSearchParams' in self, + iterable: 'Symbol' in self && 'iterator' in Symbol, + blob: + 'FileReader' in self && + 'Blob' in self && + (function() { + try { + new Blob(); + return true + } catch (e) { + return false + } + })(), + formData: 'FormData' in self, + arrayBuffer: 'ArrayBuffer' in self + }; + + function isDataView(obj) { + return obj && DataView.prototype.isPrototypeOf(obj) + } + + if (support.arrayBuffer) { + var viewClasses = [ + '[object Int8Array]', + '[object Uint8Array]', + '[object Uint8ClampedArray]', + '[object Int16Array]', + '[object Uint16Array]', + '[object Int32Array]', + '[object Uint32Array]', + '[object Float32Array]', + '[object Float64Array]' + ]; + + var isArrayBufferView = + ArrayBuffer.isView || + function(obj) { + return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 + }; + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name); + } + if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value); + } + return value + } + + // Build a destructive iterator for the value list + function iteratorFor(items) { + var iterator = { + next: function() { + var value = items.shift(); + return {done: value === undefined, value: value} + } + }; + + if (support.iterable) { + iterator[Symbol.iterator] = function() { + return iterator + }; + } + + return iterator + } + + function Headers(headers) { + this.map = {}; + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value); + }, this); + } else if (Array.isArray(headers)) { + headers.forEach(function(header) { + this.append(header[0], header[1]); + }, this); + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]); + }, this); + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name); + value = normalizeValue(value); + var oldValue = this.map[name]; + this.map[name] = oldValue ? oldValue + ', ' + value : value; + }; + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)]; + }; + + Headers.prototype.get = function(name) { + name = normalizeName(name); + return this.has(name) ? this.map[name] : null + }; + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + }; + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = normalizeValue(value); + }; + + Headers.prototype.forEach = function(callback, thisArg) { + for (var name in this.map) { + if (this.map.hasOwnProperty(name)) { + callback.call(thisArg, this.map[name], name, this); + } + } + }; + + Headers.prototype.keys = function() { + var items = []; + this.forEach(function(value, name) { + items.push(name); + }); + return iteratorFor(items) + }; + + Headers.prototype.values = function() { + var items = []; + this.forEach(function(value) { + items.push(value); + }); + return iteratorFor(items) + }; + + Headers.prototype.entries = function() { + var items = []; + this.forEach(function(value, name) { + items.push([name, value]); + }); + return iteratorFor(items) + }; + + if (support.iterable) { + Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true; + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result); + }; + reader.onerror = function() { + reject(reader.error); + }; + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsArrayBuffer(blob); + return promise + } + + function readBlobAsText(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsText(blob); + return promise + } + + function readArrayBufferAsText(buf) { + var view = new Uint8Array(buf); + var chars = new Array(view.length); + + for (var i = 0; i < view.length; i++) { + chars[i] = String.fromCharCode(view[i]); + } + return chars.join('') + } + + function bufferClone(buf) { + if (buf.slice) { + return buf.slice(0) + } else { + var view = new Uint8Array(buf.byteLength); + view.set(new Uint8Array(buf)); + return view.buffer + } + } + + function Body() { + this.bodyUsed = false; + + this._initBody = function(body) { + this._bodyInit = body; + if (!body) { + this._bodyText = ''; + } else if (typeof body === 'string') { + this._bodyText = body; + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body; + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body; + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this._bodyText = body.toString(); + } else if (support.arrayBuffer && support.blob && isDataView(body)) { + this._bodyArrayBuffer = bufferClone(body.buffer); + // IE 10-11 can't handle a DataView body. + this._bodyInit = new Blob([this._bodyArrayBuffer]); + } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { + this._bodyArrayBuffer = bufferClone(body); + } else { + this._bodyText = body = Object.prototype.toString.call(body); + } + + if (!this.headers.get('content-type')) { + if (typeof body === 'string') { + this.headers.set('content-type', 'text/plain;charset=UTF-8'); + } else if (this._bodyBlob && this._bodyBlob.type) { + this.headers.set('content-type', this._bodyBlob.type); + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); + } + } + }; + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this); + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(new Blob([this._bodyArrayBuffer])) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + }; + + this.arrayBuffer = function() { + if (this._bodyArrayBuffer) { + return consumed(this) || Promise.resolve(this._bodyArrayBuffer) + } else { + return this.blob().then(readBlobAsArrayBuffer) + } + }; + } + + this.text = function() { + var rejected = consumed(this); + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + }; + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + }; + } + + this.json = function() { + return this.text().then(JSON.parse) + }; + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; + + function normalizeMethod(method) { + var upcased = method.toUpperCase(); + return methods.indexOf(upcased) > -1 ? upcased : method + } + + function Request(input, options) { + options = options || {}; + var body = options.body; + + if (input instanceof Request) { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url; + this.credentials = input.credentials; + if (!options.headers) { + this.headers = new Headers(input.headers); + } + this.method = input.method; + this.mode = input.mode; + this.signal = input.signal; + if (!body && input._bodyInit != null) { + body = input._bodyInit; + input.bodyUsed = true; + } + } else { + this.url = String(input); + } + + this.credentials = options.credentials || this.credentials || 'same-origin'; + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers); + } + this.method = normalizeMethod(options.method || this.method || 'GET'); + this.mode = options.mode || this.mode || null; + this.signal = options.signal || this.signal; + this.referrer = null; + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body); + } + + Request.prototype.clone = function() { + return new Request(this, {body: this._bodyInit}) + }; + + function decode(body) { + var form = new FormData(); + body + .trim() + .split('&') + .forEach(function(bytes) { + if (bytes) { + var split = bytes.split('='); + var name = split.shift().replace(/\+/g, ' '); + var value = split.join('=').replace(/\+/g, ' '); + form.append(decodeURIComponent(name), decodeURIComponent(value)); + } + }); + return form + } + + function parseHeaders(rawHeaders) { + var headers = new Headers(); + // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space + // https://tools.ietf.org/html/rfc7230#section-3.2 + var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); + preProcessedHeaders.split(/\r?\n/).forEach(function(line) { + var parts = line.split(':'); + var key = parts.shift().trim(); + if (key) { + var value = parts.join(':').trim(); + headers.append(key, value); + } + }); + return headers + } + + Body.call(Request.prototype); + + function Response(bodyInit, options) { + if (!options) { + options = {}; + } + + this.type = 'default'; + this.status = options.status === undefined ? 200 : options.status; + this.ok = this.status >= 200 && this.status < 300; + this.statusText = 'statusText' in options ? options.statusText : 'OK'; + this.headers = new Headers(options.headers); + this.url = options.url || ''; + this._initBody(bodyInit); + } + + Body.call(Response.prototype); + + Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + }; + + Response.error = function() { + var response = new Response(null, {status: 0, statusText: ''}); + response.type = 'error'; + return response + }; + + var redirectStatuses = [301, 302, 303, 307, 308]; + + Response.redirect = function(url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code') + } + + return new Response(null, {status: status, headers: {location: url}}) + }; + + exports.DOMException = self.DOMException; + try { + new exports.DOMException(); + } catch (err) { + exports.DOMException = function(message, name) { + this.message = message; + this.name = name; + var error = Error(message); + this.stack = error.stack; + }; + exports.DOMException.prototype = Object.create(Error.prototype); + exports.DOMException.prototype.constructor = exports.DOMException; + } + + function fetch(input, init) { + return new Promise(function(resolve, reject) { + var request = new Request(input, init); + + if (request.signal && request.signal.aborted) { + return reject(new exports.DOMException('Aborted', 'AbortError')) + } + + var xhr = new XMLHttpRequest(); + + function abortXhr() { + xhr.abort(); + } + + xhr.onload = function() { + var options = { + status: xhr.status, + statusText: xhr.statusText, + headers: parseHeaders(xhr.getAllResponseHeaders() || '') + }; + options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); + var body = 'response' in xhr ? xhr.response : xhr.responseText; + resolve(new Response(body, options)); + }; + + xhr.onerror = function() { + reject(new TypeError('Network request failed')); + }; + + xhr.ontimeout = function() { + reject(new TypeError('Network request failed')); + }; + + xhr.onabort = function() { + reject(new exports.DOMException('Aborted', 'AbortError')); + }; + + xhr.open(request.method, request.url, true); + + if (request.credentials === 'include') { + xhr.withCredentials = true; + } else if (request.credentials === 'omit') { + xhr.withCredentials = false; + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob'; + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value); + }); + + if (request.signal) { + request.signal.addEventListener('abort', abortXhr); + + xhr.onreadystatechange = function() { + // DONE (success or failure) + if (xhr.readyState === 4) { + request.signal.removeEventListener('abort', abortXhr); + } + }; + } + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); + }) + } + + fetch.polyfill = true; + + if (!self.fetch) { + self.fetch = fetch; + self.Headers = Headers; + self.Request = Request; + self.Response = Response; + } + + exports.Headers = Headers; + exports.Request = Request; + exports.Response = Response; + exports.fetch = fetch; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{}],165:[function(require,module,exports){ +(function (process,Buffer,__dirname){ + +var Module = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + return ( +function(Module) { + Module = Module || {}; + +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",abort);Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var tempRet0=0;var setTempRet0=(function(value){tempRet0=value});var getTempRet0=(function(){return tempRet0});var GLOBAL_BASE=1024;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NONE=3;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var WASM_PAGE_SIZE=65536;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE=1024,STACK_BASE=48352,DYNAMIC_BASE=5291232,DYNAMICTOP_PTR=48096;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){var PAGE_MULTIPLE=65536;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY>2]=DYNAMIC_BASE;function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmBinaryFile="data:application/octet-stream;base64,AGFzbQEAAAABnQVRYAJ/fwF/YAN/f38Bf2AFf39+f38AYAF/AGACf38AYAF/AX9gBX9/f39/AX9gCH9/f39/f39/AX9gAn98AXxgBH9/f38Bf2AEf39/fwBgA39/fwBgAn98AGABfwF8YAN/f3wAYAABf2ACf38BfGADf3x/AGAGf39/f39/AX9gBX9/f398AX9gAABgBn9/f39/fwBgBX9/f39/AGADf39/AXxgAn98AX9gA398fAF/YAR/fHx8AX9gBX98fHx/AX9gBn9/f39/fAF/YAd/f39/f39/AX9gBX9/f39+AX9gBH9/fH8AYA1/f39/f39/f39/f39/AGAIf39/f39/f38AYAp/f39/f39/f39/AGAHf3x8fHx8fABgBH98fHwAYAV/fHx8fwBgA398fwF/YAV/fH9/fwF/YAR/fH9/AX9gA398fABgBH9/f3wBf2AGf3x/f39/AX9gBX9/fHx8AGAIfHx/f39/fH8Bf2AGfHx8f39/AX9gB39/fHx8f38AYAN8fH8BfGAGf398f39/AGAGf398fH9/AGACfHwBfGABfAF8YAF8AX9gA39/fgBgBH9/f34BfmAFf39/f38BfGAGf39/f39/AXxgAn9/AX5gAnx/AXxgA35/fwF/YAJ+fwF/YAR/f39/AX5gAnx/AX9gAn9+AX9gCn9/f39/f39/f38Bf2AMf39/f39/f39/f39/AX9gA39/fwF9YAd/f39/f39/AGALf39/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AGADf398AXxgBH9/f38BfGADf398AX9gBH9/fHwBf2AFf398fHwBf2AGf398fHx/AX9gB39/f39/f3wBf2AJf39/f39/f39/AX9gBH9/f3wAYAV/f398fwACqQo3A2VudgVhYm9ydAADA2Vudg1lbmxhcmdlTWVtb3J5AA8DZW52DmdldFRvdGFsTWVtb3J5AA8DZW52F2Fib3J0T25DYW5ub3RHcm93TWVtb3J5AA8DZW52GV9fX2N4YV9hbGxvY2F0ZV9leGNlcHRpb24ABQNlbnYTX19fY3hhX3B1cmVfdmlydHVhbAAUA2VudgxfX19jeGFfdGhyb3cACwNlbnYZX19fY3hhX3VuY2F1Z2h0X2V4Y2VwdGlvbgAPA2VudgdfX19sb2NrAAMDZW52C19fX21hcF9maWxlAAADZW52C19fX3NldEVyck5vAAMDZW52DV9fX3N5c2NhbGwxNDAAAANlbnYNX19fc3lzY2FsbDE0NQAAA2Vudg1fX19zeXNjYWxsMTQ2AAADZW52DV9fX3N5c2NhbGwyMjEAAANlbnYLX19fc3lzY2FsbDUAAANlbnYMX19fc3lzY2FsbDU0AAADZW52C19fX3N5c2NhbGw2AAADZW52DF9fX3N5c2NhbGw5MQAAA2VudglfX191bmxvY2sAAwNlbnYWX19lbWJpbmRfcmVnaXN0ZXJfYm9vbAAWA2VudhdfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcwAgA2VudiNfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19jb25zdHJ1Y3RvcgAVA2VudiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbgAhA2VudiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19wcm9wZXJ0eQAiA2VudhdfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbAAEA2VudhZfX2VtYmluZF9yZWdpc3Rlcl9lbnVtAAoDZW52HF9fZW1iaW5kX3JlZ2lzdGVyX2VudW1fdmFsdWUACwNlbnYXX19lbWJpbmRfcmVnaXN0ZXJfZmxvYXQACwNlbnYZX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcgAWA2Vudh1fX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldwALA2VudhxfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nAAQDZW52HV9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nAAsDZW52Fl9fZW1iaW5kX3JlZ2lzdGVyX3ZvaWQABANlbnYOX19lbXZhbF9kZWNyZWYAAwNlbnYOX19lbXZhbF9pbmNyZWYAAwNlbnYSX19lbXZhbF90YWtlX3ZhbHVlAAADZW52Bl9hYm9ydAAUA2VudhZfZW1zY3JpcHRlbl9tZW1jcHlfYmlnAAEDZW52B19nZXRlbnYABQNlbnYSX2xsdm1fc3RhY2tyZXN0b3JlAAMDZW52D19sbHZtX3N0YWNrc2F2ZQAPA2VudgpfbGx2bV90cmFwABQDZW52El9wdGhyZWFkX2NvbmRfd2FpdAAAA2VudhRfcHRocmVhZF9nZXRzcGVj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cGVOYW1lALQEBV9mcmVlALcFD19sbHZtX2Jzd2FwX2kzMgDgCQdfbWFsbG9jALYFB19tZW1jcHkA4QkIX21lbW1vdmUA4gkHX21lbXNldADjCRdfcHRocmVhZF9jb25kX2Jyb2FkY2FzdABwE19wdGhyZWFkX211dGV4X2xvY2sAcBVfcHRocmVhZF9tdXRleF91bmxvY2sAcAVfc2JyawDkCQpkeW5DYWxsX2RpAOUJC2R5bkNhbGxfZGlkAOYJC2R5bkNhbGxfZGlpAOcJDGR5bkNhbGxfZGlpaQDoCQlkeW5DYWxsX2kAvwMKZHluQ2FsbF9paQDpCQtkeW5DYWxsX2lpZADqCQxkeW5DYWxsX2lpZGQA6wkNZHluQ2FsbF9paWRkZADsCQ5keW5DYWxsX2lpZGRkaQDtCQtkeW5DYWxsX2lpaQDuCQxkeW5DYWxsX2lpaWkA7wkNZHluQ2FsbF9paWlpaQDwCQ5keW5DYWxsX2lpaWlpZADxCQ5keW5DYWxsX2lpaWlpaQDyCQ9keW5DYWxsX2lpaWlpaWQA8wkPZHluQ2FsbF9paWlpaWlpAPQJEGR5bkNhbGxfaWlpaWlpaWkA9QkRZHluQ2FsbF9paWlpaWlpaWkA9gkOZHluQ2FsbF9paWlpaWoAogoJZHluQ2FsbF92APcJCmR5bkNhbGxfdmkA+AkLZHluQ2FsbF92aWQA+QkMZHluQ2FsbF92aWRpAPoJC2R5bkNhbGxfdmlpAPsJDGR5bkNhbGxfdmlpZAD8CQ1keW5DYWxsX3ZpaWRpAP0JDGR5bkNhbGxfdmlpaQD+CQ1keW5DYWxsX3ZpaWlpAP8JDmR5bkNhbGxfdmlpaWlpAIAKD2R5bkNhbGxfdmlpaWlpaQCBCg5keW5DYWxsX3ZpaWppaQCjChNlc3RhYmxpc2hTdGFja1NwYWNlADUIc2V0VGhyZXcANgpzdGFja0FsbG9jADIMc3RhY2tSZXN0b3JlADQJc3RhY2tTYXZlADMJ9BQBACMAC/4KggpxdaECe3/3A/0Dgwq6AbsBwgHDAdAB0QHoAekBgAKBAoYCiQKDCoMKgwqECscDfYYBzgPOA8cDxwPOA4QKhAqECoQKhAqECoQKhQrJA4YKwAPaA98D8QP1A/YD+gOABIUEiQSLBI0ElQSVBJUEhwpwcFDFBXB0nwGlAXDdArUExAVwcMQFzQXzBfMF+gX7Bf8FgAbrBvIG8wb0BvUG9gb3BvgG6waTB5QHlQeWB5cHmAeZB7AHsQeyB7MHtAe1B7YHtwe4B7kHuge7B7wHvQe+B8EHsQeyB7MHtAe1B7YHtwe4B7kHuge7B7wHvQe+B8oHygdwygfKB3DOB84HcM4Hzgdw0gfTB9gH0gfTB9gH3wetAeQH3wetAeQHcHCDCHR0dI4IcJAIcHCDCNIH0wffB60B0QnTCb0DvwPGA70D0APQA9IDvQPQA9AD2AO9A78DvQO9A78DrQG9A+UDvQPqA70D7gO9A78D8wO9A70D0APQA78DvQPQA9ADvwO9A9AD0AO/A70DvwO9A/QCvQO/A70D0APQA78DvQPQA9ADvwO9A78DvQO9A9AD0AO9A9AD0AO9A9AD0AO9A9AD0AOoBL8DrASgBL8DpASTBL8DmQSHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKhwqHCocKiAq2Ab4BxwHiAfwBiAqICokKwwPDA8MDwwOJCokKiQqKCsEDwQPBA8EDwQOKCooKiwrUA4wKUVKmAacBxgXGBcYFxgX1BfgF/AWBBqUIpwipCK8IsQi5CLsIvQjNCM8I0Qi0AsQDxQPNA9EDzQPWA9cDzQPeA+EDQuMDzQPoA+kD4wPtA+MD7wPyA/QD9AP0A4EEggThA80D9AOOBI8E4QPhA+EDjAqMCowKjAqMCowKjQrABcMFxwWiAe0B7gHIAckB4wG2BLcEugS7BIcFwAXMBc4F9AX3BYYGiwb8B/wHpgioCKsIsAiyCLUIugi8CL8IyQjOCNAI0wjCCdQJ1QnUCcIDygOOAdMD2QPcA90D4gPnA5AEkQSbBK4EmwSmBJsEnATgBI0KjQqNCo0KjQqOCu8B8AHxAcsBzAHNAeUB/gGqCLYItwi4CL4IygjLCMwI0gjMA9UD2wPsA50EnQSdBI4KjgqOCo4KjgqOCo4KjwrWBtcG5QbmBo8KjwqPCpAKuAHAAc4B5gGEBokG0QbSBtQG2AbgBuEG4wbnBoEIggiBCIgIjQiPCIEIlAidCKEIrAjACNQI6wOQCpAKkAqRCvQH+AeRCpIKjgaPBpAGkQaSBpIGkwaUBpUGlgaXBrgGuQa6BrsGvAa8Br0Gvga/BsAGwQbsBu0G7gbvBvAGjQeOB48HkAeRB/UH+QeSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkgqSCpIKkwrFB8gH6AfpB+8H8AeTCpQK8QaSB/8HgAiHCIcIiwiMCJIIkwiUCpQKlAqUCpQKlQrTBtUG4gbkBpUKlQqVCpYKBb8JzQmXCjs8Ozw7PNQF1QXWBdcFU1RVVkxNWFk7PGxtOzw7PDw7PNAF0QXSBdMFqAGpAaoBqwGbAZwBnQGeAZkBoAE7PDs8PMUBxgHcAd0B1gHXAcYBPDycAp0CogI7pQI7O7ICswK5AroCO74CvwLAAsECwwLHAsgCyQLOAs8C0ALVAtYC2ALZAtoC2wLkAuUCO+gC6QKAA4EDggODA4QDiQO6Ao4DjwORA5IDoAOhA6ADqAO0A7UDuAO6ArAEsQS7Bb0FvgW/BcoFywXQBdEF0gXTBdQF1QXWBdcFywW/BcsFvwU7PIMGOzw7PDs8Ozw7PDs8OzyuB68HrgevB8MHxAfDB8QHwwfEB8MHxAc7PDs8Ozw7PNAH0QfbB9wH3QfeB+YH5wc7PDs8Ozw7PDs8Ozw7PDw7PDs8OzyJCIoIkQiKCDs8OzyYCJkImwicCJ8IoAijCKQIrQiuCLMItAjBCMIIxQjGCMIIxgg8PDw8PK4ItAg7PDs7PM8J0AnQCTs8PDw8PL4Dfr4DvgO+A74DvgO+A+YDvgO+A74DvgO+A74DvgO+A74DvgO+A74DvgO+A74DvgO+A74DqQShBJQEngagBju3Bc4JlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCpgKoAKQA7cDgwGEAYUBmAL4A/gD+wP+A/gDjASYCpgKmQrvAvACmQqaCqMCoQG3Ab8BygHkAf0BngKfAqMCowKkAqYCowK7ArwCowLCAsQC1wLcAuYC5wK2A6MC8gX2BfkF/gXLB8sHywfMB80HzQfLB8sHywfMB80HzQfLB8sHywfPB80HzQfLB8sHywfPB80HzQfUB9UH1gfXB9kH2gfUB9UH1gfXB9kH2gfgB+EH4gfjB9oH5QfgB+EH4gfjB9oH5QejAqMC1AfDCMQI4AfHCMgIyAOVAWdmSqwBmwJvc8gDyAPNAvkDyAP8A/8D9QLIA4oEqgSiBJYEmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpoKmgqaCpsKcnbLA88DzwPLA8sDywPLA88DywPLA5sKmwqbCpwKhASdCoMChAKFAocChAKIAnzgA+QD5APkA/AD4APgA+AD4APgA+ADgwTgA6sErQTgA6MEpQTgA5cEmgSdCp0KnQqeCk+kAbkBwQHPAecB/wHCBcIFhQaKBp4IogjFCcwJ2AmYBJgEmASeCp4KngqeCp4KngqeCp4KngqeCp4KngqfCsQJywnXCaAK/Qf+B8MJygnWCaAKoAqhCk6jAcEFwQWhCqEKoQoKlocT8wkGACAAQAALGwEBfyMJIQEgACMJaiQJIwlBD2pBcHEkCSABCwQAIwkLBgAgACQJCwoAIAAkCSABJAoLEAAjBUUEQCAAJAUgASQGCwtPAQN/IABBuJsBNgIAIABBGGoiBRB3IABBOGoiBhB3IABB2ABqIgcQdyAFIAEQkQEaIAYgAhCRARogByADEJEBGiAAIARBAXE6AHgg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IgAEQCAAKAIAKAIEIQQgACAEQf8DcUGEBWoRAwALQSgQlwkiACACEHogAEHYmwE2AgAgACACKAIgNgIgIAMgADYCAEEBC3wBAX8gAiADEI8BRQRAQQAPCyAAQRhqIgMrAwAgAWNFBEBBAA8LIAMgATkDACAAQSBqIgMoAgAiAARAIAAoAgAoAgQhBCAAIARB/wNxQYQFahEDAAtBKBCXCSIAIAIQeiAAQdibATYCACAAIAIoAiA2AiAgAyAANgIAQQELWQEBfyAAIAFGBEAgAA8LIAAgASsDCDkDCCAAIAErAxA5AxAgACABKwMYOQMYQSgQlwkiAiABKAIgIgEQeiACQdibATYCACACIAEoAiA2AiAgACACNgIgIAALQgEBfyAAIAErAwggAisDCKAgASsDECACKwMQoCABKwMYIAIrAxigEHggAEHgnAE2AgBBKBCXCSIDEEUgACADNgIgCyIBAX8gACABKAIgIgIQeiAAQdibATYCACAAIAIoAiA2AiALlwIBBX8jCSEFIwlBkAFqJAkgBSICQThqIQQgAkGE/AA2AgAgBEGY/AA2AgAgAkE4aiACQQRqIgMQ2QUgAkEANgKAASACQX82AoQBIAJB7JsBNgIAIARBgJwBNgIAIAMQ3QUgA0GgnAE2AgAgAkEkaiIGQgA3AgAgBkIANwIIIAJBEDYCNCACQaPbAUEDED0gASsDCBDqBUHg3AFBAhA9IAErAxAQ6gVB4NwBQQIQPSABKwMYEOoFQafbAUEFED0gASgCIBBXGiAAIAMQSyACQeybATYCACAEQYCcATYCACADQaCcATYCACAGLAALQQBOBEAgAxC+BSAEELsFIAUkCQ8LIAYoAgAQtwUgAxC+BSAEELsFIAUkCQsvAQF/IABB8JwBNgIAIABBCGoiAxB3IABBKGoiABB3IAMgARCRARogACACEJEBGgs1AQF/IABB8JwBNgIAIABBCGoiAhB3IABBKGoiABB3IAIgAUEIahCRARogACABQShqEJEBGgssAgF/AXwjCSEBIwlBIGokCSABIABBKGogAEEIahCHASABEH8hAiABJAkgAgtIAQN/IwkhAyMJQdAAaiQJIANBQGsiBCACOQMAIAMgAUEoaiABQQhqIgEQhwEgA0EgaiIFIAMgBBCSASAAIAUgARCLASADJAkLeAEEfyAAQYCdATYCACAAQQxqIgMoAgBFBEAPCyAAKAIIIgEoAgAiBCAAQQRqIgIoAgBBBGoiACgCADYCBCAAKAIAIAQ2AgAgA0EANgIAIAEgAkYEQA8LIAEhAANAIAAoAgQhASAAELcFIAEgAkcEQCABIQAMAQsLC4MBAQV/IABBgJ0BNgIAIABBDGoiASgCAEUEQCAAELcFDwsgACgCCCICKAIAIgQgAEEEaiIDKAIAQQRqIgUoAgA2AgQgBSgCACAENgIAIAFBADYCACACIANGBEAgABC3BQ8LA0AgAigCBCEBIAIQtwUgASADRwRAIAEhAgwBCwsgABC3BQsnAQF/IABBgJ0BNgIAIABBBGoiASABNgIAIAAgATYCCCAAQQA2AgwLYAECf0HQABCXCSICQZCdATYCACACQQhqIAEQaUEMEJcJIgEgAjYCCCABIABBBGoiAjYCBCABIAIoAgAiAzYCACADIAE2AgQgAiABNgIAIABBDGoiACAAKAIAQQFqNgIACwQAQQALCQAgAEEIahBqCw0AIAAgAUEIaiACEGsLYAECf0GIARCXCSICQaydATYCACACQQhqIAEQOUEMEJcJIgEgAjYCCCABIABBBGoiAjYCBCABIAIoAgAiAzYCACADIAE2AgQgAiABNgIAIABBDGoiACAAKAIAQQFqNgIACwQAQQELBwAgACsDEAsNACAAIAFBCGogAhA6CycBAX8gAEHInQE2AgAgAEEIaiIBQgA3AwAgAUIANwMIIAFCADcDEAsgACAAQcidATYCACAAIAE5AwggACACOQMQIAAgAzkDGAsnACAAQcidATYCACAAIAE5AwggACACOQMQIABEAAAAAAAAAAA5AxgLKQAgAEHInQE2AgAgACABKwMIOQMIIAAgASsDEDkDECAAIAErAxg5AxgLJQEBfCAAKwMIIgEgAaIgACsDECIBIAGioCAAKwMYIgEgAaKgnwtnAQZ8IAErAxAhAyACKwMYIQQgASsDGCEFIAIrAxAhBiACKwMIIQcgASsDCCEIIABByJ0BNgIAIAAgAyAEoiAFIAaioTkDCCAAIAUgB6IgBCAIoqE5AxAgACAGIAiiIAMgB6KhOQMYCyUAIAArAwggASsDCKIgACsDECABKwMQoqAgACsDGCABKwMYoqALcAICfwR8IABBCGoiASsDACIDIAOiIABBEGoiAisDACIE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nyIHIAZEAAAAAAAAAAAQeCAEIAeaIAErAwBEAAAAAAAAAAAQeCAFIAIgAxCUASAEIAIgAxCUASAAIAUrAwggBCsDCCAFKwMYIgYgBCsDGCIHZCIBGzkDACAAIAYgByABGzkDCCAEJAkLHQBEAAAAAAAAAABEAAAAAAAA8L8gACsDKCABZhsLBwAgACsDKAtGACAAQfShATYCACAAIAE5AyAgACABRAAAAAAAAOA/oiIBOQMoIAAgAjkDMCAAIAE5AwggAEEQaiIAQgA3AwAgAEIANwMIC0UBAX8gACABQdgAahB6IABBCGoiAyADKwMAIAErA3ggAisDAKKgOQMAIABBEGoiACAAKwMAIAErA4ABIAIrAwiioDkDAAtsAQN/IwkhAyMJQeAAaiQJIAEoAgAoAgAhBCADQSBqIgUgASACIARBH3FBqgpqEQsAIAEoAgAoAgghBCADIAEgAiAEQR9xQaoKahELACADQUBrIgIgAUGIAWogAxCMASAAIAUgAhCLASADJAkLKgAgACABKwOAASACKwMAoiABKwN4IAIrAwiiRAAAAAAAAAAAEHggABB+C0kBA38jCSECIwlBQGskCSACEJcCIAIgARCYAiAAKAIAKAIEIQMgAkEYaiIEIAAgAiADQR9xQaoKahELACAEKwMQIQEgAiQJIAELegEDfyMJIQMjCUHwAGokCSADQShqIgQgASsDeCACKwMAojkDACADQdAAaiIFIAQgAUGwAWoQjAEgA0EwaiIEIAFB2ABqIAUQiwEgAyABKwOAASACKwMIojkDACADQQhqIgIgAyABQdABahCMASAAIAQgAhCLASADJAkLbAEDfyMJIQMjCUHQAGokCSADQcgAaiIEIAIrAwAgASsDgAGiOQMAIANBKGoiBSAEIAFBsAFqEIwBIAMgAisDCCABKwN4ojkDACADQQhqIgIgAyABQdABahCMASAAIAUgAhCLASAAEH4gAyQJC2EBBH8jCSECIwlB4ABqJAkgAkFAayIDEJcCIAMgARCYAiAAKAIAKAIEIQQgAkEgaiIFIAAgAyAEQR9xQaoKahELACACIABBkAFqIAUQhwEgAiAAQfABahB9IQEgAiQJIAELmAEBA38jCSEFIwlBIGokCSAAQbCiATYCACAAQRBqEJcCIABBKGoQlwIgAEFAaxCXAiAAQdgAaiIGEHcgAEGQAWoiBxB3IAYgARCRARogACACOQN4IAAgAzkDgAEgACACIAOjOQMIIAAgBDkDiAEgBUQAAAAAAAAAAEQAAAAAAAAAAEQAAAAAAAAAABB4IAcgBRCRARogBSQJC5UBAQN/IABBsKIBNgIAIABBEGoQlwIgAEEoahCXAiAAQUBrEJcCIABB2ABqIgcQdyAAQZABahB3IABByKIBNgIAIABBsAFqIggQdyAAQdABaiIJEHcgAEHwAWoQdyAHIAEQkQEaIAAgAjkDeCAAIAM5A4ABIAAgAiADozkDCCAAIAQ5A4gBIAggBRCRARogCSAGEJEBGgsjAQF/IAEoAgAoAgAhAiAAIAEgAUEQaiACQR9xQaoKahELAAsjAQF/IAEoAgAoAgAhAiAAIAEgAUEoaiACQR9xQaoKahELAAsjAQF/IAEoAgAoAgQhAiAAIAEgAUEQaiACQR9xQaoKahELAAsjAQF/IAEoAgAoAgQhAiAAIAEgAUEoaiACQR9xQaoKahELAAuuBQIHfwN8IwkhASMJQSBqJAkgACgCACgCBCEDIAEiBCAAIABBEGoiBSADQR9xQaoKahELACABKwMQmSEIIABBKGoiAiAFKwMAOQMAIABBMGoiBiAAQRhqIgcrAwCaOQMAIAAoAgAoAgQhAyABIAAgAiADQR9xQaoKahELACABKwMQmSAIRLu919nffNs9oCIKYwRAIAIrAwAgBSsDACIJoZlEOoww4o55RT5kBEAgASQJQQEPCyAGKwMAIAcrAwAiCKGZRDqMMOKOeUU+ZARAIAEkCUEBDwsFIAUrAwAhCSAHKwMAIQgLIAIgCZo5AwAgBiAIOQMAIAAoAgAoAgQhAyAEIAAgAiADQR9xQaoKahELACAEKwMQmSAKYwRAIAIrAwAgBSsDACIJoZlEOoww4o55RT5kBEAgASQJQQEPCyAGKwMAIAcrAwAiCKGZRDqMMOKOeUU+ZARAIAEkCUEBDwsFIAUrAwAhCSAHKwMAIQgLIAIgCZo5AwAgBiAImjkDACAAKAIAKAIEIQMgBCAAIAIgA0EfcUGqCmoRCwAgBCsDEJkgCmMEQCACKwMAIAUrAwAiCaGZRDqMMOKOeUU+ZARAIAEkCUEBDwsgBisDACAHKwMAIgihmUQ6jDDijnlFPmQEQCABJAlBAQ8LBSAFKwMAIQkgBysDACEICyACIAk5AwAgBiAIOQMAIAAoAgAoAgQhAyAEIAAgAiADQR9xQaoKahELACAEKwMQmSAKYwRAIAEkCUEBDwtBrOUCQavnAUE+ED0aQazlAkHq5wFBCRA9IgRB9OcBQQ0QPSAAQdgAahCJAUGC6AFBAxA9IAArA3gQ6gVBhugBQQMQPSAAKwOAARDqBUGK6AFBBRA9IAArA4gBEOoFGiAEQePyAUEBED0aIAAQkQIgASQJQQAL1AIBBX8jCSEFIwlBQGskCUGs5QJBkOgBQQ0QPSEBIAVBIGoiAiAAQRBqIgMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECABIAIQmQJBnugBQQwQPSEBIAAoAgAoAgQhBCAFIAAgAyAEQR9xQaoKahELACABIAUQiQFBq+gBQQMQPSEBIAAoAgAoAgQhBCACIAAgAyAEQR9xQaoKahELACABIAIrAxAQ6gVB4/IBQQEQPRpBrOUCQa/oAUENED0hASACIABBKGoiAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAEgAhCZAkGe6AFBDBA9IQEgACgCACgCBCEEIAUgACADIARBH3FBqgpqEQsAIAEgBRCJAUGr6AFBAxA9IQEgACgCACgCBCEEIAIgACADIARBH3FBqgpqEQsAIAEgAisDEBDqBUHj8gFBARA9GiAFJAkL8wEBBX8jCSEBIwlB0ABqJAkgAUEYaiICEJcCIAEiAxCXAiACRAAAAAAAAAAAEJgCIAFEAAAAAAAACEAQmAIgACgCACgCBCEEIAFBMGoiBSAAIAIgBEEfcUGqCmoRCwAgBSsDEJlEu73X2d982z1jBEAgAEEQaiACEJoCGiAAEJACGiABJAlBAQ8LIAAoAgAoAgQhBCAFIAAgAyAEQR9xQaoKahELACAFKwMQmUS7vdfZ33zbPWMEfyAAQRBqIAMQmgIaIAAQkAIaIAEkCUEBBSAAQRBqIAIrAxAgAysDECAAEJMCEJgCIAAQkAIaIAEkCUEBCwuYBQIBfwx8IAIgACACKAIAKAIMQQ9xQQhqEQgAIgcgAiABIAIoAgAoAgxBD3FBCGoRCAAiCKJEAAAAAAAAAABmBEBBrOUCQb3oAUEzED0aCyAAIQYgACELIAghBCAHIQUgASAAoSINIQ4DQCAHmSAEmWMEfCALIQYgASIJIQsgBCIKIQUgBwUgBiEJIAEhBiAHIQogBAsiCEQAAAAAAAAAAGEgCyAGoUQAAAAAAADgP6IiAJkiB0RNZ+LxBZ7FPCAGmaJEu73X2d982z2gIgxlckUEQCAOmSAMYwR8IAAhBCAABSAFmSAImWUEfCAAIQQgAAUgCCAFoyIBIAkgC2EEfEQAAAAAAADwPyABoSEEIABEAAAAAAAAAECiBSABRAAAAAAAAPC/oCAFIAqjIgVEAAAAAAAA8L+gIAggCqMiAUQAAAAAAADwv6AiD6KiIQQgBSABoSAJIABEAAAAAAAAAECioqIgDyAGIAmhoqELoiIBRAAAAAAAAAAAZCEDIAEgAZogAxsiBUQAAAAAAAAAQKIgAEQAAAAAAAAIQKIgBJogBCADGyIEoiAMIASimaFjBHwgBSAORAAAAAAAAOA/oiAEopljBHwgBSAEoyIHIQQgB5khByANBSAAIQQgAAsFIAAhBCAACwsLIQEgAigCACgCDCEDAnwCQCACIAcgDGQEfCAGIASgBSAGIAygIAYgDKEgAEQAAAAAAAAAAGQbCyIFIANBD3FBCGoRCAAiCUQAAAAAAAAAAGQgCkQAAAAAAAAAAGRxDQAgCUQAAAAAAAAAAGUgCkQAAAAAAAAAAGVxDQAgCiEHIAQhDSABDAELIAYhCyAIIQcgBSAGoSINCyEAIAUhASAJIQQgCCEFIAAhDgwBCwsgBgvSBgIHfwN8IwkhBiMJQdAAaiQJIAZBMGoiAiABQcgAahCBASAAQfABaiACEJEBGiAAQZABaiABQQhqEJEBGiABKwMYIAErAzhhBHwgACsDgAEgACsD4AGiIgkgCaIiCSAJIAArA3ggACsDwAGiIgkgCaKgo58FIAErAxAgASsDMGEEfCAAKwOAASAAKwPYAaIiCSAJoiIJIAkgACsDeCAAKwO4AaIiCSAJoqCjnwVEAAAAAAAAAAALCyEKIAIQlwIgBkEYaiIHEJcCIAYiCBCXAiACRAAAAAAAAPA/IAogCqKhnyIJIAoQrwMQmAIgACgCACgCDCEBIAAgAkEQaiIEKwMAIAFBD3FBCGoRCABEAAAAAAAAAABkBH8gByACEJoCGkEBBSAAKAIAKAIMIQEgACAEKwMAIAFBD3FBCGoRCABEAAAAAAAAAABjBH8gCCACEJoCGkEBIQVBAAVBAAsLIQEgAiAJIAqaIgsQrwMQmAIgACgCACgCDCEDIAAgBCsDACADQQ9xQQhqEQgARAAAAAAAAAAAZARAIAcgAhCaAhpBASEBBSAAKAIAKAIMIQMgACAEKwMAIANBD3FBCGoRCABEAAAAAAAAAABjBEAgCCACEJoCGkEBIQULCyACIAmaIgkgChCvAxCYAiAAKAIAKAIMIQMgACAEKwMAIANBD3FBCGoRCABEAAAAAAAAAABkBEAgByACEJoCGkEBIQEFIAAoAgAoAgwhAyAAIAQrAwAgA0EPcUEIahEIAEQAAAAAAAAAAGMEQCAIIAIQmgIaQQEhBQsLIAIgCSALEK8DEJgCIAAoAgAoAgwhAyAAIAQrAwAgA0EPcUEIahEIAEQAAAAAAAAAAGQEQCAHIAIQmgIaQQEhAQUgACgCACgCDCEDIAAgBCsDACADQQ9xQQhqEQgARAAAAAAAAAAAYwRAIAggAhCaAhpBASEFCwsgASAFcUUEQCAGJAlBAA8LIAcrAxAiCyAIKwMQIglkBEAgCyEKBSAJIAtkBHwgCSEKIAsFRAAAAAAAAAAAIQpEAAAAAAAAAAALIQkLIAkgCiAAEJMCIQsgCkQAAAAAAAAQwKAgCSAAEJMCIQkgAEEQaiALEJgCIABBKGogCRCYAiAGJAlBAQsjAQF/IAEoAgAoAgAhAiAAIAEgAUFAayACQR9xQaoKahELAAvAAgIMfwF8IwkhAyMJQbABaiQJIAAoAgAoAgQhBCADQYgBaiIFIAAgAEEQaiIJIARBH3FBqgpqEQsAIANBgAFqIgQgAEHgAGoiCisDACAFKwMIoSABQQhqIgsrAwAiD6EgAkEIaiIMKwMAIA+hozkDACADQUBrIgYgAiABEIcBIANB4ABqIgcgBCAGEIwBIANBIGoiCCABIAcQiwEgACgCACgCBCENIAUgACAAQShqIg4gDUEfcUGqCmoRCwAgBCAKKwMAIAUrAwihIAsrAwAiD6EgDCsDACAPoaM5AwAgBiACIAEQhwEgByAEIAYQjAEgAyICIAEgBxCLASAAQUBrIQEgCCsDGCADKwMYZgRAIAEgCRCaAhogAEHYAGogCBCRARogAyQJBSABIA4QmgIaIABB2ABqIAIQkQEaIAMkCQsLTwEBfyMJIQEjCUEgaiQJIABEAAAAAAAAAAA5AxAgAUQAAAAAAADwP0QAAAAAAAAAABB5IAEQfiAAIAErAwg5AwAgACABKwMQOQMIIAEkCQvqAQEBfyMJIQIjCUEgaiQJIAAgATkDECABRAAAAAAAABBAZARAA0AgAUQAAAAAAAAQwKAiAUQAAAAAAAAQQGQNAAsLIAFEAAAAAAAAAABjBEADQCABRAAAAAAAABBAoCIBRAAAAAAAAAAAYw0ACwsgAkQAAAAAAADwPyABoSABRAAAAAAAAAjAoCABRAAAAAAAAABAYxsgAUQAAAAAAAAIQGMEfEQAAAAAAAAAQCABoSABIAFEAAAAAAAA8D9kGwUgAUQAAAAAAAAQwKALEHkgAhB+IAAgAisDCDkDACAAIAIrAxA5AwggAiQJCy8AIABB8egBQQEQPSABKwMAEOoFQfPoAUECED0gASsDCBDqBUH26AFBARA9GiAACyIAIAAgASsDADkDACAAIAErAwg5AwggACABKwMQOQMQIAALigICBX8CfCMJIQUjCUGQAWokCSAFIgJBOGohBCACQYT8ADYCACAEQZj8ADYCACACQThqIAJBBGoiAxDZBSACQQA2AoABIAJBfzYChAEgAkHsmwE2AgAgBEGAnAE2AgAgAxDdBSADQaCcATYCACACQSRqIgZCADcCACAGQgA3AgggAkEQNgI0IAErAwAhByABKwMIIQggAkHx6AFBARA9IAcQ6gVB8+gBQQIQPSAIEOoFQfboAUEBED0aIAAgAxBLIAJB7JsBNgIAIARBgJwBNgIAIANBoJwBNgIAIAYsAAtBAE4EQCADEL4FIAQQuwUgBSQJDwsgBigCABC3BSADEL4FIAQQuwUgBSQJC4gCAQV/IABB4KIBNgIAIABBNGoiBCgCACICKAIAIgMgAkEEaiIFKAIAIgFHBEADQCABQVhqIgEoAgAoAgAhAiABIAJB/wNxQYQFahEDACABIANHDQALIAQoAgAhAgsgBSADNgIAIAIEQCACKAIAIgMEQCADIAJBBGoiBCgCACIBRgR/IAMFA0AgAUFYaiIBKAIAKAIAIQUgASAFQf8DcUGEBWoRAwAgASADRw0ACyACKAIACyEBIAQgAzYCACABELcFCyACELcFCyAAKAIgIgEEQCABIAEoAgAoAgRB/wNxQYQFahEDAAsgAEG8owE2AgAgACgCKCIBRQRADwsgACABNgIsIAEQtwULDAAgABCcAiAAELcFC1QBAX9BrOUCQarqAUEOED0aIAAgATYCHCAAQSBqIgIoAgAQrgIgAigCACICIAAoAhQ2AgQgAiACIAFBBGpBAEEAEK8CNgIIQazlAkG56gFBFBA9GguDAQEEfyAAQRhqIgQgATYCACAAKAIoIgIgACgCLCIDRgRADwsgAigCACIAKAIAKAIMIQUgACABIAVB/wBxQZgJahEEACACQQRqIgAgA0YEQA8LA0AgACgCACIBKAIAKAIMIQIgASAEKAIAIAJB/wBxQZgJahEEACADIABBBGoiAEcNAAsLgQEBBH8gAEEIaiIFIAE5AwAgACgCKCICIAAoAiwiBEYEQA8LIAIoAgAiACgCACgCECEDIAAgASADQQ9xQYQJahEMACACQQRqIgAgBEYEQA8LA0AgACgCACICKAIAKAIQIQMgAiAFKwMAIANBD3FBhAlqEQwAIAQgAEEEaiIARw0ACwsHACAAKwMICwcAIAAQqQILAwABCwwAIAAgASgCNBCoAgtXAQN/IAAoAjQiACgCACIBIABBBGoiAigCACIARgRAIAIgATYCAA8LA0AgAEFYaiIAKAIAKAIAIQMgACADQf8DcUGEBWoRAwAgACABRw0ACyACIAE2AgALOQECfyAAKAI0IgBBBGoiAigCACIDIAAoAghGBEAgACABEKcCBSADIAEQXSACIAIoAgBBKGo2AgALC9ACAQh/IABBBGoiBigCACAAKAIAIgJrQShtIgRBAWoiA0HmzJkzSwRAECULIAMgAEEIaiIJKAIAIAJrQShtIgJBAXQiBSAFIANJG0HmzJkzIAJBs+bMGUkbIgcEQCAHQebMmTNLBEBBCBAEIgMQmQkgA0G02AE2AgAgA0HQmQFB6wEQBgUgB0EobBCXCSEICwsgBEEobCAIaiIEIQMgBCABEF0gACgCACIFIAYoAgAiAUYEfyAFIgEFIAQhAgNAIAJBWGogAUFYaiIBEF0gA0FYaiICIQMgASAFRw0ACyACIQMgACgCACEBIAYoAgALIQIgACADNgIAIAYgBEEoajYCACAJIAdBKGwgCGo2AgAgAiABIgNHBEAgAiEAA0AgAEFYaiIAKAIAKAIAIQIgACACQf8DcUGEBWoRAwAgACADRw0ACwsgAUUEQA8LIAEQtwULqQEBBX8gAEEANgIAIABBBGoiBEEANgIAIABBCGoiBUEANgIAIAFBBGoiBigCACABKAIAayICQShtIQMgAkUEQA8LIANB5syZM0sEQBAlCyAEIAIQlwkiAjYCACAAIAI2AgAgBSADQShsIAJqNgIAIAEoAgAiACAGKAIAIgNGBEAPCyACIQEDQCABIAAQXSAEIAQoAgBBKGoiATYCACAAQShqIgAgA0cNAAsL+QYCEH8CfCMJIQojCUGgAWokCUGs5QJB+OgBQQ8QPSAAQTRqIgQoAgAiASgCBCABKAIAa0EobRDpBUGI6QFBDxA9IAAoAhwoAgwQ6QVBmOkBQQwQPRogBCgCACIBKAIEIAEoAgBrQShtIQMgCiIFQgA3AgAgBUEANgIIIAVBC2oiBkEBOgAAIAVBCjoAACAFQQA6AAEgBUHcAGoiAUIANwIAIAFBADYCCCAFQdAAaiICQgA3AgAgAkEANgIIIAVB6ABqIgcgAyAFIAEgAhCqAiACLAALQQBIBEAgAigCABC3BQsgASwAC0EASARAIAEoAgAQtwULIAYsAABBAEgEQCAFKAIAELcFCyAAQRBqIgxBADYCACAEKAIAIgYoAgAhASAGKAIEIAFrIgJBKG0hDiACBEAgAEEgaiEPIABBGGohCyAHQShqIQ0gB0EwaiEQQQAhBEEAIQADQCAPKAIAIQIgBSAEQShsIAFqKwMIIhIgCygCACIDKwMoIhGhIBEgEqAgBEEobCABaisDECISIBGhIBEgEqAgBEEobCABaisDGCIRIBEgAysDMKAQQEEMEJcJIgMgAzYCACADQQRqIgggAzYCACADQQhqIglBADYCACACIAMgBSACKAIIEKsCIAgoAgAiASICIANHBEADQCALKAIAIAYoAgAgBEEobGogAUEIaiIBEPsBBEAgBigCACAEQShsaiABEF8EQCALKAIAIAYoAgAgBEEobGogARD6ARogAEEBaiEACwsgAigCBCIBIgIgA0cNAAsLIAkoAgAEQCAIKAIAIgEoAgAiAiADKAIAQQRqIggoAgA2AgQgCCgCACACNgIAIAlBADYCACABIANHBEADQCABKAIEIQIgAUEIaiIIKAIAKAIAIQkgCCAJQf8DcUGEBWoRAwAgARC3BSACIANHBEAgAiEBDAELCwsLIAMQtwUgDSANKAIAQQFqIgE2AgAgASAQKAIATwRAIAcQrAILIARBAWoiBCAOSQRAIAYoAgAhAQwBCwsFQQAhAAsgDCAANgIAQazlAkGl6QFBAhA9IAwoAgAQ6AVBqOkBQRUQPRogB0EcaiIALAALQQBIBEAgACgCABC3BQsgB0EQaiIALAALQQBIBEAgACgCABC3BQsgB0EEaiIALAALQQBOBEAgCiQJDwsgACgCABC3BSAKJAkLMAAgAEGs5QI2AgAgAEEEaiACEJoJIABBEGogAxCaCSAAQRxqIAQQmgkgACABEK0CC+QCAQR/IwkhBCMJQeABaiQJIAQhBSADLAAoBEAgAygCJCIGKAIEIgIiACAGRgRAIAQkCQ8LIAFBCGohAwNAIAUgAkEIahCxAUHgARCXCSIHQQA2AgAgB0EIaiAFELEBIAcgATYCBCAHIAEoAgAiAjYCACACIAc2AgQgASAHNgIAIAMgAygCAEEBajYCACAGIAAoAgQiAiIARw0ACyAEJAkPCyADKAIIIgVBAXEEQCADKwMQIAIgBUF/ahBEYyEFIAMoAhwhBiAFBEAgACABIAIgBhCrAiAEJAkPCyAGBEAgACABIAIgBhCrAgsgAygCICIDRQRAIAQkCQ8LIAAgASACIAMQqwIgBCQJBSADKwMQIAIgBUEBahBEZARAIAAgASACIAMoAiAQqwIgBCQJDwsgAygCHCIFBEAgACABIAIgBRCrAgsgAygCICIDRQRAIAQkCQ8LIAAgASACIAMQqwIgBCQJCwuQAgEIfyMJIQQjCUEQaiQJIAQhASAAQShqIgcoAgC4IABBLGoiCCgCALijRAAAAAAAAElAoqshAyAAQTRqIQYDQCAAKAIAIQIgAUEqOgAAIAIgAUEBED0Q4AUaIAYgBigCAEEBaiIFNgIAIAUgA0kNAAsgACAFuEQAAAAAAABJQKMgCCgCACICuKKrNgIwIAcoAgAgAkcEQCAEJAkPCyAFQTNJBEAgACgCACECIAFBKjoAACACIAFBARA9GgsgASAAKAIAIgMgAygCAEF0aigCAGoQ2wUgAUGU7AIQmAYiAigCACgCHCEAIAJBCiAAQT9xQdQCahEAACEAIAEQmQYgAyAAEOsFGiADEOAFGiAEJAkLsAIBBX8jCSEEIwlBEGokCSAAQQA2AjQgAEEANgIwIABBADYCKCAAQSxqIgYgATYCACAAQQRqIgEsAAsiA0EASCECIAAoAgAgASgCACABIAIbIAAoAgggA0H/AXEgAhsQPUG+6QFBNxA9IQMgAEEQaiIBLAALIgVBAEghAiAEIAMgASgCACABIAIbIAAoAhQgBUH/AXEgAhsQPUH26QFBMxA9IgEgASgCAEF0aigCAGoQ2wUgBEGU7AIQmAYiAigCACgCHCEDIAJBCiADQT9xQdQCahEAACECIAQQmQYgASACEOsFGiABEOAFGiAAQRxqIgIsAAsiBUEASCEDIAEgAigCACACIAMbIAAoAiAgBUH/AXEgAxsQPRogBigCAARAIAQkCQ8LIAZBATYCACAEJAkLjQIBB38jCSEFIwlBEGokCSAAQRBqIgIgAEEMaiIEKAIAIgE2AgAgBSIDQQA2AgAgAEEUaiIGKAIAIgcgASIASwR/IABBADYCACACIABBBGoiATYCACAHBSAEIAMQ4AEgAigCACEBIAYoAgALIQAgA0EBNgIAIAEgAEkEQCABQQE2AgAgAiABQQRqIgE2AgAFIAQgAxDgASACKAIAIQEgBigCACEACyADQQI2AgAgASAASQRAIAFBAjYCACACIAFBBGoiATYCAAUgBCADEOABIAIoAgAhASAGKAIAIQALIANBAzYCACABIABJBEAgAUEDNgIAIAIgAUEEajYCACAFJAkFIAQgAxDgASAFJAkLC70IAg5/AnwjCSELIwlB4AFqJAkgAUEIaiIEKAIARQRAQazlAkHO6gFBOxA9GiALJAlBAA8LIAshDSAAIAEQsAIiBysDCCETIAcrAxAgE0QAAAAAAADgP6KgIRIgBCgCACAAKAIESwRAIBMQsQNFBEBBDBCXCSIFIAU2AgAgBUEEaiIOIAU2AgAgBUEIaiIIQQA2AgBBDBCXCSIGIAY2AgAgBkEEaiIPIAY2AgAgBkEIaiIJQQA2AgAgASABKAIEIgQiDEYEfyAHBSANQYgBaiEQA38gDSAEQQhqELEBIBAgBygCABBEIBJkIRFB4AEQlwkiBEEANgIAIARBCGogDRCxASAEQQRqIQogEQR/IAogBjYCACAEIAYoAgAiCjYCACAKIAQ2AgQgBiAENgIAIAkFIAogBTYCACAEIAUoAgAiCjYCACAKIAQ2AgQgBSAENgIAIAgLIgQgBCgCAEEBajYCACAMKAIEIgQiDCABRw0AIAcLCyEBQTAQlwkhBCABKAIAIQEgBEGsowE2AgAgBCABNgIIIAQgEjkDECAEIAM2AhggBEEcaiIDQQA2AgAgBEEgaiIMQQA2AgBBDBCXCSIBIAE2AgAgASABNgIEIAFBADYCCCAEIAE2AiQgBCACNgIEIARBADoAKCAJKAIABEAgAyAAIAYgAkEBaiAEEK8CNgIACyAIKAIABEAgDCAAIAUgAkEBaiAEEK8CNgIAIAgoAgAEQCAOKAIAIgAoAgAiASAFKAIAQQRqIgIoAgA2AgQgAigCACABNgIAIAhBADYCACAAIAVHBEADQCAAKAIEIQEgAEEIaiICKAIAKAIAIQMgAiADQf8DcUGEBWoRAwAgABC3BSABIAVHBEAgASEADAELCwsLCyAJKAIABEAgDygCACIAKAIAIgEgBigCAEEEaiICKAIANgIEIAIoAgAgATYCACAJQQA2AgAgACAGRwRAA0AgACgCBCEBIABBCGoiAigCACgCACEDIAIgA0H/A3FBhAVqEQMAIAAQtwUgASAGRwRAIAEhAAwBCwsLCyAHBEAgBxC3BQsgCCgCAARAIA4oAgAiACgCACIBIAUoAgBBBGoiAigCADYCBCACKAIAIAE2AgAgCEEANgIAIAAgBUcEQANAIAAoAgQhASAAQQhqIgIoAgAoAgAhAyACIANB/wNxQYQFahEDACAAELcFIAEgBUcEQCABIQAMAQsLCwsgBRC3BSAJKAIABEAgDygCACIAKAIAIgEgBigCAEEEaiICKAIANgIEIAIoAgAgATYCACAJQQA2AgAgACAGRwRAA0AgACgCBCEBIABBCGoiAigCACgCACEDIAIgA0H/A3FBhAVqEQMAIAAQtwUgASAGRwRAIAEhAAwBCwsLCyAGELcFIAskCSAEDwsLQTAQlwkiACAHKAIAIBIgAyABIAIQsQIgBxC3BSALJAkgAAv/BwINfwJ8IwkhDSMJQfABaiQJQTAQlwkiBUIANwMAIAVCADcDCCAFQgA3AxAgBUIANwMYIAVCADcDICAFQgA3AyhBMBCXCSIGQgA3AwAgBkIANwMIIAZCADcDECAGQgA3AxggBkIANwMgIAZCADcDKCABKAIIRQRAQazlAkGn6wFBPRA9GiAGELcFIAUQtwUgDSQJQQAPCyANIQogASABKAIEIgMiCEYEfyAAQRBqIgQhDCAEKAIAIQIgAEEMaiIDKAIAIgEFIABBDGohByAAQRBqIQwgCkGIAWohC0EBIQADfyAKIANBCGoQsQEgBygCACIDIQQgDCgCACICIANGBH8gACEDIAIFQQAhAiAAIQMgBCEAA38gAkECdCAAaigCACEAIAMEfyALIAAQRCEPIAcoAgAgAkECdGooAgAiAEEDdCAFaiAPOQMAIAsgABBEIQ8gBygCACIAIAJBAnRqKAIAQQN0IAZqIA85AwAgACEEIAIgDCgCACAAa0ECdUF/akcFIABBA3QgBWorAwAgCyAAEERjIQMgBygCACACQQJ0aigCACEAIAMEQCALIAAQRCEPIAcoAgAgAkECdGooAgAiAEEDdCAFaiAPOQMACyAAQQN0IAZqKwMAIAsgABBEZAR/IAsgBygCACACQQJ0aigCABBEIQ8gBygCACIAIAJBAnRqKAIAQQN0IAZqIA85AwAgACEEQQAFIAcoAgAiACEEQQALCyEDIAJBAWoiAiAMKAIAIg4gAGtBAnVJDQAgDiECIAALCyEJIAEgCCgCBCIIIg5GBH8gByEDIAkhASAEBSADIQAgCCEDIA4hCAwBCwsLIQAgDUHYAWoiCUEANgIAIAlBBGoiBEEANgIAIAlBCGoiCEEANgIAIAEgAkYEf0EAIQFBAAVBACEBA0BBGBCXCSECIAFBAnQgAGooAgAiAEEDdCAGaisDACEPIABBA3QgBWorAwAgD6EhECACIAA2AgAgAiAQOQMIIAIgDzkDECAKIAI2AgAgBCgCACIAIAgoAgBJBEAgACACNgIAIAQgBCgCAEEEajYCAAUgCSAKEOABCyADKAIAIgIhACABQQFqIgEgDCgCACACa0ECdUkNAAsgBCgCACEBIAkoAgALIQAgCkEYNgIAIAAgASAKELUCQRgQlwkiAiAJKAIAIgEoAgAiACkDADcDACACIAApAwg3AwggAiAAKQMQNwMQIAEgBCgCACIDRgRAIAEhAAUgASEAA0AgA0F8aiIDKAIAIggEQCAIELcFIAQoAgBBfGohAyAJKAIAIgAhAQsgBCADNgIAIAEgA0cNAAsLIAAEQCAEIAA2AgAgABC3BQsgBhC3BSAFELcFIA0kCSACC48CAQN/IwkhBiMJQeABaiQJIABBrKMBNgIAIAAgATYCCCAAIAI5AxAgACADNgIYIABBADYCHCAAQQA2AiBBDBCXCSIBIAE2AgAgASABNgIEIAFBADYCCCAAQSRqIgggATYCACAAIAU2AgQgAEEoaiIAQQA6AAAgBEUEQCAGJAkPCyAAQQE6AAAgBCAEKAIEIgAiAUYEQCAGJAkPCyAGIQMDQCADIABBCGoQsQEgCCgCACEHQeABEJcJIgBBADYCACAAQQhqIAMQsQEgACAHNgIEIAAgBygCACIFNgIAIAUgADYCBCAHIAA2AgAgB0EIaiIAIAAoAgBBAWo2AgAgASgCBCIAIgEgBEcNAAsgBiQJC9kBAQR/IABBrKMBNgIAIAAoAhwiAQRAIAEgASgCACgCBEH/A3FBhAVqEQMACyAAKAIgIgEEQCABIAEoAgAoAgRB/wNxQYQFahEDAAsgACgCJCICRQRADwsgAkEIaiIBKAIABEAgAigCBCIAKAIAIgMgAigCAEEEaiIEKAIANgIEIAQoAgAgAzYCACABQQA2AgAgACACRwRAA0AgACgCBCEBIABBCGoiAygCACgCACEEIAMgBEH/A3FBhAVqEQMAIAAQtwUgASACRwRAIAEhAAwBCwsLCyACELcFC+MBAQV/IABBrKMBNgIAIAAoAhwiAQRAIAEgASgCACgCBEH/A3FBhAVqEQMACyAAKAIgIgEEQCABIAEoAgAoAgRB/wNxQYQFahEDAAsgACgCJCICRQRAIAAQtwUPCyACQQhqIgMoAgAEQCACKAIEIgEoAgAiBCACKAIAQQRqIgUoAgA2AgQgBSgCACAENgIAIANBADYCACABIAJHBEADQCABKAIEIQMgAUEIaiIEKAIAKAIAIQUgBCAFQf8DcUGEBWoRAwAgARC3BSACIANHBEAgAyEBDAELCwsLIAIQtwUgABC3BQsNACAAKwMIIAErAwhkC9kQAQp/AkACQAJAAkACQANAAkAgASELIAFBfGohCCABQXhqIQogASEMIAAhBAJAAkACQAJAA0ACQAJAIAsgBGsiA0ECdSIADgYNDQcJCgsACyADQfwASA0LIABBAm1BAnQgBGohByADQZwfSgRAIAQgAEEEbSIAQQJ0IARqIgkgByAAQQJ0IAdqIgYgAhC2AiEDIAIoAgAhACAIKAIAIAYoAgAgAEE/cUHUAmoRAAAEQCAGKAIAIQAgBiAIKAIANgIAIAggADYCACADQQFqIQAgAigCACEFIAYoAgAgBygCACAFQT9xQdQCahEAAARAIAcoAgAhACAHIAYoAgA2AgAgBiAANgIAIANBAmohACACKAIAIQUgBygCACAJKAIAIAVBP3FB1AJqEQAABEAgCSgCACEAIAkgBygCADYCACAHIAA2AgAgA0EDaiEAIAIoAgAhBSAJKAIAIAQoAgAgBUE/cUHUAmoRAAAEQCAEKAIAIQAgBCAJKAIANgIAIAkgADYCACADQQRqIQALCwsFIAMhAAsFAn8gAigCACEAIAcoAgAgBCgCACAAQT9xQdQCahEAACEDIAIoAgAhACAIKAIAIAcoAgAgAEE/cUHUAmoRAAAhACADRQRAQQAgAEUNARogBygCACEAIAcgCCgCADYCACAIIAA2AgAgAigCACEAQQEgBygCACAEKAIAIABBP3FB1AJqEQAARQ0BGiAEKAIAIQAgBCAHKAIANgIAIAcgADYCAEECDAELIAQoAgAhAyAABEAgBCAIKAIANgIAIAggAzYCAEEBDAELIAQgBygCADYCACAHIAM2AgAgAigCACEAIAgoAgAgAyAAQT9xQdQCahEAAAR/IAcoAgAhACAHIAgoAgA2AgAgCCAANgIAQQIFQQELCyEACyACKAIAIQMgBCgCACAHKAIAIANBP3FB1AJqEQAABH8gCCEDIAAFIAQgCkYNASAKIQMDQAJAIAIoAgAhBSADKAIAIAcoAgAgBUE/cUHUAmoRAAANACADQXxqIgMgBEcNAQwDCwsgBCgCACEFIAQgAygCADYCACADIAU2AgAgAEEBagshBSAEQQRqIgYgA0kEQCAGIQAgBSEGA38gACEFA0AgAigCACEJIAVBBGohACAFKAIAIAcoAgAgCUE/cUHUAmoRAAAEQCAAIQUMAQsLA0AgAigCACEJIANBfGoiAygCACAHKAIAIAlBP3FB1AJqEQAARQ0ACyAFIANLBH8gByEDIAYFIAUoAgAhCSAFIAMoAgA2AgAgAyAJNgIAIAMgByAFIAdGGyEHIAZBAWohBgwBCwshAAUgByEDIAUhACAGIQULIAMgBUcEQCACKAIAIQYgAygCACAFKAIAIAZBP3FB1AJqEQAABEAgBSgCACEGIAUgAygCADYCACADIAY2AgAgAEEBaiEACwsgAEUEQCAEIAUgAhC4AiEGIAVBBGoiACABIAIQuAINAyAGBEBBAiEDDAYLCyAFIARrIAwgBWtODQMgBCAFIAIQtQIgBUEEaiEEDAELCyAEQQRqIQAgAigCACEDIAQoAgAgCCgCACADQT9xQdQCahEAAEUEQCAAIAhGDQsDQAJAIAIoAgAhAyAEKAIAIAAoAgAgA0E/cUHUAmoRAAANACAIIABBBGoiAEcNAQwNCwsgACgCACEDIAAgCCgCADYCACAIIAM2AgAgAEEEaiEACyAAIAhGDQogCCEDA0ADQCACKAIAIQYgAEEEaiEFIAQoAgAgACgCACAGQT9xQdQCahEAAEUEQCAFIQAMAQsLA0AgAigCACEGIAQoAgAgA0F8aiIDKAIAIAZBP3FB1AJqEQAADQALIAAgA0kEQCAAKAIAIQYgACADKAIANgIAIAMgBjYCACAFIQAMAQVBBCEDDAQLAAsAC0EBQQIgBhshAyAEIQAgASAFIAYbIQEMAQsgBUEEaiABIAIQtQIgBCEAIAUhAQwBCwJAIANBB3EOBQAIAAgACAsLDAELCyACKAIAIQAgAUF8aiIBKAIAIAQoAgAgAEE/cUHUAmoRAABFBEAPCyAEKAIAIQAgBCABKAIANgIAIAEgADYCAA8LIAIoAgAhACAEQQRqIgYoAgAgBCgCACAAQT9xQdQCahEAACEDIAIoAgAhACABQXxqIgUoAgAgBigCACAAQT9xQdQCahEAACEAIANFBEAgAEUEQA8LIAYoAgAhACAGIAUoAgA2AgAgBSAANgIAIAIoAgAhACAGKAIAIAQoAgAgAEE/cUHUAmoRAABFBEAPCyAEKAIAIQAgBCAGKAIANgIAIAYgADYCAA8LIAQoAgAhASAABEAgBCAFKAIANgIAIAUgATYCAA8LIAQgBigCADYCACAGIAE2AgAgAigCACEAIAUoAgAgASAAQT9xQdQCahEAAEUEQA8LIAYoAgAhACAGIAUoAgA2AgAgBSAANgIADwsgBCAEQQRqIARBCGogAUF8aiACELYCGg8LIAQgBEEEaiIFIARBCGoiAyAEQQxqIgYgAhC2AhogAigCACEAIAFBfGoiASgCACAGKAIAIABBP3FB1AJqEQAARQRADwsgBigCACEAIAYgASgCADYCACABIAA2AgAgAigCACEAIAYoAgAgAygCACAAQT9xQdQCahEAAEUEQA8LIAMoAgAhACADIAYoAgAiATYCACAGIAA2AgAgAigCACEAIAEgBSgCACAAQT9xQdQCahEAAEUEQA8LIAUoAgAhACAFIAMoAgAiATYCACADIAA2AgAgAigCACEAIAEgBCgCACAAQT9xQdQCahEAAEUEQA8LIAQoAgAhACAEIAUoAgA2AgAgBSAANgIADwsgBCABIAIQtwILC90DAQJ/IAQoAgAhBSABKAIAIAAoAgAgBUE/cUHUAmoRAAAhBSAEKAIAIQYgAigCACABKAIAIAZBP3FB1AJqEQAAIQYgBQR/An8gACgCACEFIAYEQCAAIAIoAgA2AgAgAiAFNgIAQQEMAQsgACABKAIANgIAIAEgBTYCACAEKAIAIQYgAigCACAFIAZBP3FB1AJqEQAABH8gASgCACEFIAEgAigCADYCACACIAU2AgBBAgVBAQsLBSAGBH8gASgCACEFIAEgAigCADYCACACIAU2AgAgBCgCACEFIAEoAgAgACgCACAFQT9xQdQCahEAAAR/IAAoAgAhBSAAIAEoAgA2AgAgASAFNgIAQQIFQQELBUEACwshBSAEKAIAIQYgAygCACACKAIAIAZBP3FB1AJqEQAARQRAIAUPCyACKAIAIQYgAiADKAIANgIAIAMgBjYCACAFQQFqIQMgBCgCACEGIAIoAgAgASgCACAGQT9xQdQCahEAAEUEQCADDwsgASgCACEDIAEgAigCADYCACACIAM2AgAgBUECaiECIAQoAgAhAyABKAIAIAAoAgAgA0E/cUHUAmoRAABFBEAgAg8LIAAoAgAhAiAAIAEoAgA2AgAgASACNgIAIAVBA2oLtAMBBn8gAigCACEEIABBBGoiBSgCACAAKAIAIARBP3FB1AJqEQAAIQMgAigCACEGIABBCGoiBCgCACAFKAIAIAZBP3FB1AJqEQAAIQYgAwRAAkAgACgCACEDIAYEQCAAIAQoAgA2AgAgBCADNgIADAELIAAgBSgCADYCACAFIAM2AgAgAigCACEGIAQoAgAgAyAGQT9xQdQCahEAAARAIAUoAgAhAyAFIAQoAgA2AgAgBCADNgIACwsFIAYEQCAFKAIAIQMgBSAEKAIAIgY2AgAgBCADNgIAIAIoAgAhAyAGIAAoAgAgA0E/cUHUAmoRAAAEQCAAKAIAIQMgACAFKAIANgIAIAUgAzYCAAsLCyABIABBDGoiBUYEQA8LA0AgAigCACEDIAUoAgAgBCgCACADQT9xQdQCahEAAARAIAUoAgAiByEIIAUhAwNAAkAgAyAEKAIANgIAIAAgBEYEQCAAIQQMAQsgAigCACEDIAggBEF8aiIGKAIAIANBP3FB1AJqEQAABEAgBCEDIAYhBAwCCwsLIAQgBzYCAAsgBUEEaiIDIAFHBEAgBSEEIAMhBQwBCwsLowkBB38CQAJAAkACQAJAAkAgASAAa0ECdQ4GBAQAAQIDBQsgAigCACECIAFBfGoiASgCACAAKAIAIAJBP3FB1AJqEQAARQRAQQEPCyAAKAIAIQIgACABKAIANgIAIAEgAjYCAEEBDwsgAigCACEDIABBBGoiBCgCACAAKAIAIANBP3FB1AJqEQAAIQMgAigCACEFIAFBfGoiASgCACAEKAIAIAVBP3FB1AJqEQAAIQUgA0UEQCAFRQRAQQEPCyAEKAIAIQMgBCABKAIANgIAIAEgAzYCACACKAIAIQEgBCgCACAAKAIAIAFBP3FB1AJqEQAARQRAQQEPCyAAKAIAIQEgACAEKAIANgIAIAQgATYCAEEBDwsgACgCACEDIAUEQCAAIAEoAgA2AgAgASADNgIAQQEPCyAAIAQoAgA2AgAgBCADNgIAIAIoAgAhACABKAIAIAMgAEE/cUHUAmoRAABFBEBBAQ8LIAQoAgAhACAEIAEoAgA2AgAgASAANgIAQQEPCyAAIABBBGogAEEIaiABQXxqIAIQtgIaQQEPCyAAIABBBGoiAyAAQQhqIgUgAEEMaiIEIAIQtgIaIAIoAgAhBiABQXxqIgEoAgAgBCgCACAGQT9xQdQCahEAAEUEQEEBDwsgBCgCACEGIAQgASgCADYCACABIAY2AgAgAigCACEBIAQoAgAgBSgCACABQT9xQdQCahEAAEUEQEEBDwsgBSgCACEBIAUgBCgCACIGNgIAIAQgATYCACACKAIAIQEgBiADKAIAIAFBP3FB1AJqEQAARQRAQQEPCyADKAIAIQEgAyAFKAIAIgQ2AgAgBSABNgIAIAIoAgAhASAEIAAoAgAgAUE/cUHUAmoRAABFBEBBAQ8LIAAoAgAhASAAIAMoAgA2AgAgAyABNgIAQQEPC0EBDwsgAigCACEDIABBBGoiBCgCACAAKAIAIANBP3FB1AJqEQAAIQUgAigCACEGIABBCGoiAygCACAEKAIAIAZBP3FB1AJqEQAAIQYgBQRAAkAgACgCACEFIAYEQCAAIAMoAgA2AgAgAyAFNgIADAELIAAgBCgCADYCACAEIAU2AgAgAigCACEGIAMoAgAgBSAGQT9xQdQCahEAAARAIAQoAgAhBSAEIAMoAgA2AgAgAyAFNgIACwsFIAYEQCAEKAIAIQUgBCADKAIAIgY2AgAgAyAFNgIAIAIoAgAhBSAGIAAoAgAgBUE/cUHUAmoRAAAEQCAAKAIAIQUgACAEKAIANgIAIAQgBTYCAAsLCyABIABBDGoiBEYEQEEBDwtBACEGAkACQANAAkAgAigCACEFIAQoAgAgAygCACAFQT9xQdQCahEAAARAIAQoAgAiByEIIAQhBQNAAkAgBSADKAIANgIAIAAgA0YEQCAAIQMMAQsgAigCACEFIAggA0F8aiIJKAIAIAVBP3FB1AJqEQAABEAgAyEFIAkhAwwCCwsLIAMgBzYCACAGQQFqIgNBCEYNAQUgBiEDCyABIARBBGoiBkYEQEEBIQAMAwUgBCEFIAYhBCADIQYgBSEDDAILAAsLDAELIAAPCyABIARBBGpGCyUBAX8gAEG8owE2AgAgACgCKCIBRQRADwsgACABNgIsIAEQtwULBAAQKgtRAQN/IAAgATYCHCAAKAIoIgIgACgCLCIDRgRADwsgAiEAA0AgACgCACICKAIAKAIIIQQgAiABIARB/wBxQZgJahEEACADIABBBGoiAEcNAAsLJQEBf0EMEJcJIgJBADYCACACQQA2AgQgAkEANgIIIAAgAhCoAguCAQEBfyAAQQA2AiggAEEANgIsIABBADYCMCAAQeCiATYCAEEMEJcJIgFBADYCACABQQA2AgQgAUEANgIIIAAgATYCNCAAQQA2AhAgAEEANgIYIABBATYCFEEYEJcJIgFBiKQBNgIAIAFBADYCDCABQQA2AhAgAUEANgIUIAAgATYCIAslAQF/IABBiKQBNgIAIAAoAgwiAUUEQA8LIAAgATYCECABELcFCy8BAX8gAEGIpAE2AgAgACgCDCIBRQRAIAAQtwUPCyAAIAE2AhAgARC3BSAAELcFC00BAX8gAEGYpAE2AgAgACgCICIBBEAgASABKAIAKAIEQf8DcUGEBWoRAwALIABBvKMBNgIAIAAoAigiAUUEQA8LIAAgATYCLCABELcFC1cBAX8gAEGYpAE2AgAgACgCICIBBEAgASABKAIAKAIEQf8DcUGEBWoRAwALIABBvKMBNgIAIAAoAigiAUUEQCAAELcFDwsgACABNgIsIAEQtwUgABC3BQs6AQF/IAAgATYCHCAAQSBqIgIoAgAQrgIgAigCACICIAAoAhQ2AgQgAiACIAFBBGpBAEEAEK8CNgIICw8AQazlAkGr7AFBLRA9GgsJACAAIAEQxQILngMCCH8CfCMJIQUjCUHQAGokCSAAQRBqIgdBADYCACAAKAIgIQMgBSABKwMIIgsgAEEYaiIGKAIAIgArAygiCqEgCiALoCABKwMQIgsgCqEgCiALoCABKwMYIgogCiAAKwMwoBBAQQwQlwkiAiACNgIAIAJBBGoiCCACNgIAIAJBCGoiCUEANgIAIAMgAiAFIAMoAggQqwIgAiAIKAIAIgMiBEYEf0EABUEAIQADfyAGKAIAIAEgA0EIaiIDEPsBBEAgASADEF8EQCAGKAIAIAEgAxD6ARogAEEBaiEACwsgBCgCBCIDIgQgAkcNACAACwshAyAJKAIARQRAIAIQtwUgByADNgIAIAUkCQ8LIAgoAgAiACgCACIBIAIoAgBBBGoiBCgCADYCBCAEKAIAIAE2AgAgCUEANgIAIAAgAkYEQCACELcFIAcgAzYCACAFJAkPCwNAIAAoAgQhASAAQQhqIgQoAgAoAgAhBiAEIAZB/wNxQYQFahEDACAAELcFIAEgAkcEQCABIQAMAQsLIAIQtwUgByADNgIAIAUkCQthAQF/IABBADYCKCAAQQA2AiwgAEEANgIwIABBmKQBNgIAIABBADYCECAAQQA2AhggAEEBNgIUQRgQlwkiAUGIpAE2AgAgAUEANgIMIAFBADYCECABQQA2AhQgACABNgIgC6EBAQZ/IABB5KQBNgIAIABBLGoiAyAAKAIoIgE2AgAgAEFAayIEKAIAIgIEQCACIABBxABqIgUoAgAiAUYEfyACBQNAIAFBWGoiASgCACgCACEGIAEgBkH/A3FBhAVqEQMAIAEgAkcNAAsgBCgCAAshASAFIAI2AgAgARC3BSAAKAIoIQELIABBvKMBNgIAIAFFBEAPCyADIAE2AgAgARC3BQurAQEGfyAAQeSkATYCACAAQSxqIgMgACgCKCIBNgIAIABBQGsiBCgCACICBEAgAiAAQcQAaiIFKAIAIgFGBH8gAgUDQCABQVhqIgEoAgAoAgAhBiABIAZB/wNxQYQFahEDACABIAJHDQALIAQoAgALIQEgBSACNgIAIAEQtwUgACgCKCEBCyAAQbyjATYCACABRQRAIAAQtwUPCyADIAE2AgAgARC3BSAAELcFCwcAIAAQygILkAMBB38jCSEGIwlBEGokCSAAQUBrIgUoAgAiAiAAQcQAaiIEKAIAIgFHBEADQCABQVhqIgEoAgAoAgAhAyABIANB/wNxQYQFahEDACABIAJHDQALCyAEIAI2AgAgACgCNCIBQQRqIgMgASgCCCIBIgJHBEADQCAAIAEoAggQywIgAigCBCIBIgIgA0cNAAsLIABBKGoiASgCACgCACICKAIAKAIYIQMgAiADQf8DcUGEBWoRAwAgASgCACgCACIBKAIAKAIoIQMgBiICIAEgA0H/AHFBmAlqEQQAIAUoAgAiA0UEQCAFIAIoAgA2AgAgBCACKAIENgIAIAAgAigCCDYCSCAGJAkPCyADIAQoAgAiAUYEfyADBQNAIAFBWGoiASgCACgCACEHIAEgB0H/A3FBhAVqEQMAIAEgA0cNAAsgBSgCAAshASAEIAM2AgAgARC3BSAAQcgAaiIAQQA2AgAgBEEANgIAIAVBADYCACAFIAIoAgA2AgAgBCACKAIENgIAIAAgAigCCDYCACAGJAkL9QECC38BfCMJIQUjCUEgaiQJIAEoAgAoAgQhAyABIANBB3ERDQAgACsDCKNEAAAAAAAA8D+gqyIGuCENIAUiA0EIaiEHIANBEGohCCADQRhqIQkgAEE4aiEKIABBKGohC0EAIQADQCABKAIAKAIIIQIgAyABIAC4IA2jIAJBD3FBmApqEQ4AQSgQlwkiAiAHKwMAIAgrAwAgCSsDABBbIAIgCisDADkDGCALKAIAKAIAIgQoAgAoAjAhDCAEIAIgDEH/AHFBmAlqEQQAIAIoAgAoAgQhBCACIARB/wNxQYQFahEDACAAQQFqIgAgBk0NAAsgBSQJC8kBAQd/IwkhAiMJQRBqJAkgAEEANgIoIABBMGoiBUEANgIAIABB5KQBNgIAIABBADYCGCAAQQA2AhwgAEEoaiEGIABBLGoiA0EANgIAIABBNGoiAUIANwIAIAFCADcCCCABQgA3AhBBOBCXCSIEEL0CIAIiASAENgIAIAMoAgAiByAFKAIASQRAIAcgBDYCACADIAMoAgBBBGo2AgAgAESamZmZmZm5PzkDCCACJAkFIAYgARDgASAARJqZmZmZmbk/OQMIIAIkCQsLKgAgACABNgI0IAAoAigoAgAiACgCACgCLCEBIAAgAUH/A3FBhAVqEQMAC6IBAQZ/IABBsKUBNgIAIABBLGoiAyAAKAIoIgE2AgAgAEHYAGoiBCgCACICBEAgAiAAQdwAaiIFKAIAIgFGBH8gAgUDQCABQVhqIgEoAgAoAgAhBiABIAZB/wNxQYQFahEDACABIAJHDQALIAQoAgALIQEgBSACNgIAIAEQtwUgACgCKCEBCyAAQbyjATYCACABRQRADwsgAyABNgIAIAEQtwULrAEBBn8gAEGwpQE2AgAgAEEsaiIDIAAoAigiATYCACAAQdgAaiIEKAIAIgIEQCACIABB3ABqIgUoAgAiAUYEfyACBQNAIAFBWGoiASgCACgCACEGIAEgBkH/A3FBhAVqEQMAIAEgAkcNAAsgBCgCAAshASAFIAI2AgAgARC3BSAAKAIoIQELIABBvKMBNgIAIAFFBEAgABC3BQ8LIAMgATYCACABELcFIAAQtwULBwAgABDRAgvDAwEPfyMJIQMjCUHAAWokCSAAQdgAaiINKAIAIgYgAEHcAGoiCCgCACIBRwRAA0AgAUFYaiIBKAIAKAIAIQcgASAHQf8DcUGEBWoRAwAgASAGRw0ACwsgCCAGNgIAIAAoAkgiAUEEaiIOIAEoAggiASIGRgRAIAMkCQ8LIANBmAFqIQQgA0HwAGohBSADQShqIQsgA0HIAGohCSADIQcgAEEoaiEMIABB4ABqIQ8DQCABKAIIIgEoAgAoAgghAiAFIAFEAAAAAAAAAAAgAkEPcUGYCmoRDgAgBCAFEF4gASgCACgCCCECIAsgAUQAAAAAAADwPyACQQ9xQZgKahEOACAFIAsQXiAMKAIAKAIAIgIoAgAoAhwhCiACIAQgCkH/AHFBmAlqEQQAIAwoAgAoAgAiAigCACgCHCEKIAIgBSAKQf8AcUGYCWoRBAAgCCgCACICIA8oAgBGBEAgDSAEEKcCBSACIAQQXSAIIAgoAgBBKGo2AgALIAkgBBBdIAcgBRBdIAAgAUQAAAAAAAAAAEQAAAAAAADwPyAJIAcQ0gIgBxBYIAkQWCAFEFggBBBYIAYoAgQiASIGIA5HDQALIAMkCQvRAgIFfwJ8IwkhBiMJQfABaiQJIAEoAgAoAgghByAGQaABaiIIIAEgAyACoUQAAAAAAADgP6IgAqAiCyAHQQ9xQZgKahEOACAGQcABaiIHIAgQXiAAKAIoKAIAIgkoAgAoAhwhCiAJIAcgCkH/AHFBmAlqEQQAIAggBSAEEIcBIAgQfyIMIAArAwhkRQRAAkAgACAEIAcgBRDTAkUEQCAMIAArAzhkDQELIABB3ABqIgEoAgAiBCAAKAJgRgRAIABB2ABqIAUQpwIgBxBYIAYkCQ8FIAQgBRBdIAEgASgCAEEoajYCACAHEFggBiQJDwsACwsgBkH4AGoiCCAEEF0gBkHQAGoiBCAHEF0gACABIAIgCyAIIAQQ0gIgBBBYIAgQWCAGQShqIgQgBxBdIAYgBRBdIAAgASALIAMgBCAGENICIAYQWCAEEFggBxBYIAYkCQtgAQJ/IwkhBCMJQfAAaiQJIARBIGoiBSACIAEQhwEgBEHIAGoiASAFEF4gBCADIAIQhwEgBSAEEF4gARB+IAUQfiABIAUQfSAAQUBrKwMAZCEAIAUQWCABEFggBCQJIAAL3gEBB38jCSEDIwlBEGokCSAAQQA2AiggAEEwaiIFQQA2AgAgAEGwpQE2AgAgAEEANgIYIABBADYCHCAAQQA2AkggAEEoaiEGIABBLGoiAkEANgIAIABB0ABqIgFCADcDACABQgA3AwggAUEANgIQQTgQlwkiBBDGAiADIgEgBDYCACACKAIAIgcgBSgCAEkEQCAHIAQ2AgAgAiACKAIAQQRqNgIABSAGIAEQ4AELIABEmpmZmZmZuT85AwggAER7FK5H4XqEPzkDOCAAQUBrRCuHFtnO9+8/OQMAIAMkCQu3AQEFfyAAQfylATYCACAAKAI0IgIEQCACKAIAIgMEQCADIAJBBGoiBCgCACIBRgR/IAMFA0AgAUGIf2oiASgCACgCACEFIAEgBUH/A3FBhAVqEQMAIAEgA0cNAAsgAigCAAshASAEIAM2AgAgARC3BQsgAhC3BQsgACgCICIBBEAgASABKAIAKAIEQf8DcUGEBWoRAwALIABBvKMBNgIAIAAoAigiAUUEQA8LIAAgATYCLCABELcFC8EBAQV/IABB/KUBNgIAIAAoAjQiAgRAIAIoAgAiAwRAIAMgAkEEaiIEKAIAIgFGBH8gAwUDQCABQYh/aiIBKAIAKAIAIQUgASAFQf8DcUGEBWoRAwAgASADRw0ACyACKAIACyEBIAQgAzYCACABELcFCyACELcFCyAAKAIgIgEEQCABIAEoAgAoAgRB/wNxQYQFahEDAAsgAEG8owE2AgAgACgCKCIBRQRAIAAQtwUPCyAAIAE2AiwgARC3BSAAELcFC2EBAn8gACABNgIcIABBIGoiAygCACICIAAoAhQ2AgQgACwAOARAIAIQ4QIFIAAsADkEQCACEOICBUHU5gJBp+0BQcoAED0aCwsgAygCACIAIAAgAUEEakEAQQAQrwI2AggLBwAgABDgAgtYAQN/IAAoAjQiACgCACIBIABBBGoiAigCACIARgRAIAIgATYCAA8LA0AgAEGIf2oiACgCACgCACEDIAAgA0H/A3FBhAVqEQMAIAAgAUcNAAsgAiABNgIACxAAIABBAToAOCAAQQA6ADkLEAAgAEEAOgA4IABBAToAOQtyAQJ/IAAoAjQiAkEEaiIDKAIAIgAgAigCCEYEQCACIAEQ3gIFIABB3KABNgIAIABBCGogAUEIahB6IABBKGogAUEoahB6IABByABqIAFByABqEHogAEHoAGogAUHoAGoQ0gEgAyADKAIAQfgAajYCAAsLBwAgACgCNAusAwEJfyMJIQcjCUEgaiQJIAAoAgQgACgCACIEa0H4AG0iBkEBaiICQaLEiBFLBEAQJQsgAiAAKAIIIARrQfgAbSIEQQF0IgMgAyACSRtBosSIESAEQZGixAhJGyEEIAciAkEMaiIJQQA2AgAgAiAAQQhqNgIQIAQEQCAEQaLEiBFLBEBBCBAEIgMQmQkgA0G02AE2AgAgA0HQmQFB6wEQBgUgBEH4AGwQlwkhBQsLIAIgBTYCACACQQhqIgMgBkH4AGwgBWoiCDYCACACQQRqIgogCDYCACAJIARB+ABsIAVqNgIAIAhB3KABNgIAIAZB+ABsIAVqQQhqIAFBCGoQeiAGQfgAbCAFakEoaiABQShqEHogBkH4AGwgBWpByABqIAFByABqEHogBkH4AGwgBWpB6ABqIAFB6ABqENIBIAMgCEH4AGo2AgAgACACEN8CIAooAgAiASADKAIAIgBHBEADQCADIABBiH9qIgA2AgAgACAAKAIAKAIAQf8DcUGEBWoRAwAgAygCACIAIAFHDQALCyACKAIAIgBFBEAgByQJDwsgABC3BSAHJAkL/wEBBn8gAUEEaiEEIAAoAgAiBSAAQQRqIgYoAgAiA0YEfyAAIQcgBCgCACECIAQFIAQoAgAhAgNAIAJBiH9qQdygATYCACACQZB/aiADQZB/ahB6IAJBsH9qIANBsH9qEHogAkFQaiADQVBqEHogAkFwaiADQXBqENIBIAQgBCgCAEGIf2oiAjYCACADQYh/aiIDIAVHDQALIAAhByAAKAIAIQUgBAshAyAHIAI2AgAgAyAFNgIAIAYoAgAhAiAGIAFBCGoiBCgCADYCACAEIAI2AgAgAEEIaiIAKAIAIQIgACABQQxqIgAoAgA2AgAgACACNgIAIAEgAygCADYCAAvQBwIXfwR8IwkhCiMJQcABaiQJIABBEGoiEkEANgIAIABBNGoiAygCACIBKAIEIAEoAgBrQfgAbSEFIApBKGoiBkIANwIAIAZBADYCCCAGQQtqIgJBAToAACAGQQo6AAAgBkEAOgABIAoiBEIANwIAIARBADYCCCAEQfgAaiIBQgA3AgAgAUEANgIIIARBiAFqIgggBSAGIAQgARCqAiABLAALQQBIBEAgASgCABC3BQsgBCwAC0EASARAIAQoAgAQtwULIAIsAABBAEgEQCAGKAIAELcFCyADKAIAIgkoAgQgCSgCAGsiAUH4AG0hEyABBEAgAEE4aiEUIABBOWohFSAAQSBqIRYgAEEYaiEPIARBCGohDCAEQRBqIQ0gBEEYaiEOIAhBKGohECAIQTBqIRdBACEAQQAhBQNAIAQQWiAULAAABEAgDEQAAAAAAAAAADkDACANIAkoAgAiASAFQfgAbGorAxgiGjkDACAOIAVB+ABsIAFqKwMgIhg5AwBEAAAAAAAAAAAhGQUgFSwAAAR8IAwgCSgCACIBIAVB+ABsaisDECIZOQMAIA1EAAAAAAAAAAA5AwAgDiAFQfgAbCABaisDICIYOQMARAAAAAAAAAAABSAMKwMAIRkgDisDACEYIA0rAwALIRoLIBYoAgAhASAGIBkgDygCACIDKwMoIhuhIBsgGaAgGiAboSAbIBqgIBggGCADKwMwoBBAQQwQlwkiAiACNgIAIAJBBGoiCyACNgIAIAJBCGoiEUEANgIAIAEgAiAGIAEoAggQqwIgCygCACIBIgMgAkcEQANAQYgBEJcJIgcQ7AIgDygCACAJKAIAIAVB+ABsaiAHIAFBCGoQ+QEaIAkoAgAgBUH4AGxqIAcQ+QIgAEEBaiEAIAcgBygCACgCBEH/A3FBhAVqEQMAIAMoAgQiASIDIAJHDQALCyARKAIABEAgCygCACIBKAIAIgMgAigCAEEEaiIHKAIANgIEIAcoAgAgAzYCACARQQA2AgAgASACRwRAA0AgASgCBCEDIAFBCGoiBygCACgCACELIAcgC0H/A3FBhAVqEQMAIAEQtwUgAiADRwRAIAMhAQwBCwsLCyACELcFIBAgECgCAEEBaiIBNgIAIAEgFygCAE8EQCAIEKwCCyAEEFggBUEBaiIFIBNJDQALBUEAIQALIBIgADYCACAIQRxqIgAsAAtBAEgEQCAAKAIAELcFCyAIQRBqIgAsAAtBAEgEQCAAKAIAELcFCyAIQQRqIgAsAAtBAE4EQCAKJAkPCyAAKAIAELcFIAokCQuNAgEHfyMJIQUjCUEQaiQJIABBEGoiAiAAQQxqIgQoAgAiATYCACAFIgNBAjYCACAAQRRqIgYoAgAiByABIgBLBH8gAEECNgIAIAIgAEEEaiIBNgIAIAcFIAQgAxDgASACKAIAIQEgBigCAAshACADQQM2AgAgASAASQRAIAFBAzYCACACIAFBBGoiATYCAAUgBCADEOABIAIoAgAhASAGKAIAIQALIANBBDYCACABIABJBEAgAUEENgIAIAIgAUEEaiIBNgIABSAEIAMQ4AEgAigCACEBIAYoAgAhAAsgA0EFNgIAIAEgAEkEQCABQQU2AgAgAiABQQRqNgIAIAUkCQUgBCADEOABIAUkCQsLjQIBB38jCSEFIwlBEGokCSAAQRBqIgIgAEEMaiIEKAIAIgE2AgAgBSIDQQA2AgAgAEEUaiIGKAIAIgcgASIASwR/IABBADYCACACIABBBGoiATYCACAHBSAEIAMQ4AEgAigCACEBIAYoAgALIQAgA0EBNgIAIAEgAEkEQCABQQE2AgAgAiABQQRqIgE2AgAFIAQgAxDgASACKAIAIQEgBigCACEACyADQQQ2AgAgASAASQRAIAFBBDYCACACIAFBBGoiATYCAAUgBCADEOABIAIoAgAhASAGKAIAIQALIANBBTYCACABIABJBEAgAUEFNgIAIAIgAUEEajYCACAFJAkFIAQgAxDgASAFJAkLC4kBAQF/IABBADYCKCAAQQA2AiwgAEEANgIwIABB/KUBNgIAQQwQlwkiAUEANgIAIAFBADYCBCABQQA2AgggACABNgI0IABBADYCECAAQQE2AiQgAEEANgIYIABBATYCFEEYEJcJIgFBiKQBNgIAIAFBADYCDCABQQA2AhAgAUEANgIUIAAgATYCIAtNAQF/IABByKYBNgIAIAAoAiAiAQRAIAEgASgCACgCBEH/A3FBhAVqEQMACyAAQbyjATYCACAAKAIoIgFFBEAPCyAAIAE2AiwgARC3BQtXAQF/IABByKYBNgIAIAAoAiAiAQRAIAEgASgCACgCBEH/A3FBhAVqEQMACyAAQbyjATYCACAAKAIoIgFFBEAgABC3BQ8LIAAgATYCLCABELcFIAAQtwULnQEBA38gACABNgIcQazlAkGK7gFBLRA9IABBFGoiAygCABDpBUG47gFBAhA9GiAAQSBqIgQoAgAiAiADKAIANgIEIAAsADQEQCACEOECBSAALAA1BEAgAhDiAgVBrOUCQbvuAUHLABA9GgsLQazlAkGH7wFBGxA9GiAEKAIAIgAgACABQQRqQQBBABCvAjYCCEGs5QJB6/EBQQcQPRoLCQAgACABEOoCCxAAIABBAToANCAAQQA6ADULEAAgAEEAOgA0IABBAToANQuaBAIJfwR8IwkhBiMJQYABaiQJIAYiAxBaIAAsADQEQCADRAAAAAAAAAAAOQMIIAMgASsDGCIMOQMQIAMgASsDICILOQMYBSAALAA1BHwgAyABKwMQIg05AwggA0QAAAAAAAAAADkDECADIAErAyAiCzkDGEQAAAAAAAAAAAUgAysDCCENIAMrAxghCyADKwMQCyEMCyAAKAIgIQQgBkEoaiIFIA0gAEEYaiIKKAIAIgIrAygiDqEgDiANoCAMIA6hIA4gDKAgCyALIAIrAzCgEEBBDBCXCSICIAI2AgAgAkEEaiIHIAI2AgAgAkEIaiIIQQA2AgAgBCACIAUgBCgCCBCrAiAHKAIAIgQiBSACRwRAIABBEGohCSAEIQAgBSEEA0BBiAEQlwkiBRDsAiAKKAIAIAEgBSAAQQhqEPkBGiABIAUQ+QIgCSAJKAIAQQFqNgIAIAUgBSgCACgCBEH/A3FBhAVqEQMAIAQoAgQiACIEIAJHDQALCyAIKAIARQRAIAIQtwUgAxBYIAYkCQ8LIAcoAgAiACgCACIBIAIoAgBBBGoiBCgCADYCBCAEKAIAIAE2AgAgCEEANgIAIAAgAkYEQCACELcFIAMQWCAGJAkPCwNAIAAoAgQhASAAQQhqIgQoAgAoAgAhBSAEIAVB/wNxQYQFahEDACAAELcFIAEgAkcEQCABIQAMAQsLIAIQtwUgAxBYIAYkCQtoAQF/IABBADYCKCAAQQA2AiwgAEEANgIwIABByKYBNgIAIABBADYCECAAQQE2AiQgAEEANgIYIABBATYCFEEYEJcJIgFBiKQBNgIAIAFBADYCDCABQQA2AhAgAUEANgIUIAAgATYCIAuoAQEEfyMJIQEjCUEwaiQJIABB7KABNgIAIABBCGoiAhBFIABBMGoiAxBFIABBADYCcCAAQQA2AnQgACAAQfAAajYCbCAAQQA2AnwgAEEANgKAASAAIABB/ABqNgJ4IABB2ABqIgRCADcDACAEQgA3AwggARBFIAMgARCRARogACABKAIgNgJQIAEQRSACIAEQkQEaIAAgASgCIDYCKCAAQQA6AGggASQJC2EAIABB7KABNgIAIABBCGoQRSAAQTBqEEUgAEEANgJwIABBADYCdCAAIABB8ABqNgJsIABBADYCfCAAQQA2AoABIAAgAEH8AGo2AnggACABOQNgIAAgAjkDWCAAQQA6AGgLFAAgACABIAIQ7wIgACABIAIQ8AIL9AEBBX8gAEEIaiEFIABB2ABqIQQgAEEoaiIGKAIARQRAIAQgATkDACAAIAE5A2BBKBCXCSIDIAIQeiADQdibATYCACADQSBqIgcgAigCIDYCACAFIAMQkQEaIAYgBygCADYCACAAQTBqIAMQkQEaIAAgBygCADYCUCADKAIAKAIEIQAgAyAAQf8DcUGEBWoRAwALIAQrAwAgAWNFBEAPCyAEIAE5AwBBKBCXCSIAIAIQeiAAQdibATYCACAAQSBqIgMgAigCIDYCACAFIAAQkQEaIAYgAygCADYCACAAKAIAKAIEIQIgACACQf8DcUGEBWoRAwAL9QEBBX8gAEEwaiEFIABB4ABqIQQgAEHQAGoiBigCAEUEQCAEIAE5AwAgACABOQNYQSgQlwkiAyACEHogA0HYmwE2AgAgA0EgaiIHIAIoAiA2AgAgBSADEJEBGiAGIAcoAgA2AgAgAEEIaiADEJEBGiAAIAcoAgA2AiggAygCACgCBCEAIAMgAEH/A3FBhAVqEQMACyAEKwMAIAFkRQRADwsgBCABOQMAQSgQlwkiACACEHogAEHYmwE2AgAgAEEgaiIDIAIoAiA2AgAgBSAAEJEBGiAGIAMoAgA2AgAgACgCACgCBCECIAAgAkH/A3FBhAVqEQMACykAIAIgAyAEEJABIAVxRQRAQQAPCyAAIAEgAhDvAiAAIAEgAhDwAkEBCx4AIAArA2AgASsDWGQEQEEBDwsgACsDWCABKwNgYwsjACAAKwNgIAErA2BkBEAgACsDWCABKwNYYwRAQQEPCwtBAAsrACAAKwNgRAAAAAAAAAAAYQRAIAArA1hEAAAAAAAAAABhBEBBAQ8LC0EAC4ACAQV/IwkhBSMJQZABaiQJIAUiAkE4aiEEIAJBhPwANgIAIARBmPwANgIAIAJBOGogAkEEaiIDENkFIAJBADYCgAEgAkF/NgKEASACQeybATYCACAEQYCcATYCACADEN0FIANBoJwBNgIAIAJBJGoiBkIANwIAIAZCADcCCCACQRA2AjQgAkG77wFBAxA9IAErA2AQ6gVBz/IBQQMQPSABKwNYEOoFQb/vAUECED0aIAAgAxBLIAJB7JsBNgIAIARBgJwBNgIAIANBoJwBNgIAIAYsAAtBAE4EQCADEL4FIAQQuwUgBSQJDwsgBigCABC3BSADEL4FIAQQuwUgBSQJC3IBBH8jCSEDIwlBIGokCSAAQdygATYCACAAQQhqIgQQdyAAQShqIgUQdyAAQcgAaiIGEHcgAEEANgJoIABBADYCbCAAQQA2AnAgBCABEJEBGiAFIAIQkQEaIAMgBSAEEIcBIAYgAxCRARogBhB+IAMkCQugAQEIfyMJIQMjCUGQAWokCSAAKAJoIgQgACgCbCIFRgRAIAMkCUEADwsgAyICQfgAaiEGIAJB/ABqIQcgAkHsAGohCCACQfAAaiEJIAQhAAN/An8gAiAAENgBIAEgAhDzAiEEIAJB7KABNgIAIAYgBygCABDUASAIIAkoAgAQ1QFBASAEDQAaIAUgAEGIAWoiAEcNAUEACwshACADJAkgAAuVAQEIfyMJIQMjCUGQAWokCSAAKAJoIgQgACgCbCIFRgRAIAMkCUEBDwsgAyICQfgAaiEGIAJB/ABqIQcgAkHsAGohCCACQfAAaiEJQQEhAANAIAIgBBDYASABIAIQ8gIgAHEhACACQeygATYCACAGIAcoAgAQ1AEgCCAJKAIAENUBIAUgBEGIAWoiBEcNAAsgAyQJIAALvQgBEH8jCSEHIwlBsAJqJAkgARD0AgRAIAckCQ8LIABB6ABqIg4oAgAiAiAAQewAaiIGKAIARgRAIAAoAnAgAkYEQCAOIAEQ+gIgByQJDwUgAiABENgBIAYgBigCAEGIAWo2AgAgByQJDwsACyAAIAEQ9wIEQCAHJAkPCyAAIAEQ+AIEQCAGKAIAIgIgACgCcEYEQCAOIAEQ+gIgByQJDwUgAiABENgBIAYgBigCAEGIAWo2AgAgByQJDwsACyAHQYgBaiEFIAciBEGgAmohCyAEQZwCaiEMIA4oAgAhCCAEQZACaiIKQQA2AgAgCkEEaiIJQQA2AgAgCkEIaiIPQQA2AgACQAJAIAgiAiAGKAIARg0AA0AgAiABEPICBH8gBigCACEDIAJBiAFqBSAJKAIAIgMgDygCAEYEQCAKIAIQ+gIFIAMgAhDYASAJIAkoAgBBiAFqNgIACyAGAn8CQCAIIA4oAgAiAmtBiAFtQYgBbCACaiIIQYgBaiIDIAYoAgAiEUYEfyAIIQIMAQUgCCECA0AgAkEIaiADQQhqEJEBGiACIAMoAig2AiggAkEwaiADQTBqEJEBGiACIAMoAlA2AlAgAkHYAGoiDSADQdgAaiIQKQMANwMAIA0gECkDCDcDCCANIBAsABA6ABAgCyADKAJsNgIAIAwgA0HwAGo2AgAgBCALKAIANgIAIAUgDCgCADYCACACQewAaiAEIAUQ+wIgCyADKAJ4NgIAIAwgA0H8AGo2AgAgBCALKAIANgIAIAUgDCgCADYCACACQfgAaiAEIAUQ/AIgAkGIAWohAiADQYgBaiIDIBFHDQALIAIgBigCACIDRw0BIAILDAELA38gA0H4fmoiAygCACgCACENIAMgDUH/A3FBhAVqEQMAIAIgA0cNACACCwsiAzYCACAICyICIQggAiADRw0ACyAJKAIAIgIgDygCAEYNACACIAEQ2AEgCSAJKAIAQYgBajYCAAwBCyAKIAEQ+gILIAUQ7AIgCigCACIBIAkoAgAiAkcEQCAEQeAAaiEIIARBMGohAyAEQdgAaiELIARBCGohDCAEQfgAaiEPIARB/ABqIQ0gBEHsAGohECAEQfAAaiERA0AgBCABENgBIAUgCCsDACADEPACIAUgCysDACAMEO8CIARB7KABNgIAIA8gDSgCABDUASAQIBEoAgAQ1QEgAUGIAWoiASACRw0ACwsgBigCACIBIAAoAnBGBEAgDiAFEPoCBSABIAUQ2AEgBiAGKAIAQYgBajYCAAsgBUHsoAE2AgAgBUH4AGogBSgCfBDUASAFQewAaiAFKAJwENUBIAooAgAiAQRAIAEgCSgCACIARgR/IAEFA0AgAEH4fmoiACgCACgCACECIAAgAkH/A3FBhAVqEQMAIAAgAUcNAAsgCigCAAshACAJIAE2AgAgABC3BQsgByQJC9wCAQh/IABBBGoiBigCACAAKAIAIgJrQYgBbSIEQQFqIgNB4cOHD0sEQBAlCyADIABBCGoiCSgCACACa0GIAW0iAkEBdCIFIAUgA0kbQeHDhw8gAkHw4cMHSRsiBwRAIAdB4cOHD0sEQEEIEAQiAxCZCSADQbTYATYCACADQdCZAUHrARAGBSAHQYgBbBCXCSEICwsgBEGIAWwgCGoiBCEDIAQgARDYASAAKAIAIgUgBigCACIBRgR/IAUiAQUgBCECA0AgAkH4fmogAUH4fmoiARDYASADQfh+aiICIQMgASAFRw0ACyACIQMgACgCACEBIAYoAgALIQIgACADNgIAIAYgBEGIAWo2AgAgCSAHQYgBbCAIajYCACACIAEiA0cEQCACIQADQCAAQfh+aiIAKAIAKAIAIQIgACACQf8DcUGEBWoRAwAgACADRw0ACwsgAUUEQA8LIAEQtwULkAcBCX8gAEEIaiIIKAIABEACQCAAKAIAIQQgACAAQQRqIgc2AgAgBygCAEEANgIIIAdBADYCACAIQQA2AgAgBCAEKAIEIgQgBEUbIgUEQCAAQQRqIQsgASgCACEDA0AgAigCACADRwRAIAUgAygCECIJNgIQIAVBCGoiCigCACIEBEACQCAFIAQoAgAiA0YEQCAEQQA2AgAgBCgCBCIDRQ0BIAMhBANAAkAgBCgCACIDBH8gAwUgBCgCBCIDRQ0BIAMLIQQMAQsLBSAEQQA2AgQgA0UNASADIQQDQAJAIAQoAgAiAwR/IAMFIAQoAgQiA0UNASADCyEEDAELCwsLBUEAIQQLIAcoAgAiAwRAAkACQANAAkAgAygCECAJSwR/IAMoAgAiBkUNASAGBSADKAIEIgZFDQMgBgshAwwBCwsgAyEGDAELIAMhBiADQQRqIQMLBSAHIQYgByEDCyAFQQA2AgAgBUEANgIEIAogBjYCACADIAU2AgAgACgCACgCACIGBEAgACAGNgIAIAMoAgAhBQsgCygCACAFENoBIAggCCgCAEEBajYCACABKAIAIgUoAgQiAwRAA0AgAygCACIFBEAgBSEDDAELCwUgBSAFQQhqIgUoAgAiAygCAEcEQCAFIQMDfyADKAIAIgZBCGoiAygCACEFIAUoAgAgBkcNACAFCyEDCwsgASADNgIAIARFDQMgBCEFDAELCyAFKAIIIgQEQANAIAQoAggiAwRAIAMhBAwBCwsFIAUhBAsgACAEENUBCwsLIAEoAgAiAyACKAIAIgpGBEAPCyAAQQRqIQUgAEEEaiEJA0BBFBCXCSIHIAMoAhAiBjYCECAFKAIAIgIEQAJAAkADQAJAIAIoAhAgBksEfyACKAIAIgRFDQEgBAUgAigCBCIERQ0DIAQLIQIMAQsLIAIhBAwBCyACIgRBBGohAgsFIAUiBCECCyAHQQA2AgAgB0EANgIEIAcgBDYCCCACIAc2AgAgACgCACgCACIEBH8gACAENgIAIAIoAgAFIAcLIQIgCSgCACACENoBIAggCCgCAEEBajYCACADKAIEIgIEQANAIAIoAgAiBARAIAQhAgwBCwsFIANBCGoiBCgCACICKAIAIANHBEAgBCECA38gAigCACIDQQhqIgIoAgAhBCAEKAIAIANHDQAgBAshAgsLIAEgAjYCACACIApHBEAgAiEDDAELCwuyBwIJfwF8IABBCGoiCSgCAARAAkAgACgCACEDIAAgAEEEaiIINgIAIAgoAgBBADYCCCAIQQA2AgAgCUEANgIAIAMgAygCBCIDIANFGyIFBEAgAEEEaiEKIAEoAgAhBwNAIAIoAgAgB0cEQCAFIAcoAhA2AhAgBSAHKwMYIgw5AxggBUEIaiILKAIAIgMEQAJAIAUgAygCACIERgRAIANBADYCACADKAIEIgRFDQEgBCEDA0ACQCADKAIAIgQEfyAEBSADKAIEIgRFDQEgBAshAwwBCwsFIANBADYCBCAERQ0BIAQhAwNAAkAgAygCACIEBH8gBAUgAygCBCIERQ0BIAQLIQMMAQsLCwsFQQAhAwsgCCgCACIEBEACQAJAA0ACQCAMIAQrAxhjBH8gBCgCACIGRQ0BIAYFIAQoAgQiBkUNAyAGCyEEDAELCyAEIQYMAQsgBCEGIARBBGohBAsFIAgiBiEECyAFQQA2AgAgBUEANgIEIAsgBjYCACAEIAU2AgAgACgCACgCACIGBEAgACAGNgIAIAQoAgAhBQsgCigCACAFENoBIAkgCSgCAEEBajYCACAHKAIEIgQEQANAIAQoAgAiBQRAIAUhBAwBCwsFIAdBCGoiBSgCACIEKAIAIAdHBEAgBSEEA38gBCgCACIGQQhqIgQoAgAhBSAFKAIAIAZHDQAgBQshBAsLIAEgBDYCACADRQ0DIAMhBSAEIQcMAQsLIAUoAggiAwRAA0AgAygCCCIEBEAgBCEDDAELCwUgBSEDCyAAIAMQ1AELCwsgASgCACIEIAIoAgAiB0YEQA8LIABBBGohBSAAQQRqIQgDQEEgEJcJIgZBEGoiAyAEQRBqIgIpAwA3AwAgAyACKQMINwMIIAUoAgAiAgRAAkAgBisDGCEMAkADQAJAIAwgAisDGGMEfyACKAIAIgNFDQEgAwUgAigCBCIDRQ0DIAMLIQIMAQsLIAIhAwwBCyACIgNBBGohAgsFIAUiAyECCyAGQQA2AgAgBkEANgIEIAYgAzYCCCACIAY2AgAgACgCACgCACIDBH8gACADNgIAIAIoAgAFIAYLIQIgCCgCACACENoBIAkgCSgCAEEBajYCACAEKAIEIgIEQANAIAIoAgAiAwRAIAMhAgwBCwsFIARBCGoiAygCACICKAIAIARHBEAgAyECA38gAigCACIEQQhqIgIoAgAhAyADKAIAIARHDQAgAwshAgsLIAEgAjYCACACIAdHBEAgAiEEDAELCwtpAgN/AXwjCSECIwlBgAFqJAkgAkHgAGoiAyABIABBCGoiARCHASACQUBrIgQgAEEoaiIAIAEQhwEgAyAEEH0hBSACQSBqIgMgACABEIcBIAIgACABEIcBIAUgAyACEH2jIQUgAiQJIAULSAEDfyMJIQMjCUHQAGokCSADQSBqIgQgAjkDACADIAFBKGogAUEIaiIBEIcBIANBKGoiBSAEIAMQjAEgACABIAUQiwEgAyQJC10AIABBwu8BQQsQPSABQcgAahCJAUHO7wFBBRA9IAEoAmwgASgCaGtBiAFtEOkFQdTvAUELED0aIABB4O8BQQoQPSABQQhqEIkBQevvAUEKED0gAUEoahCJARogAAupAwEJfyAAQZSnATYCACAAQSxqIgYgACgCKDYCACAAQdgAaiIDKAIAIgIEQCACIABB3ABqIgQoAgAiAUYEfyACBQNAIAFBiH9qIgEoAgAoAgAhBSABIAVB/wNxQYQFahEDACABIAJHDQALIAMoAgALIQEgBCACNgIAIAEQtwULIABBzABqIgMoAgAiAgRAIAIgAEHQAGoiBCgCACIBRgR/IAIFA0AgAUGIf2oiASgCACgCACEFIAEgBUH/A3FBhAVqEQMAIAEgAkcNAAsgAygCAAshASAEIAI2AgAgARC3BQsgAEFAayIFKAIAIgMEQCADIABBxABqIgcoAgAiAUYEfyADBQNAIAFBdGoiAigCACIEBEAgBCABQXhqIggoAgAiAUYEfyAEBQNAIAFBYGoiASgCACgCACEJIAEgCUH/A3FBhAVqEQMAIAEgBEcNAAsgAigCAAshASAIIAQ2AgAgARC3BQsgAiADRwRAIAIhAQwBCwsgBSgCAAshASAHIAM2AgAgARC3BQsgAEG8owE2AgAgACgCKCIARQRADwsgBiAANgIAIAAQtwULDAAgABCAAyAAELcFC9sBAQN/IAAQhQMgAEEoaiICKAIAKAIAIgEoAgAoAhghAyABIANB/wNxQYQFahEDACACKAIAKAIEIgEoAgAoAhghAyABIANB/wNxQYQFahEDACACKAIAKAIAIgEoAgBBQGsoAgAhAyABIANB/wFxQTpqEQUAIgEgAEHMAGoiA0cEQCADIAEoAgAgASgCBBCGAwsgAigCACgCBCICKAIAQUBrKAIAIQEgAiABQf8BcUE6ahEFACICIABB2ABqIgFGBEAgABCMAw8LIAEgAigCACACKAIEEIYDIAAQjAML2wEBBH8gACgCTCICIABB0ABqIgMoAgAiAUcEQANAIAFBiH9qIgEoAgAoAgAhBCABIARB/wNxQYQFahEDACABIAJHDQALCyADIAI2AgAgACgCWCICIABB3ABqIgMoAgAiAUcEQANAIAFBiH9qIgEoAgAoAgAhBCABIARB/wNxQYQFahEDACABIAJHDQALCyADIAI2AgAgAEEoaiIAKAIAKAIAIgEoAgAoAiQhAiABIAJB/wNxQYQFahEDACAAKAIAKAIEIgAoAgAoAiQhASAAIAFB/wNxQYQFahEDAAvbAQEDfyAAEIUDIABBKGoiAigCACgCACIB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ACAMIBQgDSsDECALKwMAEHggCCsDACEUIApB4ANqIg4gBkQAAAAAAADwPyAGKAIAKAIIQQ9xQZgKahEOACANIBQgDisDECALKwMAEHggBCsDACEUIApB8AFqIgMgBkQAAAAAAADwPyAGKAIAKAIIQQ9xQZgKahEOACAOIBQgAysDECALKwMAEHggAyAQIAwQ9gIgCiIFIA0gDhD2AiAAQShqIhIoAgAoAgAiAigCACgCICEBIAIgAyABQf8AcUGYCWoRBAAgEigCACgCACICKAIAKAIgIQEgAiAFIAFB/wBxQZgJahEEACAJKAIAIgEgACgCVEYEQCAHIAMQ3gIFIAFB3KABNgIAIAFBCGogA0EIahB6IAFBKGogA0EoahB6IAFByABqIANByABqEHogAUHoAGogA0HoAGoQ0gEgCSAJKAIAQfgAajYCAAtBrOUCQZrwAUEZED0aIApB+ARqIglB3KABNgIAIAlBCGogA0EIahB6IAlBKGogA0EoahB6IAlByABqIANByABqEHogCUHoAGogA0HoAGoQ0gEgCkGABGoiAUHcoAE2AgAgAUEIaiAFQQhqEHogAUEoaiAFQShqEHogAUHIAGogBUHIAGoQeiABQegAaiAFQegAahDSASAAIAZEAAAAAAAAAABEAAAAAAAA8D8gCSABEJQDIAFB3KABNgIAIAFB6ABqIgQoAgAiAgRAIAIgAUHsAGoiCCgCACIBRgR/IAIFA0AgAUH4fmoiASgCACgCACEHIAEgB0H/A3FBhAVqEQMAIAEgAkcNAAsgBCgCAAshASAIIAI2AgAgARC3BQsgCUHcoAE2AgAgCUHoAGoiBCgCACICBEAgAiAJQewAaiIIKAIAIgFGBH8gAgUDQCABQfh+aiIBKAIAKAIAIQcgASAHQf8DcUGEBWoRAwAgASACRw0ACyAEKAIACyEBIAggAjYCACABELcFCyAFQdygATYCACAFQegAaiIEKAIAIgIEQCACIAVB7ABqIggoAgAiAUYEfyACBQNAIAFB+H5qIgEoAgAoAgAhByABIAdB/wNxQYQFahEDACABIAJHDQALIAQoAgALIQEgCCACNgIAIAEQtwULIANB3KABNgIAIANB6ABqIgQoAgAiAgRAIAIgA0HsAGoiCCgCACIBRgR/IAIFA0AgAUH4fmoiASgCACgCACEHIAEgB0H/A3FBhAVqEQMAIAEgAkcNAAsgBCgCAAshASAIIAI2AgAgARC3BQsgAEHYAGoiBygCACIIIABB3ABqIgQoAgAiAUcEQANAIAFBiH9qIgEoAgAoAgAhAiABIAJB/wNxQYQFahEDACABIAhHDQALCyAEIAg2AgAgDCAGRAAAAAAAAAAAIAYoAgAoAghBD3FBmApqEQ4AIBAgDCsDCCATKwMAIAsrAwAQeCANIAZEAAAAAAAAAAAgBigCACgCCEEPcUGYCmoRDgAgDCANKwMIIBErAwAgCysDABB4IA4gBkQAAAAAAADwPyAGKAIAKAIIQQ9xQZgKahEOACANIA4rAwggEysDACALKwMAEHggAyAGRAAAAAAAAPA/IAYoAgAoAghBD3FBmApqEQ4AIA4gAysDCCARKwMAIAsrAwAQeCADIBAgDBD2AiAFIA0gDhD2AiASKAIAKAIEIgIoAgAoAiAhASACIAMgAUH/AHFBmAlqEQQAIBIoAgAoAgQiAigCACgCICEBIAIgBSABQf8AcUGYCWoRBAAgBCgCACIBIAAoAmBGBEAgByADEN4CBSABQdygATYCACABQQhqIANBCGoQeiABQShqIANBKGoQeiABQcgAaiADQcgAahB6IAFB6ABqIANB6ABqENIBIAQgBCgCAEH4AGo2AgALQazlAkG08AFBGRA9GiAKQegCaiIEQdygATYCACAEQQhqIANBCGoQeiAEQShqIANBKGoQeiAEQcgAaiADQcgAahB6IARB6ABqIANB6ABqENIBIApB+ABqIgJB3KABNgIAIAJBCGogBUEIahB6IAJBKGogBUEoahB6IAJByABqIAVByABqEHogAkHoAGogBUHoAGoQ0gEgACAGRAAAAAAAAAAARAAAAAAAAPA/IAQgAhCVAyACQdygATYCACACQegAaiIIKAIAIgEEQCABIAJB7ABqIgcoAgAiAEYEfyABBQNAIABB+H5qIgAoAgAoAgAhAiAAIAJB/wNxQYQFahEDACAAIAFHDQALIAgoAgALIQAgByABNgIAIAAQtwULIARB3KABNgIAIARB6ABqIggoAgAiAQRAIAEgBEHsAGoiBygCACIARgR/IAEFA0AgAEH4fmoiACgCACgCACECIAAgAkH/A3FBhAVqEQMAIAAgAUcNAAsgCCgCAAshACAHIAE2AgAgABC3BQsgBUHc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CkEEaiEVIApBCGohFiAAQTBqIRAgAEE0aiEXIABBLGohGAJAAkADQAJAIAZBADYCACAHQQA2AgAgEUEANgIAIAggDSgCACgCECILNgIAIAshAEEAIQFBACECA0AgASACRgRAIAYgCBDgAQUgASAANgIAIAcgBygCAEEEajYCAAsgDigCACIDBEAgCCgCACECIA4hASADIQADQCABIAAgACgCECACSSIEGyEBIABBBGogACAEGygCACIADQALIAEgDkcEQCACIAEoAhBPBEAgASgCBCIABEADQCAAKAIAIgIEQCACIQAMAQsLBSABIAFBCGoiACgCACICKAIARgR/IAIFA38gACgCACIEQQhqIgAoAgAhAiACKAIAIARHDQAgAgsLIQALIAEgDSgCAEYEQCANIAA2AgALIAwgDCgCAEF/ajYCACADIAEQmgMgARC3BQsLCyAIKAIAIQMgD0EANgIAIAlBADYCACASQQA2AgAgAyEEIAMgAygCBCIAIgFGBH9BACEDQQAFQQAhE0EAIRRBACECA0AgACgCCCEZIAAoAgxBEGohACAKIAQ2AgAgFSAZNgIAIBYgADYCACATIBRJBEAgAiAKKQIANwIAIAIgCigCCDYCCCAJIAkoAgBBDGo2AgAFIA8gChCbAwsgASgCBCIAIgEgA0cEQCAJKAIAIgIhEyASKAIAIRQMAQsLIA8oAgAiAwsiBEEEaiEAIARBCGohAQNAIAEoAgAiAkEEaiEBIAJBCGohAiAAKAIAIgAoAhgEQCABIQAgAiEBDAELCyAIIAA2AgAgBARAIAkgBDYCACADELcFIAgoAgAhAAsgACALRwRAIAcoAgAhASARKAIAIQIMAQsLIBAoAgAiASAXKAIARgRAIBggBhCcAyAGKAIAIQAFIAFBADYCACABQQRqIgNBADYCACABQQhqIgRBADYCACAHKAIAIAYoAgAiAGsiAkECdSELIAIEQCALQf////8DSw0CIAMgAhCXCSICNgIAIAEgAjYCACAEIAtBAnQgAmo2AgAgBygCACAGKAIAIgBrIgFBAEoEQCACIAAgARDhCRogAyABQQJ2QQJ0IAJqNgIACwsgECAQKAIAQQxqNgIACyAABEAgByAANgIAIAAQtwULIAwoAgANAQwCCwsQJQwBCyAFJAkLC88LAQl/An8CQCABKAIAIgYEfyAB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IAEgASgCCCIBKAIARg0ACyAACyECIAEoAgAiAARAA0AgACgCBCIBBEAgASEADAELCwUDQCABIAEoAggiASgCAEYNAAsgASEACyAAKAIQIQAgGSACKAIQNgIAIBogADYCACANIB0Q4AEgBigCACIAIBQoAgBGBEAgDSAZEOABIAYoAgAhAAUgACAZKAIANgIAIAYgBigCAEEEaiIANgIACyAUKAIAIABGBEAgDSAYEOABIAYoAgAhAAUgACAYKAIANgIAIAYgBigCAEEEaiIANgIACyAUKAIAIABGBEAgDSAaEOABIAYoAgAhAAUgACAaKAIANgIAIAYgBigCAEEEaiIANgIACyANKAIAIgIgAEkEQANAIBVBADYCACAWQQA2AgAgBSgCACEIAkACQCACKAIAIgQoAgQiACAERiITBEAgACEBBQJAIAAhAyAAIQEDQCAIIAMoAghGDQEgBCABKAIEIgMiAUcNAAsMAgsLIAEgBEYNAAJ/AkAgEwR/DAEFIAAhAQN/IAggASgCCEYNAiAEIAAoAgQiASIARw0AQQALCwwBC0EAIAAgBEYNABogACgCDEEQagshACAKIAQ2AgAgHiAINgIAIBUgADYCACACKAIAIQQCfwJAIAUoAgAiAygCBCIAIANGBH8MAQUgACEBA38gBCABKAIIRg0CIAMgACgCBCIBIgBHDQBBAAsLDAELQQAgACADRg0AGiAAKAIMQRBqCyEAIAcgAzYCACAfIAQ2AgAgFiAANgIAIAsoAgAiACAbKAIARgRAIA4gChCbAwUgACAKKQIANwIAIAAgCigCCDYCCCALIAsoAgBBDGo2AgALIAwoAgAiACAcKAIARgRAIA8gBxCbAwUgACAHKQIANwIAIAAgBygCCDYCCCAMIAwoAgBBDGo2AgALDAELQTQQlwkiACAENgIIIAAgCDYCDCAAQQA2AhggAEEANgIkIABBADYCMCAAIBI2AgQgACASKAIAIgE2AgAgASAANgIEIBIgADYCACAXIBcoAgBBAWo2AgBBEBCXCSIBIAg2AgggASAANgIMIAEgBDYCBCABIAQoAgAiAzYCACADIAE2AgQgBCABNgIAIARBCGoiASABKAIAQQFqNgIAQRAQlwkiASAENgIIIAEgADYCDCABIAhBDGoiAzYCBCABIAMoAgAiEzYCACATIAE2AgQgAyAB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ca0iD0J/hVYEQCABIQIgBCEBDAMLIA4gD3whCyABIAUoAgAiAiAHKAIASQR/IAUgAkEBajYCACACLQAABSAAEOMECyIEQYHhAGosAAAiAkH/AXFLDQAgASECIAQLBSABIQIgBAshAQsgAiABQYHhAGotAABLBEADQCACIAUoAgAiASAHKAIASQR/IAUgAUEBajYCACABLQAABSAAEOMEC0GB4QBqLQAASw0AC0Ho3wJBIjYCACAIQQAgA0IBg0IAURshCCADIQsLCyAHKAIABEAgBSAFKAIAQX9qNgIACyALIANaBEAgCEEARyADQgGDQgBSckUEQEHo3wJBIjYCACADQn98IQMMAgsgCyADVgRAQejfAkEiNgIADAILCyALIAisIgOFIAN9IQMLCyADC+wHAQd/AnwCQAJAAkACQAJAIAEOAwABAgMLQet+IQZBGCEHDAMLQc53IQZBNSEHDAILQc53IQZBNSEHDAELRAAAAAAAAAAADAELIABBBGohAyAAQeQAaiEFA0AgAygCACIBIAUoAgBJBH8gAyABQQFqNgIAIAEtAAAFIAAQ4wQLIgEQywQNAAsCQAJAAkAgAUEraw4DAAEAAQtBASABQS1GQQF0ayEIIAMoAgAiASAFKAIASQRAIAMgAUEBajYCACABLQAAIQEMAgUgABDjBCEBDAILAAtBASEICwJAAkACQAN/IARByJUCaiwAACABQSByRgR/IARBB0kEQCADKAIAIgEgBSgCAEkEfyADIAFBAWo2AgAgAS0AAAUgABDjBAshAQsgBEEBaiIEQQhJDQFBCAUgBAsLIgRB/////wdxQQNrDgYBAAAAAAIACyACQQBHIgkgBEEDS3EEQCAEQQhGDQIMAQsgBEUEQAJAQQAhBAN/IARBhpYCaiwAACABQSByRw0BIARBAkkEQCADKAIAIgEgBSgCAEkEfyADIAFBAWo2AgAgAS0AAAUgABDjBAshAQsgBEEBaiIEQQNJDQBBAwshBAsLAkACQAJAIAQOBAECAgACCyADKAIAIgEgBSgCAEkEfyADIAFBAWo2AgAgAS0AAAUgABDjBAtBKEcEQCMHIAUoAgBFDQUaIAMgAygCAEF/ajYCACMHDAULQQEhAQNAAkAgAygCACICIAUoAgBJBH8gAyACQQFqNgIAIAItAAAFIAAQ4wQLIgJBUGpBCkkg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FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcAARcEFwUXBgcXFxcKFxcXFw4PEBcXFxMVFxcXFxcXFwABAgMDFxcBFwgXFwkLFwwXDRcLFxcREhQXCyAMIAIoAgA2AgAgCCAMKAIANgIAIAAgBUEYaiABIAggBCAJEPwGDBcLIA0gAigCADYCACAIIA0oAgA2AgAgACAFQRBqIAEgCCAEIAkQ/QYMFgsgAEEIaiIGKAIAKAIMIQsgBiALQf8BcUE6ahEFACEGIA4gASgCADYCACAPIAIoAgA2AgAgBigCACAGIAYsAAsiAkEASCILGyIJIAYoAgQgAkH/AXEgCxtqIQIgCiAOKAIANgIAIAggDygCADYCACABIAAgCiAIIAMgBCAFIAkgAhD+BjYCAAwVCyAQIAIoAgA2AgAgCCAQKAIANgIAIAVBDGogASAIIAQgCRD/BgwUCyARIAEoAgA2AgAgEiACKAIANgIAIAogESgCADYCACAIIBIoAgA2AgAgASAAIAogCCADIAQgBUHDoAJBy6ACEP4GNgIADBMLIBMgASgCADYCACAUIAIoAgA2AgAgCiATKAIANgIAIAggFCgCADYCACABIAAgCiAIIAMgBCAFQcugAkHToAIQ/gY2AgAMEgsgFSACKAIANgIAIAggFSgCADYCACAFQQhqIAEgCCAEIAkQgAcMEQsgFiACKAIANgIAIAggFigCADYCACAFQQhqIAEgCCAEIAkQgQcMEAsgFyACKAIANgIAIAggFygCADYCACAFQRxqIAEgCCAEIAkQggcMDwsgGCACKAIANgIAIAggGCgCADYCACAFQRBqIAEgCCAEIAkQgwcMDgsgGSACKAIANgIAIAggGSgCADYCACAFQQRqIAEgCCAEIAkQhAcMDQsgGiACKAIANgIAIAggGigCADYCACABIAggBCAJEIUHDAwLIBsgAigCADYCACAIIBsoAgA2AgAgACAFQQhqIAEgCCAEIAkQhgcMCwsgHCABKAIANgIAIB0gAigCADYCACAKIBwoAgA2AgAgCCAdKAIANgIAIAEgACAKIAggAyAEIAVB06ACQd6gAhD+BjYCAAwKCyAeIAEoAgA2AgAgHyACKAIANgIAIAogHigCADYCACAIIB8oAgA2AgAgASAAIAogCCADIAQgBUHeoAJB46ACEP4GNgIADAkLICAgAigC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NgIAIAggFSgCADYCACAFQQhqIAEgCCAEIAkQoQcMEQsgFiACKAIANgIAIAggFigCADYCACAFQQhqIAEgCCAEIAkQogcMEAsgFyACKAIANgIAIAggFygCADYCACAFQRxqIAEgCCAEIAkQowcMDwsgGCACKAIANgIAIAggGCgCADYCACAFQRBqIAEgCCAEIAkQpAcMDgsgGSACKAIANgIAIAggGSgCADYCACAFQQRqIAEgCCAEIAkQpQcMDQsgGiACKAIANgIAIAggGigCADYCACABIAggBCAJEKYHDAwLIBsgAigCADYCACAIIBsoAgA2AgAgACAFQQhqIAEgCCAEIAkQpwcMCwsgHCABKAIANgIAIB0gAigCADYCACAKIBwoAgA2AgAgCCAdKAIANgIAIAEgACAKIAggAyAEIAVBwPoAQez6ABCfBzYCAAwKCyAeIAEoAgA2AgAgHyACKAIANgIAIAogHigCADYCACAIIB8oAgA2AgAgASAAIAogCCADIAQgBUHw+gBBhPsAEJ8HNgIADAkLICAgAigCADYCACAIICAoAgA2AgAgBSABIAggBCAJEKgHDAgLICEgASgCADYCACAiIAIoAgA2AgAgCiAhKAIANgIAIAggIigCADYCACABIAAgCiAIIAMgBCAFQZD7AEGw+wAQnwc2AgAMBwsgIyACKAIANgIAIAggIygCADYCACAFQRhqIAEgCCAEIAkQqQcMBgsgACgCACgCFCEGICQgASgCADYCACAlIAIoAgA2AgAgCiAkKAIANgIAIAggJSgCADYCACAAIAogCCADIAQgBSAGQT9xQaAEahESAAwGCyAAQQhqIgYoAgAoAhghCyAGIAtB/wFxQTpqEQUAIQYgJiABKAIANgIAICcgAigCADYCACAGKAIAIAYgBiwACyILQQBIIgkbIQIgBigCBCALQf8BcSAJG0ECdCACaiEGIAogJigCADYCACAIICcoAgA2AgAgASAAIAogCCADIAQgBSACIAYQnwc2AgAMBAsgKCACKAIANgIAIAggKCgCADYCACAFQRRqIAEgCCAEIAkQqgcMAwsgKSACKAIANgIAIAggKSgCADYCACAFQRRqIAEgCCAEIAkQqwcMAgsgCyACKAIANgIAIAggCygCADYCACABIAggBCAJEKwHDAELIAQgBCgCAEEEcjYCAAsgASgCAAshACAHJAkgAAssAEGI2wIsAABFBEBBiNsCEN0JBEAQnAdB2O0CQcDYAjYCAAsLQdjtAigCAAssAEH42gIsAABFBEBB+NoCEN0JBEAQmwdB1O0CQaDWAjYCAAsLQdTtAigCAAssAEHo2gIsAABFBEBB6NoCEN0JBEAQmgdB0O0CQYDUAjYCAAsLQdDtAigCAAs/AEHg2gIsAABFBEBB4NoCEN0JBEBBxO0CQgA3AgBBzO0CQQA2AgBBxO0CQby+AUG8vgEQvwQQsAkLC0HE7QILPwBB2NoCLAAARQRAQdjaAhDdCQRAQbjtAkIANwIAQcDtAkEANgIAQbjtAkGMvgFBjL4BEL8EELAJCwtBuO0CCz8AQdDaAiwAAEUEQEHQ2gIQ3QkEQEGs7QJCADcCAEG07QJBADYCAEGs7QJB6L0BQei9ARC/BBCwCQsLQaztAgs/AEHI2gIsAABFBEBByNoCEN0JBEBBoO0CQgA3AgBBqO0CQQA2AgBBoO0CQcS9AUHEvQEQvwQQsAkLC0Gg7QILewECf0Hw2gIsAABFBEBB8NoCEN0JBEBBgNQCIQADQCAAQgA3AgAgAEEANgIIQQAhAQNAIAFBA0cEQCABQQJ0IABqQQA2AgAgAUEBaiEBDAELCyAAQQxqIgBBoNYCRw0ACwsLQYDUAkGQvwEQtwkaQYzUAkGcvwEQtwkaC4MDAQJ/QYDbAiwAAEUEQEGA2wIQ3QkEQEGg1gIhAANAIABCADcCACAAQQA2AghBACEBA0AgAUEDRwRAIAFBAnQgAGpBADYCACABQQFqIQEMAQsLIABBDGoiAEHA2AJHDQALCwtBoNYCQai/ARC3CRpBrNYCQci/ARC3CRpBuNYCQey/ARC3CRpBxNYCQYTAARC3CRpB0NYCQZzAARC3CRpB3NYCQazAARC3CRpB6NYCQcDAARC3CRpB9NYCQdTAARC3CRpBgNcCQfDAARC3CRpBjNcCQZjBARC3CRpBmNcCQbjBARC3CRpBpNcCQdzBARC3CRpBsNcCQYDCARC3CRpBvNcCQZDCARC3CRpByNcCQaDCARC3CRpB1NcCQbDCARC3CRpB4NcCQZzAARC3CRpB7NcCQcDCARC3CRpB+NcCQdDCARC3CRpBhNgCQeDCARC3CRpBkNgCQfDCARC3CRpBnNgCQYDDARC3CRpBqNgCQZDDARC3CRpBtNgCQaDDARC3CRoLiwIBAn9BkNsCLAAARQRAQZDbAhDdCQRAQcDYAiEAA0AgAEIANwIAIABBADYCCEEAIQEDQCABQQNHBEAgAUECdCAAakEANgIAIAFBAWohAQwBCwsgAEEMaiIAQejZAkcNAAsLC0HA2AJBsMMBELcJGkHM2AJBzMMBELcJGkHY2AJB6MMBELcJGkHk2AJBiMQBELcJGkHw2AJBsMQBELcJGkH82AJB1MQBELcJGkGI2QJB8MQBELcJGkGU2QJBlMUBELcJGkGg2QJBpMUBELcJGkGs2QJBtMUBELcJGkG42QJBxMUBELcJGkHE2QJB1MUBELcJGkHQ2QJB5MUBELcJGkHc2QJB9MUBELcJGgt5AQJ/IwkhBiMJQRBqJAkgAEEIaiIAKAIAKAIAIQcgACAHQf8BcUE6ahEFACEAIAYgAygCADYCACAGQQRqIgMgBigCADYCACACIAMgACAAQagBaiAFIARBABDQBiAAayIAQagBSARAIAEgAEEMbUEHbzYCAAsgBiQJC3kBAn8jCSEGIwlBEGokCSAAQQhqIgAoAgAoAgQhByAAIAdB/wFxQTpqEQUAIQAgBiADKAIANgIAIAZBBGoiAyAGKAIANgIAIAIgAyAAIABBoAJqIAUgBEEAENAGIABrIgBBoAJIBEAgASAAQQxtQQxvNgIACyAGJAkLtgoBDH8jCSEOIwlBEGokCSAOQQhqIRAgDkEEaiERIA4hEiAOQQxqIg8gAxDbBSAPQbTsAhCYBiELIA8QmQYgBEEANgIAAkACQANAAkAgASgCACEIIAxFIAYgB0dxRQ0AIAghDCAIBH8gCCgCDCIKIAgoAhBGBH8gCCAIKAIAKAIkQf8BcUE6ahEFAAUgCigCAAtBfxDaBQR/IAFBADYCAEEAIQhBACEMQQEFQQALBUEAIQhBAQshDSACKAIAIgkhCgJAAkAgCUUNACAJKAIMIhMgCSgCEEYEfyAJIAkoAgAoAiRB/wFxQTpqEQUABSATKAIAC0F/ENoFBEAgAkEANgIAQQAhCgwBBSANRQ0FCwwBCyANDQNBACEJCyALIAYoAgBBACALKAIAKAI0QT9xQZQDahEBAEH/AXFBJUYEQCAHIAZBBGoiDUYNAwJAAkACQCALIA0oAgBBACALKAIAKAI0QT9xQZQDahEBACIJQRh0QRh1QTBrDhYAAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQsgByAGQQhqIgZGDQUgCSEIIAsgBigCAEEAIAsoAgAoAjRBP3FBlANqEQEAIQkgDSEGDAELQQAhCAsgACgCACgCJCENIBEgDDYCACASIAo2AgAgECARKAIANgIAIA8gEigCADYCACABIAAgECAPIAMgBCAFIAkgCCANQQ9xQegEahEHADYCACAGQQhqIQYFAkAgC0GAwAAgBigCACALKAIAKAIMQT9xQZQDahEBAEUEQCALIAhBDGoiDCgCACIKIAhBEGoiCSgCAEYEfyAIIAgoAgAoAiRB/wFxQTpqEQUABSAKKAIACyALKAIAKAIcQT9xQdQCahEAACEKIAsgBigCACALKAIAKAIcQT9xQdQCahEAACAKRwRAIARBBDYCAAwCCyAMKAIAIgogCSgCAEYEQCAIIAgoAgAoAihB/wFxQTpqEQUAGgUgDCAKQQRqNgIAIAooAgAaCyAGQQRqIQYMAQsDQAJAIAcgBkEEaiIGRgRAIAchBgwBCyALQYDAACAGKAIAIAsoAgAoAgxBP3FBlANqEQEADQELCyAJIQwDQCAIBH8gCCgCDCIKIAgoAhBGBH8gCCAIKAIAKAIkQf8BcUE6ahEFAAUgCigCAAtBfxDaBQR/IAFBADYCAEEAIQhBAQVBAAsFQQAhCEEBCyEKAkACQCAMRQ0AIAwoAgwiCSAMKAIQRgR/IAwgDCgCACgCJEH/AXFBOmoRBQAFIAkoAgALQX8Q2gUEQCACQQA2AgAMAQUgCkUNBAsMAQsgCg0CQQAhDAsgC0GAwAAgCEEMaiIKKAIAIgkgCEEQaiINKAIARgR/IAggCCgCACgCJEH/AXFBOmoRBQAFIAkoAgALIAsoAgAoAgxBP3FBlANqEQEARQ0BIAooAgAiCSANKAIARgRAIAggCCgCACgCKEH/AXFBOmoRBQAaBSAKIAlBBGo2AgAgCSgCABoLDAALAAsLIAQoAgAhDAwBCwsMAQsgBEEENgIACyAIBH8gCCgCDCIAIAgoAhBGBH8gCCAIKAIAKAIkQf8BcUE6ahEFAAUgACgCAAtBfxDaBQR/IAFBADYCAEEAIQhBAQVBAAsFQQAhCEEBCyEAAkACQAJAIAIoAgAiAUUNACABKAIMIgMgASgCEEYEfyABIAEoAgAoAiRB/wFxQTpqEQUABSADKAIAC0F/ENoFBEAgAkEANgIADAEFIABFDQILDAILIAANAAwBCyAEIAQoAgBBAnI2AgALIA4kCSAIC2QBAX8jCSEFIwlBEGokCSAFIAIoAgA2AgAgBUEEaiICIAUoAgA2AgAgASACIAMgBEECEK0HIQEgAygCACICQQRxRSABQX9qQR9JcQRAIAAgATYCAAUgAyACQQRyNgIACyAFJAkLYQEBfyMJIQUjCUEQaiQJIAUgAigCADYCACAFQQRqIgIgBSgCADYCACABIAIgAyAEQQIQrQchASADKAIAIgJBBHFFIAFBGEhxBEAgACABNgIABSADIAJBBHI2AgALIAUkCQtkAQF/IwkhBSMJQRBqJAkgBSACKAIANgIAIAVBBGoiAiAFKAIANgIAIAEgAiADIARBAhCtByEBIAMoAgAiAkEEcUUgAUF/akEMSXEEQCAAIAE2AgAFIAMgAkEEcjYCAAsgBSQJC2IBAX8jCSEFIwlBEGokCSAFIAIoAgA2AgAgBUEEaiICIAUoAgA2AgAgASACIAMgBEEDEK0HIQEgAygCACICQQRxRSABQe4CSHEEQCAAIAE2AgAFIAMgAkEEcjYCAAsgBSQJC2QBAX8jCSEFIwlBEGokCSAFIAIoAgA2AgAgBUEEaiICIAUoAgA2AgAgASACIAMgBEECEK0HIQEgAygCACICQQRxRSABQQ1IcQRAIAAgAUF/ajYCAAUgAyACQQRyNgIACyAFJAkLYQEBfyMJIQUjCUEQaiQJIAUgAigCADYCACAFQQRqIgIgBSgCADYCACABIAIgAyAEQQIQrQchASADKAIAIgJBBHFFIAFBPEhxBEAgACABNgIABSADIAJBBHI2AgALIAUkCQv/AwEDfwNAAkAgACgCACIEBH8gBCgCDCIFIAQoAhBGBH8gBCAEKAIAKAIkQf8BcUE6ahEFAAUgBSgCAAtBfxDaBQR/IABBADYCAEEBBSAAKAIARQsFQQELIQUCQAJAIAEoAgAiBEUNACAEKAIMIgYgBCgCEEYEfyAEIAQoAgAoAiRB/wFxQTpqEQUABSAGKAIAC0F/ENoFBEAgAUEANgIADAEFIAVFDQMLDAELIAUEf0EAIQQMAgVBAAshBAsgA0GAwAAgACgCACIFKAIMIgYgBSgCEEYEfyAFIAUoAgAoAiRB/wFxQTpqEQUABSAGKAIACyADKAIAKAIMQT9xQZQDahEBAEUNACAAKAIAIgRBDGoiBigCACIFIAQoAhBGBEAgBCAEKAIAKAIoQf8BcUE6ahEFABoFIAYgBUEEajYCACAFKAIAGgsMAQsLIAAoAgAiAwR/IAMoAgwiBSADKAIQRgR/IAMgAygCACgCJEH/AXFBOmoRBQAFIAUoAgALQX8Q2gUEfyAAQQA2AgBBAQUgACgCAEULBUEBCyEAAkACQAJAIARFDQAgBCgCDCIDIAQoAhBGBH8gBCAEKAIAKAIkQf8BcUE6ahEFAAUgAygCAAtBfxDaBQRAIAFBADYCAAwBBSAARQ0CCwwCCyAADQAMAQsgAiACKAIAQQJyNgIACwvqAQEFfyMJIQcjCUEQaiQJIABBCGoiACgCACgCCCEGIAAgBkH/AXFBOmoRBQAiBiwACyIAQQBIBH8gBigCBAUgAEH/AXELIQkgBiwAFyIAQQBIBH8gBigCEAUgAEH/AXELIQogB0EEaiEIIAchAEEAIAprIAlGBEAgBCAEKAIAQQRyNgIABQJAIAAgAygCADYCACAIIAAoAgA2AgAgAiAIIAYgBkEYaiAFIARBABDQBiAGayICRSABKAIAIgBBDEZxBEAgAUEANgIADAELIAJBDEYgAEEMSHEEQCABIABBDGo2AgALCwsgByQJC2EBAX8jCSEFIwlBEGokCSAFIAIoAgA2AgAgBUEEaiICIAUoAgA2AgAgASACIAMgBEECEK0HIQEgAygCACICQQRxRSABQT1IcQRAIAAgATYCAAUgAyACQQRyNgIACyAFJAkLYQEBfyMJIQUjCUEQaiQJIAUgAigCADYCACAFQQRqIgIgBSgCADYCACABIAIgAyAEQQEQrQchASADKAIAIgJBBHFFIAFBB0hxBEAgACABNgIABSADIAJBBHI2AgALIAUkCQtvAQF/IwkhBSMJQRBqJAkgBSACKAIANgIAIAVBBGoiAiAFKAIANgIAIAEgAiADIARBBBCtByECIAMoAgBBBHFFBEAgACACQcUASAR/IAJB0A9qBSACQewOaiACIAJB5ABIGwtBlHFqNgIACyAFJAkLUgEBfyMJIQUjCUEQaiQJIAUgAigCADYCACAFQQRqIgIgBSgCADYCACABIAIgAyAEQQQQrQchASADKAIAQQRxRQRAIAAgAUGUcWo2AgALIAUkCQuWBAEDfyAAKAIAIgQEfyAEKAIMIgUgBCgCEEYEfyAEIAQoAgAoAiRB/wFxQTpqEQUABSAFKAIAC0F/ENoFBH8gAEEANgIAQQEFIAAoAgBFCwVBAQshBQJAAkACQCABKAIAIgQEQCAEKAIMIgYgBCgCEEYEfyAEIAQoAgAoAiRB/wFxQTpqEQUABSAGKAIAC0F/ENoFBEAgAUEANgIABSAFBEAMBAUMAwsACwsgBUUEQEEAIQQMAgsLIAIgAigCAEEGcjYCAAwBCyADIAAoAgAiBSgCDCIGIAUoAhBGBH8gBSAFKAIAKAIkQf8BcUE6ahEFAAUgBigCAAtBACADKAIAKAI0QT9xQZQDahEBAEH/AXFBJUcEQCACIAIoAgBBBHI2AgAMAQsgACgCACIDQQxqIgYoAgAiBSADKAIQRgRAIAMgAygCACgCKEH/AXFBOmoRBQAaBSAGIAVBBGo2AgAgBSgCABoLIAAoAgAiAwR/IAMoAgwiBSADKAIQRgR/IAMgAygCACgCJEH/AXFBOmoRBQAFIAUoAgALQX8Q2gUEfyAAQQA2AgBBAQUgACgCAEULBUEBCyEAAkACQCAERQ0AIAQoAgwiAyAEKAIQRgR/IAQgBCgCACgCJEH/AXFBOmoRBQAFIAMoAgALQX8Q2gUEQCABQQA2AgAMAQUgAA0DCwwBCyAARQ0BCyACIAIoAgBBAnI2AgALC8YHAQd/IAAoAgAiBQR/IAUoAgwiCSAFKAIQRgR/IAUgBSgCACgCJEH/AXFBOmoRBQAFIAkoAgALQX8Q2gUEfyAAQQA2AgBBAQUgACgCAEULBUEBCyEHAkACQAJAIAEoAgAiCQRAIAkoAgwiBSAJKAIQRgR/IAkgCSgCACgCJEH/AXFBOmoRBQAFIAUoAgALQX8Q2gUEQCABQQA2AgAFIAcEQAwEBQwDCwALCyAHRQRAQQAhCQwCCwsgAiACKAIAQQZyNgIAQQAhCQwBCyADQYAQIAAoAgAiBygCDCIFIAcoAhBGBH8gByAHKAIAKAIkQf8BcUE6ahEFAAUgBSgCAAsiByADKAIAKAIMQT9xQZQDahEBAEUEQCACIAIoAgBBBHI2AgBBACEJDAELIAMgB0EAIAMoAgAoAjRBP3FBlANqEQEAIQcgACgCACIIQQxqIgUoAgAiBiAIKAIQRgRAIAggCCgCACgCKEH/AXFBOmoRBQAaBSAFIAZBBGo2AgAgBigCABoLIAdBGHRBGHUhBiAEIQcgCSIEIQUDQAJAIAZBUGohCSAAKAIAIggEfyAIKAIMIgYgCCgCEEYEfyAIIAgoAgAoAiRB/wFxQTpqEQUABSAGKAIAC0F/ENoFBH8gAEEANgIAQQEFIAAoAgBFCwVBAQshCCAFBH8gBSgCDCIGIAUoAhBGBH8gBSAFKAIAKAIkQf8BcUE6ahEFAAUgBigCAAtBfxDaBQR/IAFBADYCAEEAIQRBACEFQQEFQQALBUEAIQVBAQshBiAAKAIAIQogBiAIcyAHQQFKcUUNACADQYAQIAooAgwiBiAKKAIQRgR/IAogCigCACgCJEH/AXFBOmoRBQAFIAYoAgALIgggAygCACgCDEE/cUGUA2oRAQBFDQIgAyAIQQAgAygCACgCNEE/cUGUA2oRAQAhCCAAKAIAIgtBDGoiBigCACIKIAsoAhBGBEAgCyALKAIAKAIoQf8BcUE6ahEFABoFIAYgCkEEajYCACAKKAIAGgsgCUEKbCAIQRh0QRh1aiEGIAdBf2ohBwwBCwsgCgR/IAooAgwiAyAKKAIQRgR/IAogCigCACgCJEH/AXFBOmoRBQAFIAMoAgALQX8Q2gUEfyAAQQA2AgBBAQUgACgCAEULBUEBCyEDAkACQCAERQ0AIAQoAgwiACAEKAIQRgR/IAQgBCgCACgCJEH/AXFBOmoRBQAFIAAoAgALQX8Q2gUEQCABQQA2AgAMAQUgAw0DCwwBCyADRQ0BCyACIAIoAgBBAnI2AgALIAkLmwEBAn8gAEGUBGoQngkgAEGIBGoQngkgAEH8A2oQngkgAEHwA2oQngkgAEHYA2ohAiAAQfADaiEBA0AgAUF0aiIBEJ4JIAEgAkcNAAsgAEG4AWohAiAAQdgDaiEBA0AgAUF0aiIBEJ4JIAEgAkcNAAsgAEEQaiECIABBuAFqIQEDQCABQXRqIgEQngkgASACRw0ACyAAQQxqEMAHC6ABAQJ/IABBlARqEJ4JIABBiARqEJ4JIABB/ANqEJ4JIABB8ANqEJ4JIABB2ANqIQIgAEHwA2ohAQNAIAFBdGoiARCeCSABIAJHDQALIABBuAFqIQIgAEHYA2ohAQNAIAFBdGoiARCeCSABIAJHDQALIABBEGohAiAAQbgBaiEBA0AgAUF0aiIBEJ4JIAEgAkcNAAsgAEEMahDAByAAELcFCwoAIABBDGoQvwcLBwAgAEEQagsIACAAQbgBagsIACAAQdgDagsIACAAQfADagsIACAAQfwDagsIACAAQYgEagsIACAAQZQEagsHACAAQQhqCwgAIABBsAFqCwgAIABB0ANqCwgAIABB6ANqCwgAIABB9ANqCwgAIABBgARqCwgAIABBjARqC5sIAQR/IABB/ANqIgIsAAsiAUEASCEDIABBgARqIQQgAUH/AXEhAEEAIQEDQAJAIAEgAwR/IAQoAgAFIAALTw0AIAMEfyACKAIABSACCyABaiwAAEElRg0AIAFBAWohAQwBCwsCfwJAAkACQAJAIAMEfyACKAIABSACCyABQQFqaiwAAEHZAGsOIQADAwMDAwMDAwMDAgMDAwMDAwMDAQMDAwMDAwMDAwMDAAMLIAFBAmohAQNAAkAgASADBH8gBCgCAAUgAAtPDQAgAwR/IAIoAgAFIAILIAFqLAAAQSVGDQAgAUEBaiEBDAELCyADBH8gBCgCAAUgAAsgAUYNAgJAAkAgAwR/IAIoAgAFIAILIAFBAWpqLAAAQeQAaw4KAQQEBAQEBAQEAAQLIAFBAmohAQNAAkAgASADBH8gBCgCAAUgAAtPDQAgAwR/IAIoAgAFIAILIAFqLAAAQSVGDQAgAUEBaiEBDAELCyADBEAgBCgCACEACyAAIAFGDQMgAwRAIAIoAgAhAgsgAUEBaiACaiwAAEHkAEcNA0EDDAQLIAFBAmohAQNAAkAgASADBH8gBCgCAAUgAAtPDQAgAwR/IAIoAgAFIAILIAFqLAAAQSVGDQAgAUEBaiEBDAELCyADBEAgBCgCACEACyAAIAFGDQIgAwRAIAIoAgAhAgsgAUEBaiACaiwAAEHtAEcNAkEEDAMLIAFBAmohAQNAAkAgASADBH8gBCgCAAUgAAtPDQAgAwR/IAIoAgAFIAILIAFqLAAAQSVGDQAgAUEBaiEBDAELCyADBH8gBCgCAAUgAAsgAUYNASADBH8gAigCAAUgAgsgAUEBamosAABB5ABHDQEgAUECaiEBA0ACQCABIAMEfyAEKAIABSAAC08NACADBH8gAigCAAUgAgsgAWosAABBJUYNACABQQFqIQEMAQsLIAMEQCAEKAIAIQALIAAgAUYNASADBH8gAigCAAUgAgsgAUEBaiIBaiwAAEH5AEYEf0ECBSADBEAgAigCACECCyABIAJqLAAAQdkARw0CQQILDAILIAFBAmohAQNAAkAgASADBH8gBCgCAAUgAAtPDQAgAwR/IAIoAgAFIAILIAFqLAAAQSVGDQAgAUEBaiEBDAELCyADBH8gBCgCAAUgAAsgAUYNACADBH8gAigCAAUgAgsgAUEBamosAABB7QBHDQAgAUECaiEBA0ACQCABIAMEfyAEKAIABSAAC08NACADBH8gAigCAAUgAgsgAWosAABBJUYNACABQQFqIQEMAQsLIAMEQCAEKAIAIQALIAAgAUYNACADBH8gAigCAAUgAgsgAUEBaiIBaiwAAEH5AEYEf0EBBSADBEAgAigCACECCyABIAJqLAAAQdkARw0BQQELDAELQQALCwoAIAAoAgAQigULCgAgAEEMahDCBwvUCAEEfyAAQfwDaiECIAAsAIcEIgFBAEghAyAAQYAEaiEEIAFB/wFxIQBBACEBA0ACQCABIAMEfyAEKAIABSAAC08NACADBH8gAigCAAUgAgsgAUECdGooAgBBJUYNACABQQFqIQEMAQsLAn8CQAJAAkACQCADBH8gAigCAAUgAgsgAUEBakECdGooAgBB2QBrDiEAAwMDAwMDAwMDAwIDAwMDAwMDAwEDAwMDAwMDAwMDAwADCyABQQJqIQEDQAJAIAEgAwR/IAQoAgAFIAALTw0AIAMEfyACKAIABSACCyABQQJ0aigCAEElRg0AIAFBAWohAQwBCwsgAwR/IAQoAgAFIAALIAFGDQICQAJAIAMEfyACKAIABSACCyABQQFqQQJ0aigCAEHkAGsOCgEEBAQEBAQEBAAECyABQQJqIQEDQAJAIAEgAwR/IAQoAgAFIAALTw0AIAMEfyACKAIABSACCyABQQJ0aigCAEElRg0AIAFBAWohAQwBCwsgAwRAIAQoAgAhAAsgACABRg0DIAMEQCACKAIAIQILIAFBAWpBAnQgAmooAgBB5ABHDQNBAwwECyABQQJqIQEDQAJAIAEgAwR/IAQoAgAFIAALTw0AIAMEfyACKAIABSACCyABQQJ0aigCAEElRg0AIAFBAWohAQwBCwsgAwRAIAQoAgAhAAsgACABRg0CIAMEQCACKAIAIQILIAFBAWpBAnQgAmooAgBB7QBHDQJBBAwDCyABQQJq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CSAAIAopAgA3AgAgACAKKAIINgIIQQAhAANAIABBA0cEQCAAQQJ0IApqQQA2AgAgAEEBaiEADAELCyAKEJ4JIAEoAgAoAhghACAKIAEgAEH/AHFBmAlqEQQAIAZBC2oiACwAAEEASAR/IAYoAgAhACALQQA6AAAgACALEIgGIAZBADYCBCAGBSALQQA6AAAgBiALEIgGIABBADoAACAGCyEAIAYQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIkIQAgASAAQf8BcUE6ahEFAAUgAUH07QIQmAYiASgCACgCLCEAIAsgASAAQf8AcUGYCWoRBAAgAiALKAIANgAAIAEoAgAoAiAhACAKIAEgAEH/AHFBmAlqEQQAIAhBC2oiACwAAEEASAR/IAgoAgAhACALQQA6AAAgACALEIgGIAhBADYCBCAIBSALQQA6AAAgCCALEIgGIABBADoAACAICyEAIAgQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIcIQAgCiABIABB/wBxQZgJahEEACAHQQtqIgAsAABBAEgEfyAHKAIAIQAgC0EAOgAAIAAgCxCIBiAHQQA2AgQgBwUgC0EAOgAAIAcgCxCIBiAAQQA6AAAgBwshACAHEKMJIAAgCikCADcCACAAIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCDCEAIAMgASAAQf8BcUE6ahEFADoAACABKAIAKAIQIQAgBCABIABB/wFxQTpqEQUAOgAAIAEoAgAoAhQhACAKIAEgAEH/AHFBmAlqEQQAIAVBC2oiACwAAEEASAR/IAUoAgAhACALQQA6AAAgACALEIgGIAVBADYCBCAFBSALQQA6AAAgBSALEIgGIABBADoAACAFCyEAIAUQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIYIQAgCiABIABB/wBxQZgJahEEACAGQQtqIgAsAABBAEgEfyAG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ACAHIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCDCEAIAMgASAAQf8BcUE6ahEFADYCACABKAIAKAIQIQAgBCABIABB/wFxQTpqEQUANgIAIAEoAgAoAhQhACAKIAEgAEH/AHFBmAlqEQQAIAVBC2oiACwAAEEASAR/IAUoAgAhACALQQA6AAAgACALEIgGIAVBADYCBCAFBSALQQA6AAAgBSALEIgGIABBADoAACAFCyEAIAUQowkgACAKKQIANwIAIAAgCigCCDYCCEEAIQADQCAAQQNHBEAgAEECdCAKakEANgIAIABBAWohAAwBCwsgChCeCSABKAIAKAIYIQAgCiABIABB/wBxQZgJahEEACAGQQtqIgAsAABBAEgEQCAGKAIAIQAgC0EANgIAIAAgCxCNBiAGQQA2AgQFIAtBADYCACAGIAsQjQYgAEEAOgAACyAGELYJIAYgCikCADcCACAGIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCJCEAIAEgAEH/AXFBOmoRBQAFIAFBhO4CEJgGIgEoAgAoAiwhACALIAEgAEH/AHFBmAlqEQQAIAIgCygCADYAACABKAIAKAIgIQAgCiABIABB/wBxQZgJahEEACAIQQtqIgAsAABBAEgEQCAIKAIAIQAgC0EANgIAIAAgCxCNBiAIQQA2AgQFIAtBADYCACAIIAsQjQYgAEEAOgAACyAIELYJIAggCikCADcCACAIIAooAgg2AghBACEAA0AgAEEDRwRAIABBAnQgCmpBADYCACAAQQFqIQAMAQsLIAoQngkgASgCACgCHCEAIAogASAAQf8AcUGYCWoRBAAgB0ELaiIALAAAQQBIBEAgBygCACEAIAtBADYCACAAIAsQjQYgB0EANgIEBSALQQA2AgAgByALEI0GIABBADoAAAsgBxC2CSAHIAopAgA3AgAgByAKKAIINgIIQQAhAANAIABBA0cEQCAAQQJ0IApqQQA2AgAgAEEBaiEADAELCyAKEJ4JIAEoAgAoAgwhACADIAEgAEH/AXFBOmoRBQA2AgAgASgCACgCECEAIAQgASAAQf8BcUE6ahEFADYCACABKAIAKAIUIQAgCiAB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6AYhACAVBEAgFRC3BQsgCBCeCSAHEJ4JIAoQngkgDRCZBiAGJAkgAAuPDQEDfyMJIQwjCUEQaiQJIAxBDGohCiAMIQsgCSAABH8gAkGM7gIQmAYhAiABBEAgAigCACgCLCEAIAogAiAAQf8AcUGYCWoRBAAgAyAKKAIANgAAIAIoAgAoAiAhACALIAIgAEH/AHFBmAlqEQQAIAhBC2oiACwAAEEASARAIAgoAgAhACAKQQA2AgAgACAKEI0GIAhBADYCBAUgCkEANgIAIAggChCNBiAAQQA6AAALIAgQtgkgCCALKQIANwIAIAggCygCCDYCCEEAIQADQCAAQQNHBEAgAEECdCALakEANgIAIABBAWohAAwBCwsgCxCeCQUgAigCACgCKCEAIAogAiAAQf8AcUGYCWoRBAAgAyAKKAIANgAAIAIoAgAoAhwhACALIAIgAEH/AHFBmAlqEQQAIAhBC2oiACwAAEEASARAIAgoAgAhACAKQQA2AgAgACAKEI0GIAhBADYCBAUgCkEANgIAIAggChCNBiAAQQA6AAALIAgQtgkgCCALKQIANwIAIAggCygCCDYCCEEAIQADQCAAQQNHBEAgAEECdCALakEANgIAIABBAWohAAwBCwsgCxCeCQsgAigCACgCDCEAIAQgAiAAQf8BcUE6ahEFADYCACACKAIAKAIQIQAgBSACIABB/wFxQTpqEQUANgIAIAIoAgAoAhQhACALIAIgAEH/AHFBmAlqEQQAIAZBC2oiACwAAEEASAR/IAYoAgAhACAKQQA6AAAgACAKEIgGIAZBADYCBCAGBSAKQQA6AAAgBiAKEIgGIABBADoAACAGCyEAIAYQowkgACALKQIANwIAIAAgCygCCDYCCEEAIQADQCAAQQNHBEAgAEECdCALakEANgIAIABBAWohAAwBCwsgCxCeCSACKAIAKAIYIQAgCyACIABB/wBxQZgJahEEACAHQQtqIgAsAABBAEgEQCAHKAIAIQAgCkEANgIAIAAgChCNBiAHQQA2AgQFIApBADYCACAHIAoQjQYgAEEAOgAACyAHELYJIAcgCykCADcCACAHIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkgAigCACgCJCEAIAIgAEH/AXFBOmoRBQAFIAJBhO4CEJgGIQIgAQRAIAIoAgAoAiwhACAKIAIgAEH/AHFBmAlqEQQAIAMgCigCADYAACACKAIAKAIgIQAgCyACIABB/wBxQZgJahEEACAIQQtqIgAsAABBAEgEQCAIKAIAIQAgCkEANgIAIAAgChCNBiAIQQA2AgQFIApBADYCACAIIAoQjQYgAEEAOgAACyAIELYJIAggCykCADcCACAIIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkFIAIoAgAoAighACAKIAIgAEH/AHFBmAlqEQQAIAMgCigCADYAACACKAIAKAIcIQAgCyACIABB/wBxQZgJahEEACAIQQtqIgAsAABBAEgEQCAIKAIAIQAgCkEANgIAIAAgChCNBiAIQQA2AgQFIApBADYCACAIIAoQjQYgAEEAOgAACyAIELYJIAggCykCADcCACAIIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkLIAIoAgAoAgwhACAEIAIgAEH/AXFBOmoRBQA2AgAgAigCACgCECEAIAUgAiAAQf8BcUE6ahEFADYCACACKAIAKAIUIQAgCyACIABB/wBxQZgJahEEACAGQQtqIgAsAABBAEgEfyAGKAIAIQAgCkEAOgAAIAAgChCIBiAGQQA2AgQgBgUgCkEAOgAAIAYgChCIBiAAQQA6AAAgBgshACAGEKMJIAAgCykCADcCACAAIAsoAgg2AghBACEAA0AgAEEDRwRAIABBAnQgC2pBADYCACAAQQFqIQAMAQsLIAsQngkgAigCACgCGCEAIAsgAiAAQf8AcUGYCWoRBAAgB0ELaiIALAAAQQBIBEAgBygCACEAIApBADYCACAAIAoQjQYgB0EANgIEBSAKQQA2AgAgByAKEI0GIABBADoAAAsgBxC2CSAHIAspAgA3AgAgByALKAIINgIIQQAhAANAIABBA0cEQCAAQQJ0IAtqQQA2AgAgAEEBaiEADAELCyALEJ4JIAIoAgAoAiQhACACIABB/wFxQTpqEQUACzYCACAMJAkLswkBEX8gAiAANgIAIA1BC2ohGSANQQRqIRggDEELaiEcIAxBBGohHSADQYAEcUUhHiAOQQBKIR8gC0ELaiEaIAtBBGohGwNAIBdBBEcE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AAs6AAAgAUEBaiEBDAELCyACCwQAIAELKQADQCABIAJHBEAgAyABLAAAOgAAIANBAWohAyABQQFqIQEMAQsLIAILEgAgASACIAFBGHRBGHVBf0obCzMAA0AgASACRwRAIAQgASwAACIAIAMgAEF/Shs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAgsYACAAQdTRATYCACAAKAIQEIoFIAAQowgLDAAgABCtCCAAELcFCxUAIAAoAhAaIAFB/wFxEMcEQf8BcQsyACAAQRBqIQADQCABIAJHBEAgACgCABogASABLQAAEMcEOgAAIAFBAWohAQwBCwsgAgsVACAAKAIQGiABQf8BcRDKBEH/AXELMgAgAEEQaiEAA0AgASACRwRAIAAoAgAaIAEgAS0AABDKBDoAACABQQFqIQEMAQsLIAILEwAgAEGI0gE2AgAgACgCCBCKBQsMACAAELMIIAAQtwULngIBAX8gAUH//wNxIgNBgMAAcQR/IAIgACgCCBCXBUEARwVBAAshASADQYCAAXEEQCAAKAIIGiABIAIQxARBAEdyIQELIANBAnEEQCAAKAIIGiABIAIQwARBAEdyIQELIANBgAJxBEAgASACIAAoAggQlgVBAEdyIQELIANBgARxBEAgASACIAAoAggQmAVBAEdyIQELIANBgAhxBEAgACgCCBogASACEL0EQQBHciEBCyADQYAQcQRAIAEgAiAAKAIIEIwFQQBHciEBCyADQQRxBEAgACgCCBogASACEMYEQQBHciEBCyADQYAgcQRAIAEgAiAAKAIIEIkFQQBHciEBCyADQQFxBH8gACgCCBogASACEMgEQQBHcgUgAQsL9QIBAX8gAEEIaiEAA0AgASACRwRAAkACQCABKAIAIgRBgAFJBEBB4LMBKAIAIAEoAgBBAXRqLgEAIQQMAQUgA0EAOwEAIAQgACgCABCXBQRAIAMgAy4BAEGAwAByOwEACyAAKAIAGiAEEMQEBEAgAyADLgEAQYCAAXI7AQALIAAoAgAaIAQQwAQEQCADIAMuAQBBAnI7AQALIAQgACgCABCWBQRAIAMgAy4BAEGAAnI7AQALIAQgACgCABCYBQRAIAMgAy4BAEGABHI7AQALIAAoAgAaIAQQvQQEQCADIAMuAQBBgAhyOwEACyAEIAAoAgAQjAUEQCADIAMuAQBBgBBy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CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwoLCyAAQSUQqQkgAEH3ABCpCQwLCyAAQSUQqQkgAEH1ABCpCQwKCyAAQSUQqQkgAEHJABCpCQwJCyAAQSUQqQkgAEHtABCpCQwICyAAQSUQqQkgAEHIABCpCQwHCyAAQSUQqQkgAEHkABCpCQwGCyAAQSUQqQkgAEHNABCpCQwFCyAAQSUQqQkgAEHTABCpCQwECyAAQSUQqQkgAEH5ABCpCQwDCyAAQSUQqQkgAEHqABCpCQwCCyAAQSUQqQkgAEHZ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CSAAQSUQugkgBSAFKAIAQQRqNgIADAMFIAAgBSgCACgCABC6CSAFIAUoAgBBBGo2AgAMAwsACwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUgCiALIAMQ4whBBmsOiBAAAQsLCwIDCwsLCwsLCwsLCwQLCwsLCwsLBQsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLBgsLCwcLCAsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCQsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsKCwsgAEElELoJIABB9wAQugkMCwsgAEElELoJIABB9QAQugkMCgsgAEElELoJIABByQAQugkMCQsgAEElELoJIABB7QAQugkMCAsgAEElELoJIABByAAQugkMBwsgAEElELoJIABB5AAQugkMBgsgAEElELoJIABBzQAQugkMBQsgAEElELoJIABB0wAQugkMBAsgAEElELoJIABB+QAQugkMAwsgAEElELoJIABB6gAQugkMAgsgAEElELoJIABB2QAQugkMAQsgBygCACECA0AgBSgCACACRg0BIAAgAigCABC6CSAHIAcoAgBBBGoiAjYCAAwACwALCwsgBSgCACEEDAELCyAIJAkL/wQBDH8jCSEOIwlB8ABqJAkgDiEGIAMgAmtBDG0iB0HkAEsEQCAHELYFIgYEQCAGIgshEAUQJQsFIAYhCwsgCyEIIAchBiACIQcDQCADIAdHBEAgBywACyIJQQBIBH8gBygCBAUgCUH/AXELBEAgCEEBOgAABSAIQQI6AAAgCkEBaiEKIAZBf2ohBgsgCEEBaiEIIAdBDGohBwwBCwsgCiEIIAYhCgNAIAEgACgCACIGRyAKQQBHcQRAIAQgBigCACAEKAIAKAIcQT9xQdQCahEAACERIA9BAWohDSACIQlBACEHIAshDCAIIQYDQCADIAlHBEAgDCwAAEEBRgRAAkAgBCAJQQtqIggsAABBAEgEfyAJKAIABSAJCyAPQQJ0aigCACAEKAIAKAIcQT9xQdQCahEAACARRwRAIAxBADoAACAKQX9qIQoMAQsgCCwAACIHQQBIBH8gCSgCBAUgB0H/AXELIA1GBH8gDEECOgAAIAZBAWohBiAKQX9qIQpBAQVBAQshBwsLIAlBDGohCSAMQQFqIQwMAQsLIAcEQAJAIAAgACgCAEEEajYCACAGIApqQQFLBEAgAiEHIAshCANAIAMgB0YNAiAILAAAQQJGBEAgBywACyIJQQBIBH8gBygCBAUgCUH/AXELIA1HBEAgCEEAOgAAIAZBf2ohBgsLIAdBDGohByAIQQFqIQgMAAsACwsLIA0hDyAGIQgMAQsLIAEgBkYEQCAFIAUoAgBBAnI2AgALAkACQANAIAIgA0YNASALLAAAQQJHBEAgAkEMaiECIAtBAWohCwwBCwsMAQsgBSAFKAIAQQRyNgIAIAMhAgsgEBC3BSAOJAkgAguQAgEDfyABIAAoAgAiBEYEQCACIAIoAgBBBnI2AgBBACEEBQJAIANBgBAgBCgCACIEIAMoAgAoAgxBP3FBlANqEQEARQRAIAIgAigCAEEEcjYCAEEAIQQMAQsgAyAEQQAgAygCACgCNEE/cUGUA2oRAQBBGHRBGHUhBEEEIQYDQAJAIAAgACgCAEEEaiIFNgIAIARBUGohBCABIAVHIAZBAUpxRQ0AIAZBf2ohBiADQYAQIAUoAgAiBSADKAIAKAIMQT9xQZQDahEBAEUNAiAEQQpsIAMgBUEAIAMoAgAoAjRBP3FBlANqEQEAQRh0QRh1aiEEDAELCyABIAVGBEAgAiACKAIAQQJyNgIACwsLIAQLlQQBBX8jCSEGIwlBEGokCSAGIQUgACABEN0IIABBrAFqIQQgAEEEaiECA0AgAkIANwIAIAJBADYCCEEAIQMDQCADQQNHBEAgA0ECdCACakEANgIAIANBAWohAwwBCwsgAkEMaiICIARHDQALIABBzANqIQQgAEGsAWohAgNAIAJCADcCACACQQA2AghBACEDA0AgA0EDRwRAIANBAnQgAmpBADYCACADQQFqIQMMAQsLIAJBDGoiAiAERw0ACyAAQeQDaiEEIABBzANqIQIDQCACQgA3AgAgAkEANgIIQQAhAwNAIANBA0cEQCADQQJ0IAJqQQA2AgAgA0EBaiEDDAELCyACQQxqIgIgBEcNAAsgAEHkA2oiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgAEHwA2oiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgAEH8A2oiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgAEGIBGoiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgBSABQQEQ5QggBUH81gE2AgAgACAFEN8IIAUQswggBiQJC1cBAn8jCSEDIwlBEGokCSADIQQgACACQX9qNgIEIABBiNIBNgIAIAAgASgCACABIAEsAAtBAEgbEI0FIgA2AgggAARAIAMkCQUgBEGItAIgARC9CRAlCwtEAQJ/IwkhAiMJQRBqJAkgAiEDIAAgASgCACABIAEsAAtBAEgbEI0FIgA2AgAgAARAIAIkCQUgA0HFtAIgARC9CRAlCwurAwEEfyMJIQUjCUEQaiQJIAUiAkEMaiIDIAEQ6AggAxDpCEUEQCACQgA3AgAgAkEANgIIIAIgASABEMwEEJsJIAJB7rQCEKsJIQRBACEBA0AgAUEDRwRAIAFBAnQgBGpBADYCACABQQFqIQEMAQsLECULIAMoAgAQmgUiAQRAIAEQmgUaCyAAQQhqIgFBgLUBKAIAIAMoAgAQ6ghFBEAgAUH/ADoAAAsgAEEJaiIBQYS1ASgCACADKAIAEOoIRQRAIAFB/wA6AAALIABBDGpBiLUBKAIAEKQJGiAAQRhqIgRB/LQBKAIAEKQJGiAAQZW1ASwAACIBQf8ARgR/QQAFIAELNgI8QZq1ASwAAAR/IABBJGpBjLUBKAIAEKQJBSAAQSRqQZm1AhCkCQsaQZu1ASwAAAR/IABBMGpBkLUBKAIAEKQJBSAAQTBqQZm1AhCkCQsaIAIgBBCaCSAAQUBrIAJBAEGWtQEsAABBl7UBLAAAQZq1ASwAABDrCCAAQcQAaiAEQQBBmLUBLAAAQZm1ASwAAEGbtQEsAAAQ6wggAhCeCSADEOwIIAUkCQsMACAAIAEQjQU2AgALCgAgACgCAEEARwuZAQEDfyMJIQQjCUEQaiQJIAQhAyABLAAAIgUEfwJ/IAEsAAFFBEAgACAFOgAAQQEMAQsgAyABIAIQ7wgEfwJ/IAMoAgAhASACEJoFIQIgARCvBSEDIAIEQCACEJoFGgsgA0F/RwRAIAAgAzoAAEEBDAELIAFBoAFGBH8gAEEgOgAAQQEFQQALCwVBAAsLBUEACyEAIAQkCSAAC9YOAQ5/IwkhCCMJQSBqJAkgAgR/IAEoAgQgASwACyICQf8BcSACQQBIG0EERgVBAAshByAIQRxqIQYgCEEYaiEJIAhBFGohCyAIQRBqIQwgCEEMaiENIAhBCGohDiAIQQRqIQ8gCCEQAkACQAJAAkAgA0EYdEEYdQ4CAAECCyAHBEAgASwACyICQQBIIQMgASgCACIKIAEoAgRqIAEgAkH/AXFqIAMbIQIgCiABIAMbIREgCiABIAMbIgpBA2oiEiETIAIhAyACIBJHBEAgAiAKQQRqRgRAIAwgETYCACANIAM2AgAgCSAMKAIANgIAIAYgDSgCADYCACAJIAYQ7QgaBSAOIBE2AgAgDyATNgIAIBAgAzYCACALIA4oAgA2AgAgCSAPKAIANgIAIAYgECgCADYCACALIAkgBhDuCBoLCwsCQAJAAkACQAJAIAVBGHRBGHUOBQABAgMEBgsgAEEDOgAAIABBBDoAASAAQQA6AAIgAEECOgADAkAgBEEYdEEYdQ4DBwAHBgsgBw0GIAEQrAkaDAYLIABBAzoAACAAQQI6AAMCQAJAAkAgBEEYdEEYdQ4DAAECBwsgAEEEOgABIABBADoAAgwHCyAAQQQ6AAEgAEEAOgACIAcNBiABEKwJGgwGCyAAQQE6AAEgAEEEOgACIAdFDQUgASABKAIAIgAgASABLAALQQBIIgIbIAAgASACG2sQrQkaDAULIABBBDoAACAAQQM6AAMCQAJAAkAgBEEYdEEYdQ4DAAECBgsgAEEAOgABIABBAjoAAgwGCyAHRQRAIAEQrAkaCyAAQQA6AAEgAEECOgACDAULIABBAjoAASAAQQE6AAIgB0UNBCABIAEoAgAiACABIAEsAAtBAEgiAhsgACABIAIbaxCtCRoMBAsgAEEEOgAAIABBAjoAAwJAAkACQCAEQRh0QRh1DgMAAQIFCyAAQQA6AAEgAEEDOgACDAULIABBAToAASAAQQM6AAIgB0UNBCABIAEoAgAiACABIAEsAAtBAEgiAhsgACABIAIbaxCtCRoMBAsgAEEDOgABIABBADoAAiAHDQMgARCsCRoMAwsgAEEEOgAAIABBAzoAAwJAAkACQCAEQRh0QRh1DgMAAQIECyAAQQA6AAEgAEECOgACDAQLIABBADoAASAAQQI6AAIgBw0DIAEQrAkaDAMLIABBAjoAASAAQQE6AAIgB0UNAiABIAEoAgAiACABIAEsAAtBAEgiAhsgACABIAIbaxCtCRoMAgsCQAJAAkACQAJAIAVBGHRBGHUOBQABAgMEBQsgAEEDOgAAIABBAjoAASAAQQA6AAIgAEEEOgADAkAgBEEYdEEYdQ4DBgAGBQsgBw0FIAEQrAkaDAULIABBAzoAACAAQQQ6AAMCQAJAAkAgBEEYdEEYdQ4DAAECBgsgAEECOgABIABBADoAAgwGCyAAQQI6AAEgAEEAOgACIAcNBSABQSAQqQkMBQsgAEEBOgABIABBAjoAAiAHRQ0EIAFBC2oiACwAACICQQBIBEAgAUEEaiICKAIAQX9qIQAgAiAANgIAIAAgASgCAGohACAGQQA6AAAgACAGEIgGDAUFIAAgAkH/AXFBf2oiADoAACAGQQA6AAAgACABaiAGEIgGDAULAAsgAEECOgAAIABBAzoAAwJAAkACQCAEQRh0QRh1DgMAAQIFCyAAQQA6AAEgAEEEOgACDAULIABBADoAASAAQQQ6AAIgBw0EIAFBIBCpCQwECyAAQQQ6AAEgAEEBOgACIAdFDQMgAUELaiIALAAAIgJBAEgEQCABQQRqIgIoAgBBf2ohACACIAA2AgAgACABKAIAaiEAIAZBADoAACAAIAYQiAYMBAUgACACQf8BcUF/aiIAOgAAIAZBADoAACAAIAFqIAYQiAYMBAsACyAAQQM6AAAgAEEEOgADAkACQAJAIARBGHRBGHUOAwABAgQLIABBAjoAASAAQQA6AAIMBAsgAEECOgABIABBADoAAiAHDQMgAUEgEKkJDAMLIABBAToAASAAQQI6AAIgB0UNAiABQQtqIgAsAAAiAkEASARAIAFBBGoiAigCAEF/aiEAIAIgADYCACAAIAEoAgBqIQAgBkEAOgAAIAAgBhCIBgwDBSAAIAJB/wFxQX9qIgA6AAAgBkEAOgAAIAAgAWogBhCIBgwDCwALIABBAjoAACAAQQQ6AAMCQAJAAkAgBEEYdEEYdQ4DAAECAwsgAEEDOgABIABBADoAAgwDCyAAQQM6AAEgAEEBOgACIAdFDQIgAUELaiIALAAAIgJBAEgEQCABQQRqIgIoAgBBf2ohACACIAA2AgAgACABKAIAaiEAIAZBADoAACAAIAYQiAYMAwUgACACQf8BcUF/aiIAOgAAIAZBADoAACAAIAFqIAYQiAYMAwsACyAAQQA6AAEgAEEDOgACIAcNASABQSAQqQkMAQsgAEECOgAAIABBAzoAASAAQQA6AAIgAEEEOgADCyAIJAkLEwEBfyAAKAIAIgEEQCABEIoFCwtDAQN/IAEoAgAiAUF/aiICLAAAIQQgASACIAAoAgAiAmsiA2shACADBEAgACACIAMQ4gkaBSABIQALIAIgBDoAACAAC/oBAQZ/IAEoAgAiBCAAKAIAIgNrIgUgAigCACAEayIHRgR/IAQhAANAIAMgBEcEQCADLAAAIQIgAyAALAAAOgAAIAAgAjoAACADQQFqIQMgAEEBaiEADAELCyABKAIABSAFIQQgByEBA0AgBCABbyIGBEAgASEEIAYhAQwBCwsgASADaiEEA0AgAyAERwRAIARBf2oiBCwAACEIIAQgBWohASAEIQMDQCADIAEsAAA6AAAgBCABIAVqIAAoAgAgBSACKAIAIAFrIgNraiAFIANIGyIGRwRAIAEhAyAGIQEMAQsLIAEgCDoAACAAKAIAIQMMAQsLIAMgB2oLC3EBBH8jCSEDIwlBEGokCSADIQQgA0EIaiEFIAEsAAAEfyAEQgA3AwAgARDMBCEGIAIQmgUhAiAFIAEgBiAEEOYEIQEgAgRAIAIQmgUaCyABQX1LBH9BAAUgACAFKAIANgIAQQELBUEACyEAIAMkCSAAC6sDAQR/IwkhBSMJQRBqJAkgBSICQQxqIgMgARDoCCADEOkIRQRAIAJCADcCACACQQA2AgggAiABIAEQzAQQmwkgAkHutAIQqwkhBEEAIQEDQCABQQNHBEAgAUECdCAEakEANgIAIAFBAWohAQwBCwsQJQsgAygCABCaBSIBBEAgARCaBRoLIABBCGoiAUGAtQEoAgAgAygCABDqCEUEQCABQf8AOgAACyAAQQlqIgFBhLUBKAIAIAMoAgAQ6ghFBEAgAUH/ADoAAAsgAEEMakGItQEoAgAQpAkaIABBGGoiBEH4tAEoAgAQpAkaIABBlLUBLAAAIgFB/wBGBH9BAAUgAQs2AjxBoLUBLAAABH8gAEEkakGMtQEoAgAQpAkFIABBJGpBmbUCEKQJCxpBobUBLAAABH8gAEEwakGQtQEoAgAQpAkFIABBMGpBmbUCEKQJCxogAiAEEJoJIABBQGsgAkEBQZy1ASwAAEGdtQEsAABBoLUBLAAAEOsIIABBxABqIARBAUGetQEsAABBn7UBLAAAQaG1ASwAABDrCCACEJ4JIAMQ7AggBSQJC5IFAQd/IwkhBSMJQbADaiQJIAUiAkGoA2oiBCABEOgIIAQQ6QhFBEAgAkIANwIAIAJBADYCCCACIAEgARDMBBCbCSACQe60AhCrCSEBA0AgA0EDRwRAIANBAnQgAWpBADYCACADQQFqIQMMAQsLECULIAQoAgAQmgUiAQRAIAEQmgUaCyAAQQhqIgFBgLUBKAIAIAQoAgAQ7whFBEAgAUH/////BzYCAAsgAEEMaiIBQYS1ASgCACAEKAIAEO8IRQRAIAFB/////wc2AgALIABBEGpBiLUBKAIAEKQJGiAFQZADaiIGQgA3AwAgBUGkA2oiB0H8tAEoAgA2AgAgBCgCABCaBSEDIAIgB0HkACAGEJwFIQEgAwRAIAMQmgUaCyABQX9GBEAQJQsgAEEcaiIDIAIgAUECdCACahDgCBogAEFAa0GVtQEsAAAiAUH/AEYEf0EABSABCzYCAEGatQEsAAAEQCAGQgA3AwAgB0GMtQEoAgA2AgAgBCgCABCaBSEIIAIgB0HkACAGEJwFIQEgCARAIAgQmgUaCyABQX9GBEAQJQUgAEEoaiACIAFBAnQgAmoQ4AgaCwUgAEEoakG41wEQtwkaC0GbtQEsAAAEQCAGQgA3AwAgB0GQtQEoAgA2AgAgBCgCABCaBSEBIAIgB0HkACAGEJwFIQggAQRAIAEQmgUaCyAIQX9GBEAQJQUgAEE0aiACIAhBAnQgAmoQ4AgaCwUgAEE0akG41wEQtwkaCyAFQZgDaiICIAMQrwkgAEHEAGogAkEAQZa1ASwAAEGXtQEsAABBmrUBLAAAEPIIIABByABqIANBAEGYtQEsAABBmbUBLAAAQZu1ASwAABDyCCACEJ4JIAQQ7AggBSQJC8gPARB/IwkhCCMJQTBqJAkgAgR/IAEoAgQgASwACyICQf8BcSACQQBIG0EERgVBAAshByAIQSRqIQYgCEEgaiEJIAhBHGohDSAIQRhqIQ4gCEEUaiEPIAhBEGohECAIQQxqIREgCEEIaiESIAhBBGohEyAIIRQCQAJAAkACQCADQRh0QRh1DgIAAQILIAcEQCABLAALIgJBAEgEfyABKAIAIgJBDGohCiABKAIEQQJ0IAJqIQsgCiEVIAIFIAJB/wFxQQJ0IAFqIQsgAUEMaiIVIQogASECIAELIQMgCiALIgxHBEAgCiADQQRqRgRAIA4gAjYCACAPIAw2AgAgCSAOKAIANgIAIAYgDygCADYCACAJIAYQ8wgaBSALIApBBGpGBEAgECACNgIAIBEgDDYCACAJIBAoAgA2AgAgBiARKAIANgIAIAkgBhD0CBoFIBIgAjYCACATIBU2AgAgFCAMNgIAIA0gEigCADYCACAJIBMoAgA2AgAgBiAUKAIANgIAIA0gCSAGEPUIGgsLCwsCQAJAAkACQAJAIAVBGHRBGHUOBQABAgMEBgsgAEEDOgAAIABBBDoAASAAQQA6AAIgAEECOgADAkAgBEEYdEEYdQ4DBwAHBgsgBw0GIAEQuwkaDAYLIABBAzoAACAAQQI6AAMCQAJAAkAgBEEYdEEYdQ4DAAECBwsgAEEEOgABIABBADoAAgwHCyAAQQQ6AAEgAEEAOgACIAcNBiABELsJGgwGCyAAQQE6AAEgAEEEOgACIAdFDQUgASABKAIAIgAgASABLAALQQBIIgIbIAAgASACG2tBAnUQvAkaDAULIABBBDoAACAAQQM6AAMCQAJAAkAgBEEYdEEYdQ4DAAECBgsgAEEAOgABIABBAjoAAgwGCyAHRQRAIAEQuwkaCyAAQQA6AAEgAEECOgACDAULIABBAjoAASAAQQE6AAIgB0UNBCABIAEoAgAiACABIAEsAAtBAEgiAhsgACABIAIba0ECdRC8CRoMBAsgAEEEOgAAIABBAjoAAwJAAkACQCAEQRh0QRh1DgMAAQIFCyAAQQA6AAEgAEEDOgACDAULIABBAToAASAAQQM6AAIgB0UNBCABIAEoAgAiACABIAEsAAtBAEgiAhsgACABIAIba0ECdRC8CRoMBAsgAEEDOgABIABBADoAAiAHDQMgARC7CRoMAwsgAEEEOgAAIABBAzoAAwJAAkACQCAEQRh0QRh1DgMAAQIECyAAQQA6AAEgAEECOgACDAQLIABBADoAASAAQQI6AAIgBw0DIAEQuwkaDAMLIABBAjoAASAAQQE6AAIgB0UNAiABIAEoAgAiACABIAEsAAtBAEgiAhsgACABIAIba0ECdRC8CRoMAgsCQAJAAkACQAJAIAVBGHRBGHUOBQABAgMEBQsgAEEDOgAAIABBAjoAASAAQQA6AAIgAEEEOgADAkAgBEEYdEEYdQ4DBgAGBQsgBw0FIAEQuwkaDAULIABBAzoAACAAQQQ6AAMCQAJAAkAgBEEYdEEYdQ4DAAECBgsgAEECOgABIABBADoAAgwGCyAAQQI6AAEgAEEAOgACIAcNBSABQSAQugkMBQsgAEEBOgABIABBAjoAAiAHRQ0EIAFBC2oiACwAACICQQBIBEAgAUEEaiICKAIAQX9qIQAgAiAANgIAIAEoAgAgAEECdGohACAGQQA2AgAgACAGEI0GDAUFIAAgAkH/AXFBf2oiADoAACAGQQA2AgAgAEECdCABaiAGEI0GDAULAAsgAEECOgAAIABBAzoAAwJAAkACQCAEQRh0QRh1DgMAAQIFCyAAQQA6AAEgAEEEOgACDAULIABBADoAASAAQQQ6AAIgBw0EIAFBIBC6CQwECyAAQQQ6AAEgAEEBOgACIAdFDQMgAUELaiIALAAAIgJBAEgEQCABQQRqIgIoAgBBf2ohACACIAA2AgAgASgCACAAQQJ0aiEAIAZBADYCACAAIAYQjQYMBAUgACACQf8BcUF/aiIAOgAAIAZBADYCACAAQQJ0IAFqIAYQjQYMBAsACyAAQQM6AAAgAEEEOgADAkACQAJAIARBGHRBGHUOAwABAgQLIABBAjoAASAAQQA6AAIMBAsgAEECOgABIABBADoAAiAHDQMgAUEgELoJDAMLIABBAToAASAAQQI6AAIgB0UNAiABQQtqIgAsAAAiAkEASARAIAFBBGoiAigCAEF/aiEAIAIgADYCACABKAIAIABBAnRqIQAgBkEANgIAIAAgBhCNBgwDBSAAIAJB/wFxQX9qIgA6AAAgBkEANgIAIABBAnQgAWogBhCNBgwDCwALIABBAjoAACAAQQQ6AAMCQAJAAkAgBEEYdEEYdQ4DAAECAwsgAEEDOgABIABBADoAAgwDCyAAQQM6AAEgAEEBOgACIAdFDQIgAUELaiIALAAAIgJBAEgEQCABQQRqIgIoAgBBf2ohACACIAA2AgAgASgCACAAQQJ0aiEAIAZBADYCACAAIAYQjQYMAwUgACACQf8BcUF/aiIAOgAAIAZBADYCACAAQQJ0IAFqIAYQjQYMAwsACyAAQQA6AAEgAEEDOgACIAcNASABQSAQugkMAQsgAEECOgAAIABBAzoAASAAQQA6AAIgAEEEOgADCyAIJAkLQAECfyAAKAIAIgAoAgAhAiABKAIAIABBBGoiA2siAQRAIAAgAyABEOIJGgsgAUECdUECdCAAaiIAIAI2AgAgAAtMAQN/IAEoAgAiAUF8aiICKAIAIQRBACACIAAoAgAiAmsiA0ECdWtBAnQgAWohACADBEAgACACIAMQ4gkaBSABIQALIAIgBDYCACAAC4cCAQZ/IAEoAgAiBCAAKAIAIgNrQQJ1IgUgAigCACIHIARrQQJ1IgZGBH8gBCEAA0AgAyAERwRAIAMoAgAhAiADIAAoAgA2AgAgACACNgIAIANBBGohAyAAQQRqIQAMAQsLIAEoAgAFIAUhASAGIQADQCABIABvIgIEQCAAIQEgAiEADAELCyAAQQJ0IANqIQIDQCACIANHBEAgAkF8aiICKAIAIQggBUECdCACaiEAIAIhAQNAIAEgACgCADYCACACIAVBAnQgAGogBSAHIABrQQJ1IgFrQQJ0IANqIAUgAUgbIgRHBEAgACEBIAQhAAwBCwsgACAINgIADAELCyAGQQJ0IANqCwuSBQEHfyMJIQUjCUGwA2okCSAFIgJBqANqIgQgARDoCCAEEOkIRQRAIAJCADcCACACQQA2AgggAiABIAEQzAQQmwkgAkHutAIQqwkhAQNAIANBA0cEQCADQQJ0IAFqQQA2AgAgA0EBaiEDDAELCxAlCyAEKAIAEJoFIgEEQCABEJoFGgsgAEEIaiIBQYC1ASgCACAEKAIAEO8IRQRAIAFB/////wc2AgALIABBDGoiAUGEtQEoAgAgBCgCABDvCEUEQCABQf////8HNgIACyAAQRBqQYi1ASgCABCkCRogBUGQA2oiBkIANwMAIAVBpANqIgdB+LQBKAIANgIAIAQoAgAQmgUhAyACIAdB5AAgBhCcBSEBIAMEQCADEJoFGgsgAUF/RgRAECULIABBHGoiAyACIAFBAnQgAmoQ4AgaIABBQGtBlLUBLAAAIgFB/wBGBH9BAAUgAQs2AgBBoLUBLAAABEAgBkIANwMAIAdBjLUBKAIANgIAIAQoAgAQmgUhCCACIAdB5AAgBhCcBSEBIAgEQCAIEJoFGgsgAUF/RgRAECUFIABBKGogAiABQQJ0IAJqEOAIGgsFIABBKGpBuNcBELcJGgtBobUBLAAABEAgBkIANwMAIAdBkLUBKAIANgIAIAQoAgAQmgUhASACIAdB5AAgBhCcBSEIIAEEQCABEJoFGgsgCEF/RgRAECUFIABBNGogAiAIQQJ0IAJqEOAIGgsFIABBNGpBuNcBELcJGgsgBUGYA2oiAiADEK8JIABBxABqIAJBAUGctQEsAABBnbUBLAAAQaC1ASwAABDyCCAAQcgAaiADQQFBnrUBLAAAQZ+1ASwAAEGhtQEsAAAQ8gggAhCeCSAEEOwIIAUkCQuBAQEBfyMJIQIjCUEQaiQJIABBfzYCBCAAQbzPATYCACAAIAEQjQUiADYCCCAABEAgAiQJDwsgAkIANwIAIAJBADYCCCACIAEgARDMBBCbCSACQZy1AhCrCSEAQQAhAQNAIAFBA0cEQCABQQJ0IABqQQA2AgAgAUEBaiEBDAELCxAlC8QJAEHc3QJBADYCAEHY3QJBzNABNgIAQeDdAhD5CEHo3gJCADcCAEHw3gJBADYCAEHo3gJBhJsCQYSbAhDMBBCbCUHk3QJB4N0CKAIANgIAQZzbAkEANgIAQZjbAkH8uQE2AgBB2N0CQZjbAkGE7AIQnQYQ+ghBpNsCQQA2AgBBoNsCQZy6ATYCAEHY3QJBoNsCQYzsAhCdBhD6CEGo2wJBARDbCEHY3QJBqNsCQZTsAhCdBhD6CEG82wJBADYCAEG42wJBrNQBNgIAQdjdAkG42wJBtOwCEJ0GEPoIQcTbAkEANgIAQcDbAkHw1AE2AgBB2N0CQcDbAkHE7gIQnQYQ+ghBzNsCQQA2AgBByNsCQbzPATYCAEHQ2wIQmwY2AgBB2N0CQcjbAkHM7gIQnQYQ+ghB3NsCQQA2AgBB2NsCQaDVATYCAEHY3QJB2NsCQdTuAhCdBhD6CEHk2wJBADYCAEHg2wJB0NUBNgIAQdjdAkHg2wJB3O4CEJ0GEPoIQejbAkEBEIMJQdjdAkHo2wJBpOwCEJ0GEPoIQYDcAkEBEIIJQdjdAkGA3AJBvOwCEJ0GEPoIQaTcAkEANgIAQaDcAkG8ugE2AgBB2N0CQaDcAkGs7AIQnQYQ+ghBrNwCQQA2AgBBqNwCQfy6ATYCAEHY3QJBqNwCQcTsAhCdBhD6CEG03AJBADYCAEGw3AJBvLsBNgIAQdjdAkGw3AJBzOwCEJ0GEPoIQbzcAkEANgIAQbjcAkHwuwE2AgBB2N0CQbjcAkHU7AIQnQYQ+ghBxNwCQQA2AgBBwNwCQczIATYCAEHY3QJBwNwCQfTtAhCdBhD6CEHM3AJBADYCAEHI3AJBhMkBNgIAQdjdAkHI3AJB/O0CEJ0GEPoIQdTcAkEANgIAQdDcAkG8yQE2AgBB2N0CQdDcAkGE7gIQnQYQ+ghB3NwCQQA2AgBB2NwCQfTJATYCAEHY3QJB2NwCQYzuAhCdBhD6CEHk3AJBADYCAEHg3AJBjMwBNgIAQdjdAkHg3AJBlO4CEJ0GEPoIQezcAkEANgIAQejcAkGozAE2AgBB2N0CQejcAkGc7gIQnQYQ+ghB9NwCQQA2AgBB8NwCQcTMATYCAEHY3QJB8NwCQaTuAhCdBhD6CEH83AJBADYCAEH43AJB4MwBNgIAQdjdAkH43AJBrO4CEJ0GEPoIQYTdAkEANgIAQYDdAkGY1AE2AgBBiN0CENUIQYDdAkGkvAE2AgBBiN0CQdS8ATYCAEHY3QJBgN0CQZjtAhCdBhD6CEGU3QJBADYCAEGQ3QJBmNQBNgIAQZjdAhDWCEGQ3QJB+LwBNgIAQZjdAkGovQE2AgBB2N0CQZDdAkHc7QIQnQYQ+ghBpN0CQQA2AgBBoN0CQZjUATYCAEGo3QIQmwY2AgBBoN0CQezHATYCAEHY3QJBoN0CQeTtAhCdBhD6CEG03QJBADYCAEGw3QJBmNQBNgIAQbjdAhCbBjYCAEGw3QJBhMgBNgIAQdjdAkGw3QJB7O0CEJ0GEPoIQcTdAkEANgIAQcDdAkH8zAE2AgBB2N0CQcDdAkG07gIQnQYQ+ghBzN0CQQA2AgBByN0CQZzNATYCAEHY3QJByN0CQbzuAhCdBhD6CAstACAAQQA2AgAgAEEANgIEIABBADYCCCAAQQA6AIABIABBHBCECSAAQRwQ/QgLngEBA38gAUEEaiIEIAQoAgBBAWo2AgAgACgCDCAAQQhqIgAoAgAiA2tBAnUgAksEfyAAIQQgAwUgACACQQFqEPsIIAAhBCAAKAIACyACQQJ0aigCACIABEAgAEEEaiIFKAIAIQMgBSADQX9qNgIAIANFBEAgACgCACgCCCEDIAAgA0H/A3FBhAVqEQMACwsgBCgCACACQQJ0aiABNgIAC0EBA38gAEEEaiIDKAIAIAAoAgAiBGtBAnUiAiABSQRAIAAgASACaxD8CAUgAiABSwRAIAMgAUECdCAEajYCAAsLC7MBAQd/IwkhBSMJQSBqJAkgBSECIABBCGoiAygCACAAQQRqIgcoAgAiBGtBAnUgAUkEQEH/////AyABIAQgACgCAGtBAnVqIgZJBEAQJQUgAiAGIAMoAgAgACgCACIIayIDQQF1IgQgBCAGSRtB/////wMgA0ECdUH/////AUkbIAcoAgAgCGtBAnUgAEEQahD+CCACIAEQ/wggACACEIAJIAIQgQkLBSAAIAEQ/QgLIAUkCQsyAQF/IABBBGoiAigCACEAA0AgAEEANgIAIAIgAigCAEEEaiIANgIAIAFBf2oiAQ0ACwtyAQJ/IABBDGoiBEEANgIAIAAgAzYCECABBEAgA0HwAGoiBSwAAEUgAUEdSXEEQCAFQQE6AAAFIAFBAnQQlwkhAwsFQQAhAwsgACADNgIAIAAgAkECdCADaiICNgIIIAAgAjYCBCAEIAFBAnQgA2o2AgALMgEBfyAAQQhqIgIoAgAhAANAIABBADYCACACIAIoAgBBBGoiADYCACABQX9qIgENAAsLtwEBBX8gAUEEaiICKAIAQQAgAEEEaiIFKAIAIAAoAgAiBGsiBkECdWtBAnRqIQMgAiADNgIAIAZBAEoEfyADIAQgBhDhCRogAiEEIAIoAgAFIAIhBCADCyECIAAoAgAhAyAAIAI2AgAgBCADNgIAIAUoAgAhAyAFIAFBCGoiAigCADYCACACIAM2AgAgAEEIaiIAKAIAIQIgACABQQxqIgAoAgA2AgAgACACNgIAIAEgBCgCADYCAAtUAQN/IAAoAgQhAiAAQQhqIgMoAgAhAQNAIAEgAkcEQCADIAFBfGoiATYCAAwBCwsgACgCACIBBEAgACgCECIAIAFGBEAgAEEAOgBwBSABELcFCwsLWwAgACABQX9qNgIEIABB9NIBNgIAIABBLjYCCCAAQSw2AgwgAEEQaiIBQgA3AgAgAUEANgIIQQAhAANAIABBA0cEQCAAQQJ0IAFqQQA2AgAgAEEBaiEADAELCwtbACAAIAFBf2o2AgQgAEHM0gE2AgAgAEEuOgAIIABBLDoACSAAQQxqIgFCADcCACABQQA2AghBACEAA0AgAEEDRwRAIABBAnQgAWpBADYCACAAQQFqIQAMAQsLC1cBAX9B/////wMgAUkEQBAlCyAAIABBgAFqIgIsAABFIAFBHUlxBH8gAkEBOgAAIABBEGoFIAFBAnQQlwkLIgI2AgQgACACNgIAIAAgAUECdCACajYCCAukDwEEfyAAQX82AgQgAEHM0AE2AgAgAEEIaiIFEPkIIABBkAFqIgQgARCaCRCGCSgCACIBIABHBEAgBSABKAIIIAEoAgwQhwkLIABBDGohAkEAIQEDQCABIAIoAgAgBSgCACIDa0ECdUkEQCABQQJ0IANqKAIAIgMEQCADQQRqIgMgAygCAEEBajYCAAsgAUEBaiEBDAELC0EMEJcJIgEgBBCICSAAIAFBhOwCEJ0GEPoIQQwQlwkiASAEEIkJIAAgAUGM7AIQnQYQ+ghBFBCXCSIBIARBABDeCCAAIAFBlOwCEJ0GEPoIQQwQlwkiASAEQQAQ5QggACABQbTsAhCdBhD6CEEIEJcJIgFBfzYCBCABQdzOATYCACAAIAFBxO4CEJ0GEPoIQQwQlwkiASAEKAIAIAQgBEELaiIFLAAAQQBIGxD3CCABQYzPATYCACAAIAFBzO4CEJ0GEPoIQQgQlwkiAUF/NgIEIAFB7M8BNgIAIAAgAUHU7gIQnQYQ+ghBCBCXCSIBQX82AgQgAUGc0AE2AgAgACABQdzuAhCdBhD6CEEYEJcJIgEgBBCKCSAAIAFBpOwCEJ0GEPoIQRwQlwkiASAEEIsJIAAgAUG87AIQnQYQ+ghByAAQlwkiAUF/NgIEIAFBrMoBNgIAIAFBDGoiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgAUEYaiIDQgA3AgAgA0EANgIIQQAhAgNAIAJBA0cEQCACQQJ0IANqQQA2AgAgAkEBaiECDAELCyABQSRqIgNCADcCACADQQA2AghBACECA0AgAkEDRwRAIAJBAnQgA2pBADYCACACQQFqIQIMAQsLIAFBMGoiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgASAEKAIAIAQgBSwAAEEASBsQ5wggACABQfTtAhCdBhD6CEHIABCXCSIBQX82AgQgAUHkygE2AgAgAUEMaiIDQgA3AgAgA0EANgIIQQAhAgNAIAJBA0cEQCACQQJ0IANqQQA2AgAgAkEBaiECDAELCyABQRhqIgNCADcCACADQQA2AghBACECA0AgAkEDRwRAIAJBAnQgA2pBADYCACACQQFqIQIMAQsLIAFBJGoiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgAUEwaiIDQgA3AgAgA0EANgIIQQAhAgNAIAJBA0cEQCACQQJ0IANqQQA2AgAgAkEBaiECDAELCyABIAQoAgAgBCAFLAAAQQBIGxDwCCAAIAFB/O0CEJ0GEPoIQcwAEJcJIgFBfzYCBCABQZzLATYCACABQRBqIgNCADcCACADQQA2AghBACECA0AgAkEDRwRAIAJBAnQgA2pBADYCACACQQFqIQIMAQsLIAFBHGoiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgAUEoaiIDQgA3AgAgA0EANgIIQQAhAgNAIAJBA0cEQCACQQJ0IANqQQA2AgAgAkEBaiECDAELCyABQTRqIgNCADcCACADQQA2AghBACECA0AgAkEDRwRAIAJBAnQgA2pBADYCACACQQFqIQIMAQsLIAEgBCgCACAEIAUsAABBAEgbEPEIIAAgAUGE7gIQnQYQ+ghBzAAQlwkiAUF/NgIEIAFB1MsBNgIAIAFBEGoiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgAUEcaiIDQgA3AgAgA0EANgIIQQAhAgNAIAJBA0cEQCACQQJ0IANqQQA2AgAgAkEBaiECDAELCyABQShqIgNCADcCACADQQA2AghBACECA0AgAkEDRwRAIAJBAnQgA2pBADYCACACQQFqIQIMAQsLIAFBNGoiA0IANwIAIANBADYCCEEAIQIDQCACQQNHBEAgAkECdCADakEANgIAIAJBAWohAgwBCwsgASAEKAIAIAQgBSwAAEEASBsQ9gggACABQYzuAhCdBhD6CEGgBBCXCSIBQX82AgQgAUGY1AE2AgAgAUEIaiIFENUIIAFBpLwBNgIAIAVB1LwBNgIAIAFBDGogBBDcCCABQYzGATYCACAFQdjGATYCACAAIAFBmO0CEJ0GEPoIQaAEEJcJIgFBfzYCBCABQZjUATYCACABQQhqIgUQ1gggAUH4vAE2AgAgBUGovQE2AgAgAUEMaiAEEOQIIAFB/MYBNgIAIAVByMcBNgIAIAAgAUHc7QIQnQYQ+ghBDBCXCSIBQX82AgQgAUGY1AE2AgAgAUEIaiAEEOYIIAFBnMgBNgIAIAAgAUHk7QIQnQYQ+ghBDBCXCSIBQX82AgQgAUGY1AE2AgAgAUEIaiAEEOYIIAFBtMgBNgIAIAAgAUHs7QIQnQYQ+ghBCBCXCSIBQX82AgQgAUGczgE2AgAgACABQbTuAhCdBhD6CEEIEJcJIgFBfzYCBCABQbzOATYCACAAIAFBvO4CEJ0GEPoICzcAQdDdAiwAAEUEQEHQ3QIQ3QkEQBD4CEHk7gJB2N0CNgIAQejuAkHk7gI2AgALC0Ho7gIoAgAL6wEBB38gACgCACIFIQkgAiABIgZrQQJ1IgMgAEEIaiIEKAIAIAVrQQJ1SwRAIAAQjwlB/////wMgA0kEQBAlBSAAIAMgBCgCACAAKAIAayIFQQF1IgQgBCADSRtB/////wMgBUECdUH/////AUkbEIQJIAAgASACIAMQjgkLBSADIABBBGoiBCgCACAFa0ECdSIHSyEIIAdBAnQgAWogAiAIGyIHIAZrIgYEQCAFIAEgBhDiCRoLIAZBAnUhASAIBEAgACAHIAIgAyAEKAIAIAAoAgBrQQJ1axCOCQUgBCABQQJ0IAlqNgIACwsLVAECfyMJIQIjCUEQaiQJIAIhAyAAQX82AgQgAEHg0AE2AgAgACABKAIAIAEgASwAC0EASBsQjQUiADYCCCAABEAgAiQJBSADQb+3AiABEL0JECULC1QBAn8jCSECIwlBEGokCSACIQMgAEF/NgIEIABBgNEBNgIAIAAgASgCACABIAEsAAtBAEgbEI0FIgA2AgggAARAIAIkCQUgA0HxtgIgARC9CRAlCwsnACAAQQAQgwkgAEHI0wE2AgAgACABKAIAIAEgASwAC0EASBsQjQkLJwAgAEEAEIIJIABB8NMBNgIAIAAgASgCACABIAEsAAtBAEgbEIwJC9wBAQN/IwkhBCMJQRBqJAkgBEEMaiECIAQhAyABQYSbAhDJBARAAkAgAiABEOgIIAIQ6QgEQCACKAIAEJoFIgMEQCADEJoFGgsgAEEIakHstAEoAgAgAigCABDvCBogAEEMakHwtAEoAgAgAigCABDvCBogAEEQakH0tAEoAgAQpAkaIAIQ7AgMAQsgA0IANwIAIANBADYCCCADIAEgARDMBBCbCSADQe61AhCrCSEBQQAhAANAIABBA0cEQCAAQQJ0IAFqQQA2AgAgAEEBaiEADAELCxAlCwsgBCQJC9wBAQN/IwkhBCMJQRBqJAkgBEEMaiECIAQhAyABQYSbAhDJBARAAkAgAiABEOgIIAIQ6QgEQCACKAIAEJoFIgMEQCADEJoFGgsgAEEIakHstAEoAgAgAigCABDqCBogAEEJakHwtAEoAgAgAigCABDqCBogAEEMakH0tAEoAgAQpAkaIAIQ7AgMAQsgA0IANwIAIANBADYCCCADIAEgARDMBBCbCSADQbG2AhCrCSEBQQAhAANAIABBA0cEQCAAQQJ0IAFqQQA2AgAgAEEBaiEADAELCxAlCwsgBCQJCzYAIABBBGohACACIAFrIgJBAEoEQCAAKAIAIAEgAhDhCRogACAAKAIAIAJBAnZBAnRqNgIACwtIAQJ/IAAoAgAiAQRAIABBBGoiAiABNgIAIAEgAEEQakYEQCAAQQA6AIABBSABELcFCyAAQQA2AgggAkEANgIAIABBADYCAAsLIAAgACABKAIAIgA2AgAgAEEEaiIAIAAoAgBBAWo2AgALMwBB+N4CLAAARQRAQfjeAhDdCQRAQezuAhCGCRCQCUHw7gJB7O4CNgIACwtB8O4CKAIACyEAIAAQkQkoAgAiADYCACAAQQRqIgAgACgCAEEBajYCAAtfAQN/IAEoAgBBBGoiAiACKAIAQQFqNgIAIAAoAgAiAkEEaiIEKAIAIQMgBCADQX9qNgIAIANFBEAgAigCACgCCCEDIAIgA0H/A3FBhAVqEQMACyAAIAEoAgA2AgAgAAteAQJ/IwkhASMJQRBqJAlBoAEQlwkhAiABQgA3AgAgAUEANgIIIAFBhJsCQYSbAhDMBBCbCSACIAEQhQkgARCeCSAAIAI2AgAgAkEEaiIAIAAoAgBBAWo2AgAgASQJCykAIAAoAgwgACgCCCIAa0ECdSABSwR/IAFBAnQgAGooAgBBAEcFQQALCzwAA0AgACgCAEEBRgRAQZDvAkH07gIQKxoMAQsLIAAoAgBFBEAgAEEBNgIAIAFBlwcRAwAgAEF/NgIACwtDAQF/IABBASAAGyEBA38gARC2BSIABH8gAAVByO8CQcjvAigCACIANgIAIAAEfyAAQQNxQYAFahEUAAwCBUEACwsLCz8BAn8gARDMBCIDQQ1qEJcJIgIgAzYCACACIAM2AgQgAkEANgIIIAJBDGoiAiABIANBAWoQ4QkaIAAgAjYCAAsXACAAQaDYATYCACAAQQRqQeKAAhCYCQs/ACAAQgA3AgAgAEEANgIIIAEsAAtBAEgEQCAAIAEoAgAgASgCBBCbCQUgACABKQIANwIAIAAgASgCCDYCCAsLdQEDfyMJIQMjCUEQaiQJIAJBb0sEQBAlCyACQQtJBEAgACACOgALBSAAIAJBEGpBcHEiBBCXCSIFNgIAIAAgBEGAgICAeHI2AgggACACNgIEIAUhAAsgACABIAIQyQUaIANBADoAACAAIAJqIAMQiAYgAyQJC3UBA38jCSEDIwlBEGokCSABQW9LBEAQJQsgAUELSQRAIAAgAToACwUgACABQRBqQXBxIgQQlwkiBTYCACAAIARBgICAgHhyNgIIIAAgATYCBCAFIQALIAAgASACEJ0JGiADQQA6AAAgACABaiADEIgGIAMkCQsaACABBEAgACACEMgFQf8BcSABEOMJGgsgAAsVACAALAALQQBIBEAgACgCABC3BQsLNgECfyAAIAFHBEAgACABKAIAIAEgASwACyICQQBIIgMbIAEoAgQgAkH/AXEgAxsQoAkaCyAAC7EBAQZ/IwkhBSMJQRBqJAkgBSEDIABBC2oiBiwAACIIQQBIIgcEfyAAKAIIQf////8HcUF/agVBCgsiBCACSQRAIAAgBCACIARrIAcEfyAAKAIEBSAIQf8BcQsiA0EAIAMgAiABEKIJBSAHBH8gACgCAAUgAAsiBCABIAIQoQkaIANBADoAACACIARqIAMQiAYgBiwAAEEASARAIAAgAjYCBAUgBiACOgAACwsgBSQJIAALEwAgAgRAIAAgASACEOIJGgsgAAv0AQEDfyMJIQgjCUEQaiQJQW4gAWsgAkkEQBAlCyAALAALQQBIBH8gACgCAAUgAAshCSABQef///8HSQR/QQsgAUEBdCIKIAEgAmoiAiACIApJGyICQRBqQXBxIAJBC0kbBUFvCyIKEJcJIQIgBARAIAIgCSAEEMkFGgsgBgRAIAIgBGogByAGEMkFGgsgAyAFayIDIARrIgcEQCAGIAIgBGpqIAUgBCAJamogBxDJBRoLIAFBCkcEQCAJELcFCyAAIAI2AgAgACAKQYCAgIB4cjYCCCAAIAMgBmoiADYCBCAIQQA6AAAgACACaiAIEIgGIAgkCQumAgEHfyAAQQtqIgcsAAAiA0EASCIEBH8gACgCBCEFIAAoAghB/////wdxQX9qBSADQf8BcSEFQQoLIQIgBUEAIAVBAEsbIgZBC0khAUEKIAZBEGpBcHFBf2ogARsiBiACRwRAAkACQAJAIAEEQCAAKAIAIQEgBAR/QQAhBCABIQIgAAUgACABIANB/wFxQQFqEMkFGiABELcFDAMLIQEFIAZBAWoiAhCXCSEBIAQEf0EBIQQgACgCAAUgASAAIANB/wFxQQFqEMkFGiAAQQRqIQMMAgshAgsgASACIABBBGoiAygCAEEBahDJBRogAhC3BSAERQ0BIAZBAWohAgsgACACQYCAgIB4cjYCCCADIAU2AgAgACABNgIADAELIAcgBToAAAsLCw4AIAAgASABEMwEEKAJC4wBAQV/IwkhBCMJQRBqJAkgAEELaiIGLAAAIgJBAEgiAwR/IAAoAgQFIAJB/wFxCyEFIAQhAiAFIAFJBEAgACABIAVrQQAQpgkaBSADBEAgASAAKAIAaiEDIAJBADoAACADIAIQiAYgACABNgIEBSACQQA6AAAgACABaiACEIgGIAYgAToAAAsLIAQkCQvPAQEGfyMJIQcjCUEQaiQJIAchCCABBEAgAEELaiIGLAAAIgRBAEgEfyAAKAIIQf////8HcUF/aiEFIAAoAgQFQQohBSAEQf8BcQshAyAFIANrIAFJBEAgACAFIAEgA2ogBWsgAyADQQAQpwkgBiwAACEECyADIARBGHRBGHVBAEgEfyAAKAIABSAACyIEaiABIAIQnQkaIAEgA2ohASAGLAAAQQBIBEAgACABNgIEBSAGIAE6AAALIAhBADoAACABIARqIAgQiAYLIAckCSAAC64BAQJ/QW8gAWsgAkkEQBAlCyAALAALQQBIBH8gACgCAAUgAAshByABQef///8HSQR/QQsgAUEBdCIGIAEgAmoiAiACIAZJGyICQRBqQXBxIAJBC0kbBUFvCyICEJcJIQYgBARAIAYgByAEEMkFGgsgAyAEayIDBEAgBSAEIAZqaiAEIAdqIAMQyQUaCyABQQpHBEAgBxC3BQsgACAGNgIAIAAgAkGAgICAeHI2AggLxgEBBn8jCSEGIwlBEGokCSAAQQtqIgcsAAAiBUEASCIIBH8gACgCBCEDIAAoAghB/////wdxQX9qBSAFQf8BcSEDQQoLIQQgBiEFIAQgA2sgAkkEQCAAIAQgAiADaiAEayADIANBACACIAEQogkFIAIEQCADIAgEfyAAKAIABSAACyIEaiABIAIQyQUaIAIgA2ohASAHLAAAQQBIBEAgACABNgIEBSAHIAE6AAALIAVBADoAACABIARqIAUQiAYLCyAGJAkgAAvEAQEGfyMJIQMjCUEQaiQJIAMiBiABOgAAIABBC2oiBCwAACIBQQBIIgcEfyAAKAIEIQIgACgCCEH/////B3FBf2oFIAFB/wFxIQJBCgshASADQQFqIQUCQAJAIAEgAkYEQCAAIAFBASABIAFBABCnCSAELAAAQQBIDQEFIAcNAQsgBCACQQFqOgAADAELIAAoAgAhASAAIAJBAWo2AgQgASEACyAAIAJqIgAgBhCIBiAFQQA6AAAgAEEBaiAFEIgGIAMkCQuAAgEGfyMJIQcjCUEQaiQJIABBC2oiCCwAACIEQQBIIgUEfyAAKAIEBSAEQf8BcQsiBiABSQRAECULIAchCSAFBH8gACgCCEH/////B3FBf2oFQQoLIgQgBmsgA0kEQCAAIAQgAyAGaiAEayAGIAFBACADIAIQogkFIAMEQCABIAUEfyAAKAIABSAACyIEaiIFIAYgAWsiAQR/IAMgBWogBSABEKEJGiACIANqIAIgBSACTSAEIAZqIAJLcRsFIAILIAMQoQkaIAMgBmohASAILAAAQQBIBEAgACABNgIEBSAIIAE6AAALIAlBADoAACABIARqIAkQiAYLCyAHJAkgAAsQACAAQQAgASABEMwEEKoJC90BAQV/IwkhBCMJQRBqJAkgAEELaiIFLAAAIgFBAEgiAwR/IAAoAgQFIAFB/wFxCyICQQBJBEAQJQsgAwR/IAAoAghB/////wdxQX9qBUEKCyIBIAJrQQFJBEAgACABIAJBAWogAWsgAkEAQQEQpwkgACgCACEBBSADBH8gACgCAAUgAAshASACIgMEQCABQQFqIAEgAxChCRoLCyABQQFBIBCdCRogAkEBaiECIAUsAABBAEgEQCAAIAI2AgQFIAUgAjoAAAsgBEEAOgAAIAEgAmogBBCIBiAEJAkgAAuxAQEHfyMJIQUjCUEQaiQJIABBC2oiBywAACICQQBIIgMEfyAAKAIEBSACQf8BcQsiCCABSQRAECULIAMEfyAAKAIABSAACyEDIAggAWsiBEEBIARBAUkbIQYgBCAGayIEBEAgASADaiIBIAEgBmogBBChCRogBywAACECCyAIIAZrIQEgAkEASARAIAAgATYCBAUgByABOgAACyAFQQA6AAAgASADaiAFEIgGIAUkCSAAC3UBAn8jCSEEIwlBEGokCSADQW9LBEAQJQsgA0ELSQRAIAAgAjoACwUgACADQRBqQXBxIgUQlwkiAzYCACAAIAVBgICAgHhyNgIIIAAgAjYCBCADIQALIAAgASACEMkFGiAEQQA6AAAgACACaiAEEIgGIAQkCQs/ACAAQgA3AgAgAEEANgIIIAEsAAtBAEgEQCAAIAEoAgAgASgCBBCwCQUgACABKQIANwIAIAAgASgCCDYCCAsLjgEBA38jCSEDIwlBEGokCSACQe////8DSwRAECULIAJBAkkEQCAAIAI6AAsgACEEBSACQQRqQXxxIgVB/////wNLBEAQJQUgACAFQQJ0EJcJIgQ2AgAgACAFQYCAgIB4cjYCCCAAIAI2AgQLCyAEIAEgAhDPBRogA0EANgIAIAJBAnQgBGogAxCNBiADJAkLjgEBA38jCSEDIwlBEGokCSABQe////8DSwRAECULIAFBAkkEQCAAIAE6AAsgACEEBSABQQRqQXxxIgVB/////wNLBEAQJQUgACAFQQJ0EJcJIgQ2AgAgACAFQYCAgIB4cjYCCCAAIAE2AgQLCyAEIAEgAhCyCRogA0EANgIAIAFBAnQgBGogAxCNBiADJAkLFgAgAQR/IAAgAiABEK0FGiAABSAACwu5AQEGfyMJIQUjCUEQaiQJIAUhBCAAQQhqIgNBA2oiBiwAACIIQQBIIgcEfyADKAIAQf////8HcUF/agVBAQsiAyACSQRAIAAgAyACIANrIAcEfyAAKAIEBSAIQf8BcQsiBEEAIAQgAiABELUJBSAHBH8gACgC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A0AgACACSARAIAAgASwAADoAACAAIAEsAAE6AAEgACABLAACOgACIAAgASwAAzoAAyAAQQRqIQAgAUEEaiEBDAELCwsDQCAAIANIBEAgACABLAAAOgAAIABBAWohACABQQFqIQEMAQsLIAQLYAEBfyABIABIIAAgASACakhxBEAgACEDIAEgAmohASAAIAJqIQADQCACQQBKBEAgAkEBayECIABBAWsiACABQQFrIgEsAAA6AAAMAQsLIAMhAAUgACABIAIQ4QkaCyAAC5gCAQR/IAAgAmohBCABQf8BcSEBIAJBwwBOBEADQCAAQQNxBEAgACABOgAAIABBAWohAAwBCwsgBEF8cSIFQUBqIQYgAUEIdCABciABQRB0ciABQRh0ciEDA0AgACAGTARAIAAgAzYCACAAIAM2AgQgACADNgIIIAAgAzYCDCAAIAM2AhAgACADNgIUIAAgAzYCGCAAIAM2AhwgACADNgIgIAAgAzYCJCAAIAM2AiggACADNgIsIAAgAzYCMCAAIAM2AjQgACADNgI4IAAgAzYCPCAAQUBrIQAMAQsLA0AgACAFSARAIAAgAzYCACAAQQRqIQAMAQsLCwNAIAAgBEgEQCAAIAE6AAAgAEEBaiEADAELCyAEIAJrC1EBAn8gACMEKAIAIgFqIgIgAUggAEEASnEgAkEASHIEQBADGkEMEApBfw8LIwQgAjYCACACEAJKBEAQAUUEQCMEIAE2AgBBDBAKQX8PCwsgAQsMACABIABBB3ERDQALEQAgASACIABBD3FBCGoRCAALEQAgASACIABBD3FBGGoREAALEwAgASACIAMgAEEBcUEoahEXAAsQACABIABB/wFxQTpqEQUACxIAIAEgAiAAQQdxQboCahEYAAsUACABIAIgAyAAQQdxQcICahEZAAsWACABIAIgAyAEIABBB3FBygJqERoACxgAIAEgAiADIAQgBSAAQQFxQdICahEbAAsSACABIAIgAEE/cUHUAmoRAAALFAAgASACIAMgAEE/cUGUA2oRAQALFgAgASACIAMgBCAAQR9xQdQDahEJAAsYACABIAIgAyAEIAUgAEEHcUH0A2oREwALGAAgASACIAMgBCAFIABBH3FB/ANqEQYACxoAIAEgAiADIAQgBSAGIABBA3FBnARqERwACxoAIAEgAiADIAQgBSAGIABBP3FBoARqERIACxwAIAEgAiADIAQgBSAGIAcgAEEHcUHgBGoRHQALHgAgASACIAMgBCAFIAYgByAIIABBD3FB6ARqEQcACw4AIABBA3FBgAVqERQACxEAIAEgAEH/A3FBhAVqEQMACxIAIAEgAiAAQQ9xQYQJahEMAAsUACABIAIgAyAAQQNxQZQJahERAAsTACABIAIgAEH/AHFBmAlqEQQACxQAIAEgAiADIABBD3FBmApqEQ4ACxYAIAEgAiADIAQgAEEBcUGoCmoRHwALFAAgASACIAMgAEEfcUGqCmoRCwALFgAgASACIAMgBCAAQR9xQcoKahEKAAsYACABIAIgAyAEIAUgAEEDcUHqCmoRFgALGgAgASACIAMgBCAFIAYgAEEHcUHuCmoRFQALDwBBABAARAAAAAAAAAAACw8AQQEQAEQAAAAAAAAAAAsPAEECEABEAAAAAAAAAAALDwBBAxAARAAAAAAAAAAACwgAQQQQAEEACwgAQQUQAEEACwgAQQYQAEEACwgAQQcQAEEACwgAQQgQAEEACwgAQQkQAEEACwgAQQoQAEEACwgAQQsQAEEACwgAQQwQAEEACwgAQQ0QAEEACwgAQQ4QAEEACwgAQQ8QAEEACwgAQRAQAEEACwgAQREQAEEACwgAQRIQAEEACwgAQRMQAEEACwYAQRQQAAsGAEEVEAALBgBBFhAACwYAQRcQAAsGAEEYEAALBgBBGRAACwYAQRoQAAsGAEEbEAALBgBBHBAACwYAQR0QAAsGAEEeEAALBgBBHxAACyAAIAEgAiADIAQgBa0gBq1CIIaEIABBB3FB+ARqER4ACyAAIAEgAiADrSAErUIghoQgBSAGIABBB3FB9gpqEQIACwurkgKqAQBBgAgLQoBAAACITQAAiE0AAIhNAAAwTQAAkEAAAPA9AADwPQAAoEAAAIhNAACITQAAiE0AAKBAAACITQAAiE0AAIhNAADgPQBB0AgLMsBAAACITQAAiE0AAIhNAADgQAAA8D0AAPA9AADwPQAAuEEAAPA9AADwPQAA8D0AADBNAEGQCQukASBNAACgQgAAiE0AAOA9AACoQwAAiE0AAIhNAACITQAAyEMAAIhNAACITQAAiE0AACBNAAAgRAAAeE0AAEBEAAAwTQAA6EMAAHhNAABARAAAIE0AAJBEAAB4TQAAQD4AADBNAAB4RAAAeE0AAEA+AAAgTQAAyEQAAHhNAADwPQAAME0AAEBEAAB4TQAA8D0AAN4SBJUAAAAA////////////////AEHACgvMAQIAAMADAADABAAAwAUAAMAGAADABwAAwAgAAMAJAADACgAAwAsAAMAMAADADQAAwA4AAMAPAADAEAAAwBEAAMASAADAEwAAwBQAAMAVAADAFgAAwBcAAMAYAADAGQAAwBoAAMAbAADAHAAAwB0AAMAeAADAHwAAwAAAALMBAADDAgAAwwMAAMMEAADDBQAAwwYAAMMHAADDCAAAwwkAAMMKAADDCwAAwwwAAMMNAADTDgAAww8AAMMAAAy7AQAMwwIADMMDAAzDBAAM0wBBlBAL+QMBAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAA9AAAAPgAAAD8AAABAAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAdAAAAHUAAAB2AAAAdwAAAHgAAAB5AAAAegAAAHsAAAB8AAAAfQAAAH4AAAB/AEGQGAuABBIRExQVFhcYGRobHB0eHyAhESIjJBElJicoKSorLBEtLi8QEDAQEBAQEBAQMTIzEDQ1EBARERERERERERERERERERERERERERERERERNhERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERETcREREROBE5Ojs8PT4RERERERERERERERERERERERERERERERERERERERERERERERERERERERERPxAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBFAQRFCQ0RFRkdISRAQEEpLTE1OEBAQT1AQEBAQURAQEBAQEBAQEBEREVJTEBAQEBAQEBAQEBARERERVBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBERVRAQEBBWEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFcQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFhZWlsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQXBAQEBAQEBAQEBAQEBAQEBAQAEGwHAsg//////////////////////////////////////////8AQdgcCzb+//8H/v//BwAAAAAABCAE//9/////f//////////////////////////////////D/wMAH1AAQZgdC6QBIAAAAAAA3zxA1///+////////////7///////////////////////wP8/////////////////////////wD+////fwL+/////wAAAAAA/7+2AP///wcHAAAA/wf//////////v/D////////////////7x/+4f+fAAD///////8A4P///////////////wMA//////8HMAT////8/x8AAP///wEAQcQeC+QB/R8AAAAAAADwA/9//////////+//3+H/z//+/u6f+f///cXjn1mAsM//AwDuh/n///1tw4cZAl7A/z8A7r/7///97eO/GwEAz/8AAO6f+f///e3jnxnAsM//AgDsxz3WGMf/w8cdgQDA/wAA7t/9///97+PfHWADz/8AAOzf/f///e/j3x1gQM//BgDs3/3/////599dgADP/wD87P9//P//+y9/gF//AAAMAP7/////f/8HPyD/AwAAAACWJfD+ruz/O18g//MAAAAAAQAAAP8DAAD//v///x/+/wP///7///8fAEGwIAuVAv///////3/5/wP//+fB//9/QP8z/////78g///////3////////////PX89//////89/////z1/Pf9//////////z3//////////4cAAAAA//8AAP////////////8fAP7//////////////////////////////////////////////////////////5////7//wf////////////HAQD/3w8A//8PAP//DwD/3w0A////////z///AYAQ/wMAAAAA/wP//////////////wD//////wf//////////z8A////H/8P/wHA/////z8fAP//////D////wP/AwAAAAD///8P/////////3/+/x8A/wP/A4AAQdAiCzD////////v/+8P/wMAAAAA///////z////////v/8DAP///////z8A/+P//////z8AQY0jCxvebwD///////////////////////////////8AQbAjCyD//z8//////z8//6r///8/////////31/cH88P/x/cHwBB3iMLBgKAAAD/HwBB8CMLEoT8Lz5Qvf/z4EMAAP//////AQBBpiQLUMD///////8DAAD//////3///////3//////////////////////H3gMAP////+/IP////////+AAAD//38Af39/f39/f3//////AAAAAACAAEGQJQtX4AAAAP4DPh/+////////////f+D+//////////////fg/////z/+/////////////38AAP///wcAAAAAAAD///////////////////////////////8/AEHwJQsy/////////////////////////////////x8AAAAAAAD//////////////////////x8AQaomCzz//////z//H////w8AAP//////f/CP////gP////////////8AAAAAgP/8////////////////eQ8A/wcAQe8mC2f/u/f///8AAAD///////8PAP//////////DwD/AwAA/Aj//////wf/////BwD///8f////////9/8AgP8DAAAAAP///////38A/z//A///fwT/////////fwUAADj//zwAfn5+AH9/AEHoJwuIAf//////B/8D//////////////////////////8PAP//f/j//////w//////////////////P/////////////////8DAAAAAH8A+OD//X9f2/////////////////8DAAAA+P///////////////z8AAP///////////P///////wAAAAAA/w8AQf4oC1Lf/////////////////////x8AAP8D/v//B/7//wfA/////////////3/8/PwcAAAAAP/v//9///+3/z//PwAAAAD///////////////////8HAEHYKQsH////////HwBBgCoLRv///x////////8BAAAAAAD///9/AAD///8HAAAAAAAA////P/////8P/z4AAAAAAP////////////////////////8//wMAQdAqCws//f////+/kf//PwBB8CoLCP//PwD///8DAEGAKwsI/////////8AAQZArCxBv8O/+//8PAAAAAAD///8fAEGwKwsP////////PwD//z8A//8HAEHQKwsK////////////AQBB8CsLKP//////////PwAAAMD/AAD8////////AQAA////Af8D////////x/8AQaAsCwz//////////x4A/wMAQcAsCx7///////8/AP8DAAAAAAAA/////////////////38AQfAsCw3///////////////8HAEGQLQsG//////9/AEGwLQsI/////////wEAQdAtCxT//////////x8A//////9/AAD4/wBB8C0LAQMAQZAuC5gB/////////////9///////////99k3v/r7/////////+/59/f////e1/8/f//////////////////////////////////////////////////////P/////3///f////3///f////3///f////3/////9/////f//98/////////v////lv73CoTqlqqW9/de//v/D+77/w8AQbAvC1IgAAAACQAAAAoAAAANAAAACwAAAAwAAACFAAAAACAAAAEgAAACIAAAAyAAAAQgAAAFIAAABiAAAAggAAAJIAAACiAAACggAAApIAAAXyAAAAAwAEGQMAv0AUEAIBrAACAfAAEBLzIBAQU5AQEPSgEBLXkBAQVwAwEDkQMgEaMDIAkABFAQEAQgIGAEASGKBAE1wQQBDdAEAT8UBQETMQUwJqABAQWz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//////9/H/zxf/9/AAD///8DAAD/////AQB7A9DBr0IADB+8//8AAAAAAAL//////////////////////////////////////////////////////////w8A/////38AAAD/BwAA/////////////z8AAAAAAAD8///+/////////////////////////////////////////////////////x//AwBB/MIACwTghwP+AEGOwwALAgGAAEGgwwALCP//////f/8PAEGwwwALOP////v/////////////DwD//////////////////////////////////z8AAAD/Dx7///8B/MHgAEHzwwALAh4BAEH/wwALAQgAQZLEAAsu//8AAAAA/////w8AAAD///9/////////////////////////////////////fwBB2MQACwj//////////wBB8sQACxD///////9/AAAAAAAAwADgAEGNxQALA4APcABBnsUACwf/AP//fwADAEGxxQALAQYAQcDFAAsPRAgAAAAP/wMAAAAAAADwAEHYxQALFBDAAAD//wMHAAAAAAD4AAAAAAiAAEH2xQALBggA/z8AwABBi8YACxTwAACACwAAAAAAAACAAgAAwAAAQwBBvcYACwQ4AAABAEH/xgALB4AAAAAAAAIAQZbHAAsD/P8DAEGnxwALAcAAQb/HAAsPMP///wN/AP/////3/38PAEHfxwALDoD+/wD8AQAA+AEAAPg/AEH8xwALKX9/ADCH//////+P/wAAAAAAAOD//wf/DwAAAAAAAP//////PwAAAAAPAEGzyAALCIAAAAAAAAABAEHKyAALAoD/AEHiyAALBsCPAAAAgABBh8kACwmH/wD/AQAAAOAAQafJAAsJ/gAAAP8AAAD/AEHMyQALBP///38AQejJAAsRwD/8/z8AAAADAAAAAAAA/gMAQYbKAAsDGAAPAEGYygALAuEBAEG2ygALAcAAQc7KAAsBDwBB8coACwKABwBBgMsAC0n///////////////////////////////////////8/AP////9//v///////////////////////////z8AAAAA//////////8/AEHgywALD/////////////9/AP//AwBBmMwACyECAAAIAAAACAAAIAAAACAAAIAAAACAAAAAAgAAAAIAAAgAQd7MAAs2AwD//////w////////////////8PAP9//n/+//7/AAAAAP8H////f/////////8P//////8HAEGczQALD8D///8HAP//////B/8BAwBBwM0AC03/////AQC///////////8f//8PAP/////fBwAA//8BAP////////9//f////////////////////////////8e/////////z8PAP///wBBn84ACzD4///////////h/wAAAAAAAP//////////PwAAAAAAAAD//////////////////w8AQeDQAAv/AQIAAgACAAIAAgACAAIAAgACAAMgAiACIAIgAiACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgABYATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwAjYCNgI2AjYCNgI2AjYCNgI2AjYBMAEwATABMAEwATABMAI1QjVCNUI1QjVCNUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFBMAEwATABMAEwATACNYI1gjWCNYI1gjWCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgTABMAEwATAAgBB5NgAC/kDAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAAB7AAAAfAAAAH0AAAB+AAAAfwBB4OAAC6ECCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QX/////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBBkOMACxgRAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAQbDjAAshEQAPChEREQMKBwABEwkLCwAACQYLAAALAAYRAAAAERERAEHh4wALAQsAQerjAAsYEQAKChEREQAKAAACAAkLAAAACQALAAALAEGb5AALAQwAQafkAAsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEHV5AALAQ4AQeHkAAsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGP5QALARAAQZvlAAseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHS5QALDhIAAAASEhIAAAAAAAAJAEGD5gALAQsAQY/mAAsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEG95gALAQwAQcnmAAt+DAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AEHQ5wAL1w5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgAAAAAAAExDX0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUA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MFcAQeSuAQsFaFcAAAUAQfSuAQsBCwBBjK8BCwoKAAAACwAAANe3AEGkrwELAQIAQbOvAQsF//////8AQeSvAQsF6FcAAAkAQfSvAQsBCwBBiLABCxIMAAAAAAAAAAsAAAD4ngAAAAQAQbSwAQsE/////wBB5LABCwVoWAAABQBB9LABCwELAEGMsQELDg0AAAALAAAACKMAAAAEAEGksQELAQEAQbOxAQsFCv////8AQeSxAQsGaFgAABAIAEGoswELAtCvAEHgswELEGAoAABgLAAAX3CJAP8JLw8AQZS0AQsBDgBBu7QBCwX//////wBB7LQBC6kCDosAANe3AADXtwAA17cAANe3AADXtwAA17cAANe3AADXtwAA17cAAH9/f39/f39/f39/f39/AAAAAAAAqEUAAHEAAAByAAAAAAAAAMBFAABzAAAAdAAAAAEAAAABAAAAAwAAAAgAAAABAAAAAgAAAAIAAAAMAAAABAAAAAUAAAADAAAABgAAAAAAAADIRQAAdQAAAHYAAAAZAAAADwAAAAQAAAAJAAAADQAAAA4AAAAQAAAADwAAABAAAAAHAAAAEQAAAAgAAAAIAAAAAAAAANBFAAAeAAAAHwAAAPj////4////0EUAACAAAAAhAAAAQFsAAFRbAAAIAAAAAAAAAOhFAAB3AAAAeAAAAPj////4////6EUAAHkAAAB6AAAAcFsAAIRbAAAEAEGdtwEL4A5GAAAHAAAACAAAAPz////8////AEYAAAkAAAAKAAAAoFsAALRbAAAEAAAAAAAAABhGAAB7AAAAfAAAAPz////8////GEYAAH0AAAB+AAAA0FsAAORbAAAAAAAAMEYAAHUAAAB/AAAAGgAAAA8AAAAEAAAACQAAABEAAAAOAAAAEAAAAA8AAAAQAAAABwAAABIAAAAJAAAAAAAAAEBGAABzAAAAgAAAABsAAAABAAAAAwAAAAgAAAASAAAAAgAAAAIAAAAMAAAABAAAAAUAAAATAAAACgAAAAAAAABQRgAAdQAAAIEAAAAcAAAADwAAAAQAAAAJAAAADQAAAA4AAAAQAAAAEwAAABQAAAALAAAAEQAAAAgAAAAAAAAAYEYAAHMAAACCAAAAHQAAAAEAAAADAAAACAAAAAEAAAACAAAAAgAAABUAAAAWAAAADAAAAAMAAAAGAAAAAAAA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RVJST1IhOiBwMT0AIGFuZCAKAHBvaW50LmNwcDogeHlEaXN0YW5jZVRvTGluZSBFUlJPUiE6IHAyPQBwb2ludC5jcHA6IHh5RGlzdGFuY2VUb0xpbmUgRVJST1IhOiBpbiB0aGUgeHktcGxhbmUKAHBvaW50LmNwcDogeHlDbG9zZXN0UG9pbnQgRVJST1IhOiBjYW4ndCBjYWxjdWxhdGUgY2xvc2VzdCBwb2ludCBmcm9tIAoAcG9pbnQuY3BwOiB4eUNsb3Nlc3RQb2ludCBFUlJPUiE6ICp0aGlzID0AcG9pbnQuY3BwOiB4eUNsb3Nlc3RQb2ludCBFUlJPUiE6IHAxPQBwb2ludC5jcHA6IHh5Q2xvc2VzdFBvaW50IEVSUk9SITogcDI9AHBvaW50LmNwcDogeHlDbG9zZXN0UG9pbnQgRVJST1IhOiBpbiB0aGUgeHktcGxhbmUKAE4zb2NsOVNUTFJlYWRlckUAcmIAYWFhYWEAc29saWQAdmVydGUAZmFjZXQAZW5kZmEATlN0M19fMjE5YmFzaWNfaXN0cmluZ3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAE5TdDNfXzIxM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjE0YmFzaWNfaWZzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUATjNvY2w4VHJpYW5nbGVFAHRyaWFuZ2xlLmNwcDogenNsaWNlX3ZlcnRzKCkgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHotc2xpY2UKACB0cmlhbmdsZT0AVDogAG49ACB6Y3V0PQAgYWJvdmUgcG9pbnRzOgoAICAgACBiZWxvdyBwb2ludHM6CgBCYWxsQ3V0dGVyKGQ9ACwgcj0ATjNvY2wxMEJhbGxDdXR0ZXJFAFdBUk5JTkc6IEJ1bGxDdXR0ZXI6OnNpbmdsZUVkZ2VEcm9wQ2Fub25pY2FsKCkgaXRlcnM+MjAwICEhCgBCdWxsQ3V0dGVyKGQ9ACwgcjE9ACByMj0ATjNvY2wxMEJ1bGxDdXR0ZXJFAE4zb2NsOEludGVydmFsRQBOM29jbDVGaWJlckUAQ29tcG9zaXRlQ3V0dGVyIHdpdGggACBjdXR0ZXJzOgoAIAA6ACAgcmFkaXVzWwBdPQAgIGhlaWdodFsAICB6b2Zmc2V0WwAgRVJST1I6IG5vdCBpbXBsZW1lbnRlZC4KAE4zb2NsMTVDb21wb3NpdGVDdXR0ZXJFAE4zb2NsMTRCYWxsQ29uZUN1dHRlckUAQ29uZUN1dHRlciAoZD0ALCBhbmdsZT0ATjNvY2wxMENvbmVDdXR0ZXJFAE1pbGxpbmdDdXR0ZXI6OmZhY2V0UHVzaCgpIHR2YWw9IAAgZXJyb3IhPwoAIHRyaWFuZ2xlOiAAIGZpYmVyOiAAIChtb3N0IHByb2JhYmx5IGEgdXNlciBlcnJvciwgdGhlIGZpYmVyIGlzIHRvbyBzaG9ydCBjb21wYXJlZCB0byB0aGUgU1RMIG1vZGVsPykKAE4zb2NsMTNNaWxsaW5nQ3V0dGVyRQBDeWxDdXR0ZXIgKGQ9ACwgTD0ATjNvY2w5Q3lsQ3V0dGVyRQBOM29jbDdFbGxpcHNlRQBOM29jbDE0QWxpZ25lZEVsbGlwc2VFAEVsbGlwc2U6OmZpbmRfRWxsaXBzZVBvc2l0aW9uMiBjYW5ub3QgZmluZCBFbGxpcHNlUG9zaXRpb24yISAKAGVsbGlwc2U9IABFbGxpcHNlOiBjZW49ACBhPQAgYj0AIG9mcz0AMXN0OiAocywgdCk9IAAgb2VQb2ludCgpPSAAIGU9ADJuZDogKHMsIHQpPSAAIGJyZW50X3plcm8oKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGludGVydmFsIFthLGJdICEKACgAICwAKQBkcm9wQ3V0dGVyU1RMNSAAIGNsLXBvaW50cyBhbmQgACB0cmlhbmdsZXMuCgAKIAAgZHJvcEN1dHRlcigpIGNhbGxzLgoAMCUgICAxMCAgIDIwICAgMzAgICA0MCAgIDUwICAgNjAgICA3MCAgIDgwICAgOTAgICAxMDAlCgB8LS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwAYmRjOjpzZXRTVEwoKQoAYmRjOjpzZXRTVEwoKSBkb25lLgoARVJST1I6IEtEVHJlZTo6YnVpbGRfbm9kZSgpIGNhbGxlZCB3aXRoIHRyaXMtPnNpemUoKT09MCAhIAoATjNvY2w2S0ROb2RlSU5TXzhUcmlhbmdsZUVFRQAgRVJST1IsIEtEVHJlZTo6Y2FsY19zcHJlYWQoKSBjYWxsZWQgd2l0aCB0cmlzLT5zaXplKCk9PTAgISAKAE4zb2NsOU9wZXJhdGlvbkUATjNvY2wxNUJhdGNoRHJvcEN1dHRlckUATjNvY2w2S0RUcmVlSU5TXzhUcmlhbmdsZUVFRQBFUlJPUjogY2FuJ3QgY2FsbCBydW4oKSBvbiBQb2ludERyb3BDdXR0ZXIoKQoATjNvY2wxNVBvaW50RHJvcEN1dHRlckUATjNvY2wxNFBhdGhEcm9wQ3V0dGVyRQBOM29jbDIyQWRhcHRpdmVQYXRoRHJvcEN1dHRlckUARVJST1I6IHNldFhEaXJlY3Rpb24oKSBvciBzZXRZRGlyZWN0aW9uKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHNldFNUTCgpIAoATjNvY2wxNUJhdGNoUHVzaEN1dHRlckUAQlBDOjpzZXRTVEwoKSBCdWlsZGluZyBrZC10cmVlLi4uIGJ1Y2tldFNpemU9AC4uACBFUlJPUjogc2V0WERpcmVjdGlvbigpIG9yIHNldFlEaXJlY3Rpb24oKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc2V0U1RMKCkgCgBCUEM6OnNldFNUTCgpIHJvb3QtPmJ1aWxkKCkATjNvY2wxNUZpYmVyUHVzaEN1dHRlckUASSBbACBdACBmaWJlciBkaXI9ACBhbmQgACBpbnRlcnZhbHMKACBmaWJlci5wMT0AIGZpYmVyLnAyIABOM29jbDV3ZWF2ZTVXZWF2ZUUATjNvY2w5V2F0ZXJsaW5lRQAgWEZpYmVyIGFkYXB0aXZlIHNhbXBsZSAKACBZRmliZXIgYWRhcHRpdmUgc2FtcGxlIAoAfkFkYXB0aXZlV2F0ZXJsaW5lKCk6IHN1Yk9wLnNpemUoKT0gAE4zb2NsMTdBZGFwdGl2ZVdhdGVybGluZUUATjNvY2w1d2VhdmUxMVNpbXBsZVdlYXZlRQAgU2ltcGxlV2VhdmU6OmJ1aWxkKCkuLi4gCgAgU21hcnRXZWF2ZTo6YnVpbGQoKSBhZGRfYWxsX2VkZ2VzKCkuLi4gACBkb25lLgoAVGhlcmUgYXJlIAAgdmVydGljZXMuCgBOM29jbDV3ZWF2ZTEwU21hcnRXZWF2ZUUAbnVtZXJpYzo6eHlWZWN0b3JUb0RpYW5nbGUoKSBlcnJvciAoeCx5KT0gKAAgLCAAICkgYW5kIGRpYW5nbGU9AAoATjNvY2w4Q0xGaWx0ZXJFAE4zb2NsMTJMaW5lQ0xGaWx0ZXJFAGlpAHYAUG9pbnQAdmkAaWlkZGQAaWlkZABpaWkAbm9ybQBkaWkAeHlOb3JtAG5vcm1hbGl6ZQB2aWkAZG90AGRpaWkAY3Jvc3MAaWlpaQB4Um90YXRlAHZpaWQAeVJvdGF0ZQB6Um90YXRlAGlzUmlnaHQAaWlpaWkAeHlEaXN0YW5jZQBfX3N0cl9fAHgAeQB6AENMUG9pbnQAaWlkZGRpAGNjAGdldENDAENDUG9pbnQAVHJpYW5nbGUAQ0NUeXBlAE5PTkUAVkVSVEVYAFZFUlRFWF9DWUwARURHRQBFREdFX1NIQUZUAEVER0VfSE9SSVoARURHRV9DWUwARURHRV9CQUxMAEVER0VfQ09ORQBFREdFX0NPTkVfQkFTRQBFREdFX0hPUklaX0NZTABFREdFX0hPUklaX1RPUgBFREdFX1BPUwBFREdFX05FRwBGQUNFVABGQUNFVF9USVAARkFDRVRfQ1lMAEVSUk9SAFNUTFJlYWRlcgBTVExTdXJmAGFkZFRyaWFuZ2xlAHZpaWkAc2l6ZQBCYm94AGlzSW5zaWRlAG1heHB0AG1pbnB0AEVsbGlwc2VQb3NpdGlvbgBzAHQAc2V0RGlhbmdsZQBMaW5lAHAxAHAyAEFyYwBpaWlpaWkAYwBkaXIAU3BhblR5cGUATGluZVNwYW5UeXBlAEFyY1NwYW5UeXBlAFBhdGgAYXBwZW5kTGluZQBhcHBlbmRBcmMAT3BlcmF0aW9uAHNldEN1dHRlcgBnZXRDTFBvaW50cwBzZXRTVEwAc2V0U2FtcGxpbmcAQmF0Y2hEcm9wQ3V0dGVyAHJ1bgBQYXRoRHJvcEN1dHRlcgBzZXRQYXRoAGdldFoAc2V0WgBnZXRQb2ludHMAQWRhcHRpdmVQYXRoRHJvcEN1dHRlcgBzZXRNaW5TYW1wbGluZwBzZXRDb3NMaW1pdABCYXRjaFB1c2hDdXR0ZXIASW50ZXJ2YWwAdXBwZXIAbG93ZXIAbG93ZXJfY2MAdXBwZXJfY2MAdXBkYXRlVXBwZXIAdmlpZGkAdXBkYXRlTG93ZXIAZW1wdHkARmliZXIAc3RkOjp2ZWN0b3I8UG9pbnQ+AHN0ZDo6dmVjdG9yPENMUG9pbnQ+AHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFBvaW50Pj4AV2F0ZXJsaW5lAGdldExvb3BzAEFkYXB0aXZlV2F0ZXJsaW5lAFdlYXZlVmVydGV4VHlwZQBDTABDTF9ET05FAEFESgBUV09BREoASU5UAEZVTExJTlQATGluZUNMRmlsdGVyAE1pbGxpbmdDdXR0ZXIAQ3lsQ3V0dGVyAEJhbGxDdXR0ZXIAQnVsbEN1dHRlcgBDb25lQ3V0dGVyAFBLTjNvY2wxMENvbmVDdXR0ZXJFAFBOM29jbDEwQ29uZUN1dHRlckUAUEtOM29jbDEwQnVsbEN1dHRlckUAUE4zb2NsMTBCdWxsQ3V0dGVyRQBQS04zb2NsMTBCYWxsQ3V0dGVyRQBQTjNvY2wxMEJhbGxDdXR0ZXJFAFBLTjNvY2w5Q3lsQ3V0dGVyRQBQTjNvY2w5Q3lsQ3V0dGVyRQBQS04zb2NsMTNNaWxsaW5nQ3V0dGVyRQBQTjNvY2wxM01pbGxpbmdDdXR0ZXJFAFBLTjNvY2wxMkxpbmVDTEZpbHRlckUAUE4zb2NsMTJMaW5lQ0xGaWx0ZXJFAE4zb2NsNXdlYXZlMTBWZXJ0ZXhUeXBlRQBQS04zb2NsMTdBZGFwdGl2ZVdhdGVybGluZUUAUE4zb2NsMTdBZGFwdGl2ZVdhdGVybGluZUUATlN0M19fMjZ2ZWN0b3JJTlMwX0lOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUVOUzNfSVM1X0VFRUUATlN0M19fMjEzX192ZWN0b3JfYmFzZUlOU182dmVjdG9ySU4zb2NsNVBvaW50RU5TXzlhbGxvY2F0b3JJUzNfRUVFRU5TNF9JUzZfRUVFRQBOU3QzX18yMjBfX3ZlY3Rvcl9iYXNlX2NvbW1vbklMYjFFRUUAUEtOM29jbDlXYXRlcmxpbmVFAFBOM29jbDlXYXRlcmxpbmVFAHB1c2hfYmFjawByZXNpemUAdmlpaWkAZ2V0AHNldABOU3QzX18yNnZlY3RvcklOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATlN0M19fMjEzX192ZWN0b3JfYmFzZUlOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATjEwZW1zY3JpcHRlbjN2YWxFAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAUEtOU3QzX18yNnZlY3RvcklOUzBfSU4zb2NsNVBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRU5TM19JUzVfRUVFRQBQTlN0M19fMjZ2ZWN0b3JJTlMwX0lOM29jbDVQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUVOUzNfSVM1X0VFRUUAUEtOU3QzX18yNnZlY3RvcklOM29jbDdDTFBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBQTlN0M19fMjZ2ZWN0b3JJTjNvY2w3Q0xQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATlN0M19fMjZ2ZWN0b3JJTjNvY2w3Q0xQb2ludEVOU185YWxsb2NhdG9ySVMyX0VFRUUATlN0M19fMjEzX192ZWN0b3JfYmFzZUlOM29jbDdDTFBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBQS05TdDNfXzI2dmVjdG9ySU4zb2NsNVBvaW50RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBQTlN0M19fMjZ2ZWN0b3JJTjNvY2w1UG9pbnRFTlNfOWFsbG9jYXRvcklTMl9FRUVFAFBLTjNvY2w1RmliZXJFAFBOM29jbDVGaWJlckUATlN0M19fMjEyYmFzaWNfc3RyaW5nSWNOU18xMWNoYXJfdHJhaXRzSWNFRU5TXzlhbGxvY2F0b3JJY0VFRUUATlN0M19fMjIxX19iYXNpY19zdHJpbmdfY29tbW9uSUxiMUVFRQBQS04zb2NsOEludGVydmFsRQBQTjNvY2w4SW50ZXJ2YWxFAFBLTjNvY2wxNUJhdGNoUHVzaEN1dHRlckUAUE4zb2NsMTVCYXRjaFB1c2hDdXR0ZXJFAFBLTjNvY2wyMkFkYXB0aXZlUGF0aERyb3BDdXR0ZXJFAFBOM29jbDIyQWRhcHRpdmVQYXRoRHJvcEN1dHRlckUAUEtOM29jbDE0UGF0aERyb3BDdXR0ZXJFAFBOM29jbDE0UGF0aERyb3BDdXR0ZXJFAFBLTjNvY2wxNUJhdGNoRHJvcEN1dHRlckUAUE4zb2NsMTVCYXRjaERyb3BDdXR0ZXJFAFBLTjNvY2w5T3BlcmF0aW9uRQBQTjNvY2w5T3BlcmF0aW9uRQBQS04zb2NsNFBhdGhFAFBOM29jbDRQYXRoRQBOM29jbDhTcGFuVHlwZUUAUEtOM29jbDNBcmNFAFBOM29jbDNBcmNFAFBLTjNvY2w0TGluZUUAUE4zb2NsNExpbmVFAFBLTjNvY2wxNUVsbGlwc2VQb3NpdGlvbkUAUE4zb2NsMTVFbGxpcHNlUG9zaXRpb25FAE4zb2NsMTVFbGxpcHNlUG9zaXRpb25FAFBLTjNvY2w0QmJveEUAUE4zb2NsNEJib3hFAFBLTjNvY2w3U1RMU3VyZkUAUE4zb2NsN1NUTFN1cmZFAE4zb2NsN1NUTFN1cmZFAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVOU185YWxsb2NhdG9ySXdFRUVFAFBLTjNvY2w5U1RMUmVhZGVyRQBQTjNvY2w5U1RMUmVhZGVyRQBOM29jbDZDQ1R5cGVFAFBLTjNvY2w4VHJpYW5nbGVFAFBOM29jbDhUcmlhbmdsZUUAUEtOM29jbDdDQ1BvaW50RQBQTjNvY2w3Q0NQb2ludEUAUEtOM29jbDdDTFBvaW50RQBQTjNvY2w3Q0xQb2ludEUAUEtOM29jbDVQb2ludEUAUE4zb2NsNVBvaW50RQB2b2lkAGJvb2wAY2hhcgBzaWduZWQgY2hhcgB1bnNpZ25lZCBjaGFyAHNob3J0AHVuc2lnbmVkIHNob3J0AGludAB1bnNpZ25lZCBpbnQAbG9uZwB1bnNpZ25lZCBsb25nAGZsb2F0AGRvdWJsZQBzdGQ6OnN0cmluZwBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBzdGQ6OndzdHJpbmcAZW1zY3JpcHRlbjo6dmFsAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZmxvYXQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGRvdWJsZT4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZyBkb3VibGU+AE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWVFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lkRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJZkVFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SW1FRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lsRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJakVFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWlFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0l0RUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJc0VFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWhFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lhRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJY0VFAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0loTlNfMTFjaGFyX3RyYWl0c0loRUVOU185YWxsb2NhdG9ySWhFRUVFAHJ3YQBpbmZpbml0eQAAAQIEBwMGBQAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAG5hbgBOQU4ALgBMQ19BTEwATEFORwBDLlVURi04AFBPU0lYAE1VU0xfTE9DUEFUSABOU3QzX18yOGlvc19iYXNlRQBOU3QzX18yOWJhc2ljX2lvc0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQBOU3QzX18yOWJhc2ljX2lvc0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRQBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjE1YmFzaWNfc3RyZWFtYnVmSXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFAE5TdDNfXzIxM2Jhc2ljX2lzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjEzYmFzaWNfaXN0cmVhbUl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRQBOU3QzX18yMTNiYXNpY19vc3RyZWFtSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAE5TdDNfXzIxM2Jhc2ljX29zdHJlYW1Jd05TXzExY2hhcl90cmFpdHNJd0VFRUUATlN0M19fMjExX19zdGRvdXRidWZJd0VFAE5TdDNfXzIxMV9fc3Rkb3V0YnVmSWNFRQB1bnN1cHBvcnRlZCBsb2NhbGUgZm9yIHN0YW5kYXJkIGlucHV0AE5TdDNfXzIxMF9fc3RkaW5idWZJd0VFAE5TdDNfXzIxMF9fc3RkaW5idWZJY0VFAE5TdDNfXzI3Y29sbGF0ZUljRUUATlN0M19fMjZsb2NhbGU1ZmFjZXRFAE5TdDNfXzI3Y29sbGF0ZUl3RUUAJXAAQwBOU3QzX18yN251bV9nZXRJY05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzI5X19udW1fZ2V0SWNFRQBOU3QzX18yMTRfX251bV9nZXRfYmFzZUUATlN0M19fMjdudW1fZ2V0SXdOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJd05TXzExY2hhcl90cmFpdHNJd0VFRUVFRQBOU3QzX18yOV9fbnVtX2dldEl3RUUAJXAAAAAATABsbAAlAAAAAABsAE5TdDNfXzI3bnVtX3B1dEljTlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjlfX251bV9wdXRJY0VFAE5TdDNfXzIxNF9fbnVtX3B1dF9iYXNlRQBOU3QzX18yN251bV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzI5X19udW1fcHV0SXdFRQAlSDolTTolUwAlbS8lZC8leQAlSTolTTolUyAlcAAlYSAlYiAlZCAlSDolTTolUyAlWQBBTQBQTQBKYW51YXJ5AEZlYnJ1YXJ5AE1hcmNoAEFwcmlsAE1heQBKdW5lAEp1bHkAQXVndXN0AFNlcHRlbWJlcgBPY3RvYmVyAE5vdmVtYmVyAERlY2VtYmVyAEphbgBGZWIATWFyAEFwcgBKdW4ASnVsAEF1ZwBTZXAAT2N0AE5vdgBEZWMAU3VuZGF5AE1vbmRheQBUdWVzZGF5AFdlZG5lc2RheQBUaHVyc2RheQBGcmlkYXkAU2F0dXJkYXkAU3VuAE1vbgBUdWUAV2VkAFRodQBGcmkAU2F0ACVtLyVkLyV5JVktJW0tJWQlSTolTTolUyAlcCVIOiVNJUg6JU06JVMlSDolTTolU05TdDNfXzI4dGltZV9nZXRJY05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzIyMF9fdGltZV9nZXRfY19zdG9yYWdlSWNFRQBOU3QzX18yOXRpbWVfYmFzZUUATlN0M19fMjh0aW1lX2dldEl3TlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFRUUATlN0M19fMjIwX190aW1lX2dldF9jX3N0b3JhZ2VJd0VFAE5TdDNfXzIxNXRpbWVfZ2V0X2J5bmFtZUljTlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjE4X190aW1lX2dldF9zdG9yYWdlSWNFRQBOU3QzX18yMTBfX3RpbWVfZ2V0RQBOU3QzX18yMTV0aW1lX2dldF9ieW5hbWVJd05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxOF9fdGltZV9nZXRfc3RvcmFnZUl3RUUATlN0M19fMjh0aW1lX3B1dEljTlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjEwX190aW1lX3B1dEUATlN0M19fMjh0aW1lX3B1dEl3TlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFRUUATlN0M19fMjE1dGltZV9wdXRfYnluYW1lSWNOU18xOW9zdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yMTV0aW1lX3B1dF9ieW5hbWVJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMG1vbmV5cHVuY3RJY0xiMEVFRQBOU3QzX18yMTBtb25leV9iYXNlRQBOU3QzX18yMTBtb25leXB1bmN0SWNMYjFFRUUATlN0M19fMjEwbW9uZXlwdW5jdEl3TGIwRUVFAE5TdDNfXzIxMG1vbmV5cHVuY3RJd0xiMUVFRQBOU3QzX18yMTdtb25leXB1bmN0X2J5bmFtZUljTGIwRUVFAE5TdDNfXzIxN21vbmV5cHVuY3RfYnluYW1lSWNMYjFFRUUATlN0M19fMjE3bW9uZXlwdW5jdF9ieW5hbWVJd0xiMEVFRQBOU3QzX18yMTdtb25leXB1bmN0X2J5bmFtZUl3TGIxRUVFADAxMjM0NTY3ODkAJUxmAE5TdDNfXzI5bW9uZXlfZ2V0SWNOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yMTFfX21vbmV5X2dldEljRUUAMDEyMzQ1Njc4OQBOU3QzX18yOW1vbmV5X2dldEl3TlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFRUUATlN0M19fMjExX19tb25leV9nZXRJd0VFACUuMExmAE5TdDNfXzI5bW9uZXlfcHV0SWNOU18xOW9zdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yMTFfX21vbmV5X3B1dEljRUUATlN0M19fMjltb25leV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMV9fbW9uZXlfcHV0SXdFRQBOU3QzX18yOG1lc3NhZ2VzSWNFRQBOU3QzX18yMTNtZXNzYWdlc19iYXNlRQBOU3QzX18yMTdfX3dpZGVuX2Zyb21fdXRmOElMbTMyRUVFAE5TdDNfXzI3Y29kZWN2dElEaWMxMV9fbWJzdGF0ZV90RUUATlN0M19fMjEyY29kZWN2dF9iYXNlRQBOU3QzX18yMTZfX25hcnJvd190b191dGY4SUxtMzJFRUUATlN0M19fMjhtZXNzYWdlc0l3RUUATlN0M19fMjE1bWVzc2FnZXNfYnluYW1lSWNFRQBOU3QzX18yMTVtZXNzYWdlc19ieW5hbWVJd0VFAE5TdDNfXzIxNGNvZGVjdnRfYnluYW1lSWNjMTFfX21ic3RhdGVfdEVFAE5TdDNfXzI3Y29kZWN2dEljYzExX19tYnN0YXRlX3RFRQBOU3QzX18yN2NvZGVjdnRJd2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjE0Y29kZWN2dF9ieW5hbWVJd2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjE0Y29kZWN2dF9ieW5hbWVJRHNjMTFfX21ic3RhdGVfdEVFAE5TdDNfXzI3Y29kZWN2dElEc2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjE0Y29kZWN2dF9ieW5hbWVJRGljMTFfX21ic3RhdGVfdEVFAE5TdDNfXzI2bG9jYWxlNV9faW1wRQBOU3QzX18yMTRjb2xsYXRlX2J5bmFtZUljRUUATlN0M19fMjE0Y29sbGF0ZV9ieW5hbWVJd0VFAE5TdDNfXzI1Y3R5cGVJY0VFAE5TdDNfXzIxMGN0eXBlX2Jhc2VFAE5TdDNfXzIxMmN0eXBlX2J5bmFtZUljRUUATlN0M19fMjEyY3R5cGVfYnluYW1lSXdFRQBOU3QzX18yNWN0eXBlSXdFRQBmYWxzZQB0cnVlAE5TdDNfXzI4bnVtcHVuY3RJY0VFAE5TdDNfXzI4bnVtcHVuY3RJd0VFAE5TdDNfXzIxNW51bXB1bmN0X2J5bmFtZUljRUUATlN0M19fMjE1bnVtcHVuY3RfYnluYW1lSXdFRQAlQQAlYQAlQgAlYgBOU3QzX18yMTVfX3RpbWVfZ2V0X3RlbXBJY0VFAGN0eXBlX2J5bmFtZTxjaGFyPjo6Y3R5cGVfYnluYW1lIGZhaWxlZCB0byBjb25zdHJ1Y3QgZm9yIAB0aW1lX2dldF9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAE5TdDNfXzIxNV9fdGltZV9nZXRfdGVtcEl3RUUAY3R5cGVfYnluYW1lPHdjaGFyX3Q+OjpjdHlwZV9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAHRpbWVfcHV0X2J5bmFtZSBmYWlsZWQgdG8gY29uc3RydWN0IGZvciAAbW9uZXlwdW5jdF9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgACgpAGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD46OmNvZGVjdnRfYnluYW1lIGZhaWxlZCB0byBjb25zdHJ1Y3QgZm9yIABudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD46Om51bXB1bmN0X2J5bmFtZSBmYWlsZWQgdG8gY29uc3RydWN0IGZvciAAbnVtcHVuY3RfYnluYW1lPGNoYXI+OjpudW1wdW5jdF9ieW5hbWUgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+Ojpjb2xsYXRlX2J5bmFtZShzaXplX3QgcmVmcykgZmFpbGVkIHRvIGNvbnN0cnVjdCBmb3IgAGNvbGxhdGVfYnluYW1lPGNoYXI+Ojpjb2xsYXRlX2J5bmFtZSBmYWlsZWQgdG8gY29uc3RydWN0IGZvciAATlN0M19fMjE0X19zaGFyZWRfY291bnRFAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXM6ICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXMAdGVybWluYXRpbmcgd2l0aCAlcyBmb3JlaWduIGV4Y2VwdGlvbgB0ZXJtaW5hdGluZwB1bmNhdWdodABTdDlleGNlcHRpb24ATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAU3Q5dHlwZV9pbmZvAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAcHRocmVhZF9vbmNlIGZhaWx1cmUgaW4gX19jeGFfZ2V0X2dsb2JhbHNfZmFzdCgpAGNhbm5vdCBjcmVhdGUgcHRocmVhZCBrZXkgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAY2Fubm90IHplcm8gb3V0IHRocmVhZCB2YWx1ZSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQB0ZXJtaW5hdGVfaGFuZGxlciB1bmV4cGVjdGVkbHkgcmV0dXJuZWQAU3QxMWxvZ2ljX2Vycm9yAFN0MTJsZW5ndGhfZXJyb3IAc3RkOjpiYWRfY2FzdABTdDhiYWRfY2FzdABOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX3BiYXNlX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTIzX19mdW5kYW1lbnRhbF90eXBlX2luZm9FAHYARG4AYgBoAGEAaQBqAG0AZgBkAE4xMF9fY3h4YWJpdjExNl9fZW51bV90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0U=";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted.push(thrown);return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_uncaught_exception(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}function ___gxx_personality_v0(){}function ___lock(){}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function ___map_file(pathname,size){___setErrNo(1);return-1}var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={"1024":flags["O_APPEND"],"64":flags["O_CREAT"],"128":flags["O_EXCL"],"0":flags["O_RDONLY"],"2":flags["O_RDWR"],"4096":flags["O_SYNC"],"512":flags["O_TRUNC"],"1":flags["O_WRONLY"]}}),bufferFrom:(function(arrayBuffer){return Buffer.alloc?Buffer.from(arrayBuffer):new Buffer(arrayBuffer)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsForNode:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),write:(function(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(40)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(40)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 13}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 13}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 13}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return 13;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return 17}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return 20}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 16}}else{if(FS.isDir(node.mode)){return 21}}return 0}),mayOpen:(function(node,flags){if(!node){return 2}if(FS.isLink(node.mode)){return 40}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 21}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(24)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(29)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(16)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(16)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(20)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(22)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(22)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(1)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=UTF8ToString(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21509:case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21524:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___unlock(){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])}),destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}});clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function runDestructor(handle){var $$=handle.$$;if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}this.$$.count.value-=1;var toDelete=0===this.$$.count.value;if(toDelete){runDestructor(this)}if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=(function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)});proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register((function(){clonedHandle["delete"]()})));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return Object.create(prototype,{$$:{value:record}})}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}var destructors=[];var args=new Array(argCount);args[0]=rawConstructor;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>1])});case 2:return(function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])});default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":(function(c){return this.constructor.values[c]}),"toWireType":(function(destructors,c){return c.value}),"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,(function(){}))}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var endChar=HEAPU8[value+4+length];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAPU8[value+4+length]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0){var stringSegment=UTF8ToString(decodeStartPtr);if(str===undefined)str=stringSegment;else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}if(endCharSwap!=0)HEAPU8[value+4+length]=endCharSwap}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){Module["abort"]()}var ENV={};function _getenv(name){if(name===0)return 0;name=UTF8ToString(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLVM_SAVEDSTACKS[p];self.LLVM_SAVEDSTACKS.splice(p,1);stackRestore(ret)}function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDSTACKS){self.LLVM_SAVEDSTACKS=[]}self.LLVM_SAVEDSTACKS.push(stackSave());return self.LLVM_SAVEDSTACKS.length-1}function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _pthread_cond_wait(){return 0}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":(function(date){return WEEKDAYS[date.tm_wday].substring(0,3)}),"%A":(function(date){return WEEKDAYS[date.tm_wday]}),"%b":(function(date){return MONTHS[date.tm_mon].substring(0,3)}),"%B":(function(date){return MONTHS[date.tm_mon]}),"%C":(function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)}),"%d":(function(date){return leadingNulls(date.tm_mday,2)}),"%e":(function(date){return leadingSomething(date.tm_mday,2," ")}),"%g":(function(date){return getWeekBasedYear(date).toString().substring(2)}),"%G":(function(date){return getWeekBasedYear(date)}),"%H":(function(date){return leadingNulls(date.tm_hour,2)}),"%I":(function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)}),"%j":(function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)}),"%m":(function(date){return leadingNulls(date.tm_mon+1,2)}),"%M":(function(date){return leadingNulls(date.tm_min,2)}),"%n":(function(){return"\n"}),"%p":(function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}}),"%S":(function(date){return leadingNulls(date.tm_sec,2)}),"%t":(function(){return"\t"}),"%u":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7}),"%U":(function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"}),"%V":(function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)}),"%Z":(function(date){return date.tm_zone}),"%%":(function(){return"%"})};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();var workerResponded=false,workerCallbackId=-1;((function(){var messageBuffer=null,buffer=0,bufferSize=0;function flushMessages(){if(!messageBuffer)return;if(runtimeInitialized){var temp=messageBuffer;messageBuffer=null;temp.forEach((function(message){onmessage(message)}))}}function messageResender(){flushMessages();if(messageBuffer){setTimeout(messageResender,100)}}onmessage=function onmessage(msg){if(!runtimeInitialized){if(!messageBuffer){messageBuffer=[];setTimeout(messageResender,100)}messageBuffer.push(msg);return}flushMessages();var func=Module["_"+msg.data["funcName"]];if(!func)throw"invalid worker function to call: "+msg.data["funcName"];var data=msg.data["data"];if(data){if(!data.byteLength)data=new Uint8Array(data);if(!buffer||bufferSize res.text()) + .then(stlContents => { + var facets = stl.toObject(stlContents) + const surface = new ocl.STLSurf() + facets.facets.forEach(facet => { + const tri = new ocl.Triangle( + new ocl.Point(facet.verts[0][0], facet.verts[0][1], facet.verts[0][2]), + new ocl.Point(facet.verts[1][0], facet.verts[1][1], facet.verts[1][2]), + new ocl.Point(facet.verts[2][0], facet.verts[2][1], facet.verts[2][2]) + ) + surface.addTriangle(tri) + }) + const cutter = new ocl.CylCutter(4, 20) + waterline(surface, cutter, 1, 0.1) + adaptiveWaterline(surface, cutter, 1, 0.1, 0.001) + const path = new ocl.Path() + const p1 = new ocl.Point(0, 1, 0) + const p2 = new ocl.Point(10, 1, 0) + const l = new ocl.Line(p1, p2) + path.appendLine(l) + pathDropCutter(surface, cutter, 0.1, path) + adaptivePathDropCutter(surface, cutter, 0.04, 0.01, path) + }) +}) +},{"./index":1,"isomorphic-fetch":104,"stl":154}]},{},[166]); diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/test.src.js opencamlib-11.10-1/src/emscriptenlib/test.src.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/emscriptenlib/test.src.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/emscriptenlib/test.src.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,106 @@ +const stl = require('stl') +const ocl = require('./index') +const fetch = require('isomorphic-fetch') + +function waterline(surface, cutter, z, sampling) { + console.log('Waterline') + const wl = new ocl.Waterline() + wl.setSTL(surface) + wl.setCutter(cutter) + wl.setZ(z) + wl.setSampling(sampling) + wl.run() + let gcode = '' + const loops = wl.getLoops() + for (var i = 0; i < loops.size(); i++) { + const loop = loops.get(i) + for (var j = 0; j < loop.size(); j++) { + const point = loop.get(j) + gcode += 'G01 X' + point.x + ' Y' + point.y + ' Z' + point.z + '\n' + } + } + console.log(gcode) +} + +function adaptiveWaterline(surface, cutter, z, sampling, minSampling) { + console.log('AdaptiveWaterline') + const awl = new ocl.AdaptiveWaterline() + awl.setSTL(surface) + awl.setCutter(cutter) + awl.setZ(z) + awl.setSampling(sampling) + awl.setMinSampling(minSampling) + awl.run() + let gcode = '' + const loops = awl.getLoops() + for (var i = 0; i < loops.size(); i++) { + const loop = loops.get(i) + for (var j = 0; j < loop.size(); j++) { + const point = loop.get(j) + gcode += 'G01 X' + point.x + ' Y' + point.y + ' Z' + point.z + '\n' + } + } + console.log(gcode) +} + +function pathDropCutter(surface, cutter, sampling, path) { + console.log('PathDropCutter') + const pdc = new ocl.PathDropCutter() + pdc.setSTL(surface) + pdc.setCutter(cutter) + pdc.setPath(path) + pdc.setSampling(sampling) + pdc.run() + const points = pdc.getPoints() + let gcode = '' + for (var j = 0; j < points.size(); j++) { + const point = points.get(j) + gcode += 'G01 X' + point.x + ' Y' + point.y + ' Z' + point.z + '\n' + } + console.log(gcode) +} + +function adaptivePathDropCutter(surface, cutter, sampling, minSampling, path) { + console.log('AdaptivePathDropCutter') + const apdc = new ocl.AdaptivePathDropCutter() + apdc.setSTL(surface) + apdc.setCutter(cutter) + apdc.setPath(path) + apdc.setSampling(sampling) + apdc.setMinSampling(minSampling) + apdc.run() + const points = apdc.getPoints() + let gcode = '' + for (var j = 0; j < points.size(); j++) { + const point = points.get(j) + gcode += 'G01 X' + point.x + ' Y' + point.y + ' Z' + point.z + '\n' + } + console.log(gcode) +} + +ocl.then(function () { + fetch('https://cdn.jsdelivr.net/gh/aewallin/opencamlib@master/stl/gnu_tux_mod.stl') + .then(res => res.text()) + .then(stlContents => { + var facets = stl.toObject(stlContents) + const surface = new ocl.STLSurf() + facets.facets.forEach(facet => { + const tri = new ocl.Triangle( + new ocl.Point(facet.verts[0][0], facet.verts[0][1], facet.verts[0][2]), + new ocl.Point(facet.verts[1][0], facet.verts[1][1], facet.verts[1][2]), + new ocl.Point(facet.verts[2][0], facet.verts[2][1], facet.verts[2][2]) + ) + surface.addTriangle(tri) + }) + const cutter = new ocl.CylCutter(4, 20) + waterline(surface, cutter, 1, 0.1) + adaptiveWaterline(surface, cutter, 1, 0.1, 0.001) + const path = new ocl.Path() + const p1 = new ocl.Point(0, 1, 0) + const p2 = new ocl.Point(10, 1, 0) + const l = new ocl.Line(p1, p2) + path.appendLine(l) + pathDropCutter(surface, cutter, 0.1, path) + adaptivePathDropCutter(surface, cutter, 0.04, 0.01, path) + }) +}) \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/gcc_version.cmake opencamlib-11.10-1/src/gcc_version.cmake --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/gcc_version.cmake 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/gcc_version.cmake 2020-06-14 12:13:19.000000000 +0000 @@ -7,7 +7,7 @@ ${CMAKE_CXX_COMPILER} ARGS --version OUTPUT_VARIABLE _compiler_output) - string(REGEX REPLACE ".*([0-9]\\.[0-9]\\.[0-9]).*" "\\1" + string(REGEX REPLACE ".*([0-9]\\.[0-9]\\.[0-9]).*" "\\1" gcc_compiler_version "${_compiler_output}" ) @@ -15,11 +15,11 @@ message(STATUS "C++ compiler version: ${gcc_compiler_version} [${CMAKE_CXX_COMPILER}]") IF(${gcc_compiler_version} MATCHES ".*4\\.[6789]\\.[0-9].*") - #MESSAGE("gcc >= 4.6") - set(GCC_4_6 TRUE) + #MESSAGE("gcc >= 4.6") + set(GCC_4_6 TRUE) ELSE(${gcc_compiler_version} MATCHES ".*4\\.[6789]\\.[0-9].*") - #MESSAGE("gcc < 4.6") - set(GCC_4_6 FALSE) + #MESSAGE("gcc < 4.6") + set(GCC_4_6 FALSE) ENDIF(${gcc_compiler_version} MATCHES ".*4\\.[6789]\\.[0-9].*") endif(CMAKE_COMPILER_IS_GNUCXX) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/arc.cpp opencamlib-11.10-1/src/geo/arc.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/arc.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/arc.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ -/* $Id$ +/* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -41,13 +42,13 @@ } void Arc::setProperties() { - // arc properties - Point vs = (p1 - c).xyPerp(); - Point ve = (p2 - c).xyPerp(); - radius = vs.xyNorm(); - vs.normalize(); - ve.normalize(); - length = fabs(xyIncludedAngle(vs, ve, dir)) * radius; + // arc properties + Point vs = (p1 - c).xyPerp(); + Point ve = (p2 - c).xyPerp(); + radius = vs.xyNorm(); + vs.normalize(); + ve.normalize(); + length = fabs(xyIncludedAngle(vs, ve, dir)) * radius; } std::ostream& operator<<(std::ostream &stream, const Arc& a) @@ -57,38 +58,38 @@ } Point Arc::getPoint(double t)const { - /// returns a point which is 0-1 along span + /// returns a point which is 0-1 along span if(fabs(t) < 0.00000000000001) - return p1; + return p1; if(fabs(t - 1.0) < 0.00000000000001) - return p2; - - double d = t * length; - if(!dir)d = -d; - Point v = p1 - c; - v.xyRotate(d / radius); - return v + c; + return p2; + + double d = t * length; + if(!dir)d = -d; + Point v = p1 - c; + v.xyRotate(d / radius); + return v + c; } double Arc::xyIncludedAngle(const Point& v1, const Point& v2, bool dir) { // returns the absolute included angle between 2 vectors in - // the direction of dir ( true=acw false=cw ) - int d = dir ? 1 : (-1); - double inc_ang = v1.dot(v2); + // the direction of dir ( true=acw false=cw ) + int d = dir ? 1 : (-1); + double inc_ang = v1.dot(v2); if(inc_ang > 1. - 1.0e-10) - return 0; - if(inc_ang < -1. + 1.0e-10) - inc_ang = PI; - else { // dot product, v1 . v2 = cos(alfa) + return 0; + if(inc_ang < -1. + 1.0e-10) + inc_ang = PI; + else { // dot product, v1 . v2 = cos(alfa) if(inc_ang > 1.0) - inc_ang = 1.0; - inc_ang = acos(inc_ang); // 0 to pi radians - - double x = v1.x * v2.y - v1.y * v2.x; + inc_ang = 1.0; + inc_ang = acos(inc_ang); // 0 to pi radians + + double x = v1.x * v2.y - v1.y * v2.x; if(d * x < 0) - inc_ang = 2 * PI - inc_ang ; // cp - } - return d * inc_ang; + inc_ang = 2 * PI - inc_ang ; // cp + } + return d * inc_ang; } } // end namespace diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/arc.hpp opencamlib-11.10-1/src/geo/arc.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/arc.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/arc.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef ARC_H #define ARC_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/bbox.cpp opencamlib-11.10-1/src/geo/bbox.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/bbox.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/bbox.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/bbox.hpp opencamlib-11.10-1/src/geo/bbox.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/bbox.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/bbox.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef BBOX_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/ccpoint.cpp opencamlib-11.10-1/src/geo/ccpoint.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/ccpoint.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/ccpoint.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include // for str() #include "ccpoint.hpp" diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/ccpoint.hpp opencamlib-11.10-1/src/geo/ccpoint.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/ccpoint.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/ccpoint.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef CCPOINT_H #define CCPOINT_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/clpoint.cpp opencamlib-11.10-1/src/geo/clpoint.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/clpoint.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/clpoint.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * - * OpenCAMlib is distributed in the hope that it will be useful, + * 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. + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with OpenCAMlib. If not, see . + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include @@ -26,37 +27,37 @@ namespace ocl { - + /* ********************************************** CLPoint *************/ -CLPoint::CLPoint() +CLPoint::CLPoint() : Point() { cc = new CCPoint(); } -CLPoint::CLPoint(double x, double y, double z) +CLPoint::CLPoint(double x, double y, double z) : Point(x,y,z) { cc = new CCPoint(); } -CLPoint::CLPoint(double x, double y, double z, CCPoint& ccp) +CLPoint::CLPoint(double x, double y, double z, CCPoint& ccp) : Point(x,y,z) { cc = new CCPoint( ccp ); } -CLPoint::CLPoint(const CLPoint& cl) +CLPoint::CLPoint(const CLPoint& cl) : Point(cl.x,cl.y,cl.z) { cc = new CCPoint( *cl.cc ); } -CLPoint::CLPoint(const Point& p) +CLPoint::CLPoint(const Point& p) : Point(p.x,p.y,p.z) { cc = new CCPoint(); } CLPoint::~CLPoint() { - delete cc; + delete cc.load(); } bool CLPoint::below(const Triangle& t) const { @@ -78,9 +79,19 @@ bool CLPoint::liftZ(double zin, CCPoint& ccp) { if (zin>z) { z=zin; - if (cc) - delete cc; - cc=new CCPoint( ccp ); + auto newCC = new CCPoint(ccp); + auto prevCC = cc.load(); + auto expected = prevCC; + // Protect against race between concurrent liftZ calls in multiple + // threads + cc.compare_exchange_strong(expected, newCC); + if (prevCC == expected) { + // Successfully replaced cc, go ahead & delete prevCC + delete prevCC; + } else { + // Another thread won the race, back off. + delete newCC; + } return true; } else { return false; @@ -88,13 +99,13 @@ } bool CLPoint::liftZ_if_InsidePoints(double zin, CCPoint& cc_tmp, const Point& p1,const Point& p2) { - if ( cc_tmp.isInside(p1, p2) ) + if ( cc_tmp.isInside(p1, p2) ) return this->liftZ(zin, cc_tmp); return false; } bool CLPoint::liftZ_if_inFacet(double zin, CCPoint& cc_tmp, const Triangle& t) { - if ( cc_tmp.isInside(t) ) + if ( cc_tmp.isInside(t) ) return this->liftZ(zin, cc_tmp); return false; } @@ -105,6 +116,9 @@ x=clp.x; y=clp.y; z=clp.z; + if (cc) { + delete cc.load(); + } cc= new CCPoint( *(clp.cc) ); return *this; } diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/clpoint.hpp opencamlib-11.10-1/src/geo/clpoint.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/clpoint.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/clpoint.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,25 +1,27 @@ /* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * - * OpenCAMlib is distributed in the hope that it will be useful, + * 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. + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with OpenCAMlib. If not, see . + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef CLPOINT_H #define CLPOINT_H +#include #include #include @@ -46,26 +48,27 @@ /// cl-point at Point p CLPoint(const Point& p); virtual ~CLPoint(); - /// Pointer to the corresponding CCPoint - CCPoint* cc; + /// Atomic pointer to the corresponding CCPoint, protected against + /// concurrent replacement in liftZ. + std::atomic cc; /// string repr std::string str() const; - + /// if cc is in the edge p1-p2, test if clpoint needs to be lifted to z /// if so, set cc = cc_tmp and return true bool liftZ_if_InsidePoints(double z, CCPoint& cc_tmp, const Point& p1,const Point& p2); - + /// if cc in in Triangle facet, test if clpoint needs to be lifted /// if so, set cc=cc_tmp and return true bool liftZ_if_inFacet(double z, CCPoint& cc_tmp, const Triangle& t); - - /// if zin > z, lift CLPoint and update cc-point, and return true + + /// if zin > z, lift CLPoint and update cc-point, and return true bool liftZ(double zin, CCPoint& ccp); - + /// if zin > z, lift CLPoint and return true. bool liftZ(const double zin); - - + + /// return true if cl-point above triangle bool below(const Triangle& t) const; /// return the CCPoint (for python) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/line.cpp opencamlib-11.10-1/src/geo/line.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/line.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/line.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include "line.hpp" namespace ocl @@ -46,13 +46,13 @@ return (p2 - p1) * t + p1; } -Point Line::Near(const Point& p) const { - // returns the near point from a line on the extended line - Point v = p2 - p1; - v.normalize(); - double dp = (p - p1).dot(v); - return p1 + (v * dp); -} +Point Line::Near(const Point& p) const { + // returns the near point from a line on the extended line + Point v = p2 - p1; + v.normalize(); + double dp = (p - p1).dot(v); + return p1 + (v * dp); +} } // end namespace // end file line.cpp diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/line.hpp opencamlib-11.10-1/src/geo/line.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/line.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/line.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef LINE_H #define LINE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/path.cpp opencamlib-11.10-1/src/geo/path.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/path.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/path.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,25 +1,25 @@ /* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include "path.hpp" namespace ocl diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/path.hpp opencamlib-11.10-1/src/geo/path.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/path.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/path.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef PATH_H #define PATH_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/path_py.hpp opencamlib-11.10-1/src/geo/path_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/path_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/path_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ -#ifndef PATH_PY_H -#define PATH_PY_H - -#include - -#include -#include - -#include "path.hpp" - - - -namespace ocl -{ - -/// Python wrapper for Path -class Path_py : public Path { - public: - Path_py() : Path () {}; - /// copy constructor - Path_py(const Path &p) : Path(p) {}; - - /// return the span-list to python - boost::python::list getSpans() { - boost::python::list slist; - BOOST_FOREACH(Span* span, span_list) { - if(span->type() == LineSpanType)slist.append(((LineSpan*)span)->line); - else if(span->type() == ArcSpanType)slist.append(((ArcSpan*)span)->arc); - } - return slist; - }; - - /// return a list of type/span pairs - boost::python::list getTypeSpanPairs() { - boost::python::list slist; - BOOST_FOREACH(Span* span, span_list) { - if(span->type() == LineSpanType) - { - boost::python::list tuple; - tuple.append(span->type()); - tuple.append(((LineSpan*)span)->line); - slist.append(tuple); - } - else if(span->type() == ArcSpanType) - { - boost::python::list tuple; - tuple.append(span->type()); - tuple.append(((ArcSpan*)span)->arc); - slist.append(tuple); - } - } - return slist; - }; - - -}; - -} // end namespace -#endif -// end file path.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/point.cpp opencamlib-11.10-1/src/geo/point.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/point.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/point.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include // sqrt, sin, cos, fabs #include #include @@ -62,8 +62,8 @@ } Point Point::cross(const Point &p) const { - double xc = y * p.z - z * p.y; - double yc = z * p.x - x * p.z; + double xc = y * p.z - z * p.y; + double yc = z * p.x - x * p.z; double zc = x * p.y - y * p.x; return Point(xc, yc, zc); } diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/point.hpp opencamlib-11.10-1/src/geo/point.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/point.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/point.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef POINT_H #define POINT_H @@ -99,7 +100,7 @@ /// returns true if point is right of line through p1 and p2 (works in the XY-plane) bool isRight(const Point &p1, const Point &p2) const; - /// retruns true if Point *this is inside Triangle t + /// returns true if Point *this is inside Triangle t bool isInside(const Triangle &t) const; /// return true if Point within line segment p1-p2 bool isInside(const Point& p1, const Point& p2) const; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlreader.cpp opencamlib-11.10-1/src/geo/stlreader.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlreader.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/stlreader.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,24 +1,26 @@ // stlreader.cpp // // Written by Dan Heeks -// Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) -// -// This file is part of OpenCAMlib. -// -// OpenCAMlib is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -// - +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ #include // required by read_from_file() #include #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlreader.hpp opencamlib-11.10-1/src/geo/stlreader.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlreader.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/stlreader.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,22 +1,24 @@ -// stlreader.h -// -// Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) -// -// This file is part of OpenCAMlib. -// -// OpenCAMlib is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -// +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + #ifndef STLREADER_H #define STLREADER_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlsurf.cpp opencamlib-11.10-1/src/geo/stlsurf.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlsurf.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/stlsurf.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #include diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlsurf.hpp opencamlib-11.10-1/src/geo/stlsurf.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlsurf.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/stlsurf.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef STLSURF_H #define STLSURF_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlsurf_py.hpp opencamlib-11.10-1/src/geo/stlsurf_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/stlsurf_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/stlsurf_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ -#ifndef STLSURF_PY_H -#define STLSURF_PY_H - -#include -#include - -#include "stlsurf.hpp" - -namespace ocl -{ - -/// STLSurf python wrapper -class STLSurf_py : public STLSurf { - public: - /// default constructor - STLSurf_py() : STLSurf() {}; - /// return list of all triangles to python - boost::python::list getTriangles() const { - boost::python::list tlist; - BOOST_FOREACH(Triangle t, tris) { - tlist.append(Triangle_py(t)); - } - return tlist; - }; - - /// return bounds in a list to python - boost::python::list getBounds() const { - boost::python::list bounds; - bounds.append( bb.minpt.x ); - bounds.append( bb.maxpt.x ); - bounds.append( bb.minpt.y ); - bounds.append( bb.maxpt.y ); - bounds.append( bb.minpt.z ); - bounds.append( bb.maxpt.z ); - return bounds; - }; - - /// string output - std::string str() const { - std::ostringstream o; - o << *this; - return o.str(); - }; -}; - -} // end namespace -#endif -// end file stlsurf_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/triangle.cpp opencamlib-11.10-1/src/geo/triangle.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/triangle.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/triangle.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,23 +1,23 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ - #include #include @@ -63,7 +63,7 @@ /// calculate, normalize, and set the Triangle normal void Triangle::calcNormal() { - Point v1=p[0]-p[1]; + Point v1=p[0]-p[1]; Point v2=p[0]-p[2]; Point ntemp = v1.cross(v2); // the normal is in the direction of the cross product between the edge vectors ntemp.normalize(); // FIXME this might fail if norm()==0 diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/triangle.hpp opencamlib-11.10-1/src/geo/triangle.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/triangle.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/triangle.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -1,21 +1,22 @@ /* $Id$ * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that it will be useful, + * + * 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 OpenCAMlib. If not, see . + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ #ifndef TRIANGLE_H #define TRIANGLE_H diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/triangle_py.hpp opencamlib-11.10-1/src/geo/triangle_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/geo/triangle_py.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/geo/triangle_py.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ -#ifndef TRIANGLE_PY_H -#define TRIANGLE_PY_H - -#include - -#include -#include - -#include "triangle.hpp" - -namespace ocl -{ - -/// -/// \brief python wrapper for Triangle -/// -class Triangle_py : public Triangle { - public: - /// default constructor - Triangle_py() : Triangle() {}; - /// construct from three points - Triangle_py( const Point& p0, - const Point& p1, - const Point& p2) : Triangle(p0,p1,p2) {}; - /// copy constructor - Triangle_py( const Triangle_py& t) : Triangle(t) {}; - /// cast-down constructor - Triangle_py( const Triangle& t) : Triangle(t) {}; - - /// string repr - std::string str() const { - std::ostringstream o; - o << *this; - return o.str(); - }; - - /// Returns a list of the vertices to Python - boost::python::list getPoints() const { - boost::python::list plist; - BOOST_FOREACH(Point vertex, p) { - plist.append(vertex); - } - return plist; - }; - -}; - -} // end namespace -#endif -// end file triangle_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/camvtk.py opencamlib-11.10-1/src/lib/camvtk.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/camvtk.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/lib/camvtk.py 2020-06-14 12:13:19.000000000 +0000 @@ -76,7 +76,7 @@ col = white else: - print "camvtk.clColor() ERROR: CCType=",cc.type," is unknown, no color" + print("camvtk.clColor() ERROR: CCType=",cc.type," is unknown, no color") col = red return col @@ -107,7 +107,7 @@ elif cc.type == ocl.CCType.ERROR: col = (0,0.5,1) else: - print "err. CCType unknown, no color" + print("err. CCType unknown, no color") col = red return col @@ -172,10 +172,10 @@ #cube.SetWireframe() myscreen.addActor( cube ) #if (nmax>100): - # print "i=", i - # print "div=", (float(nmax)/10) + # print("i=", i) + # print("div=", (float(nmax)/10)) # if ( (i % (float(nmax)/10))==0): - # print ".", + # print(".",) #i=i+1 #print "done." @@ -352,7 +352,7 @@ transformFilter.Update() self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(transformFilter.GetOutput()) + self.mapper.SetInputData(transformFilter.GetOutput()) #self.mapper = vtk.vtkPolyDataMapper() @@ -370,9 +370,9 @@ self.src.SetCenter(center) self.src.SetThetaResolution(resolution) self.src.SetPhiResolution(resolution) - + self.src.Update() self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src.GetOutput()) + self.mapper.SetInputData(self.src.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -387,7 +387,7 @@ self.src.SetZLength(length) self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src.GetOutput()) + self.mapper.SetInputData(self.src.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -418,7 +418,7 @@ self.mapper = vtk.vtkPolyDataMapper() #self.mapper.SetInput(self.src.GetOutput()) - self.mapper.SetInput( transformFilter.GetOutput() ) + self.mapper.SetInputData( transformFilter.GetOutput() ) self.SetMapper(self.mapper) self.SetColor(color) @@ -430,8 +430,9 @@ self.src = vtk.vtkLineSource() self.src.SetPoint1(p1) self.src.SetPoint2(p2) + self.src.Update() self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src.GetOutput()) + self.mapper.SetInputData(self.src.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -443,7 +444,7 @@ self.src.SetPoint2(p2) self.tubefilter = vtk.vtkTubeFilter() - self.tubefilter.SetInput( self.src.GetOutput() ) + self.tubefilter.SetInputData( self.src.GetOutput() ) self.tubefilter.SetRadius( radius ) self.tubefilter.SetNumberOfSides( 30 ) self.tubefilter.Update() @@ -461,7 +462,7 @@ lines =vtk.vtkCellArray() id = 0 points = vtk.vtkPoints() - for n in xrange(0,resolution): + for n in range(0,resolution): line = vtk.vtkLine() angle1 = (float(n)/(float(resolution)))*2*math.pi angle2 = (float(n+1)/(float(resolution)))*2*math.pi @@ -481,7 +482,7 @@ self.pdata.SetLines(lines) self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.pdata) + self.mapper.SetInputData(self.pdata) self.SetMapper(self.mapper) self.SetColor(color) @@ -502,13 +503,13 @@ self.pdata.SetLines(lines) tubefilter=vtk.vtkTubeFilter() - tubefilter.SetInput(self.pdata) + tubefilter.SetInputData(self.pdata) tubefilter.SetRadius(radius) tubefilter.SetNumberOfSides(50) tubefilter.Update() self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(tubefilter.GetOutput()) + self.mapper.SetInputData(tubefilter.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -523,7 +524,7 @@ self.src.SetNumberOfPoints(1) self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src.GetOutput()) + self.mapper.SetInputData(self.src.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -546,7 +547,7 @@ self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput( transformFilter.GetOutput() ) + self.mapper.SetInputData( transformFilter.GetOutput() ) self.SetMapper(self.mapper) self.SetColor(color) @@ -622,7 +623,7 @@ #self.src.SetCenter(center) self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src.GetOutput()) + self.mapper.SetInputData(self.src.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -659,7 +660,7 @@ transformFilter.Update() self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(transformFilter.GetOutput()) + self.mapper.SetInputData(transformFilter.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -711,10 +712,10 @@ polydata.SetPoints(points) polydata.SetPolys(triangles) polydata.Modified() - polydata.Update() + #polydata.Update() # gives error on vtk6 self.src=polydata self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src) + self.mapper.SetInputData(self.src) self.SetMapper(self.mapper) else: # a filename was specified @@ -722,7 +723,7 @@ self.src.SetFileName(filename) self.src.Update() self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src.GetOutput()) + self.mapper.SetInputData(self.src.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) @@ -755,10 +756,10 @@ #polydata.GetPointData().SetScalars(Colors) polydata.Modified() - polydata.Update() + #polydata.Update() # https://www.vtk.org/Wiki/VTK/VTK_6_Migration/Removal_of_Update self.src=polydata self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src) + self.mapper.SetInputData(self.src) self.SetMapper(self.mapper) #self.SetColor(color) @@ -790,7 +791,7 @@ polydata.Update() self.src=polydata self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src) + self.mapper.SetInputData(self.src) self.SetMapper(self.mapper) #self.SetColor(color) @@ -801,7 +802,7 @@ self.src = vtk.vtkPlaneSource() #self.src.SetCenter(center) self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInput(self.src.GetOutput()) + self.mapper.SetInputData(self.src.GetOutput()) self.SetMapper(self.mapper) self.SetColor(color) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/procmemory.py opencamlib-11.10-1/src/lib/procmemory.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/procmemory.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/lib/procmemory.py 2020-06-14 12:13:19.000000000 +0000 @@ -17,7 +17,7 @@ v = t.read() t.close() except: - print "procmemory.py ERROR!" + print("procmemory.py ERROR!") return 0.0 # non-Linux? #print v # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' @@ -52,11 +52,11 @@ if __name__ == "__main__": m1 = memory() - print m1 + print(m1) l=[] - for n in xrange(100000): + for n in range(100000): l.append(n) m2 = memory() - print m2/_scale['kB'], 'kB' + print(m2/_scale['kB'], 'kB') raw_input("Press Enter to terminate") diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/pyocl.py opencamlib-11.10-1/src/lib/pyocl.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/pyocl.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/lib/pyocl.py 2020-06-14 12:13:19.000000000 +0000 @@ -15,8 +15,8 @@ def CLPointGridZigZag(minx,dx,maxx,miny,dy,maxy,z): """ generate and return a zigzag grid of points """ plist = [] - xvalues = [round(minx+n*dx,2) for n in xrange(int(round((maxx-minx)/dx))+1) ] - yvalues = [round(miny+n*dy,2) for n in xrange(int(round((maxy-miny)/dy))+1) ] + xvalues = [round(minx+n*dx,2) for n in range(int(round((maxx-minx)/dx))+1) ] + yvalues = [round(miny+n*dy,2) for n in range(int(round((maxy-miny)/dy))+1) ] #yrow = 0 #x=minx @@ -40,8 +40,8 @@ def CLPointGrid(minx,dx,maxx,miny,dy,maxy,z): """ generate and return a rectangular grid of points """ plist = [] - xvalues = [round(minx+n*dx,2) for n in xrange(int(round((maxx-minx)/dx))+1) ] - yvalues = [round(miny+n*dy,2) for n in xrange(int(round((maxy-miny)/dy))+1) ] + xvalues = [round(minx+n*dx,2) for n in range(int(round((maxx-minx)/dx))+1) ] + yvalues = [round(miny+n*dy,2) for n in range(int(round((maxy-miny)/dy))+1) ] for y in yvalues: for x in xvalues: plist.append( ocl.CLPoint(x,y,z) ) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/STLTools.py opencamlib-11.10-1/src/lib/STLTools.py --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/lib/STLTools.py 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/lib/STLTools.py 2020-06-14 12:13:19.000000000 +0000 @@ -32,8 +32,8 @@ self.little_endian = (struct.unpack("(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + // std::cout << "AdaptivePathDropCutterJS::AdaptivePathDropCutterJS()" << std::endl; + actualClass_ = ocl::AdaptivePathDropCutter(); +} + +ocl::AdaptivePathDropCutter* AdaptivePathDropCutterJS::GetInternalInstance() +{ + return &actualClass_; +} + +void AdaptivePathDropCutterJS::setSTL(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setSTL()" << std::endl; + STLSurfJS *sjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::STLSurf *surface = sjs->GetInternalInstance(); + actualClass_.setSTL(*surface); +} + +void AdaptivePathDropCutterJS::setPath(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setPath()" << std::endl; + PathJS *pjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::Path *path = pjs->GetInternalInstance(); + actualClass_.setPath(path); +} + +void AdaptivePathDropCutterJS::setCylCutter(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setCylCutter()" << std::endl; + CylCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::CylCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptivePathDropCutterJS::setBallCutter(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setBallCutter()" << std::endl; + BallCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::BallCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptivePathDropCutterJS::setBullCutter(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setBullCutter()" << std::endl; + BullCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::BullCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptivePathDropCutterJS::setConeCutter(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setConeCutter()" << std::endl; + ConeCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::ConeCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptivePathDropCutterJS::setSampling(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setSampling()" << std::endl; + Napi::Number s = info[0].As(); + actualClass_.setSampling(s.DoubleValue()); +} + +void AdaptivePathDropCutterJS::setMinSampling(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::setMinSampling()" << std::endl; + Napi::Number s = info[0].As(); + actualClass_.setMinSampling(s.DoubleValue()); +} + +Napi::Value AdaptivePathDropCutterJS::getCLPoints(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::getCLPoints()" << std::endl; + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Array result = Napi::Array::New(env); + std::vector points = actualClass_.getPoints(); + int x = 0; + int y = 1; + int z = 2; + int i = 0; + // std::cout << points.size(); + for (auto & point : points) + { + Napi::Array pointArr = Napi::Array::New(env); + pointArr.Set(x, Napi::Number::New(env, point.x)); + pointArr.Set(y, Napi::Number::New(env, point.y)); + pointArr.Set(z, Napi::Number::New(env, point.z)); + result.Set(i, pointArr); + i++; + } + return result; +} + +void AdaptivePathDropCutterJS::run(const Napi::CallbackInfo &info) +{ + // std::cout << "AdaptivePathDropCutterJS::run()" << std::endl; + actualClass_.run(); +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/adaptivepathdropcutter_js.hpp opencamlib-11.10-1/src/nodejslib/adaptivepathdropcutter_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/adaptivepathdropcutter_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/adaptivepathdropcutter_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,23 @@ +#include +#include "adaptivepathdropcutter.hpp" + +class AdaptivePathDropCutterJS : public Napi::ObjectWrap +{ + public: + static void Init(Napi::Env env, Napi::Object exports); + AdaptivePathDropCutterJS(const Napi::CallbackInfo &info); + ocl::AdaptivePathDropCutter *GetInternalInstance(); + void setSTL(const Napi::CallbackInfo &info); + void setPath(const Napi::CallbackInfo &info); + void setCylCutter(const Napi::CallbackInfo &info); + void setBallCutter(const Napi::CallbackInfo &info); + void setBullCutter(const Napi::CallbackInfo &info); + void setConeCutter(const Napi::CallbackInfo &info); + void setSampling(const Napi::CallbackInfo &info); + void setMinSampling(const Napi::CallbackInfo &info); + Napi::Value getCLPoints(const Napi::CallbackInfo &info); + void run(const Napi::CallbackInfo &info); + private: + static Napi::FunctionReference constructor; + ocl::AdaptivePathDropCutter actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/adaptivewaterline_js.cpp opencamlib-11.10-1/src/nodejslib/adaptivewaterline_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/adaptivewaterline_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/adaptivewaterline_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,131 @@ +#include "adaptivewaterline_js.hpp" +#include "stlsurf_js.hpp" +#include "point.hpp" +#include "cylcutter_js.hpp" +#include "ballcutter_js.hpp" +#include "bullcutter_js.hpp" +#include "conecutter_js.hpp" + +Napi::FunctionReference AdaptiveWaterlineJS::constructor; + +Napi::Object AdaptiveWaterlineJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "AdaptiveWaterline", { + InstanceMethod("setZ", &AdaptiveWaterlineJS::setZ), + InstanceMethod("setSTL", &AdaptiveWaterlineJS::setSTL), + InstanceMethod("setCylCutter", &AdaptiveWaterlineJS::setCylCutter), + InstanceMethod("setBallCutter", &AdaptiveWaterlineJS::setBallCutter), + InstanceMethod("setBullCutter", &AdaptiveWaterlineJS::setBullCutter), + InstanceMethod("setConeCutter", &AdaptiveWaterlineJS::setConeCutter), + InstanceMethod("setSampling", &AdaptiveWaterlineJS::setSampling), + InstanceMethod("setMinSampling", &AdaptiveWaterlineJS::setMinSampling), + InstanceMethod("run", &AdaptiveWaterlineJS::run), + InstanceMethod("getLoops", &AdaptiveWaterlineJS::getLoops) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("AdaptiveWaterline", func); + return exports; +} + +AdaptiveWaterlineJS::AdaptiveWaterlineJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + actualClass_ = ocl::AdaptiveWaterline(); +} + +ocl::AdaptiveWaterline *AdaptiveWaterlineJS::GetInternalInstance() +{ + return &actualClass_; +} + +void AdaptiveWaterlineJS::setZ(const Napi::CallbackInfo &info) +{ + Napi::Number z = info[0].As(); + actualClass_.setZ(z.DoubleValue()); +} + +void AdaptiveWaterlineJS::setSTL(const Napi::CallbackInfo &info) +{ + STLSurfJS *sjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::STLSurf *surface = sjs->GetInternalInstance(); + actualClass_.setSTL(*surface); +} + +void AdaptiveWaterlineJS::setCylCutter(const Napi::CallbackInfo &info) +{ + CylCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::CylCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptiveWaterlineJS::setBallCutter(const Napi::CallbackInfo &info) +{ + BallCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::BallCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptiveWaterlineJS::setBullCutter(const Napi::CallbackInfo &info) +{ + BullCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::BullCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptiveWaterlineJS::setConeCutter(const Napi::CallbackInfo &info) +{ + ConeCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::ConeCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void AdaptiveWaterlineJS::setSampling(const Napi::CallbackInfo &info) +{ + Napi::Number s = info[0].As(); + actualClass_.setSampling(s.DoubleValue()); +} + +void AdaptiveWaterlineJS::setMinSampling(const Napi::CallbackInfo &info) +{ + Napi::Number s = info[0].As(); + actualClass_.setMinSampling(s.DoubleValue()); +} + +void AdaptiveWaterlineJS::run(const Napi::CallbackInfo &info) +{ + actualClass_.run(); +} + +Napi::Value AdaptiveWaterlineJS::getLoops(const Napi::CallbackInfo &info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Array result = Napi::Array::New(env); + std::vector> loops = actualClass_.getLoops(); + int x = 0; + int y = 1; + int z = 2; + int loopI = 0; + for (auto &loop : loops) + { + Napi::Array loopArr = Napi::Array::New(env); + int pointI = 0; + for (auto &point : loop) + { + Napi::Array pointArr = Napi::Array::New(env); + pointArr.Set(x, Napi::Number::New(env, point.x)); + pointArr.Set(y, Napi::Number::New(env, point.y)); + pointArr.Set(z, Napi::Number::New(env, point.z)); + loopArr.Set(pointI, pointArr); + pointI++; + } + result.Set(loopI, loopArr); + loopI++; + } + return result; +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/adaptivewaterline_js.hpp opencamlib-11.10-1/src/nodejslib/adaptivewaterline_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/adaptivewaterline_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/adaptivewaterline_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,24 @@ +#include +#include "adaptivewaterline.hpp" + +class AdaptiveWaterlineJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + AdaptiveWaterlineJS(const Napi::CallbackInfo &info); + ocl::AdaptiveWaterline *GetInternalInstance(); + void setZ(const Napi::CallbackInfo &info); + void setSTL(const Napi::CallbackInfo &info); + void setCylCutter(const Napi::CallbackInfo &info); + void setBallCutter(const Napi::CallbackInfo &info); + void setBullCutter(const Napi::CallbackInfo &info); + void setConeCutter(const Napi::CallbackInfo &info); + void setSampling(const Napi::CallbackInfo &info); + void setMinSampling(const Napi::CallbackInfo &info); + void run(const Napi::CallbackInfo &info); + Napi::Value getLoops(const Napi::CallbackInfo &info); + + private: + static Napi::FunctionReference constructor; + ocl::AdaptiveWaterline actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/ballcutter_js.cpp opencamlib-11.10-1/src/nodejslib/ballcutter_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/ballcutter_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/ballcutter_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,42 @@ +#include "ballcutter_js.hpp" + +Napi::FunctionReference BallCutterJS::constructor; + +Napi::Object BallCutterJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "BallCutter", { + InstanceMethod("str", &BallCutterJS::str) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("BallCutter", func); + return exports; +} + +BallCutterJS::BallCutterJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int length = info.Length(); + if (length != 2) + { + Napi::TypeError::New(env, "Provide 2 argument").ThrowAsJavaScriptException(); + } + Napi::Number d = info[0].As(); + Napi::Number l = info[1].As(); + actualClass_ = ocl::BallCutter(d.DoubleValue(), l.DoubleValue()); +} + +Napi::Value BallCutterJS::str(const Napi::CallbackInfo &info) +{ + Napi::Env env = info.Env(); + return Napi::String::New(env, actualClass_.str()); +} + +ocl::BallCutter* BallCutterJS::GetInternalInstance() +{ + return &actualClass_; +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/ballcutter_js.hpp opencamlib-11.10-1/src/nodejslib/ballcutter_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/ballcutter_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/ballcutter_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,15 @@ +#include +#include "ballcutter.hpp" + +class BallCutterJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + BallCutterJS(const Napi::CallbackInfo &info); + ocl::BallCutter* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; + Napi::Value str(const Napi::CallbackInfo &info); + ocl::BallCutter actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bbox_js.cpp opencamlib-11.10-1/src/nodejslib/bbox_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bbox_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/bbox_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,29 @@ +#include "bbox.hpp" +#include "bbox_js.hpp" + +Napi::FunctionReference BboxJS::constructor; + +Napi::Object BboxJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "Bbox", { + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("Bbox", func); + return exports; +} + +BboxJS::BboxJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + actualClass_ = ocl::Bbox(); +} + +ocl::Bbox* BboxJS::GetInternalInstance() +{ + return &actualClass_; +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bbox_js.hpp opencamlib-11.10-1/src/nodejslib/bbox_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bbox_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/bbox_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +#include +#include "bbox.hpp" + +class BboxJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + BboxJS(const Napi::CallbackInfo &info); + ocl::Bbox* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; + ocl::Bbox actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bullcutter_js.cpp opencamlib-11.10-1/src/nodejslib/bullcutter_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bullcutter_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/bullcutter_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,43 @@ +#include "bullcutter_js.hpp" + +Napi::FunctionReference BullCutterJS::constructor; + +Napi::Object BullCutterJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "BullCutter", { + InstanceMethod("str", &BullCutterJS::str) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("BullCutter", func); + return exports; +} + +BullCutterJS::BullCutterJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int length = info.Length(); + if (length != 3) + { + Napi::TypeError::New(env, "Provide 3 argument").ThrowAsJavaScriptException(); + } + Napi::Number d = info[0].As(); + Napi::Number r = info[1].As(); + Napi::Number l = info[2].As(); + actualClass_ = ocl::BullCutter(d.DoubleValue(), r.DoubleValue(), l.DoubleValue()); +} + +Napi::Value BullCutterJS::str(const Napi::CallbackInfo &info) +{ + Napi::Env env = info.Env(); + return Napi::String::New(env, actualClass_.str()); +} + +ocl::BullCutter* BullCutterJS::GetInternalInstance() +{ + return &actualClass_; +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bullcutter_js.hpp opencamlib-11.10-1/src/nodejslib/bullcutter_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/bullcutter_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/bullcutter_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,15 @@ +#include +#include "bullcutter.hpp" + +class BullCutterJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + BullCutterJS(const Napi::CallbackInfo &info); + ocl::BullCutter* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; + Napi::Value str(const Napi::CallbackInfo &info); + ocl::BullCutter actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/conecutter_js.cpp opencamlib-11.10-1/src/nodejslib/conecutter_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/conecutter_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/conecutter_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,43 @@ +#include "conecutter_js.hpp" + +Napi::FunctionReference ConeCutterJS::constructor; + +Napi::Object ConeCutterJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "ConeCutter", { + InstanceMethod("str", &ConeCutterJS::str) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("ConeCutter", func); + return exports; +} + +ConeCutterJS::ConeCutterJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int length = info.Length(); + if (length != 3) + { + Napi::TypeError::New(env, "Provide 3 argument").ThrowAsJavaScriptException(); + } + Napi::Number d = info[0].As(); + Napi::Number a = info[1].As(); + Napi::Number l = info[2].As(); + actualClass_ = ocl::ConeCutter(d.DoubleValue(), a.DoubleValue(), l.DoubleValue()); +} + +Napi::Value ConeCutterJS::str(const Napi::CallbackInfo &info) +{ + Napi::Env env = info.Env(); + return Napi::String::New(env, actualClass_.str()); +} + +ocl::ConeCutter* ConeCutterJS::GetInternalInstance() +{ + return &actualClass_; +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/conecutter_js.hpp opencamlib-11.10-1/src/nodejslib/conecutter_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/conecutter_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/conecutter_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,15 @@ +#include +#include "conecutter.hpp" + +class ConeCutterJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + ConeCutterJS(const Napi::CallbackInfo &info); + ocl::ConeCutter* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; + Napi::Value str(const Napi::CallbackInfo &info); + ocl::ConeCutter actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/cylcutter_js.cpp opencamlib-11.10-1/src/nodejslib/cylcutter_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/cylcutter_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/cylcutter_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,43 @@ +#include "cylcutter.hpp" +#include "cylcutter_js.hpp" + +Napi::FunctionReference CylCutterJS::constructor; + +Napi::Object CylCutterJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "CylCutter", { + InstanceMethod("str", &CylCutterJS::str) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("CylCutter", func); + return exports; +} + +CylCutterJS::CylCutterJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int length = info.Length(); + if (length != 2) + { + Napi::TypeError::New(env, "Provide 2 argument").ThrowAsJavaScriptException(); + } + Napi::Number d = info[0].As(); + Napi::Number l = info[1].As(); + actualClass_ = ocl::CylCutter(d.DoubleValue(), l.DoubleValue()); +} + +Napi::Value CylCutterJS::str(const Napi::CallbackInfo &info) +{ + Napi::Env env = info.Env(); + return Napi::String::New(env, actualClass_.str()); +} + +ocl::CylCutter* CylCutterJS::GetInternalInstance() +{ + return &actualClass_; +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/cylcutter_js.hpp opencamlib-11.10-1/src/nodejslib/cylcutter_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/cylcutter_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/cylcutter_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,15 @@ +#include +#include "cylcutter.hpp" + +class CylCutterJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + CylCutterJS(const Napi::CallbackInfo &info); + ocl::CylCutter* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; + Napi::Value str(const Napi::CallbackInfo &info); + ocl::CylCutter actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivepathdropcutter.d.ts opencamlib-11.10-1/src/nodejslib/lib/adaptivepathdropcutter.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivepathdropcutter.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/adaptivepathdropcutter.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,11 @@ +import Operation from './operation'; +import Path from './path'; +declare class AdaptivePathDropCutter extends Operation { + protected minSampling?: number; + protected path?: Path; + setMinSampling(minSampling: number): void; + getCLPoints(): any; + setPath(path: Path): void; + run(): void; +} +export default AdaptivePathDropCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivepathdropcutter.js opencamlib-11.10-1/src/nodejslib/lib/adaptivepathdropcutter.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivepathdropcutter.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/adaptivepathdropcutter.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,58 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var operation_1 = __importDefault(require("./operation")); +var AdaptivePathDropCutter = /** @class */ (function (_super) { + __extends(AdaptivePathDropCutter, _super); + function AdaptivePathDropCutter() { + return _super !== null && _super.apply(this, arguments) || this; + } + AdaptivePathDropCutter.prototype.setMinSampling = function (minSampling) { + this.minSampling = minSampling; + }; + AdaptivePathDropCutter.prototype.getCLPoints = function () { + if (!this.actualClass) { + throw new Error('Call run() before getCLPoints()'); + } + return this.actualClass.getCLPoints(); + }; + AdaptivePathDropCutter.prototype.setPath = function (path) { + this.path = path; + }; + AdaptivePathDropCutter.prototype.run = function () { + this.actualClass = new ocl_1.default.AdaptivePathDropCutter(); + if (!this.surface) { + throw new Error('Please set a STLSurface using setSTL()'); + } + if (!this.cutter) { + throw new Error('Please set a MillingCutter using setCutter()'); + } + if (!this.path) { + throw new Error('Please set a Path using setPath()'); + } + this.actualClass.setSTL(this.surface.actualClass); + this.setCutterOnActualClass(); + this.actualClass.setPath(this.path.actualClass); + this.actualClass.setSampling(this.sampling); + this.actualClass.setMinSampling(this.minSampling); + this.actualClass.run(); + }; + return AdaptivePathDropCutter; +}(operation_1.default)); +exports.default = AdaptivePathDropCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivewaterline.d.ts opencamlib-11.10-1/src/nodejslib/lib/adaptivewaterline.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivewaterline.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/adaptivewaterline.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,10 @@ +import Operation from './operation'; +declare class AdaptiveWaterline extends Operation { + protected z?: number; + protected minSampling?: number; + setZ(z: number): void; + setMinSampling(minSampling: number): void; + getLoops(): any; + run(): void; +} +export default AdaptiveWaterline; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivewaterline.js opencamlib-11.10-1/src/nodejslib/lib/adaptivewaterline.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/adaptivewaterline.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/adaptivewaterline.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,55 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var operation_1 = __importDefault(require("./operation")); +var AdaptiveWaterline = /** @class */ (function (_super) { + __extends(AdaptiveWaterline, _super); + function AdaptiveWaterline() { + return _super !== null && _super.apply(this, arguments) || this; + } + AdaptiveWaterline.prototype.setZ = function (z) { + this.z = z; + }; + AdaptiveWaterline.prototype.setMinSampling = function (minSampling) { + this.minSampling = minSampling; + }; + AdaptiveWaterline.prototype.getLoops = function () { + if (!this.actualClass) { + throw new Error('Call run() before getLoops()'); + } + return this.actualClass.getLoops(); + }; + AdaptiveWaterline.prototype.run = function () { + this.actualClass = new ocl_1.default.AdaptiveWaterline(); + if (!this.surface) { + throw new Error('Please set a STLSurface using setSTL()'); + } + if (!this.cutter) { + throw new Error('Please set a MillingCutter using setCutter()'); + } + this.actualClass.setSTL(this.surface.actualClass); + this.setCutterOnActualClass(); + this.actualClass.setZ(this.z); + this.actualClass.setSampling(this.sampling); + this.actualClass.setMinSampling(this.minSampling); + this.actualClass.run(); + }; + return AdaptiveWaterline; +}(operation_1.default)); +exports.default = AdaptiveWaterline; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ballcutter.d.ts opencamlib-11.10-1/src/nodejslib/lib/ballcutter.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ballcutter.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/ballcutter.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,8 @@ +import MillingCutter from './millingcutter'; +declare class BallCutter extends MillingCutter { + d: number; + l: number; + actualClass: any; + constructor(d: number, l: number); +} +export default BallCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ballcutter.js opencamlib-11.10-1/src/nodejslib/lib/ballcutter.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ballcutter.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/ballcutter.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,32 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var millingcutter_1 = __importDefault(require("./millingcutter")); +var BallCutter = /** @class */ (function (_super) { + __extends(BallCutter, _super); + function BallCutter(d, l) { + var _this = _super.call(this) || this; + _this.d = d; + _this.l = l; + _this.actualClass = new ocl_1.default.BallCutter(d, l); + return _this; + } + return BallCutter; +}(millingcutter_1.default)); +exports.default = BallCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/bullcutter.d.ts opencamlib-11.10-1/src/nodejslib/lib/bullcutter.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/bullcutter.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/bullcutter.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,9 @@ +import MillingCutter from './millingcutter'; +declare class BullCutter extends MillingCutter { + d: number; + r: number; + l: number; + actualClass: any; + constructor(d: number, r: number, l: number); +} +export default BullCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/bullcutter.js opencamlib-11.10-1/src/nodejslib/lib/bullcutter.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/bullcutter.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/bullcutter.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,33 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var millingcutter_1 = __importDefault(require("./millingcutter")); +var BullCutter = /** @class */ (function (_super) { + __extends(BullCutter, _super); + function BullCutter(d, r, l) { + var _this = _super.call(this) || this; + _this.d = d; + _this.r = r; + _this.l = l; + _this.actualClass = new ocl_1.default.BullCutter(d, r, l); + return _this; + } + return BullCutter; +}(millingcutter_1.default)); +exports.default = BullCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/conecutter.d.ts opencamlib-11.10-1/src/nodejslib/lib/conecutter.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/conecutter.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/conecutter.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,9 @@ +import MillingCutter from './millingcutter'; +declare class ConeCutter extends MillingCutter { + d: number; + a: number; + l: number; + actualClass: any; + constructor(d: number, a: number, l: number); +} +export default ConeCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/conecutter.js opencamlib-11.10-1/src/nodejslib/lib/conecutter.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/conecutter.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/conecutter.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,33 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var millingcutter_1 = __importDefault(require("./millingcutter")); +var ConeCutter = /** @class */ (function (_super) { + __extends(ConeCutter, _super); + function ConeCutter(d, a, l) { + var _this = _super.call(this) || this; + _this.d = d; + _this.a = a; + _this.l = l; + _this.actualClass = new ocl_1.default.ConeCutter(d, a, l); + return _this; + } + return ConeCutter; +}(millingcutter_1.default)); +exports.default = ConeCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/cylcutter.d.ts opencamlib-11.10-1/src/nodejslib/lib/cylcutter.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/cylcutter.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/cylcutter.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,8 @@ +import MillingCutter from './millingcutter'; +declare class CylCutter extends MillingCutter { + d: number; + l: number; + actualClass: any; + constructor(d: number, l: number); +} +export default CylCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/cylcutter.js opencamlib-11.10-1/src/nodejslib/lib/cylcutter.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/cylcutter.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/cylcutter.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,32 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var millingcutter_1 = __importDefault(require("./millingcutter")); +var CylCutter = /** @class */ (function (_super) { + __extends(CylCutter, _super); + function CylCutter(d, l) { + var _this = _super.call(this) || this; + _this.d = d; + _this.l = l; + _this.actualClass = new ocl_1.default.CylCutter(d, l); + return _this; + } + return CylCutter; +}(millingcutter_1.default)); +exports.default = CylCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/index.d.ts opencamlib-11.10-1/src/nodejslib/lib/index.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/index.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/index.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +export { default as ocl } from './ocl'; +export { default as Waterline } from './waterline'; +export { default as AdaptiveWaterline } from './cylcutter'; +export { default as AdaptivePathDropCutter } from './adaptivepathdropcutter'; +export { default as STLReader } from './stlreader'; +export { default as STLSurf } from './stlsurf'; +export { default as CylCutter } from './cylcutter'; +export { default as BullCutter } from './bullcutter'; +export { default as BallCutter } from './ballcutter'; +export { default as ConeCutter } from './conecutter'; +export { default as Point } from './point'; +export { default as Line } from './line'; +export { default as Path } from './path'; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/index.js opencamlib-11.10-1/src/nodejslib/lib/index.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/index.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/index.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = require("./ocl"); +exports.ocl = ocl_1.default; +var waterline_1 = require("./waterline"); +exports.Waterline = waterline_1.default; +var cylcutter_1 = require("./cylcutter"); +exports.AdaptiveWaterline = cylcutter_1.default; +var adaptivepathdropcutter_1 = require("./adaptivepathdropcutter"); +exports.AdaptivePathDropCutter = adaptivepathdropcutter_1.default; +var stlreader_1 = require("./stlreader"); +exports.STLReader = stlreader_1.default; +var stlsurf_1 = require("./stlsurf"); +exports.STLSurf = stlsurf_1.default; +var cylcutter_2 = require("./cylcutter"); +exports.CylCutter = cylcutter_2.default; +var bullcutter_1 = require("./bullcutter"); +exports.BullCutter = bullcutter_1.default; +var ballcutter_1 = require("./ballcutter"); +exports.BallCutter = ballcutter_1.default; +var conecutter_1 = require("./conecutter"); +exports.ConeCutter = conecutter_1.default; +var point_1 = require("./point"); +exports.Point = point_1.default; +var line_1 = require("./line"); +exports.Line = line_1.default; +var path_1 = require("./path"); +exports.Path = path_1.default; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/line.d.ts opencamlib-11.10-1/src/nodejslib/lib/line.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/line.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/line.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,6 @@ +import Point from './point'; +declare class Line { + actualClass: any; + constructor(p1: Point, p2: Point); +} +export default Line; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/line.js opencamlib-11.10-1/src/nodejslib/lib/line.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/line.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/line.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var Line = /** @class */ (function () { + function Line(p1, p2) { + this.actualClass = new ocl_1.default.Line(p1.actualClass, p2.actualClass); + } + return Line; +}()); +exports.default = Line; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/millingcutter.d.ts opencamlib-11.10-1/src/nodejslib/lib/millingcutter.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/millingcutter.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/millingcutter.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,3 @@ +declare class MillingCutter { +} +export default MillingCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/millingcutter.js opencamlib-11.10-1/src/nodejslib/lib/millingcutter.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/millingcutter.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/millingcutter.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var MillingCutter = /** @class */ (function () { + function MillingCutter() { + } + return MillingCutter; +}()); +exports.default = MillingCutter; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ocl.d.ts opencamlib-11.10-1/src/nodejslib/lib/ocl.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ocl.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/ocl.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,2 @@ +declare const oclLib: any; +export default oclLib; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ocl.js opencamlib-11.10-1/src/nodejslib/lib/ocl.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/ocl.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/ocl.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var platform = 'linux'; +if (process.platform == 'win32') { + platform = 'win32'; +} +else if (process.platform == 'darwin') { + platform = 'darwin'; +} +var buildType = 'Release'; +if (process.env.DEBUG) { + buildType = 'Debug'; +} +var oclLib = require(__dirname + '/../../../build/' + buildType + '/opencamlib.' + platform + '.node'); +exports.default = oclLib; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/operation.d.ts opencamlib-11.10-1/src/nodejslib/lib/operation.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/operation.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/operation.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,17 @@ +import STLSurf from './stlsurf'; +import CylCutter from './cylcutter'; +import BallCutter from './ballcutter'; +import BullCutter from './bullcutter'; +import ConeCutter from './conecutter'; +declare type Cutter = CylCutter | BallCutter | BullCutter | ConeCutter; +declare class Operation { + protected surface?: STLSurf; + protected cutter?: Cutter; + protected sampling?: number; + actualClass: any; + setSTL(surface: STLSurf): void; + setCutter(cutter: Cutter): void; + setSampling(sampling: number): void; + protected setCutterOnActualClass(): void; +} +export default Operation; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/operation.js opencamlib-11.10-1/src/nodejslib/lib/operation.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/operation.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/operation.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,40 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var cylcutter_1 = __importDefault(require("./cylcutter")); +var ballcutter_1 = __importDefault(require("./ballcutter")); +var bullcutter_1 = __importDefault(require("./bullcutter")); +var conecutter_1 = __importDefault(require("./conecutter")); +var Operation = /** @class */ (function () { + function Operation() { + } + Operation.prototype.setSTL = function (surface) { + this.surface = surface; + }; + Operation.prototype.setCutter = function (cutter) { + this.cutter = cutter; + }; + Operation.prototype.setSampling = function (sampling) { + this.sampling = sampling; + }; + Operation.prototype.setCutterOnActualClass = function () { + if (!this.cutter) + return; + if (this.cutter instanceof cylcutter_1.default) { + this.actualClass.setCylCutter(this.cutter.actualClass); + } + else if (this.cutter instanceof ballcutter_1.default) { + this.actualClass.setBallCutter(this.cutter.actualClass); + } + else if (this.cutter instanceof bullcutter_1.default) { + this.actualClass.setBullCutter(this.cutter.actualClass); + } + else if (this.cutter instanceof conecutter_1.default) { + this.actualClass.setConeCutter(this.cutter.actualClass); + } + }; + return Operation; +}()); +exports.default = Operation; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/path.d.ts opencamlib-11.10-1/src/nodejslib/lib/path.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/path.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/path.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,7 @@ +import Line from './line'; +declare class Path { + actualClass: any; + constructor(); + append(line: Line): void; +} +export default Path; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/path.js opencamlib-11.10-1/src/nodejslib/lib/path.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/path.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/path.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,16 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var Path = /** @class */ (function () { + function Path() { + this.actualClass = new ocl_1.default.Path(); + } + Path.prototype.append = function (line) { + this.actualClass.append(line.actualClass); + }; + return Path; +}()); +exports.default = Path; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/point.d.ts opencamlib-11.10-1/src/nodejslib/lib/point.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/point.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/point.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,5 @@ +declare class Point { + actualClass: any; + constructor(x: number, y: number, z: number); +} +export default Point; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/point.js opencamlib-11.10-1/src/nodejslib/lib/point.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/point.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/point.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var Point = /** @class */ (function () { + function Point(x, y, z) { + this.actualClass = new ocl_1.default.Point(x, y, z); + } + return Point; +}()); +exports.default = Point; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlreader.d.ts opencamlib-11.10-1/src/nodejslib/lib/stlreader.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlreader.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/stlreader.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,6 @@ +import STLSurf from './stlsurf'; +declare class STLReader { + actualClass: any; + constructor(filepath: string, surface: STLSurf); +} +export default STLReader; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlreader.js opencamlib-11.10-1/src/nodejslib/lib/stlreader.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlreader.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/stlreader.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var STLReader = /** @class */ (function () { + function STLReader(filepath, surface) { + this.actualClass = new ocl_1.default.STLReader(filepath, surface.actualClass); + } + return STLReader; +}()); +exports.default = STLReader; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlsurf.d.ts opencamlib-11.10-1/src/nodejslib/lib/stlsurf.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlsurf.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/stlsurf.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,5 @@ +declare class STLSurf { + actualClass: any; + constructor(); +} +export default STLSurf; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlsurf.js opencamlib-11.10-1/src/nodejslib/lib/stlsurf.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/stlsurf.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/stlsurf.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var STLSurf = /** @class */ (function () { + function STLSurf() { + this.actualClass = new ocl_1.default.STLSurf(); + } + return STLSurf; +}()); +exports.default = STLSurf; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/waterline.d.ts opencamlib-11.10-1/src/nodejslib/lib/waterline.d.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/waterline.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/waterline.d.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,8 @@ +import Operation from './operation'; +declare class Waterline extends Operation { + protected z?: number; + setZ(z: number): void; + getLoops(): any; + run(): void; +} +export default Waterline; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/waterline.js opencamlib-11.10-1/src/nodejslib/lib/waterline.js --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/lib/waterline.js 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/lib/waterline.js 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,51 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ocl_1 = __importDefault(require("./ocl")); +var operation_1 = __importDefault(require("./operation")); +var Waterline = /** @class */ (function (_super) { + __extends(Waterline, _super); + function Waterline() { + return _super !== null && _super.apply(this, arguments) || this; + } + Waterline.prototype.setZ = function (z) { + this.z = z; + }; + Waterline.prototype.getLoops = function () { + if (!this.actualClass) { + throw new Error('Call run() before getLoops()'); + } + return this.actualClass.getLoops(); + }; + Waterline.prototype.run = function () { + this.actualClass = new ocl_1.default.Waterline(); + if (!this.surface) { + throw new Error('Please set a STLSurface using setSTL()'); + } + if (!this.cutter) { + throw new Error('Please set a MillingCutter using setCutter()'); + } + this.actualClass.setSTL(this.surface.actualClass); + this.setCutterOnActualClass(); + this.actualClass.setZ(this.z); + this.actualClass.setSampling(this.sampling); + this.actualClass.run(); + }; + return Waterline; +}(operation_1.default)); +exports.default = Waterline; diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/line_js.cpp opencamlib-11.10-1/src/nodejslib/line_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/line_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/line_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,38 @@ +#include "line.hpp" +#include "line_js.hpp" +#include "point_js.hpp" + +Napi::FunctionReference LineJS::constructor; + +Napi::Object LineJS::Init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "Line", { + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("Line", func); + return exports; +} + +LineJS::LineJS(const Napi::CallbackInfo& info) : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + int length = info.Length(); + if (length == 1) { + Napi::TypeError::New(env, "Provide at least 2 arguments").ThrowAsJavaScriptException(); + } + if (length == 2) { + PointJS* p1in = Napi::ObjectWrap::Unwrap(info[0].As()); + PointJS* p2in = Napi::ObjectWrap::Unwrap(info[1].As()); + ocl::Point* p1 = p1in->GetInternalInstance(); + ocl::Point* p2 = p2in->GetInternalInstance(); + actualClass_ = ocl::Line(*p1, *p2); + } +} + +ocl::Line* LineJS::GetInternalInstance() { + return &actualClass_; +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/line_js.hpp opencamlib-11.10-1/src/nodejslib/line_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/line_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/line_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +#include +#include "line.hpp" + +class LineJS : public Napi::ObjectWrap { + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); // Init function for setting the export key to JS + LineJS(const Napi::CallbackInfo& info); // Constructor to initialise + ocl::Line* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; //reference to store the class definition that needs to be exported to JS + ocl::Line actualClass_; // Internal instance of line used to perform actual operations. +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/nodejslib.cmake opencamlib-11.10-1/src/nodejslib/nodejslib.cmake --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/nodejslib.cmake 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/nodejslib.cmake 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,63 @@ +message(STATUS "Will build node.js library") + +if(CMAKE_BUILD_TYPE EQUAL "Debug") + message(STATUS "Debug build, passing -g flag to compiler to emit source location (handy for debugging with lldb)") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") +endif() + +find_package(Boost) +include_directories(${Boost_INCLUDE_DIRS}) +include_directories(${OpenCamLib_SOURCE_DIR}/../node_modules/node-addon-api) +include_directories(${CMAKE_JS_INC}) + +# include dirs +include_directories( ${OpenCamLib_SOURCE_DIR}/cutters ) +include_directories( ${OpenCamLib_SOURCE_DIR}/geo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/algo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/dropcutter ) +include_directories( ${OpenCamLib_SOURCE_DIR}/common ) +include_directories( ${OpenCamLib_SOURCE_DIR} ) + +include_directories(${OpenCamLib_SOURCE_DIR}/nodejslib) + +add_library(opencamlib + SHARED + ${OCL_GEO_SRC} + ${OCL_CUTTER_SRC} + ${OCL_DROPCUTTER_SRC} + ${OCL_ALGO_SRC} + ${OCL_COMMON_SRC} + ${OpenCamLib_SOURCE_DIR}/nodejslib/point_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/triangle_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/bbox_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/cylcutter_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/line_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/path_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/stlsurf_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/stlreader_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/waterline_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/adaptivepathdropcutter_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/adaptivewaterline_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/cylcutter_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/ballcutter_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/bullcutter_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/conecutter_js.cpp + ${OpenCamLib_SOURCE_DIR}/nodejslib/nodejslib.cpp +) + +target_link_libraries( + opencamlib + ${Boost_LIBRARIES} + ${PYTHON_LIBRARIES} + ${CMAKE_JS_LIB} +) + +if(WIN32) + set(NODE_LIB_POSTFIX ".win32.node") +elseif(APPLE) + set(NODE_LIB_POSTFIX ".darwin.node") +else() + set(NODE_LIB_POSTFIX ".linux.node") +endif() + +set_target_properties(opencamlib PROPERTIES PREFIX "" SUFFIX ${NODE_LIB_POSTFIX}) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/nodejslib.cpp opencamlib-11.10-1/src/nodejslib/nodejslib.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/nodejslib.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/nodejslib.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,44 @@ +#include + +#include "point_js.hpp" +#include "triangle_js.hpp" +#include "bbox_js.hpp" +#include "path_js.hpp" +#include "line_js.hpp" + +#include "stlsurf_js.hpp" +#include "stlreader_js.hpp" + +#include "waterline_js.hpp" +#include "adaptivepathdropcutter_js.hpp" +#include "adaptivewaterline_js.hpp" + +#include "cylcutter_js.hpp" +#include "ballcutter_js.hpp" +#include "bullcutter_js.hpp" +#include "conecutter_js.hpp" + +using namespace Napi; + +Napi::Object InitAll(Napi::Env env, Napi::Object exports) { + PointJS::Init(env, exports); + TriangleJS::Init(env, exports); + BboxJS::Init(env, exports); + PathJS::Init(env, exports); + LineJS::Init(env, exports); + + WaterlineJS::Init(env, exports); + AdaptivePathDropCutterJS::Init(env, exports); + AdaptiveWaterlineJS::Init(env, exports); + + STLSurfJS::Init(env, exports); + STLReaderJS::Init(env, exports); + + CylCutterJS::Init(env, exports); + BallCutterJS::Init(env, exports); + BullCutterJS::Init(env, exports); + ConeCutterJS::Init(env, exports); + return exports; +} + +NODE_API_MODULE(opencamlib, InitAll) \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/path_js.cpp opencamlib-11.10-1/src/nodejslib/path_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/path_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/path_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,40 @@ +#include "path.hpp" +#include "path_js.hpp" +#include "line_js.hpp" + +Napi::FunctionReference PathJS::constructor; + +Napi::Object PathJS::Init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "Path", { + InstanceMethod("append", &PathJS::append), + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("Path", func); + return exports; +} + +PathJS::PathJS(const Napi::CallbackInfo& info) : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + actualClass_ = ocl::Path(); +} + +ocl::Path* PathJS::GetInternalInstance() { + return &actualClass_; +} + +void PathJS::append(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + if (info.Length() != 1) { + Napi::TypeError::New(env, "Argument expected").ThrowAsJavaScriptException(); + } + LineJS* ljs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::Line* ocll = ljs->GetInternalInstance(); + actualClass_.append(*ocll); +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/path_js.hpp opencamlib-11.10-1/src/nodejslib/path_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/path_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/path_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +#include +#include "path.hpp" + +class PathJS : public Napi::ObjectWrap { + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); // Init function for setting the export key to JS + PathJS(const Napi::CallbackInfo& info); // Constructor to initialise + ocl::Path* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; //reference to store the class definition that needs to be exported to JS + void append(const Napi::CallbackInfo& info); // wrapped add function + ocl::Path actualClass_; // Internal instance of path used to perform actual operations. +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/point_js.cpp opencamlib-11.10-1/src/nodejslib/point_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/point_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/point_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,64 @@ +#include "point.hpp" +#include "point_js.hpp" + +Napi::FunctionReference PointJS::constructor; + +Napi::Object PointJS::Init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "Point", { + InstanceMethod("add", &PointJS::Add), + InstanceAccessor("x", &PointJS::GetX, &PointJS::SetX) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("Point", func); + return exports; +} + +Napi::Value PointJS::GetX(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + return Napi::Number::New(env, actualClass_.x); +} + +void PointJS::SetX(const Napi::CallbackInfo& info, const Napi::Value& value) { + Napi::Number x = info[0].As(); + actualClass_.x = x.DoubleValue(); +} + +PointJS::PointJS(const Napi::CallbackInfo& info) : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + int length = info.Length(); + if (length == 1) { + Napi::TypeError::New(env, "Provide at least 2 arguments").ThrowAsJavaScriptException(); + } + if (length == 2) { + Napi::Number x = info[0].As(); + Napi::Number y = info[1].As(); + actualClass_ = ocl::Point(x.DoubleValue(), y.DoubleValue()); + } else if (length == 3) { + Napi::Number x = info[0].As(); + Napi::Number y = info[1].As(); + Napi::Number z = info[2].As(); + actualClass_ = ocl::Point(x.DoubleValue(), y.DoubleValue(), z.DoubleValue()); + } +} + +ocl::Point* PointJS::GetInternalInstance() { + return &actualClass_; +} + +void PointJS::Add(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + if (info.Length() != 1) { + Napi::TypeError::New(env, "Argument expected").ThrowAsJavaScriptException(); + } + PointJS* pjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::Point* oclp = pjs->GetInternalInstance(); + ocl::Point p = *oclp; + actualClass_.operator+=(ocl::Point(p.x, p.y, p.z)); +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/point_js.hpp opencamlib-11.10-1/src/nodejslib/point_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/point_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/point_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,16 @@ +#include +#include "point.hpp" + +class PointJS : public Napi::ObjectWrap { + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); // Init function for setting the export key to JS + PointJS(const Napi::CallbackInfo& info); // Constructor to initialise + ocl::Point* GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; //reference to store the class definition that needs to be exported to JS + Napi::Value GetX(const Napi::CallbackInfo& info); + void SetX(const Napi::CallbackInfo& info, const Napi::Value& value); + void Add(const Napi::CallbackInfo& info); // wrapped add function + ocl::Point actualClass_; // Internal instance of point used to perform actual operations. +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/adaptivepathdropcutter.ts opencamlib-11.10-1/src/nodejslib/src/adaptivepathdropcutter.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/adaptivepathdropcutter.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/adaptivepathdropcutter.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,45 @@ +import ocl from './ocl' + +import Operation from './operation' +import Path from './path' + +class AdaptivePathDropCutter extends Operation { + protected minSampling?: number + protected path?: Path + + setMinSampling(minSampling: number) { + this.minSampling = minSampling + } + + getCLPoints() { + if (!this.actualClass) { + throw new Error('Call run() before getCLPoints()') + } + return this.actualClass.getCLPoints() + } + + setPath(path: Path) { + this.path = path + } + + run() { + this.actualClass = new ocl.AdaptivePathDropCutter() + if (!this.surface) { + throw new Error('Please set a STLSurface using setSTL()') + } + if (!this.cutter) { + throw new Error('Please set a MillingCutter using setCutter()') + } + if (!this.path) { + throw new Error('Please set a Path using setPath()') + } + this.actualClass.setSTL(this.surface.actualClass) + this.setCutterOnActualClass() + this.actualClass.setPath(this.path.actualClass) + this.actualClass.setSampling(this.sampling) + this.actualClass.setMinSampling(this.minSampling) + this.actualClass.run() + } +} + +export default AdaptivePathDropCutter \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/adaptivewaterline.ts opencamlib-11.10-1/src/nodejslib/src/adaptivewaterline.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/adaptivewaterline.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/adaptivewaterline.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,41 @@ +import ocl from './ocl' + +import Operation from './operation'; + +class AdaptiveWaterline extends Operation { + protected z?: number + protected minSampling?: number + + setZ(z: number) { + this.z = z + } + + setMinSampling(minSampling: number) { + this.minSampling = minSampling + } + + getLoops() { + if (!this.actualClass) { + throw new Error('Call run() before getLoops()') + } + return this.actualClass.getLoops() + } + + run() { + this.actualClass = new ocl.AdaptiveWaterline() + if (!this.surface) { + throw new Error('Please set a STLSurface using setSTL()') + } + if (!this.cutter) { + throw new Error('Please set a MillingCutter using setCutter()') + } + this.actualClass.setSTL(this.surface.actualClass) + this.setCutterOnActualClass() + this.actualClass.setZ(this.z) + this.actualClass.setSampling(this.sampling) + this.actualClass.setMinSampling(this.minSampling) + this.actualClass.run() + } +} + +export default AdaptiveWaterline \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/ballcutter.ts opencamlib-11.10-1/src/nodejslib/src/ballcutter.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/ballcutter.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/ballcutter.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +import ocl from './ocl' + +import MillingCutter from './millingcutter' + +class BallCutter extends MillingCutter { + actualClass: any + + constructor(public d: number, public l: number) { + super() + this.actualClass = new ocl.BallCutter(d, l) + } +} + +export default BallCutter \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/bullcutter.ts opencamlib-11.10-1/src/nodejslib/src/bullcutter.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/bullcutter.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/bullcutter.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +import ocl from './ocl' + +import MillingCutter from './millingcutter' + +class BullCutter extends MillingCutter { + actualClass: any + + constructor(public d: number, public r: number, public l: number) { + super() + this.actualClass = new ocl.BullCutter(d, r, l) + } +} + +export default BullCutter \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/conecutter.ts opencamlib-11.10-1/src/nodejslib/src/conecutter.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/conecutter.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/conecutter.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +import ocl from './ocl' + +import MillingCutter from './millingcutter' + +class ConeCutter extends MillingCutter { + actualClass: any + + constructor(public d: number, public a: number, public l: number) { + super() + this.actualClass = new ocl.ConeCutter(d, a, l) + } +} + +export default ConeCutter \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/cylcutter.ts opencamlib-11.10-1/src/nodejslib/src/cylcutter.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/cylcutter.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/cylcutter.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +import ocl from './ocl' + +import MillingCutter from './millingcutter' + +class CylCutter extends MillingCutter { + actualClass: any + + constructor(public d: number, public l: number) { + super() + this.actualClass = new ocl.CylCutter(d, l) + } +} + +export default CylCutter \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/index.ts opencamlib-11.10-1/src/nodejslib/src/index.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/index.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/index.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +export { default as ocl } from './ocl' +export { default as Waterline } from './waterline' +export { default as AdaptiveWaterline } from './cylcutter' +export { default as AdaptivePathDropCutter } from './adaptivepathdropcutter' +export { default as STLReader } from './stlreader' +export { default as STLSurf } from './stlsurf' +export { default as CylCutter } from './cylcutter' +export { default as BullCutter } from './bullcutter' +export { default as BallCutter } from './ballcutter' +export { default as ConeCutter } from './conecutter' +export { default as Point } from './point' +export { default as Line } from './line' +export { default as Path } from './path' \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/line.ts opencamlib-11.10-1/src/nodejslib/src/line.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/line.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/line.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +import ocl from './ocl' + +import Point from './point' + +class Line { + actualClass: any + + constructor(p1: Point, p2: Point) { + this.actualClass = new ocl.Line(p1.actualClass, p2.actualClass) + } +} + +export default Line \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/millingcutter.ts opencamlib-11.10-1/src/nodejslib/src/millingcutter.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/millingcutter.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/millingcutter.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,5 @@ +class MillingCutter { + +} + +export default MillingCutter \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/ocl.ts opencamlib-11.10-1/src/nodejslib/src/ocl.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/ocl.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/ocl.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +var platform = 'linux' +if (process.platform == 'win32') { + platform = 'win32' +} else if (process.platform == 'darwin') { + platform = 'darwin' +} +var buildType = 'Release' +if (process.env.DEBUG) { + buildType = 'Debug' +} + +const oclLib = require(__dirname + '/../../../build/' + buildType + '/opencamlib.' + platform + '.node') + +export default oclLib \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/operation.ts opencamlib-11.10-1/src/nodejslib/src/operation.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/operation.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/operation.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,43 @@ +import ocl from './ocl' + +import STLSurf from './stlsurf' +import CylCutter from './cylcutter' +import BallCutter from './ballcutter' +import BullCutter from './bullcutter' +import ConeCutter from './conecutter' + +type Cutter = CylCutter | BallCutter | BullCutter | ConeCutter + +class Operation { + protected surface?: STLSurf + protected cutter?: Cutter + protected sampling?: number + public actualClass: any + + setSTL(surface: STLSurf) { + this.surface = surface + } + + setCutter(cutter: Cutter) { + this.cutter = cutter + } + + setSampling(sampling: number) { + this.sampling = sampling + } + + protected setCutterOnActualClass() { + if (!this.cutter) return + if (this.cutter instanceof CylCutter) { + this.actualClass.setCylCutter(this.cutter.actualClass) + } else if (this.cutter instanceof BallCutter) { + this.actualClass.setBallCutter(this.cutter.actualClass) + } else if (this.cutter instanceof BullCutter) { + this.actualClass.setBullCutter(this.cutter.actualClass) + } else if (this.cutter instanceof ConeCutter) { + this.actualClass.setConeCutter(this.cutter.actualClass) + } + } +} + +export default Operation \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/path.ts opencamlib-11.10-1/src/nodejslib/src/path.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/path.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/path.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,17 @@ +import ocl from './ocl' + +import Line from './line' + +class Path { + actualClass: any + + constructor() { + this.actualClass = new ocl.Path() + } + + append(line: Line) { + this.actualClass.append(line.actualClass) + } +} + +export default Path \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/point.ts opencamlib-11.10-1/src/nodejslib/src/point.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/point.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/point.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,11 @@ +import ocl from './ocl' + +class Point { + actualClass: any + + constructor(x: number, y: number, z: number) { + this.actualClass = new ocl.Point(x, y, z) + } +} + +export default Point \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/stlreader.ts opencamlib-11.10-1/src/nodejslib/src/stlreader.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/stlreader.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/stlreader.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,13 @@ +import ocl from './ocl' + +import STLSurf from './stlsurf' + +class STLReader { + actualClass: any + + constructor(filepath: string, surface: STLSurf) { + this.actualClass = new ocl.STLReader(filepath, surface.actualClass) + } +} + +export default STLReader \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/stlsurf.ts opencamlib-11.10-1/src/nodejslib/src/stlsurf.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/stlsurf.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/stlsurf.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,11 @@ +import ocl from './ocl' + +class STLSurf { + actualClass: any + + constructor() { + this.actualClass = new ocl.STLSurf() + } +} + +export default STLSurf \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/waterline.ts opencamlib-11.10-1/src/nodejslib/src/waterline.ts --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/src/waterline.ts 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/src/waterline.ts 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,35 @@ +import ocl from './ocl' + +import Operation from './operation'; + +class Waterline extends Operation { + protected z?: number + + setZ(z: number) { + this.z = z + } + + getLoops() { + if (!this.actualClass) { + throw new Error('Call run() before getLoops()') + } + return this.actualClass.getLoops() + } + + run() { + this.actualClass = new ocl.Waterline() + if (!this.surface) { + throw new Error('Please set a STLSurface using setSTL()') + } + if (!this.cutter) { + throw new Error('Please set a MillingCutter using setCutter()') + } + this.actualClass.setSTL(this.surface.actualClass) + this.setCutterOnActualClass() + this.actualClass.setZ(this.z) + this.actualClass.setSampling(this.sampling) + this.actualClass.run() + } +} + +export default Waterline \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlreader_js.cpp opencamlib-11.10-1/src/nodejslib/stlreader_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlreader_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/stlreader_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,38 @@ +#include +#include "stlreader.hpp" +#include "stlsurf.hpp" +#include "stlreader_js.hpp" +#include "stlsurf_js.hpp" + +Napi::FunctionReference STLReaderJS::constructor; + +Napi::Object STLReaderJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "STLReader", { + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("STLReader", func); + return exports; +} + +STLReaderJS::STLReaderJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int length = info.Length(); + if (length == 1) + { + Napi::TypeError::New(env, "Provide at least 2 arguments").ThrowAsJavaScriptException(); + } + Napi::String filepath = info[0].As(); + STLSurfJS *surface = Napi::ObjectWrap::Unwrap(info[1].As()); + ocl::STLSurf *surfaceInstance = surface->GetInternalInstance(); + std::wstring filepathWstring; + std::string filepathStr = filepath.Utf8Value(); + filepathWstring.assign(filepathStr.begin(), filepathStr.end()); + ocl::STLReader(filepathWstring, *surfaceInstance); +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlreader_js.hpp opencamlib-11.10-1/src/nodejslib/stlreader_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlreader_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/stlreader_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,12 @@ +#include +#include "stlreader.hpp" + +class STLReaderJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + STLReaderJS(const Napi::CallbackInfo &info); + + private: + static Napi::FunctionReference constructor; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlsurf_js.cpp opencamlib-11.10-1/src/nodejslib/stlsurf_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlsurf_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/stlsurf_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,65 @@ +#include "triangle.hpp" +#include "stlsurf.hpp" +#include "stlsurf_js.hpp" + +Napi::FunctionReference STLSurfJS::constructor; + +Napi::Object STLSurfJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "STLSurf", { + InstanceMethod("getTriangles", &STLSurfJS::getTriangles) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("STLSurf", func); + return exports; +} + +STLSurfJS::STLSurfJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + actualClass_ = ocl::STLSurf(); +} + +ocl::STLSurf* STLSurfJS::GetInternalInstance() +{ + return &actualClass_; +} + +Napi::Value STLSurfJS::getTriangles(const Napi::CallbackInfo &info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Array arr = Napi::Array::New(env); + int i = 0; + int a = 0; + int b = 1; + int c = 2; + std::list::iterator it; + for (it = actualClass_.tris.begin(); it != actualClass_.tris.end(); ++it) + { + Napi::Array points = Napi::Array::New(env); + Napi::Array p1 = Napi::Array::New(env); + p1.Set(a, Napi::Number::New(env, it->p[0].x)); + p1.Set(b, Napi::Number::New(env, it->p[0].y)); + p1.Set(c, Napi::Number::New(env, it->p[0].z)); + points.Set(a, p1); + Napi::Array p2 = Napi::Array::New(env); + p2.Set(a, Napi::Number::New(env, it->p[1].x)); + p2.Set(b, Napi::Number::New(env, it->p[1].y)); + p2.Set(c, Napi::Number::New(env, it->p[1].z)); + points.Set(b, p2); + Napi::Array p3 = Napi::Array::New(env); + p3.Set(a, Napi::Number::New(env, it->p[2].x)); + p3.Set(b, Napi::Number::New(env, it->p[2].y)); + p3.Set(c, Napi::Number::New(env, it->p[2].z)); + points.Set(c, p3); + arr.Set(i, points); + i++; + } + return arr; +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlsurf_js.hpp opencamlib-11.10-1/src/nodejslib/stlsurf_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/stlsurf_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/stlsurf_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +#include +#include "stlsurf.hpp" + +class STLSurfJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + STLSurfJS(const Napi::CallbackInfo &info); + ocl::STLSurf* GetInternalInstance(); + Napi::Value getTriangles(const Napi::CallbackInfo &info); + private: + static Napi::FunctionReference constructor; + ocl::STLSurf actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/triangle_js.cpp opencamlib-11.10-1/src/nodejslib/triangle_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/triangle_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/triangle_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,28 @@ +#include "triangle.hpp" +#include "triangle_js.hpp" + +Napi::FunctionReference TriangleJS::constructor; + +Napi::Object TriangleJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "Triangle", {}); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("Triangle", func); + return exports; +} + +TriangleJS::TriangleJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + actualClass_ = ocl::Triangle(); +} + +ocl::Triangle* TriangleJS::GetInternalInstance() +{ + return &actualClass_; +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/triangle_js.hpp opencamlib-11.10-1/src/nodejslib/triangle_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/triangle_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/triangle_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,14 @@ +#include +#include "triangle.hpp" + +class TriangleJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + TriangleJS(const Napi::CallbackInfo &info); + ocl::Triangle *GetInternalInstance(); + + private: + static Napi::FunctionReference constructor; + ocl::Triangle actualClass_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/tsconfig.json opencamlib-11.10-1/src/nodejslib/tsconfig.json --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/tsconfig.json 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/tsconfig.json 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,61 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./lib", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "types": ["node"], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": ["src/**/*"] +} \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/waterline_js.cpp opencamlib-11.10-1/src/nodejslib/waterline_js.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/waterline_js.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/waterline_js.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,124 @@ +#include "waterline_js.hpp" +#include "stlsurf_js.hpp" +#include "point.hpp" +#include "cylcutter_js.hpp" +#include "ballcutter_js.hpp" +#include "bullcutter_js.hpp" +#include "conecutter_js.hpp" + +Napi::FunctionReference WaterlineJS::constructor; + +Napi::Object WaterlineJS::Init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + + Napi::Function func = DefineClass(env, "Waterline", { + InstanceMethod("setZ", &WaterlineJS::setZ), + InstanceMethod("setSTL", &WaterlineJS::setSTL), + InstanceMethod("setCylCutter", &WaterlineJS::setCylCutter), + InstanceMethod("setBallCutter", &WaterlineJS::setBallCutter), + InstanceMethod("setBullCutter", &WaterlineJS::setBullCutter), + InstanceMethod("setConeCutter", &WaterlineJS::setConeCutter), + InstanceMethod("setSampling", &WaterlineJS::setSampling), + InstanceMethod("run", &WaterlineJS::run), + InstanceMethod("getLoops", &WaterlineJS::getLoops) + }); + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + + exports.Set("Waterline", func); + return exports; +} + +WaterlineJS::WaterlineJS(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + actualClass_ = ocl::Waterline(); +} + +ocl::Waterline* WaterlineJS::GetInternalInstance() +{ + return &actualClass_; +} + +void WaterlineJS::setZ(const Napi::CallbackInfo &info) +{ + Napi::Number z = info[0].As(); + actualClass_.setZ(z.DoubleValue()); +} + +void WaterlineJS::setSTL(const Napi::CallbackInfo &info) +{ + STLSurfJS *sjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::STLSurf *surface = sjs->GetInternalInstance(); + actualClass_.setSTL(*surface); +} + +void WaterlineJS::setCylCutter(const Napi::CallbackInfo &info) +{ + CylCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::CylCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void WaterlineJS::setBallCutter(const Napi::CallbackInfo &info) +{ + BallCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::BallCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void WaterlineJS::setBullCutter(const Napi::CallbackInfo &info) +{ + BullCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::BullCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void WaterlineJS::setConeCutter(const Napi::CallbackInfo &info) +{ + ConeCutterJS *cjs = Napi::ObjectWrap::Unwrap(info[0].As()); + ocl::ConeCutter *cutter = cjs->GetInternalInstance(); + actualClass_.setCutter(cutter); +} + +void WaterlineJS::setSampling(const Napi::CallbackInfo &info) +{ + Napi::Number s = info[0].As(); + actualClass_.setSampling(s.DoubleValue()); +} + +void WaterlineJS::run(const Napi::CallbackInfo &info) +{ + actualClass_.run(); +} + +Napi::Value WaterlineJS::getLoops(const Napi::CallbackInfo &info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Array result = Napi::Array::New(env); + std::vector> loops = actualClass_.getLoops(); + int x = 0; + int y = 1; + int z = 2; + int loopI = 0; + for (auto & loop : loops) + { + Napi::Array loopArr = Napi::Array::New(env); + int pointI = 0; + for (auto &point : loop) + { + Napi::Array pointArr = Napi::Array::New(env); + pointArr.Set(x, Napi::Number::New(env, point.x)); + pointArr.Set(y, Napi::Number::New(env, point.y)); + pointArr.Set(z, Napi::Number::New(env, point.z)); + loopArr.Set(pointI, pointArr); + pointI++; + } + result.Set(loopI, loopArr); + loopI++; + } + return result; +} diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/waterline_js.hpp opencamlib-11.10-1/src/nodejslib/waterline_js.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/nodejslib/waterline_js.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/nodejslib/waterline_js.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,24 @@ +#include +#include "waterline.hpp" +#include "stlsurf.hpp" + +class WaterlineJS : public Napi::ObjectWrap +{ + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + WaterlineJS(const Napi::CallbackInfo &info); + ocl::Waterline* GetInternalInstance(); + void setZ(const Napi::CallbackInfo &info); + void setSTL(const Napi::CallbackInfo &info); + void setCylCutter(const Napi::CallbackInfo &info); + void setBallCutter(const Napi::CallbackInfo &info); + void setBullCutter(const Napi::CallbackInfo &info); + void setConeCutter(const Napi::CallbackInfo &info); + void setSampling(const Napi::CallbackInfo &info); + void run(const Napi::CallbackInfo &info); + Napi::Value getLoops(const Napi::CallbackInfo &info); + private: + static Napi::FunctionReference constructor; + ocl::Waterline actualClass_; + ocl::STLSurf surface_; +}; \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_algo.cpp opencamlib-11.10-1/src/ocl_algo.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_algo.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/ocl_algo.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,200 +0,0 @@ -/* $Id$ - * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#include - - -#include "batchpushcutter_py.hpp" -#include "fiber_py.hpp" -#include "weave_py.hpp" -#include "waterline_py.hpp" -#include "adaptivewaterline_py.hpp" -#include "lineclfilter_py.hpp" -#include "numeric.hpp" - -#include "zigzag.hpp" - -#include "clsurface.hpp" - -#include "tsp.hpp" // fixme: contains python - -/* - * Python wrapping of octree and related classes - */ - -using namespace ocl; - -namespace bp = boost::python; - -void export_algo() { - bp::def("eps", eps); // machine epsilon, see numeric.cpp - bp::def("epsF", epsF); - bp::def("epsD", epsD); - bp::class_("ZigZag") - .def("run", &ZigZag::run) - .def("setDirection", &ZigZag::setDirection) - .def("setOrigin", &ZigZag::setOrigin) - .def("setStepOver", &ZigZag::setStepOver) - .def("addPoint", &ZigZag::addPoint) - .def("getOutput", &ZigZag::getOutput) - .def("__str__", &ZigZag::str) - ; - - bp::class_("BatchPushCutter_base") - ; - bp::class_ >("BatchPushCutter") - .def("run", &BatchPushCutter_py::run) - .def("setSTL", &BatchPushCutter_py::setSTL) - .def("setCutter", &BatchPushCutter_py::setCutter) - .def("setThreads", &BatchPushCutter_py::setThreads) - .def("appendFiber", &BatchPushCutter_py::appendFiber) - .def("getOverlapTriangles", &BatchPushCutter_py::getOverlapTriangles) - .def("getCLPoints", &BatchPushCutter_py::getCLPoints) - .def("getFibers", &BatchPushCutter_py::getFibers_py) - .def("getCalls", &BatchPushCutter_py::getCalls) - .def("setThreads", &BatchPushCutter_py::setThreads) - .def("getThreads", &BatchPushCutter_py::getThreads) - .def("setBucketSize", &BatchPushCutter_py::setBucketSize) - .def("getBucketSize", &BatchPushCutter_py::getBucketSize) - .def("setXDirection", &BatchPushCutter_py::setXDirection) - .def("setYDirection", &BatchPushCutter_py::setYDirection) - ; - bp::class_("Interval") - .def(bp::init()) - .def_readonly("upper", &Interval::upper ) - .def_readonly("lower", &Interval::lower ) - .def_readonly("lower_cc", &Interval::lower_cc ) - .def_readonly("upper_cc", &Interval::upper_cc ) - .def("updateUpper", &Interval::updateUpper ) - .def("updateLower", &Interval::updateLower ) - .def("empty", &Interval::empty ) - .def("__str__", &Interval::str ) - ; - bp::class_("Fiber_base") - ; - bp::class_ >("Fiber") - .def(bp::init()) - .def_readonly("p1", &Fiber_py::p1) - .def_readonly("p2", &Fiber_py::p2) - .def_readonly("dir", &Fiber_py::dir) - .def("addInterval", &Fiber_py::addInterval) - .def("point", &Fiber_py::point) - .def("printInts", &Fiber_py::printInts) - .def("getInts", &Fiber_py::getInts) - ; - bp::class_("Waterline_base") - ; - bp::class_ >("Waterline") - .def("setCutter", &Waterline_py::setCutter) - .def("setSTL", &Waterline_py::setSTL) - .def("setZ", &Waterline_py::setZ) - .def("setSampling", &Waterline_py::setSampling) - .def("run", &Waterline_py::run) - .def("run2", &Waterline_py::run2) - .def("reset", &Waterline_py::reset) - .def("getLoops", &Waterline_py::py_getLoops) - .def("setThreads", &Waterline_py::setThreads) - .def("getThreads", &Waterline_py::getThreads) - .def("getXFibers", &Waterline_py::py_getXFibers) - .def("getYFibers", &Waterline_py::py_getYFibers) - - ; - bp::class_("AdaptiveWaterline_base") - ; - bp::class_ >("AdaptiveWaterline") - .def("setCutter", &AdaptiveWaterline_py::setCutter) - .def("setSTL", &AdaptiveWaterline_py::setSTL) - .def("setZ", &AdaptiveWaterline_py::setZ) - .def("setSampling", &AdaptiveWaterline_py::setSampling) - .def("setMinSampling", &AdaptiveWaterline_py::setMinSampling) - .def("run", &AdaptiveWaterline_py::run) - .def("run2", &AdaptiveWaterline_py::run2) - .def("reset", &AdaptiveWaterline_py::reset) - //.def("run2", &AdaptiveWaterline_py::run2) // uses Weave::build2() - .def("getLoops", &AdaptiveWaterline_py::py_getLoops) - .def("setThreads", &AdaptiveWaterline_py::setThreads) - .def("getThreads", &AdaptiveWaterline_py::getThreads) - .def("getXFibers", &AdaptiveWaterline_py::getXFibers) - .def("getYFibers", &AdaptiveWaterline_py::getYFibers) - ; - - bp::enum_("WeaveVertexType") - .value("CL", weave::CL) - .value("CL_DONE",weave::CL_DONE) - .value("ADJ",weave::ADJ) - .value("TWOADJ",weave::TWOADJ) - .value("INT",weave::INT) - .value("FULLINT",weave::FULLINT) - ; - - - /* - bp::class_("Weave_base") - ; - bp::class_ >("Weave") - .def("addFiber", &weave::Weave_py::addFiber) - .def("build", &weave::Weave_py::build) - .def("build2", &weave::Weave_py::build2) - .def("printGraph", &weave::Weave_py::printGraph) - .def("face_traverse", &weave::Weave_py::face_traverse) - //.def("split_components", &weave::Weave_py::split_components) - //.def("get_components", &weave::Weave_py::get_components) - .def("getCLVertices", &weave::Weave_py::getCLVertices) - .def("getINTVertices", &weave::Weave_py::getINTVertices) - .def("getVertices", &weave::Weave_py::getVertices) - .def("numVertices", &weave::Weave_py::numVertices) - .def("getEdges", &weave::Weave_py::getEdges) - .def("getLoops", &weave::Weave_py::py_getLoops) - .def("__str__", &weave::Weave_py::str) - ; - */ - - bp::class_("LineCLFilter_base") - ; - bp::class_ >("LineCLFilter") - .def("addCLPoint", &LineCLFilter_py::addCLPoint) - .def("setTolerance",&LineCLFilter_py::setTolerance) - .def("run", &LineCLFilter_py::run) - .def("getCLPoints", &LineCLFilter_py::getCLPoints) - ; - - // some strange problem with hedi::face_edges()... let's not compile for now.. - bp::class_< clsurf::CutterLocationSurface >("CutterLocationSurface") - .def(bp::init()) - .def("run", &clsurf::CutterLocationSurface::run) - .def("setMinSampling", &clsurf::CutterLocationSurface::setMinSampling) - .def("setSampling", &clsurf::CutterLocationSurface::setSampling) - .def("setSTL", &clsurf::CutterLocationSurface::setSTL) - .def("setCutter", &clsurf::CutterLocationSurface::setCutter) - .def("getVertices", &clsurf::CutterLocationSurface::getVertices) - .def("getEdges", &clsurf::CutterLocationSurface::getEdges) - .def("__str__", &clsurf::CutterLocationSurface::str) - ; -/* - bp::class_< tsp::TSPSolver >("TSPSolver") - .def("addPoint", &tsp::TSPSolver::addPoint) - .def("run", &tsp::TSPSolver::run) - .def("getOutput", &tsp::TSPSolver::getOutput) - .def("getLength", &tsp::TSPSolver::getLength) - .def("reset", &tsp::TSPSolver::reset) - ; - */ -} - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl.cpp opencamlib-11.10-1/src/ocl.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/ocl.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -/* - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -// This is an extra comment. One can never have too many comments. - -#include -#include - -#include "version_string.hpp" // autogenerated by version_string.cmake - -std::string ocl_docstring() { - return "OpenCAMLib docstring"; -} - -std::string ocl_version() { - return VERSION_STRING; -} - -namespace bp = boost::python; - -void export_cutters(); -void export_geometry(); -void export_algo(); -void export_dropcutter(); - -// this defines the python ocl module -BOOST_PYTHON_MODULE(ocl) { - bp::docstring_options doc_options(); -// these functions set the docstring options - //void disable_user_defined(); - void enable_user_defined(); - //void disable_signatures(); - void enable_signatures(); - //void disable_py_signatures(); - void enable_py_signatures(); - //void disable_cpp_signatures(); - void enable_cpp_signatures(); - //void disable_all(); - //void enable_all(); - - bp::def("__doc__", ocl_docstring); - bp::def("version", ocl_version); - export_geometry(); // see ocl_geometry.cpp - export_cutters(); // see ocl_cutters.cpp - export_algo(); // see ocl_algo.cpp - export_dropcutter(); // see ocl_dropcutter.cpp - -} - - - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_cutters.cpp opencamlib-11.10-1/src/ocl_cutters.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_cutters.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/ocl_cutters.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - - -#include - -#include "millingcutter.hpp" -#include "millingcutter_py.hpp" -#include "cylcutter.hpp" -#include "ballcutter.hpp" -#include "bullcutter.hpp" -#include "conecutter.hpp" -#include "compositecutter.hpp" - -/* - * wrap cutters - */ - -using namespace ocl; - -namespace bp = boost::python; - -void export_cutters() { -// documentation here: -// http://www.boost.org/doc/libs/1_43_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.inheritance - - bp::class_("MillingCutter") - .def("vertexDrop", &MillingCutter::vertexDrop, &MillingCutter_py::default_vertexDrop ) - .def("facetDrop", &MillingCutter::facetDrop, &MillingCutter_py::default_facetDrop ) - .def("edgeDrop", &MillingCutter::edgeDrop, &MillingCutter_py::default_edgeDrop ) - .def("dropCutter", &MillingCutter::dropCutter) - .def("pushCutter", &MillingCutter::pushCutter) - .def("offsetCutter", &MillingCutter::offsetCutter, bp::return_value_policy() ) - .def("__str__", &MillingCutter::str, &MillingCutter_py::default_str ) - .def("getRadius", &MillingCutter::getRadius ) - .def("getLength", &MillingCutter::getLength ) - .def("getDiameter", &MillingCutter::getDiameter ) - ; - bp::class_ >("CylCutter") - .def(bp::init()) - .def("dropCutterSTL", &CylCutter::dropCutterSTL) - ; - bp::class_ >("BallCutter") - .def(bp::init()) - .def("dropCutterSTL", &BallCutter::dropCutterSTL) - ; - bp::class_ >("BullCutter") - .def(bp::init()) - ; - bp::class_ >("ConeCutter") - .def(bp::init()) - ; - - bp::class_ >("CompCylCutter") - .def(bp::init()) - ; - bp::class_ >("CompBallCutter") - .def(bp::init()) - ; - - bp::class_ >("CylConeCutter") - .def(bp::init()) - ; - bp::class_ >("BallConeCutter") - .def(bp::init()) - ; - bp::class_ >("BullConeCutter") - .def(bp::init()) - ; - bp::class_ >("ConeConeCutter") - .def(bp::init()) - ; -} - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_dropcutter.cpp opencamlib-11.10-1/src/ocl_dropcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_dropcutter.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/ocl_dropcutter.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -/* $Id: $ - * - * Copyright 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#include - -#include "batchdropcutter_py.hpp" -#include "pathdropcutter_py.hpp" -#include "adaptivepathdropcutter_py.hpp" - - -/* - * Python wrapping of octree and related classes - */ - -using namespace ocl; - -namespace bp = boost::python; - -void export_dropcutter() { - - bp::class_("BatchDropCutter_base") - ; - bp::class_ >("BatchDropCutter") - .def("run", &BatchDropCutter_py::run) - .def("getCLPoints", &BatchDropCutter_py::getCLPoints_py) - .def("setSTL", &BatchDropCutter_py::setSTL) - .def("setCutter", &BatchDropCutter_py::setCutter) - .def("setThreads", &BatchDropCutter_py::setThreads) - .def("getThreads", &BatchDropCutter_py::getThreads) - .def("appendPoint", &BatchDropCutter_py::appendPoint) - .def("getTrianglesUnderCutter", &BatchDropCutter_py::getTrianglesUnderCutter) - .def("getCalls", &BatchDropCutter_py::getCalls) - .def("getBucketSize", &BatchDropCutter_py::getBucketSize) - .def("setBucketSize", &BatchDropCutter_py::setBucketSize) - ; - - - bp::class_("PathDropCutter_base") - ; - bp::class_ >("PathDropCutter") - .def("run", &PathDropCutter_py::run) - .def("getCLPoints", &PathDropCutter_py::getCLPoints_py) - .def("setCutter", &PathDropCutter_py::setCutter) - .def("setSTL", &PathDropCutter_py::setSTL) - .def("setSampling", &PathDropCutter_py::setSampling) - .def("setPath", &PathDropCutter_py::setPath) - .def("getZ", &PathDropCutter_py::getZ) - .def("setZ", &PathDropCutter_py::setZ) - ; - bp::class_("AdaptivePathDropCutter_base") - ; - bp::class_ >("AdaptivePathDropCutter") - .def("run", &AdaptivePathDropCutter_py::run) - .def("getCLPoints", &AdaptivePathDropCutter_py::getCLPoints_py) - .def("setCutter", &AdaptivePathDropCutter_py::setCutter) - .def("setSTL", &AdaptivePathDropCutter_py::setSTL) - .def("setSampling", &AdaptivePathDropCutter_py::setSampling) - .def("setMinSampling", &AdaptivePathDropCutter_py::setMinSampling) - .def("setCosLimit", &AdaptivePathDropCutter_py::setCosLimit) - .def("getSampling", &AdaptivePathDropCutter_py::getSampling) - .def("setPath", &AdaptivePathDropCutter_py::setPath) - .def("getZ", &AdaptivePathDropCutter_py::getZ) - .def("setZ", &AdaptivePathDropCutter_py::setZ) - ; - - -} - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_geometry.cpp opencamlib-11.10-1/src/ocl_geometry.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/ocl_geometry.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/src/ocl_geometry.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,183 +0,0 @@ -/* $Id$ - * - * Copyright 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com) - * - * This file is part of OpenCAMlib. - * - * OpenCAMlib is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenCAMlib is distributed in the hope that 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 OpenCAMlib. If not, see . -*/ - -#include - -#include "point.hpp" // contains no python-specific code -#include "ccpoint.hpp" // no python -#include "clpoint.hpp" // no python -#include "triangle_py.hpp" // new-style python wrapper-class -#include "stlsurf_py.hpp" // new-style wrapper -#include "ellipse.hpp" // no python -#include "ellipseposition.hpp" -#include "bbox.hpp" // no python -#include "path_py.hpp" // new-style wrapper -#include "stlreader.hpp" // no python - -/* - * Python wrapping - */ - -using namespace ocl; - -namespace bp = boost::python; - - -void export_geometry() { - bp::class_("Point") - .def(bp::init()) - .def(bp::init()) - .def(bp::init()) - .def(bp::other() * bp::self) - .def(bp::self * bp::other()) - .def(bp::self -= bp::other()) - .def(bp::self - bp::other()) - .def(bp::self += bp::other()) - .def(bp::self + bp::other()) - .def("norm", &Point::norm) - .def("xyNorm", &Point::xyNorm) - .def("normalize", &Point::normalize) - .def("dot", &Point::dot) - .def("cross", &Point::cross) - .def("xRotate", &Point::xRotate) - .def("yRotate", &Point::yRotate) - .def("zRotate", &Point::zRotate) - .def("isRight", &Point::isRight) - //.def("isInside", &Point::isInside) - //.def("isInsidePoints", &Point::isInside) - .def("xyDistance", &Point::xyDistance) - .def("__str__", &Point::str) - .def_readwrite("x", &Point::x) - .def_readwrite("y", &Point::y) - .def_readwrite("z", &Point::z) - ; - bp::class_("CLPoint") // FIXME: should inherit from Point - .def(bp::init()) - .def(bp::init()) - .def(bp::init()) - .def("__str__", &CLPoint::str) - .def_readwrite("x", &CLPoint::x) - .def_readwrite("y", &CLPoint::y) - .def_readwrite("z", &CLPoint::z) - .def("cc", &CLPoint::getCC) - .def("getCC", &CLPoint::getCC) - ; - bp::class_("CCPoint") // FIXME: CCPoint should inherit from Point - .def(bp::init()) - .def(bp::init()) - .def("__str__", &CCPoint::str) - .def_readwrite("type", &CCPoint::type) - .def_readwrite("x", &CCPoint::x) - .def_readwrite("y", &CCPoint::y) - .def_readwrite("z", &CCPoint::z) - ; - bp::enum_("CCType") - .value("NONE", NONE) - .value("VERTEX",VERTEX) - .value("VERTEX_CYL",VERTEX_CYL) - .value("EDGE",EDGE) - .value("EDGE_SHAFT",EDGE_SHAFT) - .value("EDGE_HORIZ",EDGE_HORIZ) - .value("EDGE_CYL",EDGE_CYL) - .value("EDGE_BALL",EDGE_BALL) - .value("EDGE_CONE",EDGE_CONE) - .value("EDGE_CONE_BASE",EDGE_CONE_BASE) - .value("EDGE_HORIZ_CYL",EDGE_HORIZ_CYL) - .value("EDGE_HORIZ_TOR",EDGE_HORIZ_TOR) - .value("EDGE_POS",EDGE_POS) - .value("EDGE_NEG",EDGE_NEG) - .value("FACET", FACET) - .value("FACET_TIP", FACET_TIP) - .value("FACET_CYL", FACET_CYL) - .value("ERROR", ERROR) - ; - bp::class_("Triangle_base") // needed by Triangle_py as a base-class - ; - bp::class_ >("Triangle") - .def(bp::init()) - .def("getPoints", &Triangle_py::getPoints) - .def("__str__", &Triangle_py::str) - .def_readonly("p", &Triangle_py::p) - .def_readonly("n", &Triangle_py::n) - ; - bp::class_("STLSurf_base") // needed by STLSurf_py below - ; - bp::class_ >("STLSurf") - .def("addTriangle", &STLSurf_py::addTriangle) - .def("__str__", &STLSurf_py::str) - .def("size", &STLSurf_py::size) - .def("rotate", &STLSurf_py::rotate) - .def("getBounds", &STLSurf_py::getBounds) - .def("getTriangles", &STLSurf_py::getTriangles) - .def_readonly("tris", &STLSurf_py::tris) - .def_readonly("bb", &STLSurf_py::bb) - ; - bp::class_("STLReader") - .def(bp::init()) - ; - bp::class_("Bbox") - .def("isInside", &Bbox::isInside ) - .def_readonly("maxpt", &Bbox::maxpt) - .def_readonly("minpt", &Bbox::minpt) - ; - // Epos and the Ellipse are used for the toroidal tool edge-tests - bp::class_("EllipsePosition") - .def_readwrite("s", &EllipsePosition::s) - .def_readwrite("t", &EllipsePosition::t) - .def("setDiangle", &EllipsePosition::setDiangle) - .def("__str__", &EllipsePosition::str) - ; - bp::class_("Ellipse") - .def(bp::init()) - .def("ePoint", &Ellipse::ePoint) - .def("oePoint", &Ellipse::oePoint) - .def("normal", &Ellipse::normal) - ; - bp::class_("Line") - .def(bp::init()) - .def(bp::init()) - .def_readwrite("p1", &Line::p1) - .def_readwrite("p2", &Line::p2) - ; - bp::class_("Arc") - .def(bp::init()) - .def(bp::init()) - .def_readwrite("p1", &Arc::p1) - .def_readwrite("p2", &Arc::p2) - .def_readwrite("c", &Arc::c) - .def_readwrite("dir", &Arc::dir) - ; - bp::enum_("SpanType") - .value("LineSpanType", LineSpanType) - .value("ArcSpanType", ArcSpanType) - .export_values() - ; - bp::class_("Path_base") - ; - bp::class_ >("Path") - .def(bp::init<>()) - .def(bp::init()) - .def("getSpans", &Path_py::getSpans) - .def("getTypeSpanPairs", &Path_py::getTypeSpanPairs) - .def("append",static_cast< void (Path_py::*)(const Line &l)>(&Path_py::append)) - .def("append",static_cast< void (Path_py::*)(const Arc &a)>(&Path_py::append)) - ; -} - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/adaptivepathdropcutter_py.hpp opencamlib-11.10-1/src/pythonlib/adaptivepathdropcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/adaptivepathdropcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/adaptivepathdropcutter_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,50 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef ADAPTIVEPATHDROPCUTTER_PY_H +#define ADAPTIVEPATHDROPCUTTER_PY_H + +#include + +#include "adaptivepathdropcutter.hpp" + +namespace ocl +{ + +/// Python wrapper for PathDropCutter +class AdaptivePathDropCutter_py : public AdaptivePathDropCutter { + public: + AdaptivePathDropCutter_py() : AdaptivePathDropCutter() {} + virtual ~AdaptivePathDropCutter_py() {} + /// return a list of CL-points to python + boost::python::list getCLPoints_py() { + //std::cout << " apdc_py::getCLPoints_py()..."; + boost::python::list plist; + BOOST_FOREACH(CLPoint p, clpoints) { + plist.append(p); + } + //std::cout << " DONE.\n"; + return plist; + } +}; + +} // end namespace +#endif +// end file adaptivepathdropcutter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/adaptivewaterline_py.hpp opencamlib-11.10-1/src/pythonlib/adaptivewaterline_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/adaptivewaterline_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/adaptivewaterline_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,76 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef ADAPTIVEWATERLINE_PY_H +#define ADAPTIVEWATERLINE_PY_H + +#include "adaptivewaterline.hpp" +#include "fiber_py.hpp" + +namespace ocl +{ + +/// \brief python wrapper for AdaptiveWaterline +class AdaptiveWaterline_py : public AdaptiveWaterline { + public: + AdaptiveWaterline_py() : AdaptiveWaterline() {} + ~AdaptiveWaterline_py() { + std::cout << "~AdaptiveWaterline_py()\n"; + } + + /// return loop as a list of lists to python + boost::python::list py_getLoops() const { + boost::python::list loop_list; + BOOST_FOREACH( std::vector loop, this->loops ) { + boost::python::list point_list; + BOOST_FOREACH( Point p, loop ) { + point_list.append( p ); + } + loop_list.append(point_list); + } + return loop_list; + } + /// return a list of xfibers to python + boost::python::list getXFibers() const { + boost::python::list flist; + BOOST_FOREACH( Fiber f, xfibers ) { + if (!f.empty()) { + Fiber_py f2(f); + flist.append(f2); + } + } + return flist; + } + /// return a list of yfibers to python + boost::python::list getYFibers() const { + boost::python::list flist; + BOOST_FOREACH( Fiber f, yfibers ) { + if (!f.empty()){ + Fiber_py f2(f); + flist.append(f2); + } + } + return flist; + } +}; + +} // end namespace + +#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/batchdropcutter_py.hpp opencamlib-11.10-1/src/pythonlib/batchdropcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/batchdropcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/batchdropcutter_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,60 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef BDC_PY_H +#define BDC_PY_H + +#include +#include + +#include "batchdropcutter.hpp" + +namespace ocl +{ + +/// Python wrapper for BatchDropCutter +class BatchDropCutter_py : public BatchDropCutter { + public: + BatchDropCutter_py() : BatchDropCutter() {}; + /// return CL-points to Python + boost::python::list getCLPoints_py() { + boost::python::list plist; + BOOST_FOREACH(CLPoint p, *clpoints) { + plist.append(p); + } + return plist; + }; + /// return triangles under cutter to Python. Not for CAM-algorithms, + /// more for visualization and demonstration. + boost::python::list getTrianglesUnderCutter(CLPoint& cl, MillingCutter& cutter) { + boost::python::list trilist; + std::list *triangles_under_cutter = new std::list(); + triangles_under_cutter = root->search_cutter_overlap( &cutter , &cl); + BOOST_FOREACH(Triangle t, *triangles_under_cutter) { + trilist.append(t); + } + delete triangles_under_cutter; + return trilist; + }; +}; + +} // end namespace + +#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/batchpushcutter_py.hpp opencamlib-11.10-1/src/pythonlib/batchpushcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/batchpushcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/batchpushcutter_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,98 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#ifndef BPC_PY_H +#define BPC_PY_H + +#include + +#include "batchpushcutter.hpp" + +#include "fiber_py.hpp" + +namespace ocl +{ +/// \brief python wrapper for batchpushcutter +class BatchPushCutter_py : public BatchPushCutter { + public: + BatchPushCutter_py() : BatchPushCutter() {} + /// return CL-points to Python + boost::python::list getCLPoints() const { + boost::python::list plist; + BOOST_FOREACH(Fiber f, *fibers) { + BOOST_FOREACH( Interval i, f.ints ) { + if ( !i.empty() ) { + Point tmp = f.point(i.lower); + CLPoint p1 = CLPoint( tmp.x, tmp.y, tmp.z ); + p1.cc = new CCPoint(i.lower_cc); + tmp = f.point(i.upper); + CLPoint p2 = CLPoint( tmp.x, tmp.y, tmp.z ); + p2.cc = new CCPoint(i.upper_cc); + plist.append(p1); + plist.append(p2); + } + } + + } + return plist; + }; + /// return triangles under cutter to Python. Not for CAM-algorithms, + /// more for visualization and demonstration. + boost::python::list getOverlapTriangles(Fiber& f) { + boost::python::list trilist; + std::list *overlap_triangles = new std::list(); + //int plane = 3; // XY-plane + //Bbox bb; //FIXME + //KDNode2::search_kdtree( overlap_triangles, bb, root, plane); + CLPoint cl; + if (x_direction) { + cl.x = 0; + cl.y = f.p1.y; + cl.z = f.p1.z; + } else if (y_direction) { + cl.x = f.p1.x; + cl.y = 0; + cl.z = f.p1.z; + } else { + assert(0); + } + overlap_triangles = root->search_cutter_overlap(cutter, &cl); + + BOOST_FOREACH(Triangle t, *overlap_triangles) { + trilist.append(t); + } + delete overlap_triangles; + return trilist; + }; + /// return list of Fibers to python + boost::python::list getFibers_py() const { + boost::python::list flist; + BOOST_FOREACH(Fiber f, *fibers) { + flist.append( Fiber_py(f) ); + } + return flist; + }; + +}; + +} // end namespace + +#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/fiber_py.hpp opencamlib-11.10-1/src/pythonlib/fiber_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/fiber_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/fiber_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,52 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef FIBER_PY_H +#define FIBER_PY_H + +#include +#include + +#include "fiber.hpp" + +namespace ocl +{ + +/// python wrapper for Fiber +class Fiber_py : public Fiber { + public: + Fiber_py() : Fiber () {}; + /// construct p1-p2 fiber + Fiber_py(const Point &p1, const Point &p2) : Fiber(p1, p2) {}; + /// copy constructor + Fiber_py(const Fiber& f) : Fiber(f) {}; + /// return a list of intervals to python + boost::python::list getInts() const { + boost::python::list l; + BOOST_FOREACH( Interval i, ints) { + l.append( i ); + } + return l; + }; +}; + +} // end namespace +#endif +// end file fiber_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/lineclfilter_py.hpp opencamlib-11.10-1/src/pythonlib/lineclfilter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/lineclfilter_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/lineclfilter_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,48 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#ifndef LINE_CL_FILTER_PY_H +#define LINE_CL_FILTER_PY_H + +#include + +#include "lineclfilter.hpp" + +namespace ocl +{ +/// python wrapper for lineclfilter +class LineCLFilter_py : public LineCLFilter { + public: + LineCLFilter_py() : LineCLFilter() {}; + /// return a list of CL-points to python + boost::python::list getCLPoints() { + // return points to python + boost::python::list plist; + BOOST_FOREACH(CLPoint p, clpoints) { + plist.append(p); + } + return plist; + }; +}; + +} // end namespace +#endif +// end file lineclfilter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/millingcutter_py.hpp opencamlib-11.10-1/src/pythonlib/millingcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/millingcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/millingcutter_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,97 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#ifndef MILLING_CUTTER_PY_H +#define MILLING_CUTTER_PY_H + +#include + +#include "millingcutter.hpp" + +namespace ocl +{ + +/* required wrapper class for virtual functions in boost-python */ +/// \brief a wrapper required for boost-python +// see documentation: +// http://www.boost.org/doc/libs/1_43_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.inheritance +class MillingCutter_py : public MillingCutter, public boost::python::wrapper +{ + public: + // vertex + bool vertexDrop(CLPoint &cl, const Triangle &t) const { + if ( boost::python::override ovr_vertexDrop = this->get_override("vertexDrop")) + return ovr_vertexDrop(cl, t); + return MillingCutter::vertexDrop(cl, t); + } + /// python-wrapper boilerplate... + bool default_vertexDrop(CLPoint &cl, const Triangle &t) const { + return this->MillingCutter::vertexDrop(cl,t); + } + + // facet + bool facetDrop(CLPoint &cl, const Triangle &t) const { + if ( boost::python::override ovr_facetDrop = this->get_override("facetDrop")) + return ovr_facetDrop(cl, t); + return MillingCutter::facetDrop(cl, t); + } + /// python-wrapper boilerplate... + bool default_facetDrop(CLPoint &cl, const Triangle &t) const { + return this->MillingCutter::facetDrop(cl,t); + } + + + // edge + bool edgeDrop(CLPoint &cl, const Triangle &t) const { + if ( boost::python::override ovr_edgeDrop = this->get_override("edgeDrop")) + return ovr_edgeDrop(cl, t); + return MillingCutter::edgeDrop(cl, t); + } + /// python-wrapper boilerplate... + bool default_edgeDrop(CLPoint &cl, const Triangle &t) const { + return this->MillingCutter::edgeDrop(cl,t); + } + + MillingCutter* offsetCutter(double d) const { + if ( boost::python::override ovr_offsetCutter = this->get_override("offsetCutter") ) + return ovr_offsetCutter(d); + return MillingCutter::offsetCutter(d); + } + /// python-wrapper boilerplate... + MillingCutter* default_offsetCutter(double d) const { + return this->MillingCutter::offsetCutter(d); + } + + std::string str() const { + if ( boost::python::override ovr_str = this->get_override("str")) { + return ovr_str(); + } + return MillingCutter::str(); + } + /// python-wrapper boilerplate... + std::string default_str() const { + return this->MillingCutter::str(); + } +}; + +} // end namespace +#endif +// end file millingcutter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_algo.cpp opencamlib-11.10-1/src/pythonlib/ocl_algo.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_algo.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/ocl_algo.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,201 @@ +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#include + + +#include "batchpushcutter_py.hpp" +#include "fiber_py.hpp" +#include "weave_py.hpp" +#include "waterline_py.hpp" +#include "adaptivewaterline_py.hpp" +#include "lineclfilter_py.hpp" +#include "numeric.hpp" + +#include "zigzag.hpp" + +#include "clsurface.hpp" + +#include "tsp.hpp" // fixme: contains python + +/* + * Python wrapping of octree and related classes + */ + +using namespace ocl; + +namespace bp = boost::python; + +void export_algo() { + bp::def("eps", eps); // machine epsilon, see numeric.cpp + bp::def("epsF", epsF); + bp::def("epsD", epsD); + bp::class_("ZigZag") + .def("run", &ZigZag::run) + .def("setDirection", &ZigZag::setDirection) + .def("setOrigin", &ZigZag::setOrigin) + .def("setStepOver", &ZigZag::setStepOver) + .def("addPoint", &ZigZag::addPoint) + .def("getOutput", &ZigZag::getOutput) + .def("__str__", &ZigZag::str) + ; + + bp::class_("BatchPushCutter_base") + ; + bp::class_ >("BatchPushCutter") + .def("run", &BatchPushCutter_py::run) + .def("setSTL", &BatchPushCutter_py::setSTL) + .def("setCutter", &BatchPushCutter_py::setCutter) + .def("setThreads", &BatchPushCutter_py::setThreads) + .def("appendFiber", &BatchPushCutter_py::appendFiber) + .def("getOverlapTriangles", &BatchPushCutter_py::getOverlapTriangles) + .def("getCLPoints", &BatchPushCutter_py::getCLPoints) + .def("getFibers", &BatchPushCutter_py::getFibers_py) + .def("getCalls", &BatchPushCutter_py::getCalls) + .def("setThreads", &BatchPushCutter_py::setThreads) + .def("getThreads", &BatchPushCutter_py::getThreads) + .def("setBucketSize", &BatchPushCutter_py::setBucketSize) + .def("getBucketSize", &BatchPushCutter_py::getBucketSize) + .def("setXDirection", &BatchPushCutter_py::setXDirection) + .def("setYDirection", &BatchPushCutter_py::setYDirection) + ; + bp::class_("Interval") + .def(bp::init()) + .def_readonly("upper", &Interval::upper ) + .def_readonly("lower", &Interval::lower ) + .def_readonly("lower_cc", &Interval::lower_cc ) + .def_readonly("upper_cc", &Interval::upper_cc ) + .def("updateUpper", &Interval::updateUpper ) + .def("updateLower", &Interval::updateLower ) + .def("empty", &Interval::empty ) + .def("__str__", &Interval::str ) + ; + bp::class_("Fiber_base") + ; + bp::class_ >("Fiber") + .def(bp::init()) + .def_readonly("p1", &Fiber_py::p1) + .def_readonly("p2", &Fiber_py::p2) + .def_readonly("dir", &Fiber_py::dir) + .def("addInterval", &Fiber_py::addInterval) + .def("point", &Fiber_py::point) + .def("printInts", &Fiber_py::printInts) + .def("getInts", &Fiber_py::getInts) + ; + bp::class_("Waterline_base") + ; + bp::class_ >("Waterline") + .def("setCutter", &Waterline_py::setCutter) + .def("setSTL", &Waterline_py::setSTL) + .def("setZ", &Waterline_py::setZ) + .def("setSampling", &Waterline_py::setSampling) + .def("run", &Waterline_py::run) + .def("run2", &Waterline_py::run2) + .def("reset", &Waterline_py::reset) + .def("getLoops", &Waterline_py::py_getLoops) + .def("setThreads", &Waterline_py::setThreads) + .def("getThreads", &Waterline_py::getThreads) + .def("getXFibers", &Waterline_py::py_getXFibers) + .def("getYFibers", &Waterline_py::py_getYFibers) + + ; + bp::class_("AdaptiveWaterline_base") + ; + bp::class_ >("AdaptiveWaterline") + .def("setCutter", &AdaptiveWaterline_py::setCutter) + .def("setSTL", &AdaptiveWaterline_py::setSTL) + .def("setZ", &AdaptiveWaterline_py::setZ) + .def("setSampling", &AdaptiveWaterline_py::setSampling) + .def("setMinSampling", &AdaptiveWaterline_py::setMinSampling) + .def("run", &AdaptiveWaterline_py::run) + .def("run2", &AdaptiveWaterline_py::run2) + .def("reset", &AdaptiveWaterline_py::reset) + //.def("run2", &AdaptiveWaterline_py::run2) // uses Weave::build2() + .def("getLoops", &AdaptiveWaterline_py::py_getLoops) + .def("setThreads", &AdaptiveWaterline_py::setThreads) + .def("getThreads", &AdaptiveWaterline_py::getThreads) + .def("getXFibers", &AdaptiveWaterline_py::getXFibers) + .def("getYFibers", &AdaptiveWaterline_py::getYFibers) + ; + + bp::enum_("WeaveVertexType") + .value("CL", weave::CL) + .value("CL_DONE",weave::CL_DONE) + .value("ADJ",weave::ADJ) + .value("TWOADJ",weave::TWOADJ) + .value("INT",weave::INT) + .value("FULLINT",weave::FULLINT) + ; + + + /* + bp::class_("Weave_base") + ; + bp::class_ >("Weave") + .def("addFiber", &weave::Weave_py::addFiber) + .def("build", &weave::Weave_py::build) + .def("build2", &weave::Weave_py::build2) + .def("printGraph", &weave::Weave_py::printGraph) + .def("face_traverse", &weave::Weave_py::face_traverse) + //.def("split_components", &weave::Weave_py::split_components) + //.def("get_components", &weave::Weave_py::get_components) + .def("getCLVertices", &weave::Weave_py::getCLVertices) + .def("getINTVertices", &weave::Weave_py::getINTVertices) + .def("getVertices", &weave::Weave_py::getVertices) + .def("numVertices", &weave::Weave_py::numVertices) + .def("getEdges", &weave::Weave_py::getEdges) + .def("getLoops", &weave::Weave_py::py_getLoops) + .def("__str__", &weave::Weave_py::str) + ; + */ + + bp::class_("LineCLFilter_base") + ; + bp::class_ >("LineCLFilter") + .def("addCLPoint", &LineCLFilter_py::addCLPoint) + .def("setTolerance",&LineCLFilter_py::setTolerance) + .def("run", &LineCLFilter_py::run) + .def("getCLPoints", &LineCLFilter_py::getCLPoints) + ; + + // some strange problem with hedi::face_edges()... let's not compile for now.. + bp::class_< clsurf::CutterLocationSurface >("CutterLocationSurface") + .def(bp::init()) + .def("run", &clsurf::CutterLocationSurface::run) + .def("setMinSampling", &clsurf::CutterLocationSurface::setMinSampling) + .def("setSampling", &clsurf::CutterLocationSurface::setSampling) + .def("setSTL", &clsurf::CutterLocationSurface::setSTL) + .def("setCutter", &clsurf::CutterLocationSurface::setCutter) + .def("getVertices", &clsurf::CutterLocationSurface::getVertices) + .def("getEdges", &clsurf::CutterLocationSurface::getEdges) + .def("__str__", &clsurf::CutterLocationSurface::str) + ; +/* + bp::class_< tsp::TSPSolver >("TSPSolver") + .def("addPoint", &tsp::TSPSolver::addPoint) + .def("run", &tsp::TSPSolver::run) + .def("getOutput", &tsp::TSPSolver::getOutput) + .def("getLength", &tsp::TSPSolver::getLength) + .def("reset", &tsp::TSPSolver::reset) + ; + */ +} + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl.cpp opencamlib-11.10-1/src/pythonlib/ocl.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/ocl.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,69 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +// This is an extra comment. One can never have too many comments. + +#include +#include + +#include "version_string.hpp" // autogenerated by version_string.cmake + +std::string ocl_docstring() { + return "OpenCAMLib docstring"; +} + +std::string ocl_version() { + return VERSION_STRING; +} + +namespace bp = boost::python; + +void export_cutters(); +void export_geometry(); +void export_algo(); +void export_dropcutter(); + +// this defines the python ocl module +BOOST_PYTHON_MODULE(ocl) { + bp::docstring_options doc_options(); +// these functions set the docstring options + //void disable_user_defined(); + void enable_user_defined(); + //void disable_signatures(); + void enable_signatures(); + //void disable_py_signatures(); + void enable_py_signatures(); + //void disable_cpp_signatures(); + void enable_cpp_signatures(); + //void disable_all(); + //void enable_all(); + + bp::def("__doc__", ocl_docstring); + bp::def("version", ocl_version); + export_geometry(); // see ocl_geometry.cpp + export_cutters(); // see ocl_cutters.cpp + export_algo(); // see ocl_algo.cpp + export_dropcutter(); // see ocl_dropcutter.cpp + +} + + + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_cutters.cpp opencamlib-11.10-1/src/pythonlib/ocl_cutters.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_cutters.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/ocl_cutters.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,91 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#include + +#include "millingcutter.hpp" +#include "millingcutter_py.hpp" +#include "cylcutter.hpp" +#include "ballcutter.hpp" +#include "bullcutter.hpp" +#include "conecutter.hpp" +#include "compositecutter.hpp" + +/* + * wrap cutters + */ + +using namespace ocl; + +namespace bp = boost::python; + +void export_cutters() { +// documentation here: +// http://www.boost.org/doc/libs/1_43_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.inheritance + + bp::class_("MillingCutter") + .def("vertexDrop", &MillingCutter::vertexDrop, &MillingCutter_py::default_vertexDrop ) + .def("facetDrop", &MillingCutter::facetDrop, &MillingCutter_py::default_facetDrop ) + .def("edgeDrop", &MillingCutter::edgeDrop, &MillingCutter_py::default_edgeDrop ) + .def("dropCutter", &MillingCutter::dropCutter) + .def("pushCutter", &MillingCutter::pushCutter) + .def("offsetCutter", &MillingCutter::offsetCutter, bp::return_value_policy() ) + .def("__str__", &MillingCutter::str, &MillingCutter_py::default_str ) + .def("getRadius", &MillingCutter::getRadius ) + .def("getLength", &MillingCutter::getLength ) + .def("getDiameter", &MillingCutter::getDiameter ) + ; + bp::class_ >("CylCutter") + .def(bp::init()) + .def("dropCutterSTL", &CylCutter::dropCutterSTL) + ; + bp::class_ >("BallCutter") + .def(bp::init()) + .def("dropCutterSTL", &BallCutter::dropCutterSTL) + ; + bp::class_ >("BullCutter") + .def(bp::init()) + ; + bp::class_ >("ConeCutter") + .def(bp::init()) + ; + + bp::class_ >("CompCylCutter") + .def(bp::init()) + ; + bp::class_ >("CompBallCutter") + .def(bp::init()) + ; + + bp::class_ >("CylConeCutter") + .def(bp::init()) + ; + bp::class_ >("BallConeCutter") + .def(bp::init()) + ; + bp::class_ >("BullConeCutter") + .def(bp::init()) + ; + bp::class_ >("ConeConeCutter") + .def(bp::init()) + ; +} + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_dropcutter.cpp opencamlib-11.10-1/src/pythonlib/ocl_dropcutter.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_dropcutter.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/ocl_dropcutter.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,86 @@ +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#include + +#include "batchdropcutter_py.hpp" +#include "pathdropcutter_py.hpp" +#include "adaptivepathdropcutter_py.hpp" + + +/* + * Python wrapping of octree and related classes + */ + +using namespace ocl; + +namespace bp = boost::python; + +void export_dropcutter() { + + bp::class_("BatchDropCutter_base") + ; + bp::class_ >("BatchDropCutter") + .def("run", &BatchDropCutter_py::run) + .def("getCLPoints", &BatchDropCutter_py::getCLPoints_py) + .def("setSTL", &BatchDropCutter_py::setSTL) + .def("setCutter", &BatchDropCutter_py::setCutter) + .def("setThreads", &BatchDropCutter_py::setThreads) + .def("getThreads", &BatchDropCutter_py::getThreads) + .def("appendPoint", &BatchDropCutter_py::appendPoint) + .def("getTrianglesUnderCutter", &BatchDropCutter_py::getTrianglesUnderCutter) + .def("getCalls", &BatchDropCutter_py::getCalls) + .def("getBucketSize", &BatchDropCutter_py::getBucketSize) + .def("setBucketSize", &BatchDropCutter_py::setBucketSize) + ; + + + bp::class_("PathDropCutter_base") + ; + bp::class_ >("PathDropCutter") + .def("run", &PathDropCutter_py::run) + .def("getCLPoints", &PathDropCutter_py::getCLPoints_py) + .def("setCutter", &PathDropCutter_py::setCutter) + .def("setSTL", &PathDropCutter_py::setSTL) + .def("setSampling", &PathDropCutter_py::setSampling) + .def("setPath", &PathDropCutter_py::setPath) + .def("getZ", &PathDropCutter_py::getZ) + .def("setZ", &PathDropCutter_py::setZ) + ; + bp::class_("AdaptivePathDropCutter_base") + ; + bp::class_ >("AdaptivePathDropCutter") + .def("run", &AdaptivePathDropCutter_py::run) + .def("getCLPoints", &AdaptivePathDropCutter_py::getCLPoints_py) + .def("setCutter", &AdaptivePathDropCutter_py::setCutter) + .def("setSTL", &AdaptivePathDropCutter_py::setSTL) + .def("setSampling", &AdaptivePathDropCutter_py::setSampling) + .def("setMinSampling", &AdaptivePathDropCutter_py::setMinSampling) + .def("setCosLimit", &AdaptivePathDropCutter_py::setCosLimit) + .def("getSampling", &AdaptivePathDropCutter_py::getSampling) + .def("setPath", &AdaptivePathDropCutter_py::setPath) + .def("getZ", &AdaptivePathDropCutter_py::getZ) + .def("setZ", &AdaptivePathDropCutter_py::setZ) + ; + + +} + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_geometry.cpp opencamlib-11.10-1/src/pythonlib/ocl_geometry.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/ocl_geometry.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/ocl_geometry.cpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,183 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#include + +#include "point.hpp" // contains no python-specific code +#include "ccpoint.hpp" // no python +#include "clpoint.hpp" // no python +#include "triangle_py.hpp" // new-style python wrapper-class +#include "stlsurf_py.hpp" // new-style wrapper +#include "ellipse.hpp" // no python +#include "ellipseposition.hpp" +#include "bbox.hpp" // no python +#include "path_py.hpp" // new-style wrapper +#include "stlreader.hpp" // no python + +/* + * Python wrapping + */ + +using namespace ocl; + +namespace bp = boost::python; + + +void export_geometry() { + bp::class_("Point") + .def(bp::init()) + .def(bp::init()) + .def(bp::init()) + .def(bp::other() * bp::self) + .def(bp::self * bp::other()) + .def(bp::self -= bp::other()) + .def(bp::self - bp::other()) + .def(bp::self += bp::other()) + .def(bp::self + bp::other()) + .def("norm", &Point::norm) + .def("xyNorm", &Point::xyNorm) + .def("normalize", &Point::normalize) + .def("dot", &Point::dot) + .def("cross", &Point::cross) + .def("xRotate", &Point::xRotate) + .def("yRotate", &Point::yRotate) + .def("zRotate", &Point::zRotate) + .def("isRight", &Point::isRight) + //.def("isInside", &Point::isInside) + //.def("isInsidePoints", &Point::isInside) + .def("xyDistance", &Point::xyDistance) + .def("__str__", &Point::str) + .def_readwrite("x", &Point::x) + .def_readwrite("y", &Point::y) + .def_readwrite("z", &Point::z) + ; + bp::class_("CLPoint") // FIXME: should inherit from Point + .def(bp::init()) + .def(bp::init()) + .def(bp::init()) + .def("__str__", &CLPoint::str) + .def_readwrite("x", &CLPoint::x) + .def_readwrite("y", &CLPoint::y) + .def_readwrite("z", &CLPoint::z) + .def("cc", &CLPoint::getCC) + .def("getCC", &CLPoint::getCC) + ; + bp::class_("CCPoint") // FIXME: CCPoint should inherit from Point + .def(bp::init()) + .def(bp::init()) + .def("__str__", &CCPoint::str) + .def_readwrite("type", &CCPoint::type) + .def_readwrite("x", &CCPoint::x) + .def_readwrite("y", &CCPoint::y) + .def_readwrite("z", &CCPoint::z) + ; + bp::enum_("CCType") + .value("NONE", NONE) + .value("VERTEX",VERTEX) + .value("VERTEX_CYL",VERTEX_CYL) + .value("EDGE",EDGE) + .value("EDGE_SHAFT",EDGE_SHAFT) + .value("EDGE_HORIZ",EDGE_HORIZ) + .value("EDGE_CYL",EDGE_CYL) + .value("EDGE_BALL",EDGE_BALL) + .value("EDGE_CONE",EDGE_CONE) + .value("EDGE_CONE_BASE",EDGE_CONE_BASE) + .value("EDGE_HORIZ_CYL",EDGE_HORIZ_CYL) + .value("EDGE_HORIZ_TOR",EDGE_HORIZ_TOR) + .value("EDGE_POS",EDGE_POS) + .value("EDGE_NEG",EDGE_NEG) + .value("FACET", FACET) + .value("FACET_TIP", FACET_TIP) + .value("FACET_CYL", FACET_CYL) + .value("ERROR", ERROR) + ; + bp::class_("Triangle_base") // needed by Triangle_py as a base-class + ; + bp::class_ >("Triangle") + .def(bp::init()) + .def("getPoints", &Triangle_py::getPoints) + .def("__str__", &Triangle_py::str) + .def_readonly("p", &Triangle_py::p) + .def_readonly("n", &Triangle_py::n) + ; + bp::class_("STLSurf_base") // needed by STLSurf_py below + ; + bp::class_ >("STLSurf") + .def("addTriangle", &STLSurf_py::addTriangle) + .def("__str__", &STLSurf_py::str) + .def("size", &STLSurf_py::size) + .def("rotate", &STLSurf_py::rotate) + .def("getBounds", &STLSurf_py::getBounds) + .def("getTriangles", &STLSurf_py::getTriangles) + .def_readonly("tris", &STLSurf_py::tris) + .def_readonly("bb", &STLSurf_py::bb) + ; + bp::class_("STLReader") + .def(bp::init()) + ; + bp::class_("Bbox") + .def("isInside", &Bbox::isInside ) + .def_readonly("maxpt", &Bbox::maxpt) + .def_readonly("minpt", &Bbox::minpt) + ; + // Epos and the Ellipse are used for the toroidal tool edge-tests + bp::class_("EllipsePosition") + .def_readwrite("s", &EllipsePosition::s) + .def_readwrite("t", &EllipsePosition::t) + .def("setDiangle", &EllipsePosition::setDiangle) + .def("__str__", &EllipsePosition::str) + ; + bp::class_("Ellipse") + .def(bp::init()) + .def("ePoint", &Ellipse::ePoint) + .def("oePoint", &Ellipse::oePoint) + .def("normal", &Ellipse::normal) + ; + bp::class_("Line") + .def(bp::init()) + .def(bp::init()) + .def_readwrite("p1", &Line::p1) + .def_readwrite("p2", &Line::p2) + ; + bp::class_("Arc") + .def(bp::init()) + .def(bp::init()) + .def_readwrite("p1", &Arc::p1) + .def_readwrite("p2", &Arc::p2) + .def_readwrite("c", &Arc::c) + .def_readwrite("dir", &Arc::dir) + ; + bp::enum_("SpanType") + .value("LineSpanType", LineSpanType) + .value("ArcSpanType", ArcSpanType) + .export_values() + ; + bp::class_("Path_base") + ; + bp::class_ >("Path") + .def(bp::init<>()) + .def(bp::init()) + .def("getSpans", &Path_py::getSpans) + .def("getTypeSpanPairs", &Path_py::getTypeSpanPairs) + .def("append",static_cast< void (Path_py::*)(const Line &l)>(&Path_py::append)) + .def("append",static_cast< void (Path_py::*)(const Arc &a)>(&Path_py::append)) + ; +} + diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/pathdropcutter_py.hpp opencamlib-11.10-1/src/pythonlib/pathdropcutter_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/pathdropcutter_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/pathdropcutter_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,49 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#ifndef PATHDROPCUTTER_PY_H +#define PATHDROPCUTTER_PY_H + +#include +#include + +#include "pathdropcutter.hpp" + +namespace ocl +{ + +/// Python wrapper for PathDropCutter +class PathDropCutter_py : public PathDropCutter { + public: + PathDropCutter_py() : PathDropCutter() {}; + /// return a list of CL-points to python + boost::python::list getCLPoints_py() { + boost::python::list plist; + BOOST_FOREACH(CLPoint p, clpoints) { + plist.append(p); + } + return plist; + }; +}; + +} // end namespace +#endif +// end file pathdropcutter_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/path_py.hpp opencamlib-11.10-1/src/pythonlib/path_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/path_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/path_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,80 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef PATH_PY_H +#define PATH_PY_H + +#include + +#include +#include + +#include "path.hpp" + + + +namespace ocl +{ + +/// Python wrapper for Path +class Path_py : public Path { + public: + Path_py() : Path () {}; + /// copy constructor + Path_py(const Path &p) : Path(p) {}; + + /// return the span-list to python + boost::python::list getSpans() { + boost::python::list slist; + BOOST_FOREACH(Span* span, span_list) { + if(span->type() == LineSpanType)slist.append(((LineSpan*)span)->line); + else if(span->type() == ArcSpanType)slist.append(((ArcSpan*)span)->arc); + } + return slist; + }; + + /// return a list of type/span pairs + boost::python::list getTypeSpanPairs() { + boost::python::list slist; + BOOST_FOREACH(Span* span, span_list) { + if(span->type() == LineSpanType) + { + boost::python::list tuple; + tuple.append(span->type()); + tuple.append(((LineSpan*)span)->line); + slist.append(tuple); + } + else if(span->type() == ArcSpanType) + { + boost::python::list tuple; + tuple.append(span->type()); + tuple.append(((ArcSpan*)span)->arc); + slist.append(tuple); + } + } + return slist; + }; + + +}; + +} // end namespace +#endif +// end file path.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/pythonlib.cmake opencamlib-11.10-1/src/pythonlib/pythonlib.cmake --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/pythonlib.cmake 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/pythonlib.cmake 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,144 @@ +# find boost so we can get it's version +find_package(Boost) + +# debugging +set(Boost_DEBUG ON) + +# set additional versions, when using a old CMake version this can be handy to find a modern boost +# set(Boost_ADDITIONAL_VERSIONS 1.69.0) + +# set boost architecture and namespace, this is needed to make cmake find boost when you didn't compile boost (using b2) with the --layout=system option. +# set(Boost_ARCHITECTURE "-x64") +# set(Boost_NAMESPACE "libboost") + +if (WIN32) + # use static python lib + add_definitions(-DBOOST_PYTHON_STATIC_LIB) + # disable autolinking in boost + add_definitions( -DBOOST_ALL_NO_LIB ) # avoid LNK1104 on Windows: http://stackoverflow.com/a/28902261/122441 + set(Boost_USE_STATIC_LIBS ON) + set(Boost_USE_MULTITHREADED ON) + set(Boost_USE_STATIC_RUNTIME OFF) +endif() + +if(${CMAKE_VERSION} VERSION_LESS "3.12.0") + message(STATUS "CMake version < 3.12.0") + find_package(PythonInterp) + if (PYTHONINTERP_FOUND) + if (UNIX AND NOT APPLE) + find_package(Boost COMPONENTS python${PYTHON_VERSION_SUFFIX}) + if (PYTHON_VERSION_MAJOR EQUAL 3) + find_package(PythonInterp 3) + find_package(PythonLibs 3 REQUIRED) + else() + find_package(PythonInterp) + find_package(PythonLibs REQUIRED) + endif() + else() + find_package(Boost COMPONENTS python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}) + if (PYTHON_VERSION_MAJOR EQUAL 3) + find_package(PythonInterp 3) + find_package(PythonLibs 3 REQUIRED) + else() + find_package(PythonInterp) + find_package(PythonLibs REQUIRED) + endif() + endif() + else() + message("Python not found") + endif() + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(0,0,\"/usr/local\")" + OUTPUT_VARIABLE PYTHON_SITE_PACKAGES + OUTPUT_STRIP_TRAILING_WHITESPACE + ) # on Ubuntu 11.10 this outputs: /usr/local/lib/python2.7/dist-packages + + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(plat_specific=1,standard_lib=0,prefix=\"/usr/local\")" + OUTPUT_VARIABLE PYTHON_ARCH_PACKAGES + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +else() + message(STATUS "CMake version >= 3.12.0") + if (USE_PY_3) + find_package(Python3 COMPONENTS Interpreter Development) + set(PYTHON_INCLUDE_DIRS ${Python3_INCLUDE_DIRS}) + set(PYTHON_LIBRARIES ${Python3_LIBRARIES}) + set(PYTHON_SITE_PACKAGES ${Python3_SITELIB}) + set(PYTHON_ARCH_PACKAGES ${Python3_SITEARCH}) + find_package(Boost COMPONENTS python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR}) + else() + find_package(Python2 COMPONENTS Interpreter Development) + set(PYTHON_INCLUDE_DIRS ${Python2_INCLUDE_DIRS}) + set(PYTHON_LIBRARIES ${Python2_LIBRARIES}) + set(PYTHON_SITE_PACKAGES ${Python2_SITELIB}) + set(PYTHON_ARCH_PACKAGES ${Python2_SITEARCH}) + find_package(Boost COMPONENTS python${Python2_VERSION_MAJOR}${Python2_VERSION_MINOR}) + endif() +endif() + +message(STATUS "Boost_INCLUDE_DIR = ${Boost_INCLUDE_DIR}") +message(STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}") +message(STATUS "Boost_LIBRARY_DIRS = ${Boost_LIBRARY_DIRS}") +message(STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}") +message(STATUS "PYTHON_SITE_PACKAGES = " ${PYTHON_SITE_PACKAGES}) +message(STATUS "PYTHON_ARCH_PACKAGES = " ${PYTHON_ARCH_PACKAGES}) +message(STATUS "PYTHON_INCLUDE_DIRS = ${PYTHON_INCLUDE_DIRS}") +message(STATUS "PYTHON_LIBRARIES = ${PYTHON_LIBRARIES}") +message(STATUS "PYTHON_SITE_PACKAGES = ${PYTHON_SITE_PACKAGES}") +message(STATUS "PYTHON_ARCH_PACKAGES = ${PYTHON_ARCH_PACKAGES}") + +include_directories(${Boost_INCLUDE_DIRS}) +include_directories(${PYTHON_INCLUDE_DIRS}) + +# include dirs +include_directories( ${OpenCamLib_SOURCE_DIR}/cutters ) +include_directories( ${OpenCamLib_SOURCE_DIR}/geo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/algo ) +include_directories( ${OpenCamLib_SOURCE_DIR}/dropcutter ) +include_directories( ${OpenCamLib_SOURCE_DIR}/common ) +include_directories( ${OpenCamLib_SOURCE_DIR} ) + +# this makes the ocl Python module +add_library( + ocl + MODULE + pythonlib/ocl_cutters.cpp + pythonlib/ocl_geometry.cpp + pythonlib/ocl_algo.cpp + pythonlib/ocl_dropcutter.cpp + pythonlib/ocl.cpp +) + +target_link_libraries( + ocl + ocl_common + ocl_dropcutter + ocl_cutters + ocl_geo + ocl_algo + ${Boost_LIBRARIES} + ${PYTHON_LIBRARIES} +) + +message(STATUS "linking python binary ocl.so with boost: " ${Boost_PYTHON_LIBRARY}) + +# this makes the lib name ocl.so and not libocl.so +set_target_properties(ocl PROPERTIES PREFIX "") +if (WIN32) + set_target_properties(ocl PROPERTIES SUFFIX ".pyd") +endif (WIN32) +# if (WIN32) +# set_target_properties(ocl PROPERTIES VERSION ${MY_VERSION}) +# endif (WIN32) + +install( + TARGETS ocl + LIBRARY DESTINATION ${PYTHON_ARCH_PACKAGES} +) +# these are the python helper lib-files such as camvtk.py +install( + DIRECTORY lib/ + DESTINATION ${PYTHON_SITE_PACKAGES} + # PATTERN .svn EXCLUDE +) diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/stlsurf_py.hpp opencamlib-11.10-1/src/pythonlib/stlsurf_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/stlsurf_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/stlsurf_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,68 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef STLSURF_PY_H +#define STLSURF_PY_H + +#include +#include + +#include "stlsurf.hpp" + +namespace ocl +{ + +/// STLSurf python wrapper +class STLSurf_py : public STLSurf { + public: + /// default constructor + STLSurf_py() : STLSurf() {}; + /// return list of all triangles to python + boost::python::list getTriangles() const { + boost::python::list tlist; + BOOST_FOREACH(Triangle t, tris) { + tlist.append(Triangle_py(t)); + } + return tlist; + }; + + /// return bounds in a list to python + boost::python::list getBounds() const { + boost::python::list bounds; + bounds.append( bb.minpt.x ); + bounds.append( bb.maxpt.x ); + bounds.append( bb.minpt.y ); + bounds.append( bb.maxpt.y ); + bounds.append( bb.minpt.z ); + bounds.append( bb.maxpt.z ); + return bounds; + }; + + /// string output + std::string str() const { + std::ostringstream o; + o << *this; + return o.str(); + }; +}; + +} // end namespace +#endif +// end file stlsurf_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/triangle_py.hpp opencamlib-11.10-1/src/pythonlib/triangle_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/triangle_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/triangle_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,70 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef TRIANGLE_PY_H +#define TRIANGLE_PY_H + +#include + +#include +#include + +#include "triangle.hpp" + +namespace ocl +{ + +/// +/// \brief python wrapper for Triangle +/// +class Triangle_py : public Triangle { + public: + /// default constructor + Triangle_py() : Triangle() {}; + /// construct from three points + Triangle_py( const Point& p0, + const Point& p1, + const Point& p2) : Triangle(p0,p1,p2) {}; + /// copy constructor + Triangle_py( const Triangle_py& t) : Triangle(t) {}; + /// cast-down constructor + Triangle_py( const Triangle& t) : Triangle(t) {}; + + /// string repr + std::string str() const { + std::ostringstream o; + o << *this; + return o.str(); + }; + + /// Returns a list of the vertices to Python + boost::python::list getPoints() const { + boost::python::list plist; + BOOST_FOREACH(Point vertex, p) { + plist.append(vertex); + } + return plist; + }; + +}; + +} // end namespace +#endif +// end file triangle_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/waterline_py.hpp opencamlib-11.10-1/src/pythonlib/waterline_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/waterline_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/waterline_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,77 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ + +#ifndef WATERLINE_PY_H +#define WATERLINE_PY_H + +#include +#include + +#include "waterline.hpp" + +namespace ocl +{ + +/// Python wrapper for Waterline +class Waterline_py : public Waterline { + public: + Waterline_py() : Waterline() {} + ~Waterline_py() { + std::cout << "~Waterline_py()\n"; + } + /// return loop as a list of lists to python + boost::python::list py_getLoops() const { + boost::python::list loop_list; + BOOST_FOREACH( std::vector loop, this->loops ) { + boost::python::list point_list; + BOOST_FOREACH( Point p, loop ) { + point_list.append( p ); + } + loop_list.append(point_list); + } + return loop_list; + } + /// return a list of yfibers to python + boost::python::list py_getXFibers() const { + boost::python::list flist; + std::vector xfibers = *( subOp[0]->getFibers() ); + BOOST_FOREACH( Fiber f, xfibers ) { + Fiber_py f2(f); + flist.append(f2); + } + return flist; + } + /// return a list of yfibers to python + boost::python::list py_getYFibers() const { + boost::python::list flist; + std::vector yfibers = *( subOp[1]->getFibers() ); + BOOST_FOREACH( Fiber f, yfibers ) { + Fiber_py f2(f); + flist.append(f2); + } + return flist; + } + +}; + +} // end namespace + +#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/weave_py.h opencamlib-11.10-1/src/pythonlib/weave_py.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/weave_py.h 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/weave_py.h 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,102 @@ +/* $Id$ + * + * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef WEAVE_PY_H +#define WEAVE_PY_H + +#include // for py +#include // for py + +#include "weave.h" + +namespace ocl +{ + +/// Python wrapper for Weave +class Weave_py : public Weave { + public: + Weave_py() : Weave() {}; + // PYTHON + /// return graph components to python + boost::python::list get_components() { + boost::python::list wlist; + std::vector weaves = split_components(); + BOOST_FOREACH( Weave w, weaves ) { + wlist.append( w ); + } + return wlist; + }; + /// return CL-points to python + boost::python::list getCLPoints() const { + boost::python::list plist; + VertexIterator it_begin, it_end, itr; + boost::tie( it_begin, it_end ) = boost::vertices( g ); + for ( itr=it_begin ; itr != it_end ; ++itr ) { + if ( g[*itr].type == CL ) + plist.append( g[*itr].position ); + } + return plist; + }; + /// return internal points to python + boost::python::list getIPoints() const { + boost::python::list plist; + VertexIterator it_begin, it_end, itr; + boost::tie( it_begin, it_end ) = boost::vertices( g ); + for ( itr=it_begin ; itr != it_end ; ++itr ) { + if ( g[*itr].type == INT ) + plist.append( g[*itr].position ); + } + return plist; + }; + /// return edges to python + /// format is [ [p1,p2] , [p3,p4] , ... ] + boost::python::list getEdges() const { + boost::python::list edge_list; + EdgeIterator it_begin, it_end, itr; + boost::tie( it_begin, it_end ) = boost::edges( g ); + for ( itr=it_begin ; itr != it_end ; ++itr ) { // loop through each edge + if ( ! boost::get( boost::edge_color, g, *itr ) ) { + boost::python::list point_list; // the endpoints of each edge + WeaveVertex v1 = boost::source( *itr, g ); + WeaveVertex v2 = boost::target( *itr, g ); + point_list.append(g[v1].position); + point_list.append(g[v2].position); + edge_list.append(point_list); + } + } + return edge_list; + }; + /// return loops to python + boost::python::list py_getLoops() const { + boost::python::list loop_list; + BOOST_FOREACH( std::vector loop, loops ) { + boost::python::list point_list; + BOOST_FOREACH( WeaveVertex v, loop ) { + point_list.append( g[v].position ); + } + loop_list.append(point_list); + } + return loop_list; + }; +}; + +} // end namespace +#endif +// end file weave_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/weave_py.hpp opencamlib-11.10-1/src/pythonlib/weave_py.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/src/pythonlib/weave_py.hpp 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/src/pythonlib/weave_py.hpp 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,90 @@ +/* $Id$ + * + * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). + * + * This file is part of OpenCAMlib + * (see https://github.com/aewallin/opencamlib). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . +*/ +#ifndef WEAVE_PY_H +#define WEAVE_PY_H + +#include "weave.hpp" + +namespace ocl +{ + +namespace weave { + +/// \brief python wrapper for VoronoiDiagram +/// +class Weave_py : public Weave { + public: + Weave_py() : Weave() {}; + + int numVertices() const { + return g.num_vertices(); + }; + boost::python::list getVertices(VertexType t) { + boost::python::list plist; + BOOST_FOREACH( Vertex v, g.vertices() ) { + if ( g[v].type == t ) + plist.append( g[v].position ); + } + return plist; + }; + + /// return CL-points to python + boost::python::list getCLVertices() { + return getVertices( CL ); + }; + /// return internal points to python + boost::python::list getINTVertices() { + return getVertices( INT ); + }; + /// return edges to python + /// format is [ [p1,p2] , [p3,p4] , ... ] + boost::python::list getEdges() { + boost::python::list edge_list; + BOOST_FOREACH(Edge e, g.edges() ) { + boost::python::list point_list; // the endpoints of each edge + Vertex v1 = g.source( e ); + Vertex v2 = g.target( e ); + point_list.append(g[v1].position); + point_list.append(g[v2].position); + edge_list.append(point_list); + } + return edge_list; + }; + /// return loops to python + boost::python::list py_getLoops() { + boost::python::list loop_list; + BOOST_FOREACH( std::vector loop, loops ) { + boost::python::list point_list; + BOOST_FOREACH( Vertex v, loop ) { + point_list.append( g[v].position ); + } + loop_list.append(point_list); + } + return loop_list; + }; + +}; + +} // end weave namespace + +} // end ocl namespace +#endif +// end weave_py.h diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/.travis.yml opencamlib-11.10-1/.travis.yml --- opencamlib-11.10+git201801200005~ubuntu16.04.1/.travis.yml 1970-01-01 00:00:00.000000000 +0000 +++ opencamlib-11.10-1/.travis.yml 2020-06-14 12:13:19.000000000 +0000 @@ -0,0 +1,173 @@ +os: + - windows + - linux + - osx + +# matrix: +# allow_failures: +# - os: windows +# env: BUILD_CXX_LIB=OFF BUILD_NODEJS_LIB=ON BUILD_PY_LIB=OFF + +language: cpp + +compiler: + - gcc + +env: + - BUILD_CXX_LIB=ON BUILD_NODEJS_LIB=OFF BUILD_PY_LIB=OFF + - BUILD_CXX_LIB=OFF BUILD_NODEJS_LIB=ON BUILD_PY_LIB=OFF + - BUILD_CXX_LIB=OFF BUILD_NODEJS_LIB=OFF BUILD_PY_LIB=ON USE_PY_3=OFF + - BUILD_CXX_LIB=OFF BUILD_NODEJS_LIB=OFF BUILD_PY_LIB=ON USE_PY_3=ON + +before_install: + - > + if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + brew update + brew upgrade cmake + if [[ "$USE_PY_3" == "OFF" ]]; then + brew install boost-python + elif [[ "$USE_PY_3" == "ON" ]]; then + brew install boost-python3 + fi + export CMAKE_FIND_FRAMEWORK=LAST + export CMAKE_VERBOSE_MAKEFILE=ON + elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + sudo apt-get update + sudo apt-get install -y git libboost-python-dev libboost-system-dev + wget -O cmake.sh https://github.com/Kitware/CMake/releases/download/v3.13.2/cmake-3.13.2-Linux-x86_64.sh + sudo mkdir /opt/cmake + sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/opt/cmake + sudo ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake + else + choco install cmake + choco install nodejs + if [[ "$USE_PY_3" == "OFF" ]]; then + choco install python2 + elif [[ "$USE_PY_3" == "ON" ]]; then + choco install python3 + fi + wget -nv -O boost.zip https://dl.bintray.com/boostorg/release/1.69.0/source/boost_1_69_0.zip + 7z x boost.zip -y -o/c/boost -r + if [[ "$BUILD_PY_LIB" == "ON" ]]; then + cd /c/boost/boost_1_69_0 + ./bootstrap.bat + if [[ "$USE_PY_3" == "OFF" ]]; then + echo 'using python : 2.7 : C:\\Python27\\python : C:\\Python27\\include : C:\\Python27\\libs ;' >> project-config.jam + else + echo 'using python : 3.7 : C:\\Python37\\python : C:\\Python37\\include : C:\\Python37\\libs ;' >> project-config.jam + fi + cat project-config.jam + cat bootstrap.log + ./b2 address-model=64 threading=multi --with-python -j2 variant=debug link=static --layout=system + ls /c/boost/boost_1_69_0/stage/lib + fi + fi + +before_script: + - cd $TRAVIS_BUILD_DIR + - export PATH="$PATH:/c/Program Files/nodejs:/c/Python27/python:/c/Python37/python" + - echo $PATH + - npm install + - mkdir build + - cd build + - echo $BUILD_CXX_LIB + - echo $BUILD_NODEJS_LIB + - echo $BUILD_PY_LIB + - echo $USE_PY_3 + - > + if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + if [[ "$BUILD_NODEJS_LIB" == "ON" ]]; then + cd .. + ./node_modules/.bin/cmake-js compile --arch=x64 \ + --CDBOOST_ROOT="/c/boost/boost_1_69_0" \ + --CDBOOST_INCLUDEDIR="/c/boost/boost_1_69_0/boost" \ + --CDBOOST_LIBRARYDIR="/c/boost/boost_1_69_0/stage/lib" \ + --CDBUILD_CXX_LIB="$BUILD_CXX_LIB" \ + --CDBUILD_NODEJS_LIB="$BUILD_NODEJS_LIB" \ + --CDBUILD_PY_LIB="$BUILD_PY_LIB" \ + --CDVERSION_STRING="$TRAVIS_BRANCH" + elif [[ "$BUILD_PY_LIB" == "ON" ]]; then + if [[ "$USE_PY_3" == "ON" ]]; then + cmake \ + -DPython3_ROOT_DIR="/c/Python37" \ + -DPython3_EXECUTABLE="/c/Python37/python.exe" \ + -DPython3_SITELIB="/c/Python37/Lib/site-packages" \ + -DPython3_SITEARCH="/c/Python37/Lib/site-packages" \ + -DBOOST_ROOT="/c/boost/boost_1_69_0" \ + -DBOOST_INCLUDEDIR="/c/boost/boost_1_69_0/boost" \ + -DBOOST_LIBRARYDIR="/c/boost/boost_1_69_0/stage/lib" \ + -DBUILD_CXX_LIB="$BUILD_CXX_LIB" \ + -DBUILD_NODEJS_LIB="$BUILD_NODEJS_LIB" \ + -DBUILD_PY_LIB="$BUILD_PY_LIB" \ + -DUSE_PY_3="$USE_PY_3" \ + -DVERSION_STRING="$TRAVIS_BRANCH" \ + -DCMAKE_GENERATOR_PLATFORM="x64" \ + ../src; + else + cmake \ + -DPython2_ROOT_DIR="/c/Python27" \ + -DPython2_EXECUTABLE="/c/Python27/python.exe" \ + -DPython2_SITELIB="/c/Python27/Lib/site-packages" \ + -DPython2_SITEARCH="/c/Python27/Lib/site-packages" \ + -DBOOST_ROOT="/c/boost/boost_1_69_0" \ + -DBOOST_INCLUDEDIR="/c/boost/boost_1_69_0/boost" \ + -DBOOST_LIBRARYDIR="/c/boost/boost_1_69_0/stage/lib" \ + -DBUILD_CXX_LIB="$BUILD_CXX_LIB" \ + -DBUILD_NODEJS_LIB="$BUILD_NODEJS_LIB" \ + -DBUILD_PY_LIB="$BUILD_PY_LIB" \ + -DUSE_PY_3="$USE_PY_3" \ + -DVERSION_STRING="$TRAVIS_BRANCH" \ + -DCMAKE_GENERATOR_PLATFORM="x64" \ + ../src; + fi + else + cmake \ + -DBOOST_ROOT="/c/boost/boost_1_69_0" \ + -DBOOST_INCLUDEDIR="/c/boost/boost_1_69_0/boost" \ + -DBOOST_LIBRARYDIR="/c/boost/boost_1_69_0/stage/lib" \ + -DBUILD_CXX_LIB="$BUILD_CXX_LIB" \ + -DBUILD_NODEJS_LIB="$BUILD_NODEJS_LIB" \ + -DBUILD_PY_LIB="$BUILD_PY_LIB" \ + -DVERSION_STRING="$TRAVIS_BRANCH" \ + -DCMAKE_GENERATOR_PLATFORM="x64" \ + ../src; + fi + else + if [[ "$BUILD_NODEJS_LIB" == "ON" ]]; then + cd .. + ./node_modules/.bin/cmake-js compile --arch=x64 \ + --CDBUILD_CXX_LIB="$BUILD_CXX_LIB" \ + --CDBUILD_NODEJS_LIB="$BUILD_NODEJS_LIB" \ + --CDBUILD_PY_LIB="$BUILD_PY_LIB" \ + --CDUSE_PY_3="$USE_PY_3" \ + --CDVERSION_STRING="$TRAVIS_BRANCH" + else + /usr/local/bin/cmake \ + -DBUILD_CXX_LIB="$BUILD_CXX_LIB" \ + -DBUILD_NODEJS_LIB="$BUILD_NODEJS_LIB" \ + -DBUILD_PY_LIB="$BUILD_PY_LIB" \ + -DUSE_PY_3="$USE_PY_3" \ + -DVERSION_STRING="$TRAVIS_BRANCH" \ + ../src; + fi + fi +script: + - if [ "$TRAVIS_OS_NAME" != "windows" ] && [ "$BUILD_NODEJS_LIB" == "OFF" ]; then sudo make install; fi + +after_success: + - > + if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + if [[ "$USE_PY_3" == "ON" ]]; then + otool -L /usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ocl.so; + else + otool -L /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ocl.so; + fi + elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + if [[ "$USE_PY_3" == "ON" ]]; then + objdump -x /usr/lib/python3/dist-packages/ocl.so; + else + objdump -x /usr/lib/python2.7/dist-packages/ocl.so; + fi + fi + - if [[ "$BUILD_NODEJS_LIB" == "ON" ]]; then node $TRAVIS_BUILD_DIR/examples/nodejs/test.js; fi + - if [[ "$BUILD_PY_LIB" == "ON" ]]; then python $TRAVIS_BUILD_DIR/examples/python/ocl_clpoint.py; fi diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/dllmain.cpp opencamlib-11.10-1/Windows/dllmain.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/dllmain.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/dllmain.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "stdafx.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.cpp opencamlib-11.10-1/Windows/OpenCamLib.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/OpenCamLib.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -// OpenCamLib.cpp : Defines the exported functions for the DLL application. -// - -#include "stdafx.h" - - Binary files /tmp/tmpRJ3Un5/UNBa1k8QvJ/opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.rc and /tmp/tmpRJ3Un5/cv3kdLUWLM/opencamlib-11.10-1/Windows/OpenCamLib.rc differ diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.sln opencamlib-11.10-1/Windows/OpenCamLib.sln --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.sln 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/OpenCamLib.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.40629.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenCamLib", "OpenCamLib.vcxproj", "{A2B9038F-7C97-4AA5-93D8-AF6055102587}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A2B9038F-7C97-4AA5-93D8-AF6055102587}.Release|Win32.ActiveCfg = Release X64|x64 - {A2B9038F-7C97-4AA5-93D8-AF6055102587}.Release|Win32.Build.0 = Release X64|x64 - {A2B9038F-7C97-4AA5-93D8-AF6055102587}.Release|x64.ActiveCfg = Release X64|x64 - {A2B9038F-7C97-4AA5-93D8-AF6055102587}.Release|x64.Build.0 = Release X64|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.vcxproj opencamlib-11.10-1/Windows/OpenCamLib.vcxproj --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.vcxproj 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/OpenCamLib.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,392 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release X64 - Win32 - - - Release X64 - x64 - - - Release - Win32 - - - Release - x64 - - - - {A2B9038F-7C97-4AA5-93D8-AF6055102587} - OpenCamLib - Win32Proj - - - - DynamicLibrary - v120 - Unicode - true - - - DynamicLibrary - v120 - Unicode - true - - - DynamicLibrary - v120 - Unicode - true - - - DynamicLibrary - v120 - Unicode - true - - - DynamicLibrary - v120 - Unicode - - - DynamicLibrary - v120 - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>12.0.30501.0 - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - ocl - .pyd - - - true - ocl - .pyd - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - ocl - .pyd - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - ocl - .pyd - - - false - ocl - .pyd - - - false - ocl - .pyd - - - - Disabled - C:\Python27\include;C:\Program Files\boost\boost_1_62_0;..\src\geo;..\src\cutters;..\src\dropcutter;..\src\common;..\src\algo;..\Windows - WIN32;_DEBUG;_WINDOWS;_USRDLL;OPENCAMLIB_EXPORTS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - NotUsing - Level3 - EditAndContinue - true - - - C:\Python27\libs;C:\Program Files\boost\boost_1_62_0\stage\lib - true - Windows - MachineX86 - $(OutDir)ocl.pyd - - - - - Disabled - C:\Python27\include;C:\Program Files\boost\boost_1_62_0;..\src\geo;..\src\cutters;..\src\dropcutter;..\src\common;..\src\algo;..\Windows - WIN32;_DEBUG;_WINDOWS;_USRDLL;OPENCAMLIB_EXPORTS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - NotUsing - Level3 - ProgramDatabase - true - - - C:\Python27\libs;C:\Program Files\boost\boost_1_62_0\stage\lib - true - Windows - $(OutDir)ocl.pyd - - - - - - - - MaxSpeed - true - C:\Python27\include;C:\Program Files\boost\boost_1_62_0;..\src\geo;..\src\cutters;..\src\dropcutter;..\src\common;..\src\algo;..\Windows - WIN32;NDEBUG;_WINDOWS;_USRDLL;OPENCAMLIB_EXPORTS;__BOOST_PYTHON_NO_LIB__;BOOST_PYTHON_STATIC_LIB=1;BOOST_LIB_DIAGNOSTIC;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - NotUsing - Level3 - ProgramDatabase - true - - - $(PYTHON_LIB);%(AdditionalDependencies) - $(OutDir)ocl.pyd - C:\Python27\libs;C:\Program Files\boost\boost_1_62_0\stage\lib - true - Windows - true - true - MachineX86 - - - - - - - - - MaxSpeed - true - C:\Python27\include;C:\Program Files\boost\boost_1_62_0;..\src\geo;..\src\cutters;..\src\dropcutter;..\src\common;..\src\algo;..\Windows - WIN32;NDEBUG;_WINDOWS;_USRDLL;OPENCAMLIB_EXPORTS;__BOOST_PYTHON_NO_LIB__;BOOST_PYTHON_STATIC_LIB=1;BOOST_LIB_DIAGNOSTIC;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - NotUsing - Level3 - ProgramDatabase - true - - - $(PYTHON_LIB);%(AdditionalDependencies) - $(OutDir)ocl.pyd - C:\Python27\libs;C:\Program Files\boost\boost_1_62_0\stage\lib - true - Windows - true - true - MachineX86 - - - - - - - - - MaxSpeed - true - C:\Python27\include;C:\Program Files\boost\boost_1_62_0;..\src\geo;..\src\cutters;..\src\dropcutter;..\src\common;..\src\algo;..\Windows - WIN32;NDEBUG;_WINDOWS;_USRDLL;OPENCAMLIB_EXPORTS;__BOOST_PYTHON_NO_LIB__;BOOST_PYTHON_STATIC_LIB=1;BOOST_LIB_DIAGNOSTIC;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - NotUsing - Level3 - ProgramDatabase - true - - - $(PYTHON_LIB);%(AdditionalDependencies) - $(OutDir)ocl.pyd - C:\Python27\libs;C:\Program Files\boost\boost_1_62_0\stage\lib - true - Windows - true - true - - - - - - - - - MaxSpeed - true - C:\Python27\include;C:\Program Files\boost\boost_1_62_0;..\src\geo;..\src\cutters;..\src\dropcutter;..\src\common;..\src\algo;..\Windows - WIN32;NDEBUG;_WINDOWS;_USRDLL;OPENCAMLIB_EXPORTS;__BOOST_PYTHON_NO_LIB__;BOOST_PYTHON_STATIC_LIB=1;BOOST_LIB_DIAGNOSTIC;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - NotUsing - Level3 - ProgramDatabase - true - - - $(PYTHON_LIB);%(AdditionalDependencies) - $(OutDir)ocl.pyd - C:\Python27\libs;C:\Program Files\boost\boost_1_62_0\stage\lib - true - Windows - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.vcxproj.filters opencamlib-11.10-1/Windows/OpenCamLib.vcxproj.filters --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/OpenCamLib.vcxproj.filters 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/OpenCamLib.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,335 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - {c404a69e-c919-4276-987e-013c1c2e7154} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {716f9b17-fee0-4fea-994a-39b3862792b7} - h;hpp;hxx;hm;inl;inc;xsd - - - {a8f3e4a8-d0d9-48eb-b190-16feda395cd1} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - Resource Files - - - \ No newline at end of file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/README opencamlib-11.10-1/Windows/README --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/README 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -======================================================================== - OpenCAMLib for Windows README -======================================================================== - -1. INTRODUCTION ------------------------------------------------------------------------------------------ - -https://github.com/fra589/opencamlib is a fork of https://github.com/aewallin/opencamlib. -The only goal of this fork is to make a Windows available version for using with FreeCAD. - - -2. INSTALL DEPENDENCY ------------------------------------------------------------------------------------------ - -2.1. - Get latest full Python 2 Release with development files (I useed the 2.7.13) from https://www.python.org/downloads/windows/ -2.2. - Install Python on his standard path : C:\Python27 - /!\ Install Python before Boost because the Boost build process need it. -2.3. - Get latest Boost libraries from http://www.boost.org (I used the 1.62.0 from https://sourceforge.net/projects/boost/files/boost/1.62.0/boost_1_62_0.7z) -2.4. - Un7zip sources lib to it's standard path : C:\Program Files\boost\boost_1_62_0 -2.5. - Créate configuration file %HOMEDRIVE%%HOMEPATH%\user-config.jam to tell Boost building where is Python, with the following content : -using python - : 2.7 # Version - : C:\\Python27\\python.exe # Python Path - : C:\\Python27\\include # include path - : C:\\\\Python27\\libs # lib path(s) - : BOOST_ALL_NO_LIB=1 - ; -2.6. - Start an Administrator shell command and cd to C:\Program Files\boost\boost_1_62_0 then type: - .\bootstrap - .\b2 -a --build-type=complete architecture=x86 address-model=64 - => This build all the boost's binaries libraries, This may take a while, depending of your PC. - (The complette doc for Boost install and build is here : http://www.boost.org/doc/libs/1_62_0/more/getting_started/windows.html) - - -3. GET OpenCAMLib source and compile library ------------------------------------------------------------------------------------------ - -3.1. - git clone https://github.com/fra589/opencamlib.git or download and uncompress the ZIP file somewhere on your PC -3.2. - Open the Visual Studio Solution : /opencamlib/Windows/OpenCamLib.sln -3.3. - Select "Release" as active solution configuration and x64 as Active solution platform in the Visual Studio Configuration Manager. - (if you have the 32 bits FreeCAD version, you need to create the corect config for Release win32) -3.4. - Click on the “OpenCamLib” project in the solution explorer then click on: - PROJECT -> Properties -> Configuration Properies -> C/C++ Tab -> General -> Additional Include Directories - verify the 2 directories : - C:\Python27\include --- Or change it whatever other place where you installed it... - C:\Program Files\boost\boost_1_62_0 --- Or change it whatever other place where you installed it... - In PROJECT -> Properties -> Configuration Properies -> Link editor -> General -> Additional Libraries Directories - verify the 2 directories : - C:\Python27\libs --- Or change it whatever other place where you installed it... - C:\Program Files\boost\boost_1_62_0\stage\lib --- Or change it whatever other place where you installed it... - Click OK -3.5. - Click on BUILD -> Build Solution - (This may take a while, depending of your PC) - - -4. INSTALL for use with FreeCAD ------------------------------------------------------------------------------------------ - -4.1. - Copy the resulting library from : \opencamlib\Windows\x64\Release X64\ocl.pyd - to \MOD\Path\ocl.pyd - - -======================================================================== - RUN FreeCAD and enjoy Path surfacing :-) -======================================================================== - diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/resource.h opencamlib-11.10-1/Windows/resource.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/resource.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/resource.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by OpenCamLib.rc - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/stdafx.cpp opencamlib-11.10-1/Windows/stdafx.cpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/stdafx.cpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/stdafx.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// OpenCamLib.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/stdafx.h opencamlib-11.10-1/Windows/stdafx.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/stdafx.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/stdafx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -// Windows Header Files: -#include - -// TODO: reference additional headers your program requires here diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/targetver.h opencamlib-11.10-1/Windows/targetver.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/targetver.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/targetver.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -#pragma once - -// The following macros define the minimum required platform. The minimum required platform -// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run -// your application. The macros work by enabling all features available on platform versions up to and -// including the version specified. - -// Modify the following defines if you have to target a platform prior to the ones specified below. -// Refer to MSDN for the latest info on corresponding values for different platforms. -#ifndef WINVER // Specifies that the minimum required platform is Windows Vista. -#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows. -#endif - -#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista. -#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows. -#endif - -#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows XP. -#define _WIN32_WINDOWS 0x0501 // Change this to the appropriate value to target other Windows versions. -#endif - -#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0. -#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE. -#endif diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/version.h opencamlib-11.10-1/Windows/version.h --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/version.h 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/version.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -// Version -// -#define VER_FILEVERSION 2016,12,26,0 -#define VER_FILEVERSION_STR "2016.12.26.0\0" -#define VER_PRODUCTVERSION VER_FILEVERSION -#define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR -#define VER_INTERNALNAME_STR "ocl.pyd" -#define VER_ORIGINALFILENAME_STR "ocl.pyd" -#define VER_PRODUCTNAME_STR "OpenCAMLib" -#define VER_FILEDESCRIPTION_STR "OpenCAM lib for Windows - OpenCAMLib (ocl) is a C++ library for creating toolpaths for cnc-machines such as mills and lathes." diff -Nru opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/version_string.hpp opencamlib-11.10-1/Windows/version_string.hpp --- opencamlib-11.10+git201801200005~ubuntu16.04.1/Windows/version_string.hpp 2018-01-20 00:05:22.000000000 +0000 +++ opencamlib-11.10-1/Windows/version_string.hpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -//version_string.hpp - Manually created for Windows Compile#include "version.h" -#include "version.h" - -#ifndef VERSION_STRING -#define VERSION_STRING VER_FILEVERSION_STR -#endif \ No newline at end of file