diff --git a/.gitignore b/.gitignore index 668b69c..55ea89f 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,8 @@ Thumbs.db *.zip *.as *.bin +.env +/assets # Nitro /src/configuration.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + 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 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 +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 +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. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +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 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 . + +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: + + 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 +. diff --git a/README.md b/README.md index 0ac3c73..cd62ce3 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,8 @@ -### Nitro Converter +# Nitro Converter -# What files does this tool convert? +This tool is used to generate `.nitro` bundled assets for use with the Nitro Client -The converter currently supports the following files: - -- furnidata.xml -- figuredata.xml -- figuremap.xml -- effectmap.xml -- external_texts.txt -- productdata.txt -- Furniture swfs -- Pet swfs -- Figure swfs -- Effect swfs - -# Configuration +## Configuration You must rename `configuration.json.example` to `configuration.json` @@ -23,35 +10,44 @@ The simplest way to set your configuration is by changing the `external.variable You may set any of the urls to a local path on your system or a remote url. A local path is recommended as the tool will run a lot quicker for downloading. -| key | value | -| ------ | ------ | -| output.folder | The folder where converted assets will be saved to | -| flash.client.url | The base url where figures/pets/effects are stored, eg https://url/gordon/ | -| furnidata.load.url | The url to your furnidata, can be XML or JSON, eg https://url/gamedata/furnidata.xml | -| productdata.load.url | The url to your productdata.txt, eg https://url/gamedata/productdata.txt | -| figuremap.load.url | The url to your figure map, can be XML or JSON, eg https://url/gordon/figuremap.xml | -| effectmap.load.url | The url to your effect map, can be XML or JSON, eg https://url/gordon/effectmap.xml | -| dynamic.download.pet.url | The full url where pets are stored, eg https://url/gordon/%className%.swf | -| dynamic.download.figure.url | The full url where figures are stored, eg https://url/gordon/%className%.swf | -| dynamic.download.effect.url | The full url where effects are stored, eg https://url/gordon/%className%.swf | -| flash.dynamic.download.url | The base url where furniture is stored, eg https://url/dcr/hof_furni/ | +| key | value | +| ------------------------------ | ------------------------------------------------------------------------------------ | +| output.folder | The folder where converted assets will be saved to | +| flash.client.url | The base url where figures/pets/effects are stored, eg https://url/gordon/ | +| furnidata.load.url | The url to your furnidata, can be XML or JSON, eg https://url/gamedata/furnidata.xml | +| productdata.load.url | The url to your productdata.txt, eg https://url/gamedata/productdata.txt | +| figuremap.load.url | The url to your figure map, can be XML or JSON, eg https://url/gordon/figuremap.xml | +| effectmap.load.url | The url to your effect map, can be XML or JSON, eg https://url/gordon/effectmap.xml | +| dynamic.download.pet.url | The full url where pets are stored, eg https://url/gordon/%className%.swf | +| dynamic.download.figure.url | The full url where figures are stored, eg https://url/gordon/%className%.swf | +| dynamic.download.effect.url | The full url where effects are stored, eg https://url/gordon/%className%.swf | +| flash.dynamic.download.url | The base url where furniture is stored, eg https://url/dcr/hof_furni/ | | dynamic.download.furniture.url | The full url where furniture is stored, eg https://url/dcr/hof_furni/%className%.swf | -| external.variables.url | The url to your external variables, eg https://url/gamedata/external_variables.txt | -| external.texts.url | The url to your external texts, eg https://url/gamedata/external_texts.txt | -| convert.productdata | Either `0` to skip or `1` to run | -| convert.externaltexts | Either `0` to skip or `1` to run | -| convert.figure | Either `0` to skip or `1` to run | -| convert.figuredata | Either `0` to skip or `1` to run | -| convert.effect | Either `0` to skip or `1` to run | -| convert.furniture | Either `0` to skip or `1` to run | -| convert.pet | Either `0` to skip or `1` to run | +| external.variables.url | The url to your external variables, eg https://url/gamedata/external_variables.txt | +| external.texts.url | The url to your external texts, eg https://url/gamedata/external_texts.txt | +| convert.productdata | Either `0` to skip or `1` to run | +| convert.externaltexts | Either `0` to skip or `1` to run | +| convert.figure | Either `0` to skip or `1` to run | +| convert.figuredata | Either `0` to skip or `1` to run | +| convert.effect | Either `0` to skip or `1` to run | +| convert.furniture | Either `0` to skip or `1` to run | +| convert.pet | Either `0` to skip or `1` to run | -# Running the converter +## Running the converter + +**Make sure you run `yarn install` before first use.** To run the converter open a new terminal / console window in the main converter directory. -**Make sure you run ``npm i`` before first use.** +The converter has a few different start commands: -Type `npm start` and the converter will start running, only errors will be outputted in the console. +| key | value | +| ---------------------- | ---------------------------------------------------------- | +| yarn start | Will download and convert assets as set in the config | +| yarn start:bundle | Will bundle decompressed `.nitro` assets (json / png) | +| yarn start:extract | Will extract `.nitro` assets which can be used for editing | +| yarn start:convert-swf | Will convert inputted `.swf` assets to `.nitro` | -The converter will skip any assets that already exist but will always reconvert your XMLs / copy your JSONS to the ``gamedata`` folder to ensure you always have the latest copy. +When you run `start:bundle | start:extract | start:convert-swf` for the first time it will automatically generate a folder structure for placing your assets for conversion. + +The converter will skip any assets that already exist but will always reconvert your XMLs / copy your JSONS to the `gamedata` folder to ensure you always have the latest copy. diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 1bd356b..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3153 +0,0 @@ -{ - "name": "nitro-converter", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", - "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@jimp/bmp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", - "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "bmp-js": "^0.1.0" - } - }, - "@jimp/core": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", - "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "^0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - } - }, - "@jimp/custom": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", - "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.16.1" - } - }, - "@jimp/gif": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", - "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "gifwrap": "^0.9.2", - "omggif": "^1.0.9" - } - }, - "@jimp/jpeg": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", - "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "jpeg-js": "0.4.2" - } - }, - "@jimp/plugin-blit": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", - "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-blur": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", - "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-circle": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", - "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-color": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", - "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "tinycolor2": "^1.4.1" - } - }, - "@jimp/plugin-contain": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", - "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-cover": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", - "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-crop": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", - "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-displace": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", - "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-dither": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", - "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-fisheye": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", - "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-flip": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", - "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-gaussian": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", - "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-invert": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", - "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-mask": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", - "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-normalize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", - "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-print": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", - "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "load-bmfont": "^1.4.0" - } - }, - "@jimp/plugin-resize": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", - "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-rotate": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", - "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-scale": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", - "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-shadow": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", - "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugin-threshold": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", - "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1" - } - }, - "@jimp/plugins": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", - "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.16.1", - "@jimp/plugin-blur": "^0.16.1", - "@jimp/plugin-circle": "^0.16.1", - "@jimp/plugin-color": "^0.16.1", - "@jimp/plugin-contain": "^0.16.1", - "@jimp/plugin-cover": "^0.16.1", - "@jimp/plugin-crop": "^0.16.1", - "@jimp/plugin-displace": "^0.16.1", - "@jimp/plugin-dither": "^0.16.1", - "@jimp/plugin-fisheye": "^0.16.1", - "@jimp/plugin-flip": "^0.16.1", - "@jimp/plugin-gaussian": "^0.16.1", - "@jimp/plugin-invert": "^0.16.1", - "@jimp/plugin-mask": "^0.16.1", - "@jimp/plugin-normalize": "^0.16.1", - "@jimp/plugin-print": "^0.16.1", - "@jimp/plugin-resize": "^0.16.1", - "@jimp/plugin-rotate": "^0.16.1", - "@jimp/plugin-scale": "^0.16.1", - "@jimp/plugin-shadow": "^0.16.1", - "@jimp/plugin-threshold": "^0.16.1", - "timm": "^1.6.1" - } - }, - "@jimp/png": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", - "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.1", - "pngjs": "^3.3.3" - } - }, - "@jimp/tiff": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", - "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", - "requires": { - "@babel/runtime": "^7.7.2", - "utif": "^2.0.1" - } - }, - "@jimp/types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", - "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.16.1", - "@jimp/gif": "^0.16.1", - "@jimp/jpeg": "^0.16.1", - "@jimp/png": "^0.16.1", - "@jimp/tiff": "^0.16.1", - "timm": "^1.6.1" - } - }, - "@jimp/utils": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", - "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", - "requires": { - "@babel/runtime": "^7.7.2", - "regenerator-runtime": "^0.13.3" - } - }, - "@jvitela/mustache-wax": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@jvitela/mustache-wax/-/mustache-wax-1.0.3.tgz", - "integrity": "sha512-5M5p8d9YQwEDSa0oLoeCZ8ECiM2ZJLKxI/D0pDByiNBJw+4Tizjk/NMIjGx7IoJOGBnWcfHX3Pwd6m/MpMHoGA==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@types/bytebuffer": { - "version": "5.0.42", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", - "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", - "dev": true, - "requires": { - "@types/long": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "dev": true - }, - "@types/node": { - "version": "14.14.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz", - "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz", - "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true - }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "@types/xml2js": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz", - "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz", - "integrity": "sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.15.1", - "@typescript-eslint/scope-manager": "4.15.1", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz", - "integrity": "sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.15.1", - "@typescript-eslint/types": "4.15.1", - "@typescript-eslint/typescript-estree": "4.15.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz", - "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.15.1", - "@typescript-eslint/types": "4.15.1", - "@typescript-eslint/typescript-estree": "4.15.1", - "debug": "^4.1.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz", - "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.15.1", - "@typescript-eslint/visitor-keys": "4.15.1" - } - }, - "@typescript-eslint/types": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.1.tgz", - "integrity": "sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz", - "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.15.1", - "@typescript-eslint/visitor-keys": "4.15.1", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz", - "integrity": "sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.15.1", - "eslint-visitor-keys": "^2.0.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.1.tgz", - "integrity": "sha1-tcdcUyBS3M1qOcAGTHcsjVegbNI=" - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "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.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "requires": { - "readable-stream": "~1.0.26" - } - }, - "bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" - }, - "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" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" - }, - "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 - }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", - "requires": { - "long": "~3" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", - "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=" - }, - "concat-frames": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/concat-frames/-/concat-frames-1.0.3.tgz", - "integrity": "sha1-z+moFvJce3WWPZn+8vSqBFj7+Zs=", - "requires": { - "pixel-stream": "^1.0.3" - } - }, - "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 - }, - "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=" - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "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" - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "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 - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", - "dev": true, - "requires": { - "xtend": "^4.0.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" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz", - "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.3.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" - }, - "exif-reader": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exif-reader/-/exif-reader-1.0.3.tgz", - "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==" - }, - "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": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "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 - }, - "fastq": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", - "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", - "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-type": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", - "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "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" - } - }, - "free-tex-packer-core": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/free-tex-packer-core/-/free-tex-packer-core-0.3.2.tgz", - "integrity": "sha512-CauShorQ77Pgm+u2YalXX6HyR0rnkuccS3lIKCZpnBeAjcUV6SXCwswUGS8cbrvS5/dIwM5UeqFu02X86PPMkg==", - "requires": { - "@jvitela/mustache-wax": "^1.0.1", - "jimp": "^0.2.28", - "maxrects-packer": "^2.5.0", - "mustache": "^2.3.0", - "tinify": "^1.5.0" - }, - "dependencies": { - "bmp-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", - "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=" - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "jimp": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", - "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", - "requires": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.3", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "mkdirp": "0.5.1", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - } - }, - "jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "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" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": 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 - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "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" - } - }, - "gifwrap": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", - "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", - "requires": { - "image-q": "^1.1.1", - "omggif": "^1.0.10" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "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" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "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.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "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" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "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" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "image-q": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", - "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "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=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jimp": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", - "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.16.1", - "@jimp/plugins": "^0.16.1", - "@jimp/types": "^0.16.1", - "regenerator-runtime": "^0.13.3" - } - }, - "jpeg-js": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", - "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==" - }, - "jpg-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jpg-stream/-/jpg-stream-1.1.2.tgz", - "integrity": "sha1-TboVnZ0ZNo3yExj2SM7pgKcr5Ac=", - "requires": { - "exif-reader": "^1.0.0", - "pixel-stream": "^1.0.3" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "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-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "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=" - }, - "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" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "load-bmfont": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", - "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "requires": { - "chalk": "^4.0.0" - } - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lzma-purejs": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/lzma-purejs/-/lzma-purejs-0.9.3.tgz", - "integrity": "sha1-yJF+iUsbTbXIZbkn34ZO3edZzN4=", - "requires": { - "amdefine": "~0.1.0", - "commander": "~2.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "maxrects-packer": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/maxrects-packer/-/maxrects-packer-2.7.2.tgz", - "integrity": "sha512-akd5IRLPqQeWlpJyRJyfYq86VB05zzbMIdyTgLxRk4z1H0A8g4oTJW31Yo6zO9piSRsFNYdzmgudW7J2g1gEhQ==" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "requires": { - "mime-db": "1.45.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "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.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mustache": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", - "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "node-gzip": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/node-gzip/-/node-gzip-1.1.2.tgz", - "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "requires": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.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=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "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-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pixel-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pixel-stream/-/pixel-stream-1.0.3.tgz", - "integrity": "sha1-U+jFSyHVUIOTtTvLMrZKd1Xx+l4=", - "requires": { - "shallow-copy": "0.0.1" - } - }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "requires": { - "pngjs": "^3.0.0" - } - }, - "png-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/png-stream/-/png-stream-1.0.5.tgz", - "integrity": "sha1-W8cWh+qJWUJ+lQ5Sx8yknipvBMY=", - "requires": { - "bl": "^0.9.3", - "buffer-crc32": "^0.2.3", - "buffer-equal": "^0.0.1", - "pixel-stream": "^1.0.3" - } - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-nodeify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/promise-nodeify/-/promise-nodeify-3.0.1.tgz", - "integrity": "sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg==" - }, - "proxying-agent": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/proxying-agent/-/proxying-agent-2.4.0.tgz", - "integrity": "sha512-b9vDqIcViJZVsWPpQlp9Py74u+Wqd0a+kMkkg7zX58mwNtrNbOChNlRTM7lUrlpiwNzyJCV8+5D8rnZYLDFh7Q==" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "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==" - }, - "queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", - "dev": true - }, - "read-chunk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", - "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "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" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "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.3", - "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.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "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 - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "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" - } - }, - "stream-to": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", - "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=" - }, - "stream-to-array": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", - "requires": { - "any-promise": "^1.1.0" - } - }, - "stream-to-buffer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", - "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", - "requires": { - "stream-to": "~0.2.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.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": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", - "dev": true, - "requires": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ajv": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", - "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" - }, - "tinify": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/tinify/-/tinify-1.5.0.tgz", - "integrity": "sha1-a6LqfognyEXSY947RvTbe61VWSA=", - "requires": { - "promise-nodeify": ">= 0.1", - "proxying-agent": ">= 2.1" - } - }, - "tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - } - }, - "ts-node-dev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.1.tgz", - "integrity": "sha512-kAO8LUZgXZSY0+PucMPsQ0Bbdv0x+lgbN7j8gcD4PuTI4uKC6YchekaspmYTBNilkiu+rQYkWJA7cK+Q8/B0tQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.0", - "dateformat": "~1.0.4-1.2.3", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^9.0.0", - "tsconfig": "^7.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "requires": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "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=", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", - "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tsyringe": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.4.0.tgz", - "integrity": "sha512-SlMApe1lhIq546CDp7bF+IdF4RB6d+9C5T7B0AS0P/Bm+Qpizj/gEmZzvw9J/KlXPEt4qHTbi1TRvX3rCPSdTg==", - "requires": { - "tslib": "^1.9.3" - } - }, - "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=" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typescript": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", - "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "requires": { - "ip-regex": "^1.0.1" - } - }, - "utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "requires": { - "pako": "^1.0.5" - }, - "dependencies": { - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - } - } - }, - "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.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "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" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "requires": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 46b55de..8de433d 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,36 @@ { - "name": "nitro-converter", + "name": "@nitrots/nitro-converter", + "description": "Serverside javascript library for bundling .nitro assets", "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "ts-node-transpile-only src/Main.ts", - "start:dev": "ts-node-dev --respawn --transpile-only src/Main.ts" + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://git.krews.org/nitro/nitro-converter.git" + }, + "license": "GPL-3.0", + "bugs": { + "url": "https://git.krews.org/nitro/nitro-converter/issues" + }, + "homepage": "https://git.krews.org/nitro/nitro-converter", + "scripts": { + "build": "tsc", + "start:dev": "ts-node-dev --respawn --transpile-only src/Main.ts", + "start": "yarn start:dev", + "start:bundle": "yarn start --bundle", + "start:extract": "yarn start --extract", + "start:convert-swf": "yarn start --convert-swf" }, - "author": "", - "license": "ISC", "dependencies": { "bytebuffer": "^5.0.1", "concat-frames": "^1.0.3", "free-tex-packer-core": "^0.3.2", - "jimp": "^0.16.1", "jpg-stream": "^1.1.2", - "lodash": "^4.17.20", "lzma-purejs": "^0.9.3", "node-fetch": "^2.6.1", - "node-gzip": "^1.1.2", "ora": "^5.3.0", + "pako": "^2.0.4", "png-stream": "^1.0.5", "reflect-metadata": "^0.1.13", "stream-to-array": "^2.3.0", @@ -30,6 +41,8 @@ "@types/bytebuffer": "^5.0.42", "@types/node": "^14.14.28", "@types/node-fetch": "^2.5.8", + "@types/pako": "^1.0.2", + "@types/stream-to-array": "^2.3.0", "@types/xml2js": "^0.4.8", "@typescript-eslint/eslint-plugin": "^4.15.1", "@typescript-eslint/parser": "^4.15.1", diff --git a/src/Main.ts b/src/Main.ts index 60be08c..083f068 100644 --- a/src/Main.ts +++ b/src/Main.ts @@ -2,22 +2,16 @@ import 'reflect-metadata'; import { container } from 'tsyringe'; import { Configuration } from './common/config/Configuration'; import { IConverter } from './common/converters/IConverter'; -import { EffectConverter } from './converters/EffectConverter'; +import { ConverterUtilities } from './converters/ConverterUtilities'; import { EffectMapConverter } from './converters/EffectMapConverter'; import { ExternalTextsConverter } from './converters/ExternalTextsConverter'; -import { FigureConverter } from './converters/FigureConverter'; import { FigureDataConverter } from './converters/FigureDataConverter'; import { FigureMapConverter } from './converters/FigureMapConverter'; -import { FurnitureConverter } from './converters/FurnitureConverter'; import { FurnitureDataConverter } from './converters/FurnitureDataConverter'; -import { OldAssetConverter } from './converters/OldAssetConverter'; -import { PetConverter } from './converters/PetConverter'; import { ProductDataConverter } from './converters/ProductDataConverter'; (async () => { - checkNodeVersion(); - const config = container.resolve(Configuration); await config.init(); @@ -27,30 +21,35 @@ import { ProductDataConverter } from './converters/ProductDataConverter'; ProductDataConverter, ExternalTextsConverter, EffectMapConverter, - FigureMapConverter, - FurnitureConverter, - FigureConverter, - EffectConverter, - PetConverter, - OldAssetConverter + FigureMapConverter ]; - const [ arg1, arg2, ...rest ] = process.argv; + const bundle = (process.argv.indexOf('--bundle') >= 0); + const extract = (process.argv.indexOf('--extract') >= 0); + const convertSwf = (process.argv.indexOf('--convert-swf') >= 0); + const skip = (bundle || extract || convertSwf); + + if(skip) + { + const extractor = container.resolve(ConverterUtilities); + + bundle && await extractor.bundleExtractedFromFolder(); + extract && await extractor.extractNitroFromFolder(); + convertSwf && await extractor.convertSwfFromFolder(); + + process.exit(); + } for(const converterClass of converters) { const converter = (container.resolve(converterClass) as IConverter); - await converter.convertAsync(rest); + await converter.convertAsync(); } -})(); -function checkNodeVersion() -{ - const version = process.version.replace('v', ''); - const major = version.split('.')[0]; - if(parseInt(major) < 14) - { - throw new Error('Invalid node version: ' + version + ' please use >= 14'); - } -} + const utilities = container.resolve(ConverterUtilities); + + await utilities.downloadSwfTypes(); + + process.exit(); +})(); diff --git a/src/common/SWFDownloader.ts b/src/common/SWFDownloader.ts deleted file mode 100644 index 5d9e345..0000000 --- a/src/common/SWFDownloader.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { HabboAssetSWF } from '../swf/HabboAssetSWF'; -import { FileUtilities } from '../utils/FileUtilities'; - -export class SWFDownloader -{ - public static USES_REVISION: boolean = true; - public static LOG_DOWNLOADS: boolean = true; - - public static async download(baseUrl: string, className: string, revision: number): Promise - { - let url = baseUrl; - - if(!url || !url.length) return; - - if(SWFDownloader.USES_REVISION && (revision > -1)) url = url.replace('%revision%', revision.toString()); - - url = url.replace('%className%', className); - - if(SWFDownloader.LOG_DOWNLOADS) - { - console.log(); - console.log(` Downloading ${ className } from ${url}`); - } - - const habboAssetSWF = await this.extractSWF(url); - - if(!habboAssetSWF) return null; - - return habboAssetSWF; - } - - public static async downloadFromUrl(url: string, className: string, revision: number): Promise - { - if(SWFDownloader.LOG_DOWNLOADS) - { - console.log(); - console.log(` Downloading ${ className } from ${url}`); - } - - const habboAssetSWF = await this.extractSWF(url); - - if(!habboAssetSWF) return null; - - return habboAssetSWF; - } - - public static async extractSWF(url: string): Promise - { - const buffer = await FileUtilities.readFileAsBuffer(url); - - if(!buffer) return null; - - const habboAssetSWF = new HabboAssetSWF(buffer); - - await habboAssetSWF.setupAsync(); - - return habboAssetSWF; - } -} diff --git a/src/common/bundle/BundleProvider.ts b/src/common/bundle/BundleProvider.ts deleted file mode 100644 index 8f57cbb..0000000 --- a/src/common/bundle/BundleProvider.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { packAsync } from 'free-tex-packer-core'; -import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; -import { ImageBundle } from './ImageBundle'; -import { SpriteBundle } from './SpriteBundle'; - -export class BundleProvider -{ - public static imageSource: Map = new Map(); - - public static async generateSpriteSheet(habboAssetSWF: HabboAssetSWF, convertCase: boolean = false): Promise - { - const tagList = habboAssetSWF.symbolTags(); - const names: string[] = []; - const tags: number[] = []; - - let documentClass = habboAssetSWF.getDocumentClass(); - - if(convertCase) documentClass = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))); - - for(const tag of tagList) - { - names.push(...tag.names); - tags.push(...tag.tags); - } - - const imageBundle = new ImageBundle(); - - const imageTags = habboAssetSWF.imageTags(); - - for(const imageTag of imageTags) - { - if(tags.includes(imageTag.characterID)) - { - for(let i = 0; i < tags.length; i++) - { - if(tags[i] != imageTag.characterID) continue; - - if(names[i] == imageTag.className) continue; - - if(imageTag.className.startsWith('sh_')) continue; - - if(imageTag.className.indexOf('_32_') >= 0) continue; - - BundleProvider.imageSource.set(names[i].substring(documentClass.length + 1), imageTag.className.substring(documentClass.length + 1)); - } - } - - if(imageTag.className.startsWith('sh_')) continue; - - if(imageTag.className.indexOf('_32_') >= 0) continue; - - let className = imageTag.className; - - if(convertCase) className = ((className.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1)); - - imageBundle.addImage(className, imageTag.imgData); - } - - if(!imageBundle.images.length) return null; - - return await this.packImages(documentClass, imageBundle, convertCase); - } - - private static async packImages(documentClass: string, imageBundle: ImageBundle, convertCase: boolean = false): Promise - { - const files = await packAsync(imageBundle.images, { - textureName: (convertCase ? documentClass.substring(1) : documentClass), - width: 10240, - height: 4320, - fixedSize: false, - allowRotation: false, - detectIdentical: true, - allowTrim: true, - //@ts-ignore - exporter: 'Pixi' - }); - - const bundle = new SpriteBundle(); - - for(const item of files) - { - if(item.name.endsWith('.json')) - { - bundle.spritesheet = JSON.parse(item.buffer.toString('utf8')); - - delete bundle.spritesheet.meta.app; - delete bundle.spritesheet.meta.version; - } - else - { - bundle.imageData = { - name: item.name, - buffer: item.buffer - }; - - if(convertCase) bundle.imageData.name = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1); - } - } - - if((bundle.spritesheet !== undefined) && (bundle.imageData !== undefined)) bundle.spritesheet.meta.image = bundle.imageData.name; - - return bundle; - } -} diff --git a/src/common/bundle/NitroBundle.ts b/src/common/bundle/NitroBundle.ts new file mode 100644 index 0000000..2ea51fc --- /dev/null +++ b/src/common/bundle/NitroBundle.ts @@ -0,0 +1,75 @@ +import ByteBuffer from 'bytebuffer'; +import { Data, deflate, inflate } from 'pako'; +import { BinaryReader } from '../utils'; + +export class NitroBundle +{ + private readonly _files: Map; + + constructor() + { + this._files = new Map(); + } + + public static from(buffer: ArrayBuffer): NitroBundle + { + const nitroBundle = new NitroBundle(); + const binaryReader = new BinaryReader(buffer); + + let fileCount = binaryReader.readShort(); + + while(fileCount > 0) + { + const fileNameLength = binaryReader.readShort(); + const fileName = binaryReader.readBytes(fileNameLength).toString(); + const fileLength = binaryReader.readInt(); + const buffer = binaryReader.readBytes(fileLength); + const decompressed = inflate((buffer.toArrayBuffer() as Data)); + + nitroBundle.addFile(fileName, Buffer.from(decompressed.buffer)); + + fileCount--; + } + + return nitroBundle; + } + + public addFile(name: string, data: Buffer): void + { + this._files.set(name, data); + } + + public async toBufferAsync(): Promise + { + const buffer = new ByteBuffer(); + + buffer.writeUint16(this._files.size); + + for(const file of this._files.entries()) + { + const fileName = file[0]; + const fileBuffer = file[1]; + + buffer.writeUint16(fileName.length); + buffer.writeString(fileName); + + const compressed = deflate(fileBuffer); + buffer.writeUint32(compressed.length); + buffer.append(compressed); + } + + buffer.flip(); + + return buffer.toBuffer(); + } + + public get files(): Map + { + return this._files; + } + + public get totalFiles(): number + { + return this._files.size; + } +} diff --git a/src/common/bundle/SpriteBundle.ts b/src/common/bundle/SpriteBundle.ts index f058f60..b39a026 100644 --- a/src/common/bundle/SpriteBundle.ts +++ b/src/common/bundle/SpriteBundle.ts @@ -1,4 +1,4 @@ -import { ISpritesheetData } from '../../mapping/json'; +import { ISpritesheetData } from '../mapping'; export class SpriteBundle { diff --git a/src/common/bundle/index.ts b/src/common/bundle/index.ts new file mode 100644 index 0000000..d0e332d --- /dev/null +++ b/src/common/bundle/index.ts @@ -0,0 +1,3 @@ +export * from './ImageBundle'; +export * from './NitroBundle'; +export * from './SpriteBundle'; diff --git a/src/common/config/Configuration.ts b/src/common/config/Configuration.ts index e291943..11ec41b 100644 --- a/src/common/config/Configuration.ts +++ b/src/common/config/Configuration.ts @@ -1,6 +1,6 @@ import { singleton } from 'tsyringe'; import * as configuration from '../../configuration.json'; -import { FileUtilities } from '../../utils/FileUtilities'; +import { FileUtilities } from '../utils'; @singleton() export class Configuration @@ -101,6 +101,7 @@ export class Configuration public interpolate(value: string, regex: RegExp = null): string { + if(!value || (typeof value === 'object')) return value; if(!regex) regex = new RegExp(/\${(.*?)}/g); const pieces = value.match(regex); diff --git a/src/common/config/index.ts b/src/common/config/index.ts new file mode 100644 index 0000000..a699b40 --- /dev/null +++ b/src/common/config/index.ts @@ -0,0 +1 @@ +export * from './Configuration'; diff --git a/src/common/converters/Converter.ts b/src/common/converters/Converter.ts deleted file mode 100644 index 0ce6736..0000000 --- a/src/common/converters/Converter.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IConverter } from './IConverter'; - -export class Converter implements IConverter -{ - public async convertAsync(args: string[] = []): Promise - { - return; - } -} diff --git a/src/common/converters/ConverterResult.ts b/src/common/converters/ConverterResult.ts new file mode 100644 index 0000000..6a968a3 --- /dev/null +++ b/src/common/converters/ConverterResult.ts @@ -0,0 +1,7 @@ +export class ConverterResult +{ + public static OK: number = 1; + public static BAD_ARGS: number = 2; + public static FILE_EXISTS: number = 3; + public static INVALID_SWF: number = 4; +} diff --git a/src/common/converters/ConverterType.ts b/src/common/converters/ConverterType.ts deleted file mode 100644 index 2b744fa..0000000 --- a/src/common/converters/ConverterType.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class ConverterType -{ - public static EFFECT_CONVERTER: string = 'effect'; - public static FIGURE_CONVERTER: string = 'figure'; - public static FURNITURE_CONVERTER: string = 'furni'; - public static PET_CONVERTER: string = 'pet'; -} diff --git a/src/common/converters/IConverter.ts b/src/common/converters/IConverter.ts index 3041112..7375373 100644 --- a/src/common/converters/IConverter.ts +++ b/src/common/converters/IConverter.ts @@ -1,4 +1,4 @@ export interface IConverter { - convertAsync(args?: string[]): Promise; + convertAsync(): Promise; } diff --git a/src/common/converters/index.ts b/src/common/converters/index.ts new file mode 100644 index 0000000..73109e9 --- /dev/null +++ b/src/common/converters/index.ts @@ -0,0 +1,2 @@ +export * from './ConverterResult'; +export * from './IConverter'; diff --git a/src/common/index.ts b/src/common/index.ts new file mode 100644 index 0000000..10e7235 --- /dev/null +++ b/src/common/index.ts @@ -0,0 +1,40 @@ +export * from './bundle'; +export * from './config'; +export * from './converters'; +export * from './mapping'; +export * from './mapping/json'; +export * from './mapping/json/asset'; +export * from './mapping/json/asset/animation'; +export * from './mapping/json/asset/logic'; +export * from './mapping/json/asset/logic/model'; +export * from './mapping/json/asset/logic/particlesystem'; +export * from './mapping/json/asset/spritesheet'; +export * from './mapping/json/asset/visualization'; +export * from './mapping/json/asset/visualization/animation'; +export * from './mapping/json/asset/visualization/color'; +export * from './mapping/json/asset/visualization/gestures'; +export * from './mapping/json/asset/visualization/postures'; +export * from './mapping/json/effectmap'; +export * from './mapping/json/externaltexts'; +export * from './mapping/json/figuredata'; +export * from './mapping/json/figuremap'; +export * from './mapping/json/furnituredata'; +export * from './mapping/json/productdata'; +export * from './mapping/mappers'; +export * from './mapping/mappers/asset'; +export * from './mapping/xml'; +export * from './mapping/xml/asset'; +export * from './mapping/xml/asset/animation'; +export * from './mapping/xml/asset/assets'; +export * from './mapping/xml/asset/logic'; +export * from './mapping/xml/asset/logic/model'; +export * from './mapping/xml/asset/logic/particlesystem'; +export * from './mapping/xml/asset/manifest'; +export * from './mapping/xml/asset/visualization'; +export * from './mapping/xml/asset/visualization/animation'; +export * from './mapping/xml/asset/visualization/color'; +export * from './mapping/xml/effectmap'; +export * from './mapping/xml/figuredata'; +export * from './mapping/xml/figuremap'; +export * from './mapping/xml/furnituredata'; +export * from './utils'; diff --git a/src/common/mapping/index.ts b/src/common/mapping/index.ts new file mode 100644 index 0000000..3b699b8 --- /dev/null +++ b/src/common/mapping/index.ts @@ -0,0 +1,35 @@ +export * from './json'; +export * from './json/asset'; +export * from './json/asset/animation'; +export * from './json/asset/logic'; +export * from './json/asset/logic/model'; +export * from './json/asset/logic/particlesystem'; +export * from './json/asset/spritesheet'; +export * from './json/asset/visualization'; +export * from './json/asset/visualization/animation'; +export * from './json/asset/visualization/color'; +export * from './json/asset/visualization/gestures'; +export * from './json/asset/visualization/postures'; +export * from './json/effectmap'; +export * from './json/externaltexts'; +export * from './json/figuredata'; +export * from './json/figuremap'; +export * from './json/furnituredata'; +export * from './json/productdata'; +export * from './mappers'; +export * from './mappers/asset'; +export * from './xml'; +export * from './xml/asset'; +export * from './xml/asset/animation'; +export * from './xml/asset/assets'; +export * from './xml/asset/logic'; +export * from './xml/asset/logic/model'; +export * from './xml/asset/logic/particlesystem'; +export * from './xml/asset/manifest'; +export * from './xml/asset/visualization'; +export * from './xml/asset/visualization/animation'; +export * from './xml/asset/visualization/color'; +export * from './xml/effectmap'; +export * from './xml/figuredata'; +export * from './xml/figuremap'; +export * from './xml/furnituredata'; diff --git a/src/mapping/json/asset/IAsset.ts b/src/common/mapping/json/asset/IAsset.ts similarity index 100% rename from src/mapping/json/asset/IAsset.ts rename to src/common/mapping/json/asset/IAsset.ts diff --git a/src/mapping/json/asset/IAssetAlias.ts b/src/common/mapping/json/asset/IAssetAlias.ts similarity index 100% rename from src/mapping/json/asset/IAssetAlias.ts rename to src/common/mapping/json/asset/IAssetAlias.ts diff --git a/src/mapping/json/asset/IAssetData.ts b/src/common/mapping/json/asset/IAssetData.ts similarity index 100% rename from src/mapping/json/asset/IAssetData.ts rename to src/common/mapping/json/asset/IAssetData.ts diff --git a/src/mapping/json/asset/IAssetPalette.ts b/src/common/mapping/json/asset/IAssetPalette.ts similarity index 100% rename from src/mapping/json/asset/IAssetPalette.ts rename to src/common/mapping/json/asset/IAssetPalette.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimation.ts b/src/common/mapping/json/asset/animation/IAssetAnimation.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimation.ts rename to src/common/mapping/json/asset/animation/IAssetAnimation.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationAdd.ts b/src/common/mapping/json/asset/animation/IAssetAnimationAdd.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationAdd.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationAdd.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationAvatar.ts b/src/common/mapping/json/asset/animation/IAssetAnimationAvatar.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationAvatar.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationAvatar.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationDirection.ts b/src/common/mapping/json/asset/animation/IAssetAnimationDirection.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationDirection.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationDirection.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationFrame.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFrame.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationFrame.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationFrame.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationFramePart.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFramePart.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationFramePart.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationFramePart.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationOverride.ts b/src/common/mapping/json/asset/animation/IAssetAnimationOverride.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationOverride.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationOverride.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationRemove.ts b/src/common/mapping/json/asset/animation/IAssetAnimationRemove.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationRemove.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationRemove.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationShadow.ts b/src/common/mapping/json/asset/animation/IAssetAnimationShadow.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationShadow.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationShadow.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationSprite.ts b/src/common/mapping/json/asset/animation/IAssetAnimationSprite.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationSprite.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationSprite.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts b/src/common/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts diff --git a/src/mapping/json/asset/animation/index.ts b/src/common/mapping/json/asset/animation/index.ts similarity index 100% rename from src/mapping/json/asset/animation/index.ts rename to src/common/mapping/json/asset/animation/index.ts diff --git a/src/mapping/json/asset/index.ts b/src/common/mapping/json/asset/index.ts similarity index 100% rename from src/mapping/json/asset/index.ts rename to src/common/mapping/json/asset/index.ts diff --git a/src/mapping/json/asset/logic/IAssetLogicCustomVars.ts b/src/common/mapping/json/asset/logic/IAssetLogicCustomVars.ts similarity index 100% rename from src/mapping/json/asset/logic/IAssetLogicCustomVars.ts rename to src/common/mapping/json/asset/logic/IAssetLogicCustomVars.ts diff --git a/src/mapping/json/asset/logic/IAssetLogicData.ts b/src/common/mapping/json/asset/logic/IAssetLogicData.ts similarity index 100% rename from src/mapping/json/asset/logic/IAssetLogicData.ts rename to src/common/mapping/json/asset/logic/IAssetLogicData.ts diff --git a/src/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts b/src/common/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts similarity index 100% rename from src/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts rename to src/common/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts diff --git a/src/mapping/json/asset/logic/ISoundSample.ts b/src/common/mapping/json/asset/logic/ISoundSample.ts similarity index 100% rename from src/mapping/json/asset/logic/ISoundSample.ts rename to src/common/mapping/json/asset/logic/ISoundSample.ts diff --git a/src/mapping/json/asset/logic/index.ts b/src/common/mapping/json/asset/logic/index.ts similarity index 100% rename from src/mapping/json/asset/logic/index.ts rename to src/common/mapping/json/asset/logic/index.ts diff --git a/src/mapping/json/asset/logic/model/IAssetDimension.ts b/src/common/mapping/json/asset/logic/model/IAssetDimension.ts similarity index 77% rename from src/mapping/json/asset/logic/model/IAssetDimension.ts rename to src/common/mapping/json/asset/logic/model/IAssetDimension.ts index 4a4629f..a467a03 100644 --- a/src/mapping/json/asset/logic/model/IAssetDimension.ts +++ b/src/common/mapping/json/asset/logic/model/IAssetDimension.ts @@ -3,4 +3,5 @@ export interface IAssetDimension x: number; y: number; z?: number; -} \ No newline at end of file + centerZ?: number; +} diff --git a/src/mapping/json/asset/logic/model/IAssetLogicModel.ts b/src/common/mapping/json/asset/logic/model/IAssetLogicModel.ts similarity index 100% rename from src/mapping/json/asset/logic/model/IAssetLogicModel.ts rename to src/common/mapping/json/asset/logic/model/IAssetLogicModel.ts diff --git a/src/mapping/json/asset/logic/model/index.ts b/src/common/mapping/json/asset/logic/model/index.ts similarity index 100% rename from src/mapping/json/asset/logic/model/index.ts rename to src/common/mapping/json/asset/logic/model/index.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystem.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystem.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystem.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystem.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts diff --git a/src/mapping/json/asset/logic/particlesystem/index.ts b/src/common/mapping/json/asset/logic/particlesystem/index.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/index.ts rename to src/common/mapping/json/asset/logic/particlesystem/index.ts diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetData.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetData.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/ISpritesheetData.ts rename to src/common/mapping/json/asset/spritesheet/ISpritesheetData.ts diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetFrame.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts rename to src/common/mapping/json/asset/spritesheet/ISpritesheetFrame.ts diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetMeta.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts rename to src/common/mapping/json/asset/spritesheet/ISpritesheetMeta.ts diff --git a/src/mapping/json/asset/spritesheet/index.ts b/src/common/mapping/json/asset/spritesheet/index.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/index.ts rename to src/common/mapping/json/asset/spritesheet/index.ts diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationData.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationData.ts similarity index 100% rename from src/mapping/json/asset/visualization/IAssetVisualizationData.ts rename to src/common/mapping/json/asset/visualization/IAssetVisualizationData.ts diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationDirection.ts similarity index 100% rename from src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts rename to src/common/mapping/json/asset/visualization/IAssetVisualizationDirection.ts diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationLayer.ts similarity index 100% rename from src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts rename to src/common/mapping/json/asset/visualization/IAssetVisualizationLayer.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts diff --git a/src/mapping/json/asset/visualization/animation/index.ts b/src/common/mapping/json/asset/visualization/animation/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/index.ts rename to src/common/mapping/json/asset/visualization/animation/index.ts diff --git a/src/mapping/json/asset/visualization/color/IAssetColor.ts b/src/common/mapping/json/asset/visualization/color/IAssetColor.ts similarity index 100% rename from src/mapping/json/asset/visualization/color/IAssetColor.ts rename to src/common/mapping/json/asset/visualization/color/IAssetColor.ts diff --git a/src/mapping/json/asset/visualization/color/IAssetColorLayer.ts b/src/common/mapping/json/asset/visualization/color/IAssetColorLayer.ts similarity index 100% rename from src/mapping/json/asset/visualization/color/IAssetColorLayer.ts rename to src/common/mapping/json/asset/visualization/color/IAssetColorLayer.ts diff --git a/src/mapping/json/asset/visualization/color/index.ts b/src/common/mapping/json/asset/visualization/color/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/color/index.ts rename to src/common/mapping/json/asset/visualization/color/index.ts diff --git a/src/mapping/json/asset/visualization/gestures/IAssetGesture.ts b/src/common/mapping/json/asset/visualization/gestures/IAssetGesture.ts similarity index 100% rename from src/mapping/json/asset/visualization/gestures/IAssetGesture.ts rename to src/common/mapping/json/asset/visualization/gestures/IAssetGesture.ts diff --git a/src/mapping/json/asset/visualization/gestures/index.ts b/src/common/mapping/json/asset/visualization/gestures/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/gestures/index.ts rename to src/common/mapping/json/asset/visualization/gestures/index.ts diff --git a/src/mapping/json/asset/visualization/index.ts b/src/common/mapping/json/asset/visualization/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/index.ts rename to src/common/mapping/json/asset/visualization/index.ts diff --git a/src/mapping/json/asset/visualization/postures/IAssetPosture.ts b/src/common/mapping/json/asset/visualization/postures/IAssetPosture.ts similarity index 100% rename from src/mapping/json/asset/visualization/postures/IAssetPosture.ts rename to src/common/mapping/json/asset/visualization/postures/IAssetPosture.ts diff --git a/src/mapping/json/asset/visualization/postures/index.ts b/src/common/mapping/json/asset/visualization/postures/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/postures/index.ts rename to src/common/mapping/json/asset/visualization/postures/index.ts diff --git a/src/mapping/json/effectmap/IEffectMap.ts b/src/common/mapping/json/effectmap/IEffectMap.ts similarity index 100% rename from src/mapping/json/effectmap/IEffectMap.ts rename to src/common/mapping/json/effectmap/IEffectMap.ts diff --git a/src/mapping/json/effectmap/IEffectMapLibrary.ts b/src/common/mapping/json/effectmap/IEffectMapLibrary.ts similarity index 100% rename from src/mapping/json/effectmap/IEffectMapLibrary.ts rename to src/common/mapping/json/effectmap/IEffectMapLibrary.ts diff --git a/src/mapping/json/effectmap/index.ts b/src/common/mapping/json/effectmap/index.ts similarity index 100% rename from src/mapping/json/effectmap/index.ts rename to src/common/mapping/json/effectmap/index.ts diff --git a/src/mapping/json/externaltexts/IExternalTexts.ts b/src/common/mapping/json/externaltexts/IExternalTexts.ts similarity index 100% rename from src/mapping/json/externaltexts/IExternalTexts.ts rename to src/common/mapping/json/externaltexts/IExternalTexts.ts diff --git a/src/mapping/json/externaltexts/index.ts b/src/common/mapping/json/externaltexts/index.ts similarity index 100% rename from src/mapping/json/externaltexts/index.ts rename to src/common/mapping/json/externaltexts/index.ts diff --git a/src/mapping/json/figuredata/IFigureData.ts b/src/common/mapping/json/figuredata/IFigureData.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureData.ts rename to src/common/mapping/json/figuredata/IFigureData.ts diff --git a/src/mapping/json/figuredata/IFigureDataColor.ts b/src/common/mapping/json/figuredata/IFigureDataColor.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataColor.ts rename to src/common/mapping/json/figuredata/IFigureDataColor.ts diff --git a/src/mapping/json/figuredata/IFigureDataHiddenLayer.ts b/src/common/mapping/json/figuredata/IFigureDataHiddenLayer.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataHiddenLayer.ts rename to src/common/mapping/json/figuredata/IFigureDataHiddenLayer.ts diff --git a/src/mapping/json/figuredata/IFigureDataPalette.ts b/src/common/mapping/json/figuredata/IFigureDataPalette.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataPalette.ts rename to src/common/mapping/json/figuredata/IFigureDataPalette.ts diff --git a/src/mapping/json/figuredata/IFigureDataPart.ts b/src/common/mapping/json/figuredata/IFigureDataPart.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataPart.ts rename to src/common/mapping/json/figuredata/IFigureDataPart.ts diff --git a/src/mapping/json/figuredata/IFigureDataSet.ts b/src/common/mapping/json/figuredata/IFigureDataSet.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataSet.ts rename to src/common/mapping/json/figuredata/IFigureDataSet.ts diff --git a/src/mapping/json/figuredata/IFigureDataSetType.ts b/src/common/mapping/json/figuredata/IFigureDataSetType.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataSetType.ts rename to src/common/mapping/json/figuredata/IFigureDataSetType.ts diff --git a/src/mapping/json/figuredata/index.ts b/src/common/mapping/json/figuredata/index.ts similarity index 100% rename from src/mapping/json/figuredata/index.ts rename to src/common/mapping/json/figuredata/index.ts diff --git a/src/mapping/json/figuremap/IFigureMap.ts b/src/common/mapping/json/figuremap/IFigureMap.ts similarity index 100% rename from src/mapping/json/figuremap/IFigureMap.ts rename to src/common/mapping/json/figuremap/IFigureMap.ts diff --git a/src/mapping/json/figuremap/IFigureMapLibrary.ts b/src/common/mapping/json/figuremap/IFigureMapLibrary.ts similarity index 100% rename from src/mapping/json/figuremap/IFigureMapLibrary.ts rename to src/common/mapping/json/figuremap/IFigureMapLibrary.ts diff --git a/src/mapping/json/figuremap/IFigureMapLibraryPart.ts b/src/common/mapping/json/figuremap/IFigureMapLibraryPart.ts similarity index 100% rename from src/mapping/json/figuremap/IFigureMapLibraryPart.ts rename to src/common/mapping/json/figuremap/IFigureMapLibraryPart.ts diff --git a/src/mapping/json/figuremap/index.ts b/src/common/mapping/json/figuremap/index.ts similarity index 100% rename from src/mapping/json/figuremap/index.ts rename to src/common/mapping/json/figuremap/index.ts diff --git a/src/mapping/json/furnituredata/IFurnitureData.ts b/src/common/mapping/json/furnituredata/IFurnitureData.ts similarity index 100% rename from src/mapping/json/furnituredata/IFurnitureData.ts rename to src/common/mapping/json/furnituredata/IFurnitureData.ts diff --git a/src/mapping/json/furnituredata/IFurnitureType.ts b/src/common/mapping/json/furnituredata/IFurnitureType.ts similarity index 100% rename from src/mapping/json/furnituredata/IFurnitureType.ts rename to src/common/mapping/json/furnituredata/IFurnitureType.ts diff --git a/src/mapping/json/furnituredata/index.ts b/src/common/mapping/json/furnituredata/index.ts similarity index 100% rename from src/mapping/json/furnituredata/index.ts rename to src/common/mapping/json/furnituredata/index.ts diff --git a/src/mapping/json/index.ts b/src/common/mapping/json/index.ts similarity index 100% rename from src/mapping/json/index.ts rename to src/common/mapping/json/index.ts diff --git a/src/mapping/json/productdata/IProductData.ts b/src/common/mapping/json/productdata/IProductData.ts similarity index 100% rename from src/mapping/json/productdata/IProductData.ts rename to src/common/mapping/json/productdata/IProductData.ts diff --git a/src/mapping/json/productdata/IProductType.ts b/src/common/mapping/json/productdata/IProductType.ts similarity index 100% rename from src/mapping/json/productdata/IProductType.ts rename to src/common/mapping/json/productdata/IProductType.ts diff --git a/src/mapping/json/productdata/index.ts b/src/common/mapping/json/productdata/index.ts similarity index 100% rename from src/mapping/json/productdata/index.ts rename to src/common/mapping/json/productdata/index.ts diff --git a/src/mapping/mappers/EffectMapMapper.ts b/src/common/mapping/mappers/EffectMapMapper.ts similarity index 97% rename from src/mapping/mappers/EffectMapMapper.ts rename to src/common/mapping/mappers/EffectMapMapper.ts index 712b69b..dea07a1 100644 --- a/src/mapping/mappers/EffectMapMapper.ts +++ b/src/common/mapping/mappers/EffectMapMapper.ts @@ -1,6 +1,6 @@ import { IEffectMap, IEffectMapLibrary } from '../json'; import { EffectMapEffectXML, EffectMapXML } from '../xml'; -import { Mapper } from './asset/Mapper'; +import { Mapper } from './asset'; export class EffectMapMapper extends Mapper { diff --git a/src/mapping/mappers/FigureDataMapper.ts b/src/common/mapping/mappers/FigureDataMapper.ts similarity index 85% rename from src/mapping/mappers/FigureDataMapper.ts rename to src/common/mapping/mappers/FigureDataMapper.ts index 8b50a40..71c2627 100644 --- a/src/mapping/mappers/FigureDataMapper.ts +++ b/src/common/mapping/mappers/FigureDataMapper.ts @@ -1,18 +1,6 @@ -import { IFigureDataHiddenLayer } from '../json'; -import { IFigureDataPalette } from '../json/figuredata/IFigureDataPalette'; -import { IFigureDataSet } from '../json/figuredata/IFigureDataSet'; -import { FigureDataHiddenLayerXML } from '../xml'; -import { FigureDataColorXML } from '../xml/figuredata/FigureDataColorXML'; -import { FigureDataPaletteXML } from '../xml/figuredata/FigureDataPaletteXML'; -import { FigureDataXML } from '../xml/figuredata/FigureDataXML'; -import { IFigureData } from './../json/figuredata/IFigureData'; -import { IFigureDataColor } from './../json/figuredata/IFigureDataColor'; -import { IFigureDataPart } from './../json/figuredata/IFigureDataPart'; -import { IFigureDataSetType } from './../json/figuredata/IFigureDataSetType'; -import { FigureDataPartXML } from './../xml/figuredata/FigureDataPartXML'; -import { FigureDataSetTypeXML } from './../xml/figuredata/FigureDataSetTypeXML'; -import { FigureDataSetXML } from './../xml/figuredata/FigureDataSetXML'; -import { Mapper } from './asset/Mapper'; +import { IFigureData, IFigureDataColor, IFigureDataHiddenLayer, IFigureDataPalette, IFigureDataPart, IFigureDataSet, IFigureDataSetType } from '../json'; +import { FigureDataColorXML, FigureDataHiddenLayerXML, FigureDataPaletteXML, FigureDataPartXML, FigureDataSetTypeXML, FigureDataSetXML, FigureDataXML } from '../xml'; +import { Mapper } from './asset'; export class FigureDataMapper extends Mapper { diff --git a/src/mapping/mappers/FigureMapMapper.ts b/src/common/mapping/mappers/FigureMapMapper.ts similarity index 98% rename from src/mapping/mappers/FigureMapMapper.ts rename to src/common/mapping/mappers/FigureMapMapper.ts index 5c7e8e7..daa8bc9 100644 --- a/src/mapping/mappers/FigureMapMapper.ts +++ b/src/common/mapping/mappers/FigureMapMapper.ts @@ -1,6 +1,6 @@ import { IFigureMap, IFigureMapLibrary, IFigureMapLibraryPart } from '../json'; import { FigureLibraryPartXML, FigureLibraryXML, FigureMapXML } from '../xml'; -import { Mapper } from './asset/Mapper'; +import { Mapper } from './asset'; export class FigureMapMapper extends Mapper { diff --git a/src/mapping/mappers/FurnitureDataMapper.ts b/src/common/mapping/mappers/FurnitureDataMapper.ts similarity index 98% rename from src/mapping/mappers/FurnitureDataMapper.ts rename to src/common/mapping/mappers/FurnitureDataMapper.ts index 2a45c40..5387840 100644 --- a/src/mapping/mappers/FurnitureDataMapper.ts +++ b/src/common/mapping/mappers/FurnitureDataMapper.ts @@ -1,6 +1,6 @@ import { IFurnitureData, IFurnitureType } from '../json'; import { FurnitureDataXML, FurnitureTypeXML } from '../xml'; -import { Mapper } from './asset/Mapper'; +import { Mapper } from './asset'; export class FurnitureDataMapper extends Mapper { diff --git a/src/mapping/mappers/asset/AnimationMapper.ts b/src/common/mapping/mappers/asset/AnimationMapper.ts similarity index 100% rename from src/mapping/mappers/asset/AnimationMapper.ts rename to src/common/mapping/mappers/asset/AnimationMapper.ts diff --git a/src/mapping/mappers/asset/AssetMapper.ts b/src/common/mapping/mappers/asset/AssetMapper.ts similarity index 89% rename from src/mapping/mappers/asset/AssetMapper.ts rename to src/common/mapping/mappers/asset/AssetMapper.ts index 4ebc586..f889ac4 100644 --- a/src/mapping/mappers/asset/AssetMapper.ts +++ b/src/common/mapping/mappers/asset/AssetMapper.ts @@ -1,4 +1,4 @@ -import { BundleProvider } from '../../../common/bundle/BundleProvider'; +import { IMAGE_SOURCES } from '../../../../swf'; import { IAsset, IAssetData, IAssetPalette } from '../../json'; import { AssetsXML, AssetXML, PaletteXML } from '../../xml'; import { Mapper } from './Mapper'; @@ -55,12 +55,12 @@ export class AssetMapper extends Mapper { asset.source = assetXML.source; - if(BundleProvider.imageSource.has(assetXML.source)) asset.source = BundleProvider.imageSource.get(assetXML.source) as string; + if(IMAGE_SOURCES.has(assetXML.source)) asset.source = IMAGE_SOURCES.get(assetXML.source) as string; } if(assetXML.name !== undefined) { - if(BundleProvider.imageSource.has(assetXML.name)) asset.source = BundleProvider.imageSource.get(assetXML.name) as string; + if(IMAGE_SOURCES.has(assetXML.name)) asset.source = IMAGE_SOURCES.get(assetXML.name) as string; } if(assetXML.x !== undefined) asset.x = assetXML.x; diff --git a/src/mapping/mappers/asset/IndexMapper.ts b/src/common/mapping/mappers/asset/IndexMapper.ts similarity index 100% rename from src/mapping/mappers/asset/IndexMapper.ts rename to src/common/mapping/mappers/asset/IndexMapper.ts diff --git a/src/mapping/mappers/asset/LogicMapper.ts b/src/common/mapping/mappers/asset/LogicMapper.ts similarity index 96% rename from src/mapping/mappers/asset/LogicMapper.ts rename to src/common/mapping/mappers/asset/LogicMapper.ts index 8d29529..ff3f6cf 100644 --- a/src/mapping/mappers/asset/LogicMapper.ts +++ b/src/common/mapping/mappers/asset/LogicMapper.ts @@ -25,9 +25,12 @@ export class LogicMapper extends Mapper { output.model.dimensions = { x: xml.model.dimensions.x, - y: xml.model.dimensions.y, - z: xml.model.dimensions.z + y: xml.model.dimensions.y }; + + if(xml.model.dimensions.z !== undefined) output.model.dimensions.z = xml.model.dimensions.z; + + if(xml.model.dimensions.centerZ !== undefined) output.model.dimensions.centerZ = xml.model.dimensions.centerZ; } if(xml.model.directions !== undefined) diff --git a/src/mapping/mappers/asset/ManifestMapper.ts b/src/common/mapping/mappers/asset/ManifestMapper.ts similarity index 93% rename from src/mapping/mappers/asset/ManifestMapper.ts rename to src/common/mapping/mappers/asset/ManifestMapper.ts index bd26d3a..afc4cd7 100644 --- a/src/mapping/mappers/asset/ManifestMapper.ts +++ b/src/common/mapping/mappers/asset/ManifestMapper.ts @@ -1,4 +1,4 @@ -import { BundleProvider } from '../../../common/bundle/BundleProvider'; +import { IMAGE_SOURCES } from '../../../../swf'; import { IAsset, IAssetAlias, IAssetData } from '../../json'; import { ManifestLibraryAliasXML, ManifestLibraryAssetParamXML, ManifestLibraryAssetXML, ManifestLibraryXML, ManifestXML } from '../../xml'; import { Mapper } from './Mapper'; @@ -60,7 +60,7 @@ export class ManifestMapper extends Mapper if(libraryAssetXML.param !== undefined) ManifestMapper.mapManifestLibraryAssetParamXML(libraryAssetXML.param, asset); - if(BundleProvider.imageSource.has(libraryAssetXML.name)) asset.source = BundleProvider.imageSource.get(libraryAssetXML.name); + if(IMAGE_SOURCES.has(libraryAssetXML.name)) asset.source = IMAGE_SOURCES.get(libraryAssetXML.name); output[libraryAssetXML.name] = asset; } diff --git a/src/mapping/mappers/asset/Mapper.ts b/src/common/mapping/mappers/asset/Mapper.ts similarity index 100% rename from src/mapping/mappers/asset/Mapper.ts rename to src/common/mapping/mappers/asset/Mapper.ts diff --git a/src/mapping/mappers/asset/VisualizationMapper.ts b/src/common/mapping/mappers/asset/VisualizationMapper.ts similarity index 100% rename from src/mapping/mappers/asset/VisualizationMapper.ts rename to src/common/mapping/mappers/asset/VisualizationMapper.ts diff --git a/src/mapping/mappers/asset/index.ts b/src/common/mapping/mappers/asset/index.ts similarity index 100% rename from src/mapping/mappers/asset/index.ts rename to src/common/mapping/mappers/asset/index.ts diff --git a/src/mapping/mappers/index.ts b/src/common/mapping/mappers/index.ts similarity index 100% rename from src/mapping/mappers/index.ts rename to src/common/mapping/mappers/index.ts diff --git a/src/mapping/xml/asset/IndexXML.ts b/src/common/mapping/xml/asset/IndexXML.ts similarity index 100% rename from src/mapping/xml/asset/IndexXML.ts rename to src/common/mapping/xml/asset/IndexXML.ts diff --git a/src/mapping/xml/asset/animation/AddXML.ts b/src/common/mapping/xml/asset/animation/AddXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/AddXML.ts rename to src/common/mapping/xml/asset/animation/AddXML.ts diff --git a/src/mapping/xml/asset/animation/AvatarXML.ts b/src/common/mapping/xml/asset/animation/AvatarXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/AvatarXML.ts rename to src/common/mapping/xml/asset/animation/AvatarXML.ts diff --git a/src/mapping/xml/asset/animation/DirectionOffsetXML.ts b/src/common/mapping/xml/asset/animation/DirectionOffsetXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/DirectionOffsetXML.ts rename to src/common/mapping/xml/asset/animation/DirectionOffsetXML.ts diff --git a/src/mapping/xml/asset/animation/DirectionXML.ts b/src/common/mapping/xml/asset/animation/DirectionXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/DirectionXML.ts rename to src/common/mapping/xml/asset/animation/DirectionXML.ts diff --git a/src/mapping/xml/asset/animation/EffectAnimationXML.ts b/src/common/mapping/xml/asset/animation/EffectAnimationXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectAnimationXML.ts rename to src/common/mapping/xml/asset/animation/EffectAnimationXML.ts diff --git a/src/mapping/xml/asset/animation/EffectFramePartItemXML.ts b/src/common/mapping/xml/asset/animation/EffectFramePartItemXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectFramePartItemXML.ts rename to src/common/mapping/xml/asset/animation/EffectFramePartItemXML.ts diff --git a/src/mapping/xml/asset/animation/EffectFramePartXML.ts b/src/common/mapping/xml/asset/animation/EffectFramePartXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectFramePartXML.ts rename to src/common/mapping/xml/asset/animation/EffectFramePartXML.ts diff --git a/src/mapping/xml/asset/animation/EffectFrameXML.ts b/src/common/mapping/xml/asset/animation/EffectFrameXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectFrameXML.ts rename to src/common/mapping/xml/asset/animation/EffectFrameXML.ts diff --git a/src/mapping/xml/asset/animation/OverrideXML.ts b/src/common/mapping/xml/asset/animation/OverrideXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/OverrideXML.ts rename to src/common/mapping/xml/asset/animation/OverrideXML.ts diff --git a/src/mapping/xml/asset/animation/RemoveXML.ts b/src/common/mapping/xml/asset/animation/RemoveXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/RemoveXML.ts rename to src/common/mapping/xml/asset/animation/RemoveXML.ts diff --git a/src/mapping/xml/asset/animation/ShadowXML.ts b/src/common/mapping/xml/asset/animation/ShadowXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/ShadowXML.ts rename to src/common/mapping/xml/asset/animation/ShadowXML.ts diff --git a/src/mapping/xml/asset/animation/SpriteXML.ts b/src/common/mapping/xml/asset/animation/SpriteXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/SpriteXML.ts rename to src/common/mapping/xml/asset/animation/SpriteXML.ts diff --git a/src/mapping/xml/asset/animation/index.ts b/src/common/mapping/xml/asset/animation/index.ts similarity index 100% rename from src/mapping/xml/asset/animation/index.ts rename to src/common/mapping/xml/asset/animation/index.ts diff --git a/src/mapping/xml/asset/assets/AssetXML.ts b/src/common/mapping/xml/asset/assets/AssetXML.ts similarity index 100% rename from src/mapping/xml/asset/assets/AssetXML.ts rename to src/common/mapping/xml/asset/assets/AssetXML.ts diff --git a/src/mapping/xml/asset/assets/AssetsXML.ts b/src/common/mapping/xml/asset/assets/AssetsXML.ts similarity index 100% rename from src/mapping/xml/asset/assets/AssetsXML.ts rename to src/common/mapping/xml/asset/assets/AssetsXML.ts diff --git a/src/mapping/xml/asset/assets/PaletteXML.ts b/src/common/mapping/xml/asset/assets/PaletteXML.ts similarity index 100% rename from src/mapping/xml/asset/assets/PaletteXML.ts rename to src/common/mapping/xml/asset/assets/PaletteXML.ts diff --git a/src/mapping/xml/asset/assets/index.ts b/src/common/mapping/xml/asset/assets/index.ts similarity index 100% rename from src/mapping/xml/asset/assets/index.ts rename to src/common/mapping/xml/asset/assets/index.ts diff --git a/src/mapping/xml/asset/index.ts b/src/common/mapping/xml/asset/index.ts similarity index 100% rename from src/mapping/xml/asset/index.ts rename to src/common/mapping/xml/asset/index.ts diff --git a/src/mapping/xml/asset/logic/ActionXML.ts b/src/common/mapping/xml/asset/logic/ActionXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/ActionXML.ts rename to src/common/mapping/xml/asset/logic/ActionXML.ts diff --git a/src/mapping/xml/asset/logic/CreditsXML.ts b/src/common/mapping/xml/asset/logic/CreditsXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/CreditsXML.ts rename to src/common/mapping/xml/asset/logic/CreditsXML.ts diff --git a/src/mapping/xml/asset/logic/CustomVarsXML.ts b/src/common/mapping/xml/asset/logic/CustomVarsXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/CustomVarsXML.ts rename to src/common/mapping/xml/asset/logic/CustomVarsXML.ts diff --git a/src/mapping/xml/asset/logic/LogicXML.ts b/src/common/mapping/xml/asset/logic/LogicXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/LogicXML.ts rename to src/common/mapping/xml/asset/logic/LogicXML.ts diff --git a/src/mapping/xml/asset/logic/MaskXML.ts b/src/common/mapping/xml/asset/logic/MaskXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/MaskXML.ts rename to src/common/mapping/xml/asset/logic/MaskXML.ts diff --git a/src/mapping/xml/asset/logic/PlanetSystemXML.ts b/src/common/mapping/xml/asset/logic/PlanetSystemXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/PlanetSystemXML.ts rename to src/common/mapping/xml/asset/logic/PlanetSystemXML.ts diff --git a/src/mapping/xml/asset/logic/SoundSampleXML.ts b/src/common/mapping/xml/asset/logic/SoundSampleXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/SoundSampleXML.ts rename to src/common/mapping/xml/asset/logic/SoundSampleXML.ts diff --git a/src/mapping/xml/asset/logic/index.ts b/src/common/mapping/xml/asset/logic/index.ts similarity index 100% rename from src/mapping/xml/asset/logic/index.ts rename to src/common/mapping/xml/asset/logic/index.ts diff --git a/src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts b/src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts similarity index 59% rename from src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts rename to src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts index 2507c6a..a04fb6a 100644 --- a/src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts +++ b/src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts @@ -3,6 +3,7 @@ export class ModelDimensionsXML private readonly _x: number; private readonly _y: number; private readonly _z: number; + private readonly _centerZ: number; constructor(xml: any) { @@ -10,9 +11,10 @@ export class ModelDimensionsXML if(attributes !== undefined) { - if(attributes.x !== undefined) this._x = parseInt(attributes.x); - if(attributes.y !== undefined) this._y = parseInt(attributes.y); + if(attributes.x !== undefined) this._x = parseFloat(attributes.x); + if(attributes.y !== undefined) this._y = parseFloat(attributes.y); if(attributes.z !== undefined) this._z = parseFloat(attributes.z); + if(attributes.centerZ !== undefined) this._centerZ = parseFloat(attributes.centerZ); } } @@ -30,4 +32,9 @@ export class ModelDimensionsXML { return this._z; } + + public get centerZ(): number + { + return this._centerZ; + } } diff --git a/src/mapping/xml/asset/logic/model/ModelDirectionXML.ts b/src/common/mapping/xml/asset/logic/model/ModelDirectionXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/model/ModelDirectionXML.ts rename to src/common/mapping/xml/asset/logic/model/ModelDirectionXML.ts diff --git a/src/mapping/xml/asset/logic/model/ModelXML.ts b/src/common/mapping/xml/asset/logic/model/ModelXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/model/ModelXML.ts rename to src/common/mapping/xml/asset/logic/model/ModelXML.ts diff --git a/src/mapping/xml/asset/logic/model/index.ts b/src/common/mapping/xml/asset/logic/model/index.ts similarity index 100% rename from src/mapping/xml/asset/logic/model/index.ts rename to src/common/mapping/xml/asset/logic/model/index.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/index.ts b/src/common/mapping/xml/asset/logic/particlesystem/index.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/index.ts rename to src/common/mapping/xml/asset/logic/particlesystem/index.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestXML.ts b/src/common/mapping/xml/asset/manifest/ManifestXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestXML.ts diff --git a/src/mapping/xml/asset/manifest/index.ts b/src/common/mapping/xml/asset/manifest/index.ts similarity index 100% rename from src/mapping/xml/asset/manifest/index.ts rename to src/common/mapping/xml/asset/manifest/index.ts diff --git a/src/mapping/xml/asset/visualization/GestureXML.ts b/src/common/mapping/xml/asset/visualization/GestureXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/GestureXML.ts rename to src/common/mapping/xml/asset/visualization/GestureXML.ts diff --git a/src/mapping/xml/asset/visualization/LayerXML.ts b/src/common/mapping/xml/asset/visualization/LayerXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/LayerXML.ts rename to src/common/mapping/xml/asset/visualization/LayerXML.ts diff --git a/src/mapping/xml/asset/visualization/PostureXML.ts b/src/common/mapping/xml/asset/visualization/PostureXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/PostureXML.ts rename to src/common/mapping/xml/asset/visualization/PostureXML.ts diff --git a/src/mapping/xml/asset/visualization/VisualDirectionXML.ts b/src/common/mapping/xml/asset/visualization/VisualDirectionXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/VisualDirectionXML.ts rename to src/common/mapping/xml/asset/visualization/VisualDirectionXML.ts diff --git a/src/mapping/xml/asset/visualization/VisualizationDataXML.ts b/src/common/mapping/xml/asset/visualization/VisualizationDataXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/VisualizationDataXML.ts rename to src/common/mapping/xml/asset/visualization/VisualizationDataXML.ts diff --git a/src/mapping/xml/asset/visualization/VisualizationXML.ts b/src/common/mapping/xml/asset/visualization/VisualizationXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/VisualizationXML.ts rename to src/common/mapping/xml/asset/visualization/VisualizationXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts b/src/common/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts rename to src/common/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/AnimationXML.ts b/src/common/mapping/xml/asset/visualization/animation/AnimationXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/AnimationXML.ts rename to src/common/mapping/xml/asset/visualization/animation/AnimationXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts rename to src/common/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts rename to src/common/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/FrameXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/FrameXML.ts rename to src/common/mapping/xml/asset/visualization/animation/FrameXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/index.ts b/src/common/mapping/xml/asset/visualization/animation/index.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/index.ts rename to src/common/mapping/xml/asset/visualization/animation/index.ts diff --git a/src/mapping/xml/asset/visualization/color/ColorLayerXML.ts b/src/common/mapping/xml/asset/visualization/color/ColorLayerXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/color/ColorLayerXML.ts rename to src/common/mapping/xml/asset/visualization/color/ColorLayerXML.ts diff --git a/src/mapping/xml/asset/visualization/color/ColorXML.ts b/src/common/mapping/xml/asset/visualization/color/ColorXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/color/ColorXML.ts rename to src/common/mapping/xml/asset/visualization/color/ColorXML.ts diff --git a/src/mapping/xml/asset/visualization/color/index.ts b/src/common/mapping/xml/asset/visualization/color/index.ts similarity index 100% rename from src/mapping/xml/asset/visualization/color/index.ts rename to src/common/mapping/xml/asset/visualization/color/index.ts diff --git a/src/mapping/xml/asset/visualization/index.ts b/src/common/mapping/xml/asset/visualization/index.ts similarity index 100% rename from src/mapping/xml/asset/visualization/index.ts rename to src/common/mapping/xml/asset/visualization/index.ts diff --git a/src/mapping/xml/effectmap/EffectMapEffectXML.ts b/src/common/mapping/xml/effectmap/EffectMapEffectXML.ts similarity index 95% rename from src/mapping/xml/effectmap/EffectMapEffectXML.ts rename to src/common/mapping/xml/effectmap/EffectMapEffectXML.ts index f48d8d0..735519d 100644 --- a/src/mapping/xml/effectmap/EffectMapEffectXML.ts +++ b/src/common/mapping/xml/effectmap/EffectMapEffectXML.ts @@ -1,41 +1,41 @@ - -export class EffectMapEffectXML -{ - private _id: string; - private _lib: string; - private _type: string; - private _revision: number; - - constructor(xml: any) - { - const attributes = xml.$; - - if(attributes) - { - if(attributes.id !== undefined) this._id = attributes.id; - if(attributes.lib !== undefined) this._lib = attributes.lib; - if(attributes.type !== undefined) this._type = attributes.type; - if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); - } - } - - public get id(): string - { - return this._id; - } - - public get lib(): string - { - return this._lib; - } - - public get type(): string - { - return this._type; - } - - public get revision(): number - { - return this._revision; - } -} + +export class EffectMapEffectXML +{ + private _id: string; + private _lib: string; + private _type: string; + private _revision: number; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.lib !== undefined) this._lib = attributes.lib; + if(attributes.type !== undefined) this._type = attributes.type; + if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); + } + } + + public get id(): string + { + return this._id; + } + + public get lib(): string + { + return this._lib; + } + + public get type(): string + { + return this._type; + } + + public get revision(): number + { + return this._revision; + } +} diff --git a/src/mapping/xml/effectmap/EffectMapXML.ts b/src/common/mapping/xml/effectmap/EffectMapXML.ts similarity index 100% rename from src/mapping/xml/effectmap/EffectMapXML.ts rename to src/common/mapping/xml/effectmap/EffectMapXML.ts diff --git a/src/mapping/xml/effectmap/index.ts b/src/common/mapping/xml/effectmap/index.ts similarity index 100% rename from src/mapping/xml/effectmap/index.ts rename to src/common/mapping/xml/effectmap/index.ts diff --git a/src/mapping/xml/figuredata/FigureDataColorXML.ts b/src/common/mapping/xml/figuredata/FigureDataColorXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataColorXML.ts rename to src/common/mapping/xml/figuredata/FigureDataColorXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts b/src/common/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts rename to src/common/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataPaletteXML.ts b/src/common/mapping/xml/figuredata/FigureDataPaletteXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataPaletteXML.ts rename to src/common/mapping/xml/figuredata/FigureDataPaletteXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataPartXML.ts b/src/common/mapping/xml/figuredata/FigureDataPartXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataPartXML.ts rename to src/common/mapping/xml/figuredata/FigureDataPartXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataSetTypeXML.ts b/src/common/mapping/xml/figuredata/FigureDataSetTypeXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataSetTypeXML.ts rename to src/common/mapping/xml/figuredata/FigureDataSetTypeXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataSetXML.ts b/src/common/mapping/xml/figuredata/FigureDataSetXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataSetXML.ts rename to src/common/mapping/xml/figuredata/FigureDataSetXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataXML.ts b/src/common/mapping/xml/figuredata/FigureDataXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataXML.ts rename to src/common/mapping/xml/figuredata/FigureDataXML.ts diff --git a/src/mapping/xml/figuredata/index.ts b/src/common/mapping/xml/figuredata/index.ts similarity index 100% rename from src/mapping/xml/figuredata/index.ts rename to src/common/mapping/xml/figuredata/index.ts diff --git a/src/mapping/xml/figuremap/FigureLibraryPartXML.ts b/src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts similarity index 95% rename from src/mapping/xml/figuremap/FigureLibraryPartXML.ts rename to src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts index 964ae29..11c62f4 100644 --- a/src/mapping/xml/figuremap/FigureLibraryPartXML.ts +++ b/src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts @@ -1,26 +1,26 @@ -export class FigureLibraryPartXML -{ - private _id: number; - private _type: string; - - constructor(xml: any) - { - const attributes = xml.$; - - if(attributes) - { - if(attributes.id !== undefined) this._id = parseInt(attributes.id); - if(attributes.type !== undefined) this._type = attributes.type; - } - } - - public get id(): number - { - return this._id; - } - - public get type(): string - { - return this._type; - } -} +export class FigureLibraryPartXML +{ + private _id: number; + private _type: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.type !== undefined) this._type = attributes.type; + } + } + + public get id(): number + { + return this._id; + } + + public get type(): string + { + return this._type; + } +} diff --git a/src/mapping/xml/figuremap/FigureLibraryXML.ts b/src/common/mapping/xml/figuremap/FigureLibraryXML.ts similarity index 95% rename from src/mapping/xml/figuremap/FigureLibraryXML.ts rename to src/common/mapping/xml/figuremap/FigureLibraryXML.ts index 3522491..487da09 100644 --- a/src/mapping/xml/figuremap/FigureLibraryXML.ts +++ b/src/common/mapping/xml/figuremap/FigureLibraryXML.ts @@ -1,49 +1,49 @@ -import { FigureLibraryPartXML } from './FigureLibraryPartXML'; - -export class FigureLibraryXML -{ - private _id: string; - private _revision: number; - private _parts: FigureLibraryPartXML[]; - - constructor(xml: any) - { - const attributes = xml.$; - - if(attributes) - { - if(attributes.id !== undefined) this._id = attributes.id; - if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); - } - - if(xml.part !== undefined) - { - if(Array.isArray(xml.part)) - { - this._parts = []; - - for(const partId in xml.part) - { - const part = xml.part[partId]; - - this._parts.push(new FigureLibraryPartXML(part)); - } - } - } - } - - public get id(): string - { - return this._id; - } - - public get revision(): number - { - return this._revision; - } - - public get parts(): FigureLibraryPartXML[] - { - return this._parts; - } -} +import { FigureLibraryPartXML } from './FigureLibraryPartXML'; + +export class FigureLibraryXML +{ + private _id: string; + private _revision: number; + private _parts: FigureLibraryPartXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); + } + + if(xml.part !== undefined) + { + if(Array.isArray(xml.part)) + { + this._parts = []; + + for(const partId in xml.part) + { + const part = xml.part[partId]; + + this._parts.push(new FigureLibraryPartXML(part)); + } + } + } + } + + public get id(): string + { + return this._id; + } + + public get revision(): number + { + return this._revision; + } + + public get parts(): FigureLibraryPartXML[] + { + return this._parts; + } +} diff --git a/src/mapping/xml/figuremap/FigureMapXML.ts b/src/common/mapping/xml/figuremap/FigureMapXML.ts similarity index 100% rename from src/mapping/xml/figuremap/FigureMapXML.ts rename to src/common/mapping/xml/figuremap/FigureMapXML.ts diff --git a/src/mapping/xml/figuremap/index.ts b/src/common/mapping/xml/figuremap/index.ts similarity index 100% rename from src/mapping/xml/figuremap/index.ts rename to src/common/mapping/xml/figuremap/index.ts diff --git a/src/mapping/xml/furnituredata/FurnitureDataXML.ts b/src/common/mapping/xml/furnituredata/FurnitureDataXML.ts similarity index 100% rename from src/mapping/xml/furnituredata/FurnitureDataXML.ts rename to src/common/mapping/xml/furnituredata/FurnitureDataXML.ts diff --git a/src/mapping/xml/furnituredata/FurnitureTypeXML.ts b/src/common/mapping/xml/furnituredata/FurnitureTypeXML.ts similarity index 100% rename from src/mapping/xml/furnituredata/FurnitureTypeXML.ts rename to src/common/mapping/xml/furnituredata/FurnitureTypeXML.ts diff --git a/src/mapping/xml/furnituredata/index.ts b/src/common/mapping/xml/furnituredata/index.ts similarity index 100% rename from src/mapping/xml/furnituredata/index.ts rename to src/common/mapping/xml/furnituredata/index.ts diff --git a/src/mapping/xml/index.ts b/src/common/mapping/xml/index.ts similarity index 100% rename from src/mapping/xml/index.ts rename to src/common/mapping/xml/index.ts diff --git a/src/common/utils/BinaryReader.ts b/src/common/utils/BinaryReader.ts new file mode 100644 index 0000000..60869c5 --- /dev/null +++ b/src/common/utils/BinaryReader.ts @@ -0,0 +1,62 @@ +export class BinaryReader +{ + private _position: number; + private _dataView: DataView; + + constructor(buffer: ArrayBuffer) + { + this._position = 0; + this._dataView = new DataView(buffer); + } + + public readByte(): number + { + const byte = this._dataView.getInt8(this._position); + + this._position++; + + return byte; + } + + public readBytes(length: number): BinaryReader + { + const buffer = new BinaryReader(this._dataView.buffer.slice(this._position, this._position + length)); + + this._position += length; + + return buffer; + } + + public readShort(): number + { + const short = this._dataView.getInt16(this._position); + + this._position += 2; + + return short; + } + + public readInt(): number + { + const int = this._dataView.getInt32(this._position); + + this._position += 4; + + return int; + } + + public remaining(): number + { + return this._dataView.byteLength - this._position; + } + + public toString(encoding?: string): string + { + return new TextDecoder().decode(this._dataView.buffer); + } + + public toArrayBuffer(): ArrayBuffer + { + return this._dataView.buffer; + } +} diff --git a/src/utils/CustomIterator.ts b/src/common/utils/CustomIterator.ts similarity index 97% rename from src/utils/CustomIterator.ts rename to src/common/utils/CustomIterator.ts index 72abc2f..1e8f37d 100644 --- a/src/utils/CustomIterator.ts +++ b/src/common/utils/CustomIterator.ts @@ -1,6 +1,5 @@ -export default class CustomIterator +export class CustomIterator { - private idx: number; private readonly top: number; private readonly keys: Array; diff --git a/src/common/utils/File.ts b/src/common/utils/File.ts new file mode 100644 index 0000000..9ba26fc --- /dev/null +++ b/src/common/utils/File.ts @@ -0,0 +1,101 @@ +import { existsSync } from 'fs'; +import { lstat, mkdir, readdir, readFile, writeFile } from 'fs/promises'; + +export class File +{ + constructor(private readonly _path: string) + {} + + public async createDirectory(): Promise + { + try + { + await mkdir(this._path, { recursive: true }); + + return true; + } + + catch (error) + { + if(error.code && (error.code === 'EEXISTS')) return true; + + console.error(error); + + return false; + } + } + + public exists(): boolean + { + if(existsSync(this._path)) return true; + + return false; + } + + public async getFileList(): Promise + { + try + { + return await readdir(this._path); + } + + catch (error) + { + console.error(error); + + return null; + } + } + + public async isDirectory(): Promise + { + try + { + return (await lstat(this._path)).isDirectory(); + } + + catch (error) + { + console.error(error); + + return false; + } + } + + public async getContentsAsBuffer(): Promise + { + try + { + return await readFile(this._path); + } + + catch (error) + { + console.error(error); + + return null; + } + } + + public async writeData(data: string | Uint8Array): Promise + { + try + { + await writeFile(this._path, data); + + return true; + } + + catch (error) + { + console.error(error); + + return false; + } + } + + public get path(): string + { + return this._path; + } +} diff --git a/src/utils/FileUtilities.ts b/src/common/utils/FileUtilities.ts similarity index 68% rename from src/utils/FileUtilities.ts rename to src/common/utils/FileUtilities.ts index 4917252..1cab562 100644 --- a/src/utils/FileUtilities.ts +++ b/src/common/utils/FileUtilities.ts @@ -1,24 +1,14 @@ -import { readFile } from 'fs'; +import { readFile } from 'fs/promises'; import * as fetch from 'node-fetch'; -import { promisify } from 'util'; import { File } from './File'; -const readFileAsync = promisify(readFile); - export class FileUtilities { - public static getDirectory(baseFolderPath: string, childFolderName: string = null): File + public static async getDirectory(path: string): Promise { - let folder = new File(baseFolderPath); + const folder = new File(path); - if(!folder.isDirectory()) folder.mkdirs(); - - if(childFolderName) - { - folder = new File(folder.path + childFolderName); - - if(!folder.isDirectory()) folder.mkdirs(); - } + await folder.createDirectory(); return folder; } @@ -42,7 +32,7 @@ export class FileUtilities } else { - content = await readFileAsync(url); + content = await readFile(url); } return content; @@ -65,7 +55,7 @@ export class FileUtilities } else { - const data = await readFileAsync(url); + const data = await readFile(url); content = data.toString('utf-8'); } diff --git a/src/utils/SlicedToArray.ts b/src/common/utils/SlicedToArray.ts similarity index 53% rename from src/utils/SlicedToArray.ts rename to src/common/utils/SlicedToArray.ts index ba0c681..863cc01 100644 --- a/src/utils/SlicedToArray.ts +++ b/src/common/utils/SlicedToArray.ts @@ -4,7 +4,7 @@ export class SlicedToArray { if(Array.isArray(arr)) return arr; - if(Symbol.iterator in Object(arr)) return SlicedToArray.sliceIterator(arr, i); + if(Symbol.iterator in Object(arr)) return this.sliceIterator(arr, i); throw new TypeError('Invalid attempt to destructure non-iterable instance'); } @@ -13,37 +13,27 @@ export class SlicedToArray { const _arr = []; + let _i = null; + let _s = null; let _n = true; - let _d = false; - let _e = undefined; try { - for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) + for(_i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if(i && _arr.length === i) break; } + + if(!_n && _i['return']) _i['return'](); } catch (err) { - _d = true; - _e = err; - } + if(!_n && _i['return']) _i['return'](); - finally - { - try - { - if(!_n && _i['return']) _i['return'](); - } - - finally - { - if(_d) throw _e; - } + throw err; } return _arr; diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts new file mode 100644 index 0000000..7299482 --- /dev/null +++ b/src/common/utils/index.ts @@ -0,0 +1,5 @@ +export * from './BinaryReader'; +export * from './CustomIterator'; +export * from './File'; +export * from './FileUtilities'; +export * from './SlicedToArray'; diff --git a/src/configuration.json.example b/src/configuration.json.example index 27521c3..c7ae69d 100644 --- a/src/configuration.json.example +++ b/src/configuration.json.example @@ -1,5 +1,4 @@ { - "output.folder": "C:/nitro-converted-assets/", "flash.client.url": "", "furnidata.load.url": "", "productdata.load.url": "", @@ -12,10 +11,11 @@ "flash.dynamic.download.url": "", "dynamic.download.furniture.url": "${flash.dynamic.download.url}%revision%/%className%.swf", "external.variables.url": "https://www.habbo.com/gamedata/external_variables/1", - "external.texts.url": "", - "convert.figure": "0", - "convert.effect": "0", - "convert.furniture": "0", - "convert.pet": "0", - "misc.log_download_urls": "0" + "external.texts.url": "${external.texts.txt}", + "convert.figure": "1", + "convert.effect": "1", + "convert.furniture": "1", + "convert.furniture.floor.only": "0", + "convert.furniture.wall.only": "0", + "convert.pet": "1" } diff --git a/src/converters/ConverterUtilities.ts b/src/converters/ConverterUtilities.ts new file mode 100644 index 0000000..eb43f3f --- /dev/null +++ b/src/converters/ConverterUtilities.ts @@ -0,0 +1,311 @@ +import ora from 'ora'; +import { singleton } from 'tsyringe'; +import { Configuration, File, FileUtilities, NitroBundle } from '../common'; +import { GenerateNitroBundleFromSwf, SWFDownloader } from '../swf'; +import { EffectMapConverter } from './EffectMapConverter'; +import { FigureMapConverter } from './FigureMapConverter'; +import { FurnitureDataConverter } from './FurnitureDataConverter'; + +@singleton() +export class ConverterUtilities +{ + private static BUNDLE_TYPES: string[] = [ 'furniture', 'figure', 'effect', 'pet', 'generic' ]; + private static DOWNLOAD_SWF_TYPES: string[] = [ 'furniture', 'figure', 'effect', 'pet' ]; + + constructor( + private readonly _furnitureDataConverter: FurnitureDataConverter, + private readonly _figureMapConverter: FigureMapConverter, + private readonly _effectMapConverter: EffectMapConverter, + private readonly _configuration: Configuration) + {} + + public async downloadSwfTypes(): Promise + { + const floorOnly = (this._configuration.getBoolean('convert.furniture.floor.only') || false); + const wallOnly = (this._configuration.getBoolean('convert.furniture.wall.only') || false); + + for(const downloadType of ConverterUtilities.DOWNLOAD_SWF_TYPES) + { + if(!this._configuration.getBoolean(`convert.${ downloadType }`)) continue; + + const now = Date.now(); + const spinner = ora(`Preparing ${ downloadType }`).start(); + const downloadBase = this.getDownloadBaseUrl(downloadType); + const saveDirectory = await FileUtilities.getDirectory(`./assets/bundled/${ downloadType }`); + const classNamesWithRevisions = await this.getClassNamesWithRevision(downloadType, floorOnly, wallOnly); + const classNames = Object.keys(classNamesWithRevisions); + + if(classNames && classNames.length) + { + const totalClassNames = classNames.length; + + for(let i = 0; i < totalClassNames; i++) + { + const className = classNames[i]; + const revision = (classNamesWithRevisions[className] || '-1'); + + try + { + const saveFile = new File(`${ saveDirectory.path }/${ className }.nitro`); + + if(saveFile.exists()) continue; + + spinner.text = `Converting: ${ className } (${ (i + 1) } / ${ totalClassNames })`; + spinner.render(); + + const downloadUrl = SWFDownloader.getDownloadUrl(downloadBase, className, revision); + const habboAssetSwf = await SWFDownloader.downloadFromUrl(downloadUrl); + + if(!habboAssetSwf) + { + console.log(); + console.error(`Invalid SWF: ${ className }`); + + continue; + } + + const nitroBundle = await GenerateNitroBundleFromSwf(habboAssetSwf); + + await saveFile.writeData(await nitroBundle.toBufferAsync()); + + spinner.text = `Converted: ${ className }`; + spinner.render(); + } + + catch (error) + { + console.log(); + console.error(`Error Converting: ${ className } - ${ error.message }`); + + continue; + } + } + } + + spinner.succeed(`Finished ${ downloadType } in ${ Date.now() - now }ms`); + } + } + + public getDownloadBaseUrl(type: string): string + { + switch(type) + { + case 'furniture': + return this._configuration.getValue('dynamic.download.furniture.url'); + case 'figure': + return this._configuration.getValue('dynamic.download.figure.url'); + case 'effect': + return this._configuration.getValue('dynamic.download.effect.url'); + case 'pet': + return this._configuration.getValue('dynamic.download.pet.url'); + } + + return null; + } + + public async getClassNamesWithRevision(type: string, floorOnly: boolean = false, wallOnly: boolean = false): Promise<{ [index: string ]: string }> + { + switch(type) + { + case 'furniture': + return await this._furnitureDataConverter.getClassNamesAndRevisions(floorOnly, wallOnly); + case 'figure': + return await this._figureMapConverter.getClassNamesAndRevisions(); + case 'effect': + return await this._effectMapConverter.getClassNamesAndRevisions(); + case 'pet': { + const entries: { [index: string]: string } = {}; + const classNames = this._configuration.getValue('pet.configuration').split(','); + + for(const className of classNames) entries[className] = '-1'; + + return entries; + } + } + + return null; + } + + public async extractNitroFromFolder(): Promise + { + const now = Date.now(); + const spinner = ora('Preparing Extraction').start(); + const extractBaseDirectory = await FileUtilities.getDirectory('./assets/extract'); + const extractedBaseDirectory = await FileUtilities.getDirectory('./assets/extracted'); + + for await (const type of ConverterUtilities.BUNDLE_TYPES) + { + const extractTypeDirectory = await FileUtilities.getDirectory(`${ extractBaseDirectory.path }/${ type }`); + const extractedTypeDirectory = await FileUtilities.getDirectory(`${ extractedBaseDirectory.path }/${ type }`); + const files = await extractTypeDirectory.getFileList(); + + for await (const name of files) + { + const [ className, extension, ...rest ] = name.split('.'); + + try + { + spinner.text = `Extracting: ${ className }`; + spinner.render(); + + const saveDirectory = await FileUtilities.getDirectory(`${ extractedTypeDirectory.path }/${ className }`); + + const file = new File(`${ extractTypeDirectory.path }/${ name }`); + + if(extension === 'nitro') + { + const nitroBundle = NitroBundle.from((await file.getContentsAsBuffer()).buffer); + + for await (const [ bundleName, bundleBuffer ] of nitroBundle.files.entries()) + { + const saveFile = new File(`${ saveDirectory.path }/${ bundleName }`); + + await saveFile.writeData(bundleBuffer); + } + + spinner.text = `Extracted: ${ className }`; + spinner.render(); + } + } + + catch (error) + { + console.log(); + console.error(`Error Extracting: ${ name } - ${ error.message }`); + } + } + } + + spinner.succeed(`Extraction: Finished in ${ Date.now() - now }ms`); + } + + public async convertSwfFromFolder(): Promise + { + const now = Date.now(); + const spinner = ora('Preparing SWF Extraction').start(); + const swfBaseDirectory = await FileUtilities.getDirectory('./assets/swf'); + const bundledBaseDirectory = await FileUtilities.getDirectory('./assets/bundled'); + + for await (const type of ConverterUtilities.BUNDLE_TYPES) + { + const swfTypeDirectory = await FileUtilities.getDirectory(`${ swfBaseDirectory.path }/${ type }`); + const bundledTypeDirectory = await FileUtilities.getDirectory(`${ bundledBaseDirectory.path }/${ type }`); + const files = await swfTypeDirectory.getFileList(); + + for await (const name of files) + { + const [ className, extension, ...rest ] = name.split('.'); + + try + { + spinner.text = `Extracting SWF: ${ className }`; + spinner.render(); + + const downloadUrl = `${ swfTypeDirectory.path }/${ className }.swf`; + const habboAssetSwf = await SWFDownloader.downloadFromUrl(downloadUrl); + + if(!habboAssetSwf) + { + console.log(); + console.error(`Invalid SWF: ${ downloadUrl }`); + + continue; + } + + const nitroBundle = await GenerateNitroBundleFromSwf(habboAssetSwf); + + if(!nitroBundle) + { + console.log(); + console.error(`Invalid SWF Bundle: ${ downloadUrl }`); + + continue; + } + + const saveFile = new File(`${ bundledTypeDirectory.path }/${ className }.nitro`); + + await saveFile.writeData(await nitroBundle.toBufferAsync()); + + spinner.text = `Extracted SWF: ${ className }`; + spinner.render(); + } + + catch (error) + { + console.log(); + console.error(`Error Extracting: ${ name } - ${ error.message }`); + } + } + } + + spinner.succeed(`SWF Extraction: Finished in ${ Date.now() - now }ms`); + } + + public async bundleExtractedFromFolder(): Promise + { + const now = Date.now(); + const spinner = ora('Preparing Bundler').start(); + const bundleBaseDirectory = await FileUtilities.getDirectory('./assets/extracted'); + const bundledBaseDirectory = await FileUtilities.getDirectory('./assets/bundled'); + + for await (const type of ConverterUtilities.BUNDLE_TYPES) + { + const bundleTypeDirectory = await FileUtilities.getDirectory(`${ bundleBaseDirectory.path }/${ type }`); + const bundledTypeDirectory = await FileUtilities.getDirectory(`${ bundledBaseDirectory.path }/${ type }`); + const files = await bundleTypeDirectory.getFileList(); + + for await (const name of files) + { + const [ className, extension, ...rest ] = name.split('.'); + + try + { + const bundleDirectory = new File(`${ bundleTypeDirectory.path }/${ name }`); + + if(!await bundleDirectory.isDirectory()) continue; + + spinner.text = `Bundling: ${ className }`; + spinner.render(); + + const nitroBundle = new NitroBundle(); + const childFiles = await bundleDirectory.getFileList(); + + if(childFiles && childFiles.length) + { + for await (const childName of childFiles) + { + const childFile = new File(`${ bundleDirectory.path }/${ childName }`); + + nitroBundle.addFile(childName, await childFile.getContentsAsBuffer()); + } + } + + if(nitroBundle.totalFiles) + { + const saveFile = new File(`${ bundledTypeDirectory.path }/${ className }.nitro`); + + await saveFile.writeData(await nitroBundle.toBufferAsync()); + } + else + { + console.log(); + console.error(`Error Bundling: ${ name } - The bundle was empty`); + + continue; + } + + spinner.text = `Bundled: ${ name }`; + spinner.render(); + } + + catch (error) + { + console.log(); + console.error(`Error Bundling: ${ name } - ${ error.message }`); + } + } + } + + spinner.succeed(`Bundler: Finished in ${ Date.now() - now }ms`); + } +} diff --git a/src/converters/EffectConverter.ts b/src/converters/EffectConverter.ts deleted file mode 100644 index c495b4d..0000000 --- a/src/converters/EffectConverter.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; -import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; -import { EffectMapConverter } from './EffectMapConverter'; - -@singleton() -export class EffectConverter extends Converter -{ - public effectTypes: Map = new Map(); - - constructor( - private readonly _effectMapConverter: EffectMapConverter, - private readonly _configuration: Configuration) - { - super(); - } - - public async convertAsync(args: string[] = []): Promise - { - if(!this._configuration.getBoolean('convert.effect')) return; - - const now = Date.now(); - const spinner = ora('Preparing Effects').start(); - const baseUrl = this._configuration.getValue('dynamic.download.effect.url'); - const effectMap = this._effectMapConverter.effectMap; - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'effect'); - - const classNames: string[] = []; - - if(effectMap.effects !== undefined) - { - for(const library of effectMap.effects) - { - const className = library.lib; - - if(classNames.indexOf(className) >= 0) continue; - - classNames.push(className); - - this.effectTypes.set(className, library.type); - } - } - - for(const className of classNames) - { - try - { - const path = new File(directory.path + '/' + className + '.nitro'); - - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); - - if(!habboAssetSWF) - { - spinner.text = 'Couldnt convert effect: ' + className; - - spinner.render(); - - continue; - } - else - { - spinner.text = 'Converting: ' + className; - - spinner.render(); - } - - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, className); - - if(assetData) - { - assetData.name = className; - assetData.type = this.effectTypes.get(className); - } - - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - spinner.text = 'Finished: ' + className; - - spinner.render(); - } - - catch (error) - { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; - } - } - - console.log(); - spinner.succeed(`Effects finished in ${ Date.now() - now }ms`); - } -} diff --git a/src/converters/EffectMapConverter.ts b/src/converters/EffectMapConverter.ts index 35210fb..4b2d744 100644 --- a/src/converters/EffectMapConverter.ts +++ b/src/converters/EffectMapConverter.ts @@ -1,48 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IEffectMap } from '../mapping/json'; -import { EffectMapMapper } from '../mapping/mappers'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, EffectMapMapper, FileUtilities, IConverter, IEffectMap } from '../common'; @singleton() -export class EffectMapConverter extends Converter +export class EffectMapConverter implements IConverter { - public effectMap: IEffectMap = null; + private _effectMap: IEffectMap = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing EffectMap').start(); const url = this._configuration.getValue('effectmap.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); + this._effectMap = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.effectMap = await this.mapXML2JSON(xml); - } - else - { - this.effectMap = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/EffectMap.json'; - await writeFile(path, JSON.stringify(this.effectMap), 'utf8'); + await writeFile(path, JSON.stringify(this._effectMap), 'utf8'); - spinner.succeed(`EffectMap finished in ${ Date.now() - now }ms`); + spinner.succeed(`EffectMap: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise @@ -55,4 +40,16 @@ export class EffectMapConverter extends Converter return output; } + + public async getClassNamesAndRevisions(): Promise<{ [index: string]: string }> + { + const entries: { [index: string]: string } = {}; + + if(this._effectMap.effects) + { + for(const library of this._effectMap.effects) entries[library.lib] = '-1'; + } + + return entries; + } } diff --git a/src/converters/ExternalTextsConverter.ts b/src/converters/ExternalTextsConverter.ts index 7115d22..c3a0b68 100644 --- a/src/converters/ExternalTextsConverter.ts +++ b/src/converters/ExternalTextsConverter.ts @@ -1,44 +1,32 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IExternalTexts } from '../mapping/json'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FileUtilities, IConverter, IExternalTexts } from '../common'; @singleton() -export class ExternalTextsConverter extends Converter +export class ExternalTextsConverter implements IConverter { public externalTexts: IExternalTexts = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing ExternalTexts').start(); const url = this._configuration.getValue('external.texts.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - this.externalTexts = await this.mapText2JSON(content); - } - else - { - this.externalTexts = JSON.parse(content); - } + this.externalTexts = ((!content.startsWith('{')) ? await this.mapText2JSON(content) : JSON.parse(content)); - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/ExternalTexts.json'; await writeFile(path, JSON.stringify(this.externalTexts), 'utf8'); - spinner.succeed(`ExternalTexts finished in ${ Date.now() - now }ms`); + spinner.succeed(`ExternalTexts: Finished in ${ Date.now() - now }ms`); } private async mapText2JSON(text: string): Promise @@ -47,15 +35,20 @@ export class ExternalTextsConverter extends Converter const output: IExternalTexts = {}; - const parts = text.split(/\n\r{1,}|\n{1,}|\r{1,}/mg); + const parts = text.split(/\r?\n/); for(const part of parts) { - const [ key, value ] = part.split('='); + const [ key, ...value ] = part.split('='); - output[key] = value; + output[key] = value.join(); } return output; } + + public get converterType(): string + { + return 'ExternalTexts'; + } } diff --git a/src/converters/FigureConverter.ts b/src/converters/FigureConverter.ts deleted file mode 100644 index ae412f7..0000000 --- a/src/converters/FigureConverter.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; -import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; -import { FigureMapConverter } from './FigureMapConverter'; - -@singleton() -export class FigureConverter -{ - public figureTypes: Map = new Map(); - - constructor( - private readonly _figureMapConverter: FigureMapConverter, - private readonly _configuration: Configuration) - {} - - public async convertAsync(args: string[] = []): Promise - { - if(!this._configuration.getBoolean('convert.figure')) return; - - const now = Date.now(); - const spinner = ora('Preparing Figure').start(); - const baseUrl = this._configuration.getValue('dynamic.download.figure.url'); - const figureMap = this._figureMapConverter.figureMap; - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'figure'); - const classNames: string[] = []; - - if(figureMap.libraries !== undefined) - { - for(const library of figureMap.libraries) - { - const className = library.id.split('*')[0]; - - if(className === 'hh_human_fx' || className === 'hh_pets') continue; - - if(classNames.indexOf(className) >= 0) continue; - - classNames.push(className); - - this.figureTypes.set(className, library.parts[0].type); - } - } - - for(const className of classNames) - { - try - { - const path = new File(directory.path + '/' + className + '.nitro'); - - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); - - if(!habboAssetSWF) - { - spinner.text = 'Couldnt convert figure: ' + className; - - spinner.render(); - - continue; - } - else - { - spinner.text = 'Converting: ' + className; - - spinner.render(); - } - - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, className); - - if(assetData) - { - assetData.name = className; - assetData.type = this.figureTypes.get(className); - } - - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - spinner.text = 'Finished: ' + className; - - spinner.render(); - } - - catch (error) - { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; - } - } - - console.log(); - spinner.succeed(`Figures finished in ${ Date.now() - now }ms`); - } -} diff --git a/src/converters/FigureDataConverter.ts b/src/converters/FigureDataConverter.ts index 76b5e07..f0cde00 100644 --- a/src/converters/FigureDataConverter.ts +++ b/src/converters/FigureDataConverter.ts @@ -1,48 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IFigureData } from '../mapping/json/figuredata/IFigureData'; -import { FigureDataMapper } from '../mapping/mappers/FigureDataMapper'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FigureDataMapper, FileUtilities, IConverter, IFigureData } from '../common'; @singleton() -export class FigureDataConverter extends Converter +export class FigureDataConverter implements IConverter { public figureData: IFigureData = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing FigureData').start(); const url = this._configuration.getValue('figuredata.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); + this.figureData = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.figureData = await this.mapXML2JSON(xml); - } - else - { - this.figureData = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/FigureData.json'; await writeFile(path, JSON.stringify(this.figureData), 'utf8'); - spinner.succeed(`FigureData finished in ${ Date.now() - now }ms`); + spinner.succeed(`FigureData: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise @@ -55,4 +40,9 @@ export class FigureDataConverter extends Converter return output; } + + public get converterType(): string + { + return 'FigureData'; + } } diff --git a/src/converters/FigureMapConverter.ts b/src/converters/FigureMapConverter.ts index f087c79..45bfda2 100644 --- a/src/converters/FigureMapConverter.ts +++ b/src/converters/FigureMapConverter.ts @@ -1,50 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IFigureMap } from '../mapping/json'; -import { FigureMapMapper } from '../mapping/mappers'; -import { FileUtilities } from '../utils/FileUtilities'; -import { Logger } from '../utils/Logger'; +import { Configuration, FigureMapMapper, FileUtilities, IConverter, IFigureMap } from '../common'; @singleton() -export class FigureMapConverter extends Converter +export class FigureMapConverter implements IConverter { - public figureMap: IFigureMap = null; + private _figureMap: IFigureMap = null; constructor( - private readonly _configuration: Configuration, - private readonly _logger: Logger) - { - super(); - } + private readonly _configuration: Configuration) + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing FigureMap').start(); const url = this._configuration.getValue('figuremap.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); + this._figureMap = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.figureMap = await this.mapXML2JSON(xml); - } - else - { - this.figureMap = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/FigureMap.json'; - await writeFile(path, JSON.stringify(this.figureMap), 'utf8'); + await writeFile(path, JSON.stringify(this._figureMap), 'utf8'); - spinner.succeed(`FigureMap finished in ${ Date.now() - now }ms`); + spinner.succeed(`FigureMap: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise @@ -57,4 +40,23 @@ export class FigureMapConverter extends Converter return output; } + + public async getClassNamesAndRevisions(): Promise<{ [index: string]: string }> + { + const entries: { [index: string]: string } = {}; + + if(this._figureMap.libraries) + { + for(const library of this._figureMap.libraries) + { + const className = library.id.split('*')[0]; + + if(className === 'hh_human_fx' || className === 'hh_pets') continue; + + entries[className] = '-1'; + } + } + + return entries; + } } diff --git a/src/converters/FurnitureConverter.ts b/src/converters/FurnitureConverter.ts deleted file mode 100644 index d0972e0..0000000 --- a/src/converters/FurnitureConverter.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; -import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { IAssetData } from '../mapping/json'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; -import { FurnitureDataConverter } from './FurnitureDataConverter'; - -@singleton() -export class FurnitureConverter -{ - public assets: Map = new Map(); - - constructor( - private readonly _furniDataConverter: FurnitureDataConverter, - private readonly _configuration: Configuration) - {} - - public async convertAsync(args: string[] = []): Promise - { - if(!this._configuration.getBoolean('convert.furniture')) return; - - const now = Date.now(); - const spinner = ora('Preparing Furniture').start(); - const baseUrl = this._configuration.getValue('dynamic.download.furniture.url'); - const furniData = this._furniDataConverter.furnitureData; - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'furniture'); - const classNames: string[] = []; - const revisions: number[] = []; - - if(furniData.roomitemtypes) - { - if(furniData.roomitemtypes.furnitype) - { - for(const furniType of furniData.roomitemtypes.furnitype) - { - const className = furniType.classname.split('*')[0]; - const revision = furniType.revision; - - if(classNames.indexOf(className) >= 0) continue; - - classNames.push(className); - revisions.push(revision); - } - } - } - - if(furniData.wallitemtypes) - { - if(furniData.wallitemtypes.furnitype) - { - for(const furniType of furniData.wallitemtypes.furnitype) - { - const className = furniType.classname.split('*')[0]; - const revision = furniType.revision; - - if(classNames.indexOf(className) >= 0) continue; - - classNames.push(className); - revisions.push(revision); - } - } - } - - for(let i = 0; i < classNames.length; i++) - { - const className = classNames[i]; - const revision = revisions[i]; - - try - { - const path = new File(directory.path + '/' + className + '.nitro'); - - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, revision); - - if(!habboAssetSWF) - { - spinner.text = 'Couldnt convert furni: ' + className; - - spinner.render(); - - continue; - } - else - { - spinner.text = 'Couldnt convert furni: ' + className; - - spinner.render(); - } - - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, 'furniture'); - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - spinner.text = 'Finished: ' + className; - - spinner.render(); - } - - catch (error) - { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; - } - } - - console.log(); - spinner.succeed(`Furniture finished in ${ Date.now() - now }ms`); - } -} diff --git a/src/converters/FurnitureDataConverter.ts b/src/converters/FurnitureDataConverter.ts index 9038240..7ae17f5 100644 --- a/src/converters/FurnitureDataConverter.ts +++ b/src/converters/FurnitureDataConverter.ts @@ -1,49 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IFurnitureData } from '../mapping/json'; -import { FurnitureDataMapper } from '../mapping/mappers'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FileUtilities, FurnitureDataMapper, IConverter, IFurnitureData } from '../common'; @singleton() -export class FurnitureDataConverter extends Converter +export class FurnitureDataConverter implements IConverter { public furnitureData: IFurnitureData = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing FurnitureData').start(); const url = this._configuration.getValue('furnidata.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); - const furnitureData = await this.mapXML2JSON(xml); + this.furnitureData = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.furnitureData = furnitureData; - } - else - { - this.furnitureData = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/FurnitureData.json'; await writeFile(path, JSON.stringify(this.furnitureData), 'utf8'); - spinner.succeed(`FurnitureData finished in ${ Date.now() - now }ms`); + spinner.succeed(`FurnitureData: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise @@ -56,4 +40,47 @@ export class FurnitureDataConverter extends Converter return output; } + + public async getClassNamesAndRevisions(floorOnly: boolean = false, wallOnly: boolean = false): Promise<{ [index: string]: string }> + { + if(!this.furnitureData) return null; + + const both = (!floorOnly && !wallOnly); + const entries: { [index: string]: string } = {}; + + if((both || floorOnly) && this.furnitureData.roomitemtypes) + { + if(this.furnitureData.roomitemtypes.furnitype) + { + for(const furniType of this.furnitureData.roomitemtypes.furnitype) + { + const className = furniType.classname.split('*')[0]; + const revision = furniType.revision; + + entries[className] = revision.toString(); + } + } + } + + if((both || wallOnly) && this.furnitureData.wallitemtypes) + { + if(this.furnitureData.wallitemtypes.furnitype) + { + for(const furniType of this.furnitureData.wallitemtypes.furnitype) + { + const className = furniType.classname.split('*')[0]; + const revision = furniType.revision; + + entries[className] = revision.toString(); + } + } + } + + return entries; + } + + public get converterType(): string + { + return 'FurnitureData'; + } } diff --git a/src/converters/OldAssetConverter.ts b/src/converters/OldAssetConverter.ts deleted file mode 100644 index 90c25bf..0000000 --- a/src/converters/OldAssetConverter.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { writeFile } from 'fs/promises'; -import { singleton } from 'tsyringe'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; -import { Logger } from '../utils/Logger'; -import { NitroBundle } from '../utils/NitroBundle'; - -@singleton() -export class OldAssetConverter extends Converter -{ - constructor( - private readonly _configuration: Configuration, - private readonly _logger: Logger) - { - super(); - } - - public async convertAsync(args: string[] = []): Promise - { - if(args.shift() !== 'old-asset') return; - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'generic'); - const baseDirectory = FileUtilities.getDirectory(args.shift()); - - for(const className of args) - { - try - { - const path = new File(directory.path + '/' + className + '.nitro'); - const jsonBuffer = await FileUtilities.readFileAsBuffer(baseDirectory.path + '/' + className + '/' + className + '.json'); - const imageBuffer = await FileUtilities.readFileAsBuffer(baseDirectory.path + '/' + className + '/' + className + '.png'); - const nitroBundle = new NitroBundle(); - - nitroBundle.addFile((className + '.json'), jsonBuffer); - nitroBundle.addFile((className + '.png'), imageBuffer); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - console.log('Finished converting: ' + className); - } - - catch (error) - { - console.log('Error converting: ' + className); - } - } - } -} diff --git a/src/converters/PetConverter.ts b/src/converters/PetConverter.ts deleted file mode 100644 index b2be9da..0000000 --- a/src/converters/PetConverter.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; -import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; -import { Logger } from '../utils/Logger'; - -@singleton() -export class PetConverter extends Converter -{ - constructor( - private readonly _configuration: Configuration, - private readonly _logger: Logger) - { - super(); - } - - public async convertAsync(args: string[] = []): Promise - { - if(!this._configuration.getBoolean('convert.pet')) return; - - const now = Date.now(); - const spinner = ora('Preparing Pets').start(); - const baseUrl = this._configuration.getValue('dynamic.download.pet.url'); - const classNames = this.getPetTypes(); - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'pet'); - - for(const className of classNames) - { - try - { - const path = new File(directory.path + '/' + className + '.nitro'); - - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); - - if(!habboAssetSWF) - { - spinner.text = 'Couldnt convert pet: ' + className; - - spinner.render(); - - continue; - } - else - { - spinner.text = 'Converting: ' + className; - - spinner.render(); - } - - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, 'pet'); - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - spinner.text = 'Finished: ' + className; - - spinner.render(); - } - - catch (error) - { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; - } - } - - console.log(); - spinner.succeed(`Pets finished in ${ Date.now() - now }ms`); - } - - private getPetTypes(): string[] - { - const petTypes: string[] = []; - - const pets = this._configuration.getValue('pet.configuration'); - - if(pets) - { - const types = pets.split(','); - - for(const type of types) petTypes.push(type); - } - - return petTypes; - } -} diff --git a/src/converters/ProductDataConverter.ts b/src/converters/ProductDataConverter.ts index acfb0a6..86587df 100644 --- a/src/converters/ProductDataConverter.ts +++ b/src/converters/ProductDataConverter.ts @@ -1,21 +1,16 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IProductData } from '../mapping/json'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FileUtilities, IConverter, IProductData } from '../common'; @singleton() -export class ProductDataConverter extends Converter +export class ProductDataConverter implements IConverter { public productData: IProductData = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} public async convertAsync(args: string[] = []): Promise { @@ -24,23 +19,14 @@ export class ProductDataConverter extends Converter const url = this._configuration.getValue('productdata.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const productData = await this.mapText2JSON(content); + this.productData = ((!content.startsWith('{')) ? await this.mapText2JSON(content) : JSON.parse(content)); - this.productData = productData; - } - else - { - this.productData = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/ProductData.json'; await writeFile(path, JSON.stringify(this.productData), 'utf8'); - spinner.succeed(`ProductData finished in ${ Date.now() - now }ms`); + spinner.succeed(`ProductData: Finished in ${ Date.now() - now }ms`); } private async mapText2JSON(text: string): Promise @@ -83,4 +69,9 @@ export class ProductDataConverter extends Converter return output; } + + public get converterType(): string + { + return 'ProductData'; + } } diff --git a/src/swf-reader/index.js b/src/swf-reader/index.js deleted file mode 100644 index b24740b..0000000 --- a/src/swf-reader/index.js +++ /dev/null @@ -1,491 +0,0 @@ -/** - * Simple module for reading SWF properties - * - * (c) 2014 Rafael Leal Dias - * MIT LICENCE - * - */ -const fs = require('fs'); -const zlib = require('zlib'); -const lzma = require('lzma-purejs'); -const Stream = require('stream'); -const SWFTags = require('./lib/swf-tags'); -const SWFReader = exports; -import { SWFBuffer } from './lib/SWFBuffer'; - -function readSWFTags(buff, swf) -{ - var tags = [] - , tag - , tagHeader - , flag - , l - , sc - , fc; - - /* Reads TagCodeAndLength from Tag's RECORDHEADER */ - while( (tagHeader = buff.readTagCodeAndLength()) ) - { - tag = { - header : tagHeader - }; - switch( tagHeader.code ) - { - case SWFTags.FileAttributes: { - const flag = buff.readUIntLE(32); - const fileAttrs = {}; - - fileAttrs.useNetwork = tag.useNetwork = !!(flag & 0x1); - fileAttrs.as3 = tag.as3 = !!(flag & 0x8); - fileAttrs.hasMetaData = tag.hasMetaData = !!(flag & 0x10); - fileAttrs.useGPU = tag.useGPU = !!(flag & 0x20); - fileAttrs.useDirectBit = tag.useDirectBlit = !!(flag & 0x40); - - swf.fileAttributes = fileAttrs; - break; - } - case SWFTags.Metadata: { - swf.metadata = tag.metadata = buff.readString(); - break; - } - case SWFTags.SetBackgroundColor: { - tag.RGB = buff.readRGB(); - swf.backgroundColor = '#' + (tag.RGB[0]*65536 + tag.RGB[1]*256 + tag.RGB[0]).toString(16); - break; - } - case SWFTags.Protect : - swf.protect = tagHeader.length && buff.readString(); - break; - case SWFTags.DefineSceneAndFrameLabelData : - sc = tag.sceneCount = buff.readEncodedU32(); - tag.scenes = []; - - while(sc--) - tag.scenes.push({ - offset : buff.readEncodedU32(), - name : buff.readString() - }); - - fc = tag.frameLabelCount = buff.readEncodedU32(); - tag.labels = []; - - while(fc--) - tag.labels.push({ - frameNum : buff.readEncodedU32(), - frameLabel : buff.readString() - }); - break; - /** - * DefineShape4 extends the capabilities of - * DefineShape3 by using a new line style - * record in the shape - */ - //case SWFTags.DefineShape4 : - // /* id for this character */ - // tag.ShapeId = buff.readUIntLE(16); - // /* bounds of the shape */ - // tag.ShapeBounds = buff.readRect(); - // /* bounds of the shape, excluding the strokes */ - // tag.EdgeBounds = buff.readRect(); - // /* reserved, must be 0 */ - // if (0 !== buff.readBits(5)) - // throw new Error('Reserved bit used.'); - // /* if 1, use fill winding. >= SWF 10 */ - // if (swf.version >= 10) - // tag.UsesFillWindingRule = buff.readBits(1); - // /** - // * if 1, shape contains at least one - // * non-scaling stroke. - // */ - // tag.UsesNonScallingStrokes = buff.readBits(1); - // /** - // * if 1, shape contains at least one - // * scaling stroke - // */ - // tag.UsesScalingStrokes = buff.readBits(1); - // tag.shapes = buff.readShapeWithStyle(); - // break; - case SWFTags.FrameLabel : - tag.name = buff.readString(); - l = Buffer.byteLength(tag.name); - /* check if it's an named anchor */ - if(l & (tagHeader.length - 1) != l) - tag.anchor = buff.readUInt8(); - break; - case SWFTags.DefineSprite : - tag.SpriteID = buff.readUIntLE(16); - tag.FrameCount = buff.readUIntLE(16); - tag.ControlTags = readSWFTags(buff, swf); - break; - case SWFTags.ExportAssets : - tag.count = buff.readUIntLE(16); - tag.assets = []; - - l = 0; - - while(l++ < tag.count) - tag.assets.push({ - id : buff.readUIntLE(16), - name : buff.readString() - }); - break; - case SWFTags.ImportAssets : - /** - * URL where the source SWF file can be found - */ - tag.url = buff.readString(); - /** - * Number of assets to import - */ - tag.count = buff.readUIntLE(16); - tag.assets = []; - - l = 0; - - while(l++ < tag.count) - tag.assets.push({ - /** - * Character ID for the l-th item - * in importing SWF file - */ - id : buff.readUIntLE(16), - /** - * Identifies for the l-th - * imported character - */ - name : buff.readString() - }); - break; - case SWFTags.ImportAssets2 : - tag.url = buff.readString(); - - if( !(1 === buff.readUInt8() && 0 === buff.readUInt8()) ) - { - throw new Error('Reserved bits for ImportAssets2 used'); - } - - tag.count = buff.readUIntLE(16); - tag.assets = []; - - l = 0; - - while(l++ < tag.count) - tag.assets({ - id : buff.readUIntLE(16), - name : buff.readString() - }); - break; - case SWFTags.EnableDebbuger : - tag.password = buff.readString(); - break; - case SWFTags.EnableDebugger2 : - if(0 !== buff.readUIntLE(16)) - { - //throw new Error('Reserved bit for EnableDebugger2 used.'); - } - tag.password = buff.readString(); - break; - case SWFTags.ScriptLimits : - /** - * Maximum recursion Depth - */ - tag.maxRecursionDepth = buff.readUIntLE(16); - /** - * Maximum ActionScript processing time before script - * stuck dialog box displays - */ - tag.scriptTimeoutSeconds = buff.readUIntLE(16); - break; - case SWFTags.SymbolClass: { - tag.numSymbols = buff.readUIntLE(16); - tag.symbols = []; - - l = 0; - - while(l++ < tag.numSymbols) - tag.symbols.push({ - id : buff.readUIntLE(16), - name : buff.readString() - }); - break; - } - case SWFTags.DefineScalingGrid: { - tag.characterId = buff.readUIntLE(16); - tag.splitter = buff.readRect(); - break; - } - case SWFTags.setTabIndex: { - tag.depth = buff.readUIntLE(16); - tag.tabIndex = buff.readUIntLE(16); - break; - } - case SWFTags.JPEGTables: { - tag.jpegData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length); - buff.pointer += tagHeader.length; - break; - } - case SWFTags.DefineBits: { - tag.characterId = buff.readUIntLE(16); - tag.jpegData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length - 2); - buff.pointer += tagHeader.length - 2; - break; - } - case SWFTags.DefineBitsJPEG2: { - tag.characterId = buff.readUIntLE(16); - tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length - 2); - buff.pointer += tagHeader.length - 2; - break; - } - case SWFTags.DefineBitsJPEG3: { - tag.characterId = buff.readUIntLE(16); - var alphaDataOffset = buff.readUIntLE(32); - tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + alphaDataOffset); - buff.pointer += alphaDataOffset; - var restLength = tagHeader.length - 6 - alphaDataOffset; - tag.bitmapAlphaData = buff.buffer.slice(buff.pointer, buff.pointer + restLength); - buff.pointer += restLength; - break; - } - case SWFTags.DefineBitsJPEG4: { - tag.characterId = buff.readUIntLE(16); - const alphaDataOffset = buff.readUIntLE(32); - tag.deblockParam = buff.readUIntLE(16); - tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + alphaDataOffset); - buff.pointer += alphaDataOffset; - const restLength = tagHeader.length - 8 - alphaDataOffset; - tag.bitmapAlphaData = buff.buffer.slice(buff.pointer, buff.pointer + restLength); - buff.pointer += restLength; - break; - } - case SWFTags.DefineBitsLossless: - case SWFTags.DefineBitsLossless2: { - tag.characterId = buff.readUIntLE(16); - tag.bitmapFormat = buff.readUInt8(); - tag.bitmapWidth = buff.readUIntLE(16); - tag.bitmapHeight = buff.readUIntLE(16); - let restLength = tagHeader.length - 7; - if(tag.bitmapFormat == 3) - { - tag.bitmapColorTableSize = buff.readUInt8(); - restLength--; - } - tag.zlibBitmapData = buff.buffer.slice(buff.pointer, buff.pointer + restLength); - buff.pointer += restLength; - break; - } - default: - tag.data = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length); - buff.pointer += tagHeader.length; - break; - } - tags.push(tag); - } - return tags; -} - -/** - * Reads tags and their contents, passaing a SWF object to callback - * - * @param {SWFBuffer} buff - * @param {Buffer} compressed_buff - * @param {function} callback - * @api private - * - */ -function readSWFBuff(buff, compressed_buff, next) -{ - if(!buff) return next(null, null); - - buff.seek(3);// start - - if(buff.length < 9) - { - if(isSync) throw new Error('Buffer is to small, must be greater than 9 bytes.'); - return next(new Error('Buffer is to small, must be greater than 9 bytes.')); - } - var swf = { - version : buff.readUInt8(), - fileLength : { - compressed : compressed_buff.length, - uncompressed : buff.readUIntLE(32) - }, - frameSize : buff.readRect(), // Returns a RECT object. i.e : { x : 0, y : 0, width : 200, height: 300 } - frameRate : buff.readUIntLE(16)/256, - frameCount : buff.readUIntLE(16) - } - , isSync = 'function' !== typeof next; - - try - { - swf.tags = readSWFTags(buff, swf); - } - catch (e) - { - if(isSync) throw e; - return next(e); - } - - return isSync && swf || next( null, swf ); -} - -/** - * Concat SWF Header with uncompressed Buffer - * - * @param {Buffer|ArrayBuffer} buff - * @param {Buffer|ArrayBuffer} swf - */ -function concatSWFHeader(buff, swf) -{ - return Buffer.concat([swf.slice(0, 8), buff]); -} - -/** - * Uncompress SWF and start reading it - * - * @param {Buffer|ArrayBuffer} swf - * @param {function} callback - * - */ -function uncompress(swf, next) -{ - var compressed_buff = swf.slice(8) - , uncompressed_buff - , isSync = 'function' !== typeof next - , e; - - // uncompress buffer - switch(swf[0]) - { - case 0x43 : // zlib compressed - if(isSync) - { - uncompressed_buff = concatSWFHeader(zlib.unzipSync(compressed_buff), swf); - - if(!Buffer.isBuffer(uncompressed_buff)) return null; - - return readSWFBuff(new SWFBuffer(uncompressed_buff), swf); - } - - zlib.inflate(compressed_buff, function(err, buf) - { - if(!Buffer.isBuffer(buf)) - { - readSWFBuff(null, swf, next); - } - else - { - readSWFBuff(new SWFBuffer(buf), swf, next); - } - }); - break; - case 0x46 : // uncompressed - if(!Buffer.isBuffer(swf)) return null; - - return readSWFBuff(new SWFBuffer( swf ), swf, next); - case 0x5a : // LZMA compressed - var lzmaProperties = compressed_buff.slice(4, 9); - compressed_buff = compressed_buff.slice(9); - - var input_stream = new Stream(); - input_stream.pos = 0; - input_stream.readByte = function() - { - return this.pos >= compressed_buff.length ? -1 : compressed_buff[this.pos++]; - }; - - var output_stream = new Stream(); - output_stream.buffer = new Buffer(16384); - output_stream.pos = 0; - output_stream.writeByte = function(_byte) - { - if(this.pos >= this.buffer.length) - { - var newBuffer = new Buffer(this.buffer.length * 2); - this.buffer.copy(newBuffer); - this.buffer = newBuffer; - } - this.buffer[this.pos++] = _byte; - }; - output_stream.getBuffer = function() - { - // trim buffer - if(this.pos !== this.buffer.length) - { - var newBuffer = new Buffer(this.pos); - this.buffer.copy(newBuffer, 0, 0, this.pos); - this.buffer = newBuffer; - } - return this.buffer; - }; - - lzma.decompress(lzmaProperties, input_stream, output_stream, -1); - uncompressed_buff = Buffer.concat([swf.slice(0, 8), output_stream.getBuffer()]); - - if(!Buffer.isBuffer(uncompressed_buff)) return null; - - return readSWFBuff(new SWFBuffer(uncompressed_buff), swf, next); - default : - e = new Error('Unknown SWF compressions'); - - if(isSync) - { - throw e; - } - else - { - next(e); - } - } -} - -/** - * Check if file is Buffer or ArrayBuffer - * - * @param {Buffer|ArrayBuffer) b - * @api private - * - */ -function isBuffer(b) -{ - return typeof Buffer !== 'undefined' && Buffer.isBuffer(b) || b instanceof ArrayBuffer; -} - -/* Exposes Tags constants */ -SWFReader.TAGS = SWFTags; - -/** - * Reads SWF file - * - * @param {String|Buffer}} file - * @param {function} next - if not a function, uses synchronous algorithm - * @api public - * - */ -SWFReader.read = SWFReader.readSync = function(file, next) -{ - if(isBuffer(file)) - { - /* File is already a buffer */ - return uncompress(file, next); - } - else - { - /* Get the buffer */ - if('function' === typeof next) - { - fs.readFile(file, function(err, swf) - { - if( err ) - { - next(err); - return; - } - uncompress(swf, next); - }); - } - else - { - return uncompress(fs.readFileSync(file)); - } - } -}; diff --git a/src/swf-reader/lib/swf-tags.js b/src/swf-reader/lib/swf-tags.js deleted file mode 100644 index 26a6dd0..0000000 --- a/src/swf-reader/lib/swf-tags.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Defines constants on exports object - * - * @param {String} name - * @param {Mixed} value - */ - -function define(name, value) -{ - Object.defineProperty(exports, name, { - value : value, - enumerable : true - }); -} - -/* SWF Tags Type */ - -define('End', 0); -define('ShowFrame', 1); -define('DefineShape', 2); -define('PlaceObject', 4); -define('RemoveObject', 5); -define('DefineBits', 6); -define('DefineButton', 7); -define('JPEGTables', 8); -define('SetBackgroundColor', 9); -define('DefineFont', 10); -define('DefineText', 11); -define('DoAction', 12); -define('DefineFontInfo', 13); -define('DefineSound', 14); -define('StartSound', 15); -define('DefineButtonSound', 17); -define('SoundStreamHead', 18); -define('SoundStreamBlock', 19); -define('DefineBitsLossless', 20); -define('DefineBitsJPEG2', 21); -define('DefineShape2', 22); -define('DefineButtonCxform', 23); -define('Protect', 24); -define('PlaceObject2', 26); -define('RemoveObject2', 28); -define('DefineShape3', 32); -define('DefineText2', 33); -define('DefineButton2', 34); -define('DefineBitsJPEG3', 35); -define('DefineBitsLossless2', 36); -define('DefineEditText', 37); -define('DefineSprite', 39); -define('SerialNumber', 41); -define('FrameLabel', 43); -define('SoundStreamHead2', 45); -define('DefineMorphShape', 46); -define('DefineFont2', 48); -define('ExportAssets', 56); -define('ImportAssets', 57); -define('EnableDebugger', 58); -define('DoInitAction', 59); -define('DefineVideoStream', 60); -define('VideoFrame', 61); -define('DefineFontInfo2', 62); -define('EnableDebugger2', 64); -define('ScriptLimits', 65); -define('SetTabIndex', 66); -define('FileAttributes', 69); -define('PlaceObject3', 70); -define('ImportAssets2', 71); -define('DefineFontAlignZones', 73); -define('CSMTextSettings', 74); -define('DefineFont3', 75); -define('SymbolClass', 76); -define('Metadata', 77); -define('DefineScalingGrid', 78); -define('DoABC', 82); -define('DefineShape4', 83); -define('DefineMorphShape2', 84); -define('DefineSceneAndFrameLabelData', 86); -define('DefineBinaryData', 87); -define('DefineFontName', 88); -define('StartSound2', 89); -define('DefineBitsJPEG4', 90); -define('DefineFont4', 91); -//define('TagMax' (DefineFont4 + 1) diff --git a/src/swf/ConcatSWFHeader.ts b/src/swf/ConcatSWFHeader.ts new file mode 100644 index 0000000..5e7f27d --- /dev/null +++ b/src/swf/ConcatSWFHeader.ts @@ -0,0 +1,4 @@ +export const ConcatSWFHeader = (buff: Buffer, swf: Buffer) => +{ + return Buffer.concat([ swf.slice(0, 8), buff ]); +}; diff --git a/src/swf/GenerateNitroBundleFromSwf.ts b/src/swf/GenerateNitroBundleFromSwf.ts new file mode 100644 index 0000000..82a2755 --- /dev/null +++ b/src/swf/GenerateNitroBundleFromSwf.ts @@ -0,0 +1,15 @@ +import { GenerateSpriteSheet } from './GenerateSpritesheet'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { SWFUtilities } from './SWFUtilities'; + +export const GenerateNitroBundleFromSwf = async (habboAssetSWF: HabboAssetSWF, assetType: string = null) => +{ + if(!habboAssetSWF) return null; + + const spriteBundle = await GenerateSpriteSheet(habboAssetSWF); + const assetData = await SWFUtilities.mapXML2JSON(habboAssetSWF, assetType); + + if(assetData) assetData.name = habboAssetSWF.getDocumentClass(); + + return SWFUtilities.createNitroBundle(assetData.name, assetData, spriteBundle); +}; diff --git a/src/swf/GenerateSpritesheet.ts b/src/swf/GenerateSpritesheet.ts new file mode 100644 index 0000000..9c2b552 --- /dev/null +++ b/src/swf/GenerateSpritesheet.ts @@ -0,0 +1,59 @@ +import { ImageBundle } from '../common'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { PackImages } from './PackImages'; + +export const IMAGE_SOURCES: Map = new Map(); + +export const GenerateSpriteSheet = async (habboAssetSWF: HabboAssetSWF, convertCase: boolean = false) => +{ + const tagList = habboAssetSWF.symbolTags(); + const names: string[] = []; + const tags: number[] = []; + + let documentClass = habboAssetSWF.getDocumentClass(); + + if(convertCase) documentClass = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))); + + for(const tag of tagList) + { + names.push(...tag.names); + tags.push(...tag.tags); + } + + const imageBundle = new ImageBundle(); + + const imageTags = habboAssetSWF.imageTags(); + + for(const imageTag of imageTags) + { + if(tags.includes(imageTag.characterId)) + { + for(let i = 0; i < tags.length; i++) + { + if(tags[i] != imageTag.characterId) continue; + + if(names[i] == imageTag.className) continue; + + if(imageTag.className.startsWith('sh_')) continue; + + if(imageTag.className.indexOf('_32_') >= 0) continue; + + IMAGE_SOURCES.set(names[i].substring(documentClass.length + 1), imageTag.className.substring(documentClass.length + 1)); + } + } + + if(imageTag.className.startsWith('sh_')) continue; + + if(imageTag.className.indexOf('_32_') >= 0) continue; + + let className = imageTag.className; + + if(convertCase) className = ((className.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1)); + + imageBundle.addImage(className, imageTag.imgData); + } + + if(!imageBundle.images.length) return null; + + return await PackImages(documentClass, imageBundle, convertCase); +}; diff --git a/src/swf/HabboAssetSWF.ts b/src/swf/HabboAssetSWF.ts index 732e3ae..e41a185 100644 --- a/src/swf/HabboAssetSWF.ts +++ b/src/swf/HabboAssetSWF.ts @@ -1,32 +1,27 @@ -import CustomIterator from '../utils/CustomIterator'; -import { readImagesDefineBitsLossless, readImagesJPEG3or4, readSwfAsync } from '../utils/SwfReader'; -import { CharacterTag } from './tags/CharacterTag'; -import { DefineBinaryDataTag } from './tags/DefineBinaryDataTag'; -import { ImageTag } from './tags/ImageTag'; -import { ITag } from './tags/ITag'; -import { SymbolClassTag } from './tags/SymbolClassTag'; +import { CustomIterator } from '../common'; +import { ReadImagesDefineBitsLossless } from './ReadImagesDefineBitsLossless'; +import { ReadImagesJPEG3or4 } from './ReadImagesJPEG3or4'; +import { ReadSWF } from './ReadSWF'; +import { CharacterTag, DefineBinaryDataTag, ImageTag, ITag, SymbolClassTag } from './tags'; export class HabboAssetSWF { - private readonly _tags: Array; + private readonly _tags: Array = []; private _documentClass: string | null = null; constructor( - private readonly _data: string | Buffer + private readonly _data: Buffer ) - { - this._tags = new Array(); - } + {} - async setupAsync() + public async setupAsync() { - const swf = await readSwfAsync(this._data); + const swf = await ReadSWF(this._data); if(!swf) return; for(const tag of swf.tags) { - switch(tag.header.code) { case 76: @@ -35,67 +30,29 @@ export class HabboAssetSWF case 87: this._tags.push(new DefineBinaryDataTag(tag.data)); break; - case 6: console.log(tag); break; - case 21: { - const jpeg3 = await readImagesJPEG3or4(21, tag); - this._tags.push(new ImageTag({ - code: 21, - characterID: jpeg3.characterId, - imgType: 'jpeg', - imgData: jpeg3.imageData, - bitmapWidth: jpeg3.bitmapWidth, - bitmapHeight: jpeg3.bitmapHeight - })); + const jpeg3 = await ReadImagesJPEG3or4(21, tag); + this._tags.push(new ImageTag(jpeg3.characterId, 21, 'jpeg', jpeg3.imgData)); break; } - case 35: { - const jpeg3 = await readImagesJPEG3or4(35, tag); - this._tags.push(new ImageTag({ - code: jpeg3.code, - characterID: jpeg3.characterId, - imgType: jpeg3.imgType, - imgData: jpeg3.imgData, - bitmapWidth: jpeg3.bitmapWidth, - bitmapHeight: jpeg3.bitmapHeight - })); + const jpeg3 = await ReadImagesJPEG3or4(35, tag); + this._tags.push(new ImageTag(jpeg3.characterId, jpeg3.code, jpeg3.imgType, jpeg3.imgData)); break; } - case 36: { - const pngTagLossLess2: any = await readImagesDefineBitsLossless(tag); - this._tags.push(new ImageTag({ - code: pngTagLossLess2.code, - characterID: pngTagLossLess2.characterId, - imgType: pngTagLossLess2.imgType, - imgData: pngTagLossLess2.imgData, - bitmapWidth: pngTagLossLess2.bitmapWidth, - bitmapHeight: pngTagLossLess2.bitmapHeight - })); + const pngTagLossLess2: any = await ReadImagesDefineBitsLossless(tag); + this._tags.push(new ImageTag(pngTagLossLess2.characterId, pngTagLossLess2.code, pngTagLossLess2.imgType, pngTagLossLess2.imgData, pngTagLossLess2.bitmapWidth, pngTagLossLess2.bitmapHeight)); break; } - case 20: { - const pngTagLossless: any = await readImagesDefineBitsLossless(tag); - this._tags.push(new ImageTag({ - code: pngTagLossless.code, - characterID: pngTagLossless.characterId, - imgType: pngTagLossless.imgType, - imgData: pngTagLossless.imgData, - bitmapWidth: pngTagLossless.bitmapWidth, - bitmapHeight: pngTagLossless.bitmapHeight - })); + const pngTagLossless: any = await ReadImagesDefineBitsLossless(tag); + this._tags.push(new ImageTag(pngTagLossless.characterId, pngTagLossless.code, pngTagLossless.imgType, pngTagLossless.imgData, pngTagLossless.bitmapWidth, pngTagLossless.bitmapHeight)); break; } - - case 90: - console.log(tag); - break; - default: //console.log(tag.header.code); break; @@ -172,8 +129,7 @@ export class HabboAssetSWF public getBinaryTagByName(name: string): DefineBinaryDataTag | null { - const streamTag = this.binaryTags() - .filter(tag => tag.className === name)[0]; + const streamTag = this.binaryTags().filter(tag => tag.className === name)[0]; if(streamTag === undefined) return null; diff --git a/src/swf/PackImages.ts b/src/swf/PackImages.ts new file mode 100644 index 0000000..6458e08 --- /dev/null +++ b/src/swf/PackImages.ts @@ -0,0 +1,43 @@ +import { packAsync } from 'free-tex-packer-core'; +import { ImageBundle, SpriteBundle } from '../common'; + +export const PackImages = async (documentClass: string, imageBundle: ImageBundle, convertCase: boolean = false) => +{ + const files = await packAsync(imageBundle.images, { + textureName: (convertCase ? documentClass.substring(1) : documentClass), + width: 10240, + height: 4320, + fixedSize: false, + allowRotation: false, + detectIdentical: true, + allowTrim: true, + //@ts-ignore + exporter: 'Pixi' + }); + + const bundle = new SpriteBundle(); + + for(const item of files) + { + if(item.name.endsWith('.json')) + { + bundle.spritesheet = JSON.parse(item.buffer.toString('utf8')); + + delete bundle.spritesheet.meta.app; + delete bundle.spritesheet.meta.version; + } + else + { + bundle.imageData = { + name: item.name, + buffer: item.buffer + }; + + if(convertCase) bundle.imageData.name = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1); + } + } + + if((bundle.spritesheet !== undefined) && (bundle.imageData !== undefined)) bundle.spritesheet.meta.image = bundle.imageData.name; + + return bundle; +}; diff --git a/src/swf/ReadImagesDefineBitsLossless.ts b/src/swf/ReadImagesDefineBitsLossless.ts new file mode 100644 index 0000000..698671b --- /dev/null +++ b/src/swf/ReadImagesDefineBitsLossless.ts @@ -0,0 +1,89 @@ +import encoder from 'png-stream/encoder'; +import streamToArray from 'stream-to-array'; +import { promisify } from 'util'; +import { unzip } from 'zlib'; +import { ISWFTag } from './common'; + +export const ReadImagesDefineBitsLossless = async (tag: Partial) => +{ + const { characterId, bitmapFormat, bitmapWidth, bitmapHeight, bitmapColorTableSize, zlibBitmapData } = tag; + + const pngEncoder = new encoder(bitmapWidth, bitmapHeight, { colorSpace: 'rgba' }); + const dataBuf = await promisify(unzip)(zlibBitmapData); + + if(!dataBuf) return null; + const output = Buffer.alloc(bitmapWidth * bitmapHeight * 4); + + let index = 0; + let ptr = 0; + + switch(bitmapFormat) + { + case 5: { + for(let y = 0; y < bitmapHeight; ++y) + { + for(let x = 0; x < bitmapWidth; ++x) + { + const alpha = dataBuf[ptr]; + output[index] = dataBuf[ptr + 1] * (255 / alpha); + output[index + 1] = dataBuf[ptr + 2] * (255 / alpha); + output[index + 2] = dataBuf[ptr + 3] * (255 / alpha); + output[index + 3] = alpha; + index += 4; + ptr += 4; + } + } + + break; + } + case 3: { + // 8-bit colormapped image + const colorMap = []; + + for(let i = 0; i < bitmapColorTableSize + 1; ++i) + { + colorMap.push([dataBuf[ptr], dataBuf[ptr + 1], dataBuf[ptr + 2], dataBuf[ptr + 3]]); + + ptr += 4; + } + + for(let _y2 = 0; _y2 < bitmapHeight; ++_y2) + { + for(let _x2 = 0; _x2 < bitmapWidth; ++_x2) + { + const idx = dataBuf[ptr]; + const color = idx < colorMap.length ? colorMap[idx] : [0, 0, 0, 0]; + output[index] = color[0]; + output[index + 1] = color[1]; + output[index + 2] = color[2]; + output[index + 3] = color[3]; + ptr += 1; + index += 4; + } + + // skip padding + ptr += (4 - bitmapWidth % 4) % 4; + } + + break; + } + default: + // reject(new Error('unhandled bitmapFormat: ' + bitmapFormat)); + break; + } + + pngEncoder.end(output); + + const parts = await streamToArray(pngEncoder); + + const buffers = parts.map(part => Buffer.isBuffer(part) ? part : Buffer.from(part)); + + return { + code: 36, + characterId: characterId, + imgType: 'png', + imgData: Buffer.concat(buffers), + bitmapWidth: bitmapWidth, + bitmapHeight: bitmapHeight + }; +}; diff --git a/src/swf/ReadImagesJPEG3or4.ts b/src/swf/ReadImagesJPEG3or4.ts new file mode 100644 index 0000000..70e804e --- /dev/null +++ b/src/swf/ReadImagesJPEG3or4.ts @@ -0,0 +1,77 @@ +import * as concatFrames from 'concat-frames'; +import decoder from 'jpg-stream/decoder'; +import encoder from 'png-stream/encoder'; +import { PassThrough } from 'stream'; +import streamToArray from 'stream-to-array'; +import { promisify } from 'util'; +import { unzip } from 'zlib'; +import { SlicedToArray } from '../common'; +import { ISWFTag } from './common'; +import { RecognizeImageHeader } from './RecognizeImageHeader'; + +export const ReadImagesJPEG3or4 = async (code: number, tag: Partial) => +{ + const { characterId, imgData, bitmapAlphaData } = tag; + const imgType = RecognizeImageHeader(imgData); + + if(imgType !== 'jpeg') return { code, characterId, imgType, imgData }; + + const pngEncoder = new encoder(undefined, undefined, { colorSpace: 'rgba' }); + const alphaBufPre = await promisify(unzip)(bitmapAlphaData); + + let alphaBuffer: Buffer = null; + + if(alphaBufPre.length > 0) alphaBuffer = alphaBufPre; + + const bufferStream = new PassThrough(); + + bufferStream.end(imgData); + + bufferStream + .pipe(new decoder()) + .pipe(concatFrames.default((data: any) => + { + const _ref2 = SlicedToArray.slicedToArray(data, 1); + const frame = _ref2[0]; + + const input = frame.pixels; + const pCount = frame.width * frame.height; + const output = Buffer.alloc(pCount * 4); + + if(alphaBuffer !== null && alphaBuffer.length !== pCount) + { + console.error('expect alphaBuf to have size ' + pCount + ' while getting ' + alphaBuffer.length); + } + + const getAlphaBuffer = (i: any) => + { + if(!alphaBuffer) return 0xFF; + + return alphaBuffer[i]; + }; + + for(let i = 0; i < pCount; ++i) + { + output[4 * i] = input[3 * i]; + output[4 * i + 1] = input[3 * i + 1]; + output[4 * i + 2] = input[3 * i + 2]; + output[4 * i + 3] = getAlphaBuffer(i); + } + + pngEncoder.format.width = frame.width; + pngEncoder.format.height = frame.height; + pngEncoder.end(output); + })); + + const parts = await streamToArray(pngEncoder); + const buffers = parts.map(part => Buffer.isBuffer(part) ? part : Buffer.from(part)); + + bufferStream.end(); + + return { + code: code, + characterId: characterId, + imgType: 'png', + imgData: Buffer.concat(buffers) + }; +}; diff --git a/src/swf/ReadSWF.ts b/src/swf/ReadSWF.ts new file mode 100644 index 0000000..9082020 --- /dev/null +++ b/src/swf/ReadSWF.ts @@ -0,0 +1,13 @@ +import { readFile } from 'fs/promises'; +import { UncompressSWF } from './UncompressSWF'; + +export const ReadSWF = async (buffer: Buffer) => +{ + if(Buffer.isBuffer(buffer)) return await UncompressSWF(buffer); + + buffer = await readFile(buffer); + + if(!buffer) return null; + + return await UncompressSWF(buffer); +}; diff --git a/src/swf/ReadSWFBuffer.ts b/src/swf/ReadSWFBuffer.ts new file mode 100644 index 0000000..25a2176 --- /dev/null +++ b/src/swf/ReadSWFBuffer.ts @@ -0,0 +1,32 @@ +import { ISWF } from './common'; +import { readSWFTags } from './ReadSWFTags'; +import { SWFBuffer } from './SWFBuffer'; + +export const ReadSWFBuff = (swfBuffer: SWFBuffer, rawBuffer: Buffer) => +{ + if(!swfBuffer || !rawBuffer) return null; + + swfBuffer.seek(3); + + if(swfBuffer.length < 9) + { + console.error('Buffer is to small, must be greater than 9 bytes.'); + + return null; + } + + const swf: ISWF = { + version: swfBuffer.readUInt8(), + fileLength: { + compressed: rawBuffer.length, + uncompressed: swfBuffer.readUIntLE(32) + }, + frameSize: swfBuffer.readRect(), + frameRate: (swfBuffer.readUIntLE(16) / 256), + frameCount: swfBuffer.readUIntLE(16), + }; + + swf.tags = readSWFTags(swfBuffer, swf); + + return swf; +}; diff --git a/src/swf/ReadSWFTags.ts b/src/swf/ReadSWFTags.ts new file mode 100644 index 0000000..4cb4505 --- /dev/null +++ b/src/swf/ReadSWFTags.ts @@ -0,0 +1,203 @@ +import { ISWF, ISWFFileAttributes, ISWFTag, ISWFTagHeader } from './common'; +import { SWFBuffer } from './SWFBuffer'; +import { SWFTags } from './SWFTags'; + +export const readSWFTags = (buffer: SWFBuffer, swf: Partial) => +{ + const tags: Partial[] = []; + + let header: ISWFTagHeader = null; + + while((header = buffer.readTagCodeAndLength())) + { + const tag: Partial = { header }; + + switch(header.code) + { + case SWFTags.FileAttributes: { + const flag = buffer.readUIntLE(32); + const fileAttrs: Partial = {}; + + fileAttrs.useNetwork = tag.useNetwork = !!(flag & 0x1); + fileAttrs.as3 = tag.as3 = !!(flag & 0x8); + fileAttrs.hasMetaData = tag.hasMetaData = !!(flag & 0x10); + fileAttrs.useGPU = tag.useGPU = !!(flag & 0x20); + fileAttrs.useDirectBit = tag.useDirectBit = !!(flag & 0x40); + + swf.fileAttributes = fileAttrs; + break; + } + case SWFTags.Metadata: + swf.metadata = tag.metadata = buffer.readString(); + break; + case SWFTags.SetBackgroundColor: + tag.RGB = buffer.readRGB(); + swf.backgroundColor = ('#' + ((tag.RGB[0] * 65536) + (tag.RGB[1] * 256) + tag.RGB[0]).toString(16)); + break; + case SWFTags.Protect: + swf.protect = header.length && buffer.readString(); + break; + case SWFTags.DefineSceneAndFrameLabelData: { + let sc = tag.sceneCount = buffer.readEncodedU32(); + tag.scenes = []; + + while(sc--) tag.scenes.push({ + offset: buffer.readEncodedU32(), + name: buffer.readString() + }); + + let fc = tag.frameLabelCount = buffer.readEncodedU32(); + tag.labels = []; + + while(fc--) tag.labels.push({ + frameNum: buffer.readEncodedU32(), + frameLabel: buffer.readString() + }); + break; + } + case SWFTags.FrameLabel: { + tag.name = buffer.readString(); + const l = Buffer.byteLength(tag.name); + if(l && ((header.length - 1) !== l)) tag.anchor = buffer.readUInt8(); + break; + } + case SWFTags.DefineSprite: + tag.SpriteID = buffer.readUIntLE(16); + tag.FrameCount = buffer.readUIntLE(16); + tag.ControlTags = readSWFTags(buffer, swf); + break; + case SWFTags.ExportAssets: { + tag.count = buffer.readUIntLE(16); + tag.assets = []; + + let l = 0; + + while(l++ < tag.count) tag.assets.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.ImportAssets: { + tag.url = buffer.readString(); + tag.count = buffer.readUIntLE(16); + tag.assets = []; + + let l = 0; + + while(l++ < tag.count) tag.assets.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.ImportAssets2: { + tag.url = buffer.readString(); + + if(!((1 === buffer.readUInt8()) && (0 === buffer.readUInt8()))) throw new Error('Reserved bits for ImportAssets2 used'); + + tag.count = buffer.readUIntLE(16); + tag.assets = []; + + let l = 0; + + while(l++ < tag.count) tag.assets.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.EnableDebugger: + tag.password = buffer.readString(); + break; + case SWFTags.EnableDebugger2: + tag.password = buffer.readString(); + break; + case SWFTags.ScriptLimits: + tag.maxRecursionDepth = buffer.readUIntLE(16); + tag.scriptTimeoutSeconds = buffer.readUIntLE(16); + break; + case SWFTags.SymbolClass: { + tag.numSymbols = buffer.readUIntLE(16); + tag.symbols = []; + + let l = 0; + + while(l++ < tag.numSymbols) tag.symbols.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.DefineScalingGrid: + tag.characterId = buffer.readUIntLE(16); + tag.splitter = buffer.readRect(); + break; + case SWFTags.SetTabIndex: + tag.depth = buffer.readUIntLE(16); + tag.tabIndex = buffer.readUIntLE(16); + break; + case SWFTags.JPEGTables: + tag.jpegData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length); + buffer.pointer += header.length; + break; + case SWFTags.DefineBits: + tag.characterId = buffer.readUIntLE(16); + tag.jpegData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length - 2); + buffer.pointer += (header.length - 2); + break; + case SWFTags.DefineBitsJPEG2: + tag.characterId = buffer.readUIntLE(16); + tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length - 2); + buffer.pointer += (header.length - 2); + break; + case SWFTags.DefineBitsJPEG3: { + tag.characterId = buffer.readUIntLE(16); + const alphaDataOffset = buffer.readUIntLE(32); + tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + alphaDataOffset); + buffer.pointer += alphaDataOffset; + const restLength = ((header.length - 6) - alphaDataOffset); + tag.bitmapAlphaData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength); + buffer.pointer += restLength; + break; + } + case SWFTags.DefineBitsJPEG4: { + tag.characterId = buffer.readUIntLE(16); + const alphaDataOffset = buffer.readUIntLE(32); + tag.deblockParam = buffer.readUIntLE(16); + tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + alphaDataOffset); + buffer.pointer += alphaDataOffset; + const restLength = ((header.length - 8) - alphaDataOffset); + tag.bitmapAlphaData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength); + buffer.pointer += restLength; + break; + } + case SWFTags.DefineBitsLossless: + case SWFTags.DefineBitsLossless2: { + tag.characterId = buffer.readUIntLE(16); + tag.bitmapFormat = buffer.readUInt8(); + tag.bitmapWidth = buffer.readUIntLE(16); + tag.bitmapHeight = buffer.readUIntLE(16); + let restLength = (header.length - 7); + + if(tag.bitmapFormat === 3) + { + tag.bitmapColorTableSize = buffer.readUInt8(); + restLength--; + } + + tag.zlibBitmapData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength); + buffer.pointer += restLength; + break; + } + default: + tag.data = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length); + buffer.pointer += header.length; + break; + } + + tags.push(tag); + } + + return tags; +}; diff --git a/src/swf/RecognizeImageHeader.ts b/src/swf/RecognizeImageHeader.ts new file mode 100644 index 0000000..be94dc9 --- /dev/null +++ b/src/swf/RecognizeImageHeader.ts @@ -0,0 +1,14 @@ +const pngMagic = Buffer.from('0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A'.split(' ').map(Number)); +const gifMagic = Buffer.from('0x47 0x49 0x46 0x38 0x39 0x61'.split(' ').map(Number)); +const jpegMagic = Buffer.from('0xFF 0xD8'.split(' ').map(Number)); + +export const RecognizeImageHeader = (buffer: Buffer) => +{ + if(pngMagic.equals(buffer.slice(0, pngMagic.length))) return 'png'; + if(gifMagic.equals(buffer.slice(0, gifMagic.length))) return 'gif'; + if(jpegMagic.equals(buffer.slice(0, jpegMagic.length))) return 'jpeg'; + + console.error('Unknown format:', buffer.slice(0, 8)); + + return null; +}; diff --git a/src/swf-reader/lib/SWFBuffer.ts b/src/swf/SWFBuffer.ts similarity index 78% rename from src/swf-reader/lib/SWFBuffer.ts rename to src/swf/SWFBuffer.ts index bbc9012..56751ba 100644 --- a/src/swf-reader/lib/SWFBuffer.ts +++ b/src/swf/SWFBuffer.ts @@ -4,7 +4,7 @@ export class SWFBuffer public static EOS: number = 0x00; public static STYLE_COUNT_EXT: number = 0xFF; - public buffer: Buffer + public buffer: Buffer = null; public pointer: number = 0; public position: number = 1; public current: number = 0; @@ -12,10 +12,7 @@ export class SWFBuffer constructor(buffer: Buffer) { - if(!Buffer.isBuffer(buffer)) - { - throw new Error('invalid_buffer'); - } + if(!Buffer.isBuffer(buffer)) throw new Error('invalid_buffer'); this.buffer = buffer; this.length = buffer.length; @@ -35,7 +32,7 @@ export class SWFBuffer break; } - this.pointer += bits / 8; + this.pointer += (bits / 8); return value; } @@ -69,13 +66,13 @@ export class SWFBuffer return [ ...this.readRGB(), this.readUInt8() ]; } - public readString(encoding: BufferEncoding): string + public readString(encoding: BufferEncoding = 'utf8'): string { const init = this.pointer; while(this.readUInt8() !== SWFBuffer.EOS); - return this.buffer.toString(encoding || 'utf8', init, this.pointer - 1); + return this.buffer.toString((encoding || 'utf8'), init, (this.pointer - 1)); } public readStyleArray(buffer: SWFBuffer, next) @@ -122,7 +119,7 @@ export class SWFBuffer public readLineStyle(buffer: SWFBuffer): { width: number, color: [ number, number, number, number ]} { return { - width: buffer.readUIntLE(16)/20, + width: (buffer.readUIntLE(16) / 20), color: buffer.readRGBA() }; } @@ -149,10 +146,10 @@ export class SWFBuffer public readShapeWithStyle() { return { - fillStyles : this.readStyleArray(this, this.readFillStyle), - lineStyles : this.readStyleArray(this, this.readLineStyle), - numFillBits : this.readBits(4), - numLineBits : this.readBits(4), + fillStyles: this.readStyleArray(this, this.readFillStyle), + lineStyles: this.readStyleArray(this, this.readLineStyle), + numFillBits: this.readBits(4), + numLineBits: this.readBits(4), shapeRecords: this.readShapeRecords(this) }; } @@ -162,8 +159,8 @@ export class SWFBuffer if(this.pointer === this.length) return null; const n = this.readUIntLE(16); - const tagType = n >> 6; - let tagLength = n & SWFBuffer.RECORDHEADER_LENTH_FULL; + const tagType = (n >> 6); + let tagLength = (n & SWFBuffer.RECORDHEADER_LENTH_FULL); if(n === 0) return null; @@ -177,22 +174,22 @@ export class SWFBuffer this.start(); const NBits = this.readBits(5); - const Xmin = this.readBits(NBits, true) / 20; - const Xmax = this.readBits(NBits, true) / 20; - const Ymin = this.readBits(NBits, true) / 20; - const Ymax = this.readBits(NBits, true) / 20; + const Xmin = (this.readBits(NBits, true) / 20); + const Xmax = (this.readBits(NBits, true) / 20); + const Ymin = (this.readBits(NBits, true) / 20); + const Ymax = (this.readBits(NBits, true) / 20); return { - x : Xmin, - y : Ymin, - width : (Xmax > Xmin ? Xmax - Xmin : Xmin - Xmax), - height : (Ymax > Ymin ? Ymax - Ymin : Ymin - Ymax) + x: Xmin, + y: Ymin, + width: (Xmax > Xmin ? (Xmax - Xmin) : (Xmin - Xmax)), + height: (Ymax > Ymin ? (Ymax - Ymin) : (Ymin - Ymax)) }; } public seek(pos: number): void { - this.pointer = pos % this.buffer.length; + this.pointer = (pos % this.buffer.length); } public start(): void @@ -217,9 +214,9 @@ export class SWFBuffer { if( this.position > 8 ) this.start(); - r = (r << 1 ) + ((this.current >> (8 - this.position++)) & 1); + r = (r << 1) + ((this.current >> (8 - this.position++)) & 1); } - return sign * r; + return (sign * r); } } diff --git a/src/swf/SWFDownloader.ts b/src/swf/SWFDownloader.ts new file mode 100644 index 0000000..d0a680f --- /dev/null +++ b/src/swf/SWFDownloader.ts @@ -0,0 +1,39 @@ +import { FileUtilities } from '../common'; +import { HabboAssetSWF } from './HabboAssetSWF'; + +export class SWFDownloader +{ + public static USES_REVISION: boolean = true; + public static LOG_DOWNLOADS: boolean = true; + + public static getDownloadUrl(baseUrl: string, className: string, revision: string): string + { + let url = baseUrl; + + if(!url || !url.length) return null; + + if(SWFDownloader.USES_REVISION && (revision !== '-1')) url = url.replace('%revision%', revision.toString()); + + url = url.replace('%className%', className); + + return url; + } + + public static async downloadFromUrl(url: string): Promise + { + return await this.extractSWF(url); + } + + public static async extractSWF(url: string): Promise + { + const buffer = await FileUtilities.readFileAsBuffer(url); + + if(!buffer) return null; + + const habboAssetSWF = new HabboAssetSWF(buffer); + + await habboAssetSWF.setupAsync(); + + return habboAssetSWF; + } +} diff --git a/src/swf/SWFTags.ts b/src/swf/SWFTags.ts new file mode 100644 index 0000000..1f0d2c7 --- /dev/null +++ b/src/swf/SWFTags.ts @@ -0,0 +1,68 @@ +export class SWFTags +{ + public static End: number = 0; + public static ShowFrame: number = 1; + public static DefineShape: number = 2; + public static PlaceObject: number = 4; + public static RemoveObject: number = 5; + public static DefineBits: number = 6; + public static DefineButton: number = 7; + public static JPEGTables: number = 8; + public static SetBackgroundColor: number = 9; + public static DefineFont: number = 10; + public static DefineText: number = 11; + public static DoAction: number = 12; + public static DefineFontInfo: number = 13; + public static DefineSound: number = 14; + public static StartSound: number = 15; + public static DefineButtonSound: number = 17; + public static SoundStreamHead: number = 18; + public static SoundStreamBlock: number = 19; + public static DefineBitsLossless: number = 20; + public static DefineBitsJPEG2: number = 21; + public static DefineShape2: number = 22; + public static DefineButtonCxform: number = 23; + public static Protect: number = 24; + public static PlaceObject2: number = 26; + public static RemoveObject2: number = 28; + public static DefineShape3: number = 32; + public static DefineText2: number = 33; + public static DefineButton2: number = 34; + public static DefineBitsJPEG3: number = 35; + public static DefineBitsLossless2: number = 36; + public static DefineEditText: number = 37; + public static DefineSprite: number = 39; + public static SerialNumber: number = 41; + public static FrameLabel: number = 43; + public static SoundStreamHead2: number = 45; + public static DefineMorphShape: number = 46; + public static DefineFont2: number = 48; + public static ExportAssets: number = 56; + public static ImportAssets: number = 57; + public static EnableDebugger: number = 58; + public static DoInitAction: number = 59; + public static DefineVideoStream: number = 60; + public static VideoFrame: number = 61; + public static DefineFontInfo2: number = 62; + public static EnableDebugger2: number = 64; + public static ScriptLimits: number = 65; + public static SetTabIndex: number = 66; + public static FileAttributes: number = 69; + public static PlaceObject3: number = 70; + public static ImportAssets2: number = 71; + public static DefineFontAlignZones: number = 73; + public static CSMTextSettings: number = 74; + public static DefineFont3: number = 75; + public static SymbolClass: number = 76; + public static Metadata: number = 77; + public static DefineScalingGrid: number = 78; + public static DoABC: number = 82; + public static DefineShape4: number = 83; + public static DefineMorphShape2: number = 84; + public static DefineSceneAndFrameLabelData: number = 86; + public static DefineBinaryData: number = 87; + public static DefineFontName: number = 88; + public static StartSound2: number = 89; + public static DefineBitsJPEG4: number = 90; + public static DefineFont4: number = 91; +} diff --git a/src/common/converters/SWFConverter.ts b/src/swf/SWFUtilities.ts similarity index 85% rename from src/common/converters/SWFConverter.ts rename to src/swf/SWFUtilities.ts index e3d20aa..e90e72a 100644 --- a/src/common/converters/SWFConverter.ts +++ b/src/swf/SWFUtilities.ts @@ -1,14 +1,10 @@ import { wrap } from 'bytebuffer'; import { parseStringPromise } from 'xml2js'; -import { IAssetData } from '../../mapping/json'; -import { AnimationMapper, AssetMapper, IndexMapper, LogicMapper, ManifestMapper, VisualizationMapper } from '../../mapping/mappers'; -import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; -import { DefineBinaryDataTag } from '../../swf/tags/DefineBinaryDataTag'; -import { NitroBundle } from '../../utils/NitroBundle'; -import { SpriteBundle } from '../bundle/SpriteBundle'; -import { Converter } from './Converter'; +import { AnimationMapper, AssetMapper, IAssetData, IndexMapper, LogicMapper, ManifestMapper, NitroBundle, SpriteBundle, VisualizationMapper } from '../common'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { DefineBinaryDataTag } from './tags'; -export class SWFConverter extends Converter +export class SWFUtilities { private static removeComments(data: string): string { @@ -44,7 +40,7 @@ export class SWFConverter extends Converter public static async getManifestXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'manifest', false, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'manifest', false, snakeCase); if(!binaryData) return null; @@ -53,7 +49,7 @@ export class SWFConverter extends Converter public static async getIndexXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'index', false, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'index', false, snakeCase); if(!binaryData) return null; @@ -62,7 +58,7 @@ export class SWFConverter extends Converter public static async getAssetsXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'assets', true, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'assets', true, snakeCase); if(!binaryData) return null; @@ -71,7 +67,7 @@ export class SWFConverter extends Converter public static async getLogicXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'logic', true, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'logic', true, snakeCase); if(!binaryData) return null; @@ -80,7 +76,7 @@ export class SWFConverter extends Converter public static async getVisualizationXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'visualization', true, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'visualization', true, snakeCase); if(!binaryData) return null; @@ -89,7 +85,7 @@ export class SWFConverter extends Converter public static async getAnimationXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'animation', false, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'animation', false, snakeCase); if(!binaryData) return null; @@ -98,7 +94,7 @@ export class SWFConverter extends Converter public static getPalette(habboAssetSWF: HabboAssetSWF, paletteName: string): [ number, number, number ][] { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, paletteName, false); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, paletteName, false); if(!binaryData || !binaryData.binaryDataBuffer) return null; @@ -138,7 +134,7 @@ export class SWFConverter extends Converter const output: IAssetData = {}; - output.type = assetType; + if(assetType) output.type = assetType; const indexXML = await this.getIndexXML(habboAssetSWF, snakeCase); diff --git a/src/swf/UncompressSWF.ts b/src/swf/UncompressSWF.ts new file mode 100644 index 0000000..0b7ba3e --- /dev/null +++ b/src/swf/UncompressSWF.ts @@ -0,0 +1,86 @@ +import * as lzma from 'lzma-purejs'; +import { Stream } from 'stream'; +import { promisify } from 'util'; +import { unzip } from 'zlib'; +import { ReadSWFBuff } from './ReadSWFBuffer'; +import { SWFBuffer } from './SWFBuffer'; + +export const UncompressSWF = async (rawBuffer: Buffer) => +{ + if(!Buffer.isBuffer(rawBuffer)) return null; + + let compressedBuffer = rawBuffer.slice(8); + + switch(rawBuffer[0]) + { + case 0x43: { // zlib compressed + const buffer = await (promisify(unzip)(compressedBuffer)); + + if(!Buffer.isBuffer(buffer)) return null; + + return ReadSWFBuff(new SWFBuffer(buffer), rawBuffer); + } + case 0x46: // uncompressed + return ReadSWFBuff(new SWFBuffer(rawBuffer), rawBuffer); + case 0x5a: { // LZMA compressed + const lzmaProperties = compressedBuffer.slice(4, 9); + compressedBuffer = compressedBuffer.slice(9); + + const inputStream = new Stream(); + + let inputPos = 0; + + //@ts-ignore + inputStream.readByte = () => + { + return inputPos >= compressedBuffer.length ? -1 : compressedBuffer[inputPos++]; + }; + + const outputStream = new Stream(); + + let outputBuffer = Buffer.alloc(16384); + let outputPos = 0; + + //@ts-ignore + outputStream.writeByte = (_byte: number) => + { + if(outputPos >= outputBuffer.length) + { + const newBuffer = Buffer.alloc(outputBuffer.length * 2); + + outputBuffer.copy(newBuffer); + outputBuffer = newBuffer; + } + + outputBuffer[outputPos++] = _byte; + + return true; + }; + + //@ts-ignore + outputStream.getBuffer = () => + { + // trim buffer + if(outputPos !== outputBuffer.length) + { + const newBuffer = Buffer.alloc(outputPos); + outputBuffer.copy(newBuffer, 0, 0, outputPos); + outputBuffer = newBuffer; + } + + return outputBuffer; + }; + + lzma.decompress(lzmaProperties, inputStream, outputStream, -1); + + //@ts-ignore + const buffer = Buffer.concat([ rawBuffer.slice(0, 8), outputStream.getBuffer() ]); + + if(!Buffer.isBuffer(buffer)) return null; + + return ReadSWFBuff(new SWFBuffer(buffer), rawBuffer); + } + } + + return null; +}; diff --git a/src/swf/common/ISWF.ts b/src/swf/common/ISWF.ts new file mode 100644 index 0000000..ed97c88 --- /dev/null +++ b/src/swf/common/ISWF.ts @@ -0,0 +1,18 @@ +import { ISWFFileAttributes } from './ISWFFileAttributes'; +import { ISWFFileLength } from './ISWFFileLength'; +import { ISWFFrameSize } from './ISWFFrameSize'; +import { ISWFTag } from './ISWFTag'; + +export interface ISWF +{ + version?: number; + fileLength?: ISWFFileLength; + frameSize?: ISWFFrameSize; + frameRate?: number; + frameCount?: number; + backgroundColor?: string; + fileAttributes?: Partial; + metadata?: string; + protect?: string; + tags?: Partial[]; +} diff --git a/src/swf/common/ISWFFileAttributes.ts b/src/swf/common/ISWFFileAttributes.ts new file mode 100644 index 0000000..3a396f3 --- /dev/null +++ b/src/swf/common/ISWFFileAttributes.ts @@ -0,0 +1,8 @@ +export interface ISWFFileAttributes +{ + useNetwork: boolean, + as3: boolean, + hasMetaData: boolean, + useGPU: boolean, + useDirectBit: boolean +} diff --git a/src/swf/common/ISWFFileLength.ts b/src/swf/common/ISWFFileLength.ts new file mode 100644 index 0000000..ac51b9f --- /dev/null +++ b/src/swf/common/ISWFFileLength.ts @@ -0,0 +1,5 @@ +export interface ISWFFileLength +{ + compressed: number; + uncompressed: number; +} diff --git a/src/swf/common/ISWFFrameSize.ts b/src/swf/common/ISWFFrameSize.ts new file mode 100644 index 0000000..ad43e52 --- /dev/null +++ b/src/swf/common/ISWFFrameSize.ts @@ -0,0 +1,7 @@ +export interface ISWFFrameSize +{ + x: number; + y: number; + width: number; + height: number; +} diff --git a/src/swf/common/ISWFTag.ts b/src/swf/common/ISWFTag.ts new file mode 100644 index 0000000..b7ff7ef --- /dev/null +++ b/src/swf/common/ISWFTag.ts @@ -0,0 +1,49 @@ +import { ISWFTagAsset } from './ISWFTagAsset'; +import { ISWFTagHeader } from './ISWFTagHeader'; +import { ISWFTagLabel } from './ISWFTagLabel'; +import { ISWFTagScene } from './ISWFTagScene'; +import { ISWFTagSplitter } from './ISWFTagSplitter'; +import { ISWFTagSymbol } from './ISWFTagSymbol'; + +export interface ISWFTag +{ + header: ISWFTagHeader; + useNetwork: boolean; + as3: boolean; + hasMetaData: boolean; + useGPU: boolean; + useDirectBit: boolean; + metadata: string; + RGB: [ number, number, number ]; + sceneCount: number; + scenes: ISWFTagScene[]; + frameLabelCount: number; + labels: ISWFTagLabel[]; + name: string; + anchor: number; + SpriteID: number; + FrameCount: number; + ControlTags: Partial[]; + count: number; + assets: ISWFTagAsset[]; + url: string; + characterId: number; + bitmapFormat: number; + bitmapWidth: number; + bitmapHeight: number; + bitmapColorTableSize: number; + zlibBitmapData: Buffer; + deblockParam: number; + imgData: Buffer; + bitmapAlphaData: Buffer; + jpegData: Buffer; + data: Buffer; + splitter: ISWFTagSplitter; + depth: number; + tabIndex: number; + password: string; + maxRecursionDepth: number; + scriptTimeoutSeconds: number; + numSymbols: number; + symbols: ISWFTagSymbol[]; +} diff --git a/src/swf/common/ISWFTagAsset.ts b/src/swf/common/ISWFTagAsset.ts new file mode 100644 index 0000000..de5be06 --- /dev/null +++ b/src/swf/common/ISWFTagAsset.ts @@ -0,0 +1,5 @@ +export interface ISWFTagAsset +{ + id: number; + name: string; +} diff --git a/src/swf/common/ISWFTagHeader.ts b/src/swf/common/ISWFTagHeader.ts new file mode 100644 index 0000000..ba6d6b5 --- /dev/null +++ b/src/swf/common/ISWFTagHeader.ts @@ -0,0 +1,5 @@ +export interface ISWFTagHeader +{ + code: number; + length: number; +} diff --git a/src/swf/common/ISWFTagLabel.ts b/src/swf/common/ISWFTagLabel.ts new file mode 100644 index 0000000..5b2f2e7 --- /dev/null +++ b/src/swf/common/ISWFTagLabel.ts @@ -0,0 +1,5 @@ +export interface ISWFTagLabel +{ + frameNum: number; + frameLabel: string; +} diff --git a/src/swf/common/ISWFTagScene.ts b/src/swf/common/ISWFTagScene.ts new file mode 100644 index 0000000..1fa49f3 --- /dev/null +++ b/src/swf/common/ISWFTagScene.ts @@ -0,0 +1,5 @@ +export interface ISWFTagScene +{ + offset: number; + name: string; +} diff --git a/src/swf/common/ISWFTagSplitter.ts b/src/swf/common/ISWFTagSplitter.ts new file mode 100644 index 0000000..03f30f3 --- /dev/null +++ b/src/swf/common/ISWFTagSplitter.ts @@ -0,0 +1,7 @@ +export interface ISWFTagSplitter +{ + x: number; + y: number; + width: number; + height: number; +} diff --git a/src/swf/common/ISWFTagSymbol.ts b/src/swf/common/ISWFTagSymbol.ts new file mode 100644 index 0000000..72f7a1d --- /dev/null +++ b/src/swf/common/ISWFTagSymbol.ts @@ -0,0 +1,5 @@ +export interface ISWFTagSymbol +{ + id: number; + name: string; +} diff --git a/src/swf/common/index.ts b/src/swf/common/index.ts new file mode 100644 index 0000000..c61164d --- /dev/null +++ b/src/swf/common/index.ts @@ -0,0 +1,11 @@ +export * from './ISWF'; +export * from './ISWFFileAttributes'; +export * from './ISWFFileLength'; +export * from './ISWFFrameSize'; +export * from './ISWFTag'; +export * from './ISWFTagAsset'; +export * from './ISWFTagHeader'; +export * from './ISWFTagLabel'; +export * from './ISWFTagScene'; +export * from './ISWFTagSplitter'; +export * from './ISWFTagSymbol'; diff --git a/src/swf/index.ts b/src/swf/index.ts new file mode 100644 index 0000000..da1aa20 --- /dev/null +++ b/src/swf/index.ts @@ -0,0 +1,18 @@ +export * from './common'; +export * from './ConcatSWFHeader'; +export * from './GenerateNitroBundleFromSwf'; +export * from './GenerateSpritesheet'; +export * from './HabboAssetSWF'; +export * from './PackImages'; +export * from './ReadImagesDefineBitsLossless'; +export * from './ReadImagesJPEG3or4'; +export * from './ReadSWF'; +export * from './ReadSWFBuffer'; +export * from './ReadSWFTags'; +export * from './RecognizeImageHeader'; +export * from './SWFBuffer'; +export * from './SWFDownloader'; +export * from './SWFTags'; +export * from './SWFUtilities'; +export * from './tags'; +export * from './UncompressSWF'; diff --git a/src/swf/tags/CharacterTag.ts b/src/swf/tags/CharacterTag.ts index 2f44f53..3f8d35d 100644 --- a/src/swf/tags/CharacterTag.ts +++ b/src/swf/tags/CharacterTag.ts @@ -1,7 +1,11 @@ export abstract class CharacterTag { private _className: string = ''; - private _characterId: number = -1; + + constructor( + protected _characterId: number = 1 + ) + {} public get className(): string { diff --git a/src/swf/tags/ImageTag.ts b/src/swf/tags/ImageTag.ts index 422cec1..b8e09b1 100644 --- a/src/swf/tags/ImageTag.ts +++ b/src/swf/tags/ImageTag.ts @@ -3,27 +3,16 @@ import { ITag } from './ITag'; export class ImageTag extends CharacterTag implements ITag { - private readonly _code: number; - private readonly _characterID: number; - private readonly _imgType: string; - private readonly _imgData: Buffer; - - private readonly _bitmapWidth: number; - private readonly _bitmapHeight: number; - - constructor(image: { code: number, characterID: number, imgType: string, imgData: Buffer, bitmapWidth: number, bitmapHeight: number }) + constructor( + protected _characterId: number, + private _code: number, + private _imgType: string, + private _imgData: Buffer, + private _imgWidth: number = 0, + private _imgHeight: number = 0 + ) { - super(); - - this._code = image.code; - this._characterID = image.characterID; - this._imgType = image.imgType; - this._imgData = image.imgData; - - this.characterId = this._characterID; - - this._bitmapWidth = image.bitmapWidth; - this._bitmapHeight = image.bitmapHeight; + super(_characterId); } public get code(): number @@ -31,11 +20,6 @@ export class ImageTag extends CharacterTag implements ITag return this._code; } - public get characterID(): number - { - return this._characterID; - } - public get imgType(): string { return this._imgType; @@ -46,13 +30,13 @@ export class ImageTag extends CharacterTag implements ITag return this._imgData; } - public get bitmapWidth(): number + public get imgWidth(): number { - return this._bitmapWidth; + return this._imgWidth; } - public get bitmapHeight(): number + public get imgHeight(): number { - return this._bitmapHeight; + return this._imgHeight; } } diff --git a/src/swf/tags/index.ts b/src/swf/tags/index.ts new file mode 100644 index 0000000..9cb05c1 --- /dev/null +++ b/src/swf/tags/index.ts @@ -0,0 +1,6 @@ +export * from './CharacterTag'; +export * from './DefineBinaryDataTag'; +export * from './ImageTag'; +export * from './ISymbolClass'; +export * from './ITag'; +export * from './SymbolClassTag'; diff --git a/src/utils/File.ts b/src/utils/File.ts deleted file mode 100644 index 5ff7c3a..0000000 --- a/src/utils/File.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { existsSync, lstatSync, mkdirSync, readdirSync, RmOptions, rmSync } from 'fs'; - -export class File -{ - private readonly _path: string; - - constructor(path: string) - { - this._path = path; - } - - public exists(): boolean - { - return existsSync(this._path); - } - - public mkdirs(): void - { - return mkdirSync(this._path); - } - - public list(): string[] - { - const test = readdirSync(this._path); - - return test; - } - - public isDirectory(): boolean - { - return this.exists() && lstatSync(this._path).isDirectory(); - } - - public rmdir(options: RmOptions): void - { - return rmSync(this._path, options); - } - - public get path(): string - { - return this._path; - } -} diff --git a/src/utils/Logger.ts b/src/utils/Logger.ts deleted file mode 100644 index b185fe3..0000000 --- a/src/utils/Logger.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { WriteStream } from 'fs'; -import { singleton } from 'tsyringe'; - -@singleton() -export class Logger -{ - private _fileName: string = `error-${ Date.now() }.log`; - private _writeStream: WriteStream = null; - - constructor() - { - - } - - public logError(message: string): void - { - // - } -} diff --git a/src/utils/NitroBundle.ts b/src/utils/NitroBundle.ts deleted file mode 100644 index a81c84d..0000000 --- a/src/utils/NitroBundle.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as ByteBuffer from 'bytebuffer'; -import { promisify } from 'util'; -import * as zlib from 'zlib'; - -const gzip = promisify(zlib.gzip); - -export class NitroBundle -{ - private readonly _files: Map; - - constructor() - { - this._files = new Map(); - } - - addFile(name: string, data: Buffer) - { - this._files.set(name, data); - } - - async toBufferAsync() - { - const buffer = new ByteBuffer(); - - buffer.writeUint16(this._files.size); - - const iterator = this._files.entries(); - let result: IteratorResult<[string, Buffer]> = iterator.next(); - while(!result.done) - { - const fileName = result.value[0]; - const file = result.value[1]; - - buffer.writeUint16(fileName.length); - buffer.writeString(fileName); - - const compressed = await gzip(file); - buffer.writeUint32(compressed.length); - buffer.append(compressed); - - result = iterator.next(); - } - - return buffer.flip().toBuffer(); - } -} diff --git a/src/utils/SwfReader.ts b/src/utils/SwfReader.ts deleted file mode 100644 index 9c1d795..0000000 --- a/src/utils/SwfReader.ts +++ /dev/null @@ -1,311 +0,0 @@ -import {writeFileSync} from "fs"; - -const SWFReader = require('../swf-reader/index.js'); - -const _encoder = require('png-stream/encoder'); - -const _encoder2 = _interopRequireDefault(_encoder); - -const _zlib = require('zlib'); - -const _zlib2 = _interopRequireDefault(_zlib); - -const _streamToArray = require('stream-to-array'); - -const _streamToArray2 = _interopRequireDefault(_streamToArray); - -const _stream = require('stream'); - -const _stream2 = _interopRequireDefault(_stream); - -const _decoder = require('jpg-stream/decoder'); - -const _decoder2 = _interopRequireDefault(_decoder); - -function _interopRequireDefault(obj: any) -{ - return obj && obj.__esModule ? obj : { default: obj }; -} - -const _concatFrames = require('concat-frames'); - -const _concatFrames2 = _interopRequireDefault(_concatFrames); - -const _slicedToArray = function () -{ - function sliceIterator(arr: any, i: any) - { - const _arr = []; - let _n = true; - let _d = false; - let _e = undefined; - try - { - for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) - { - _arr.push(_s.value); - if(i && _arr.length === i) break; - } - } - catch (err) - { - _d = true; - _e = err; - } - finally - { - try - { - if(!_n && _i['return']) _i['return'](); - } - finally - { - if(_d) throw _e; - } - } - return _arr; - } - - return function (arr: any, i: any) - { - if(Array.isArray(arr)) - { - return arr; - } - else if(Symbol.iterator in Object(arr)) - { - return sliceIterator(arr, i); - } - else - { - throw new TypeError('Invalid attempt to destructure non-iterable instance'); - } - }; -}(); - -export function readSwfAsync(data: string | Buffer): Promise -{ - return new Promise(((resolve, reject) => - { - SWFReader.read(data, function (err: Error, swf: any) - { - if(err) - { - reject(err); - } - resolve(swf); - }); - })); -} - -const pngMagic = Buffer.from('0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A'.split(' ').map(Number)); -const gifMagic = Buffer.from('0x47 0x49 0x46 0x38 0x39 0x61'.split(' ').map(Number)); -const jpegMagic = Buffer.from('0xFF 0xD8'.split(' ').map(Number)); -const recognizeHeader = function recognizeHeader(buffer: Buffer) -{ - if(pngMagic.equals(buffer.slice(0, pngMagic.length))) return 'png'; - if(gifMagic.equals(buffer.slice(0, gifMagic.length))) return 'gif'; - if(jpegMagic.equals(buffer.slice(0, jpegMagic.length))) return 'jpeg'; - - throw new Error('unknown format: ' + buffer.slice(0, 8)); -}; - -export async function readImagesJPEG3or4(code: number, tagData: any): Promise -{ - const characterId = tagData.characterId, - imageData = tagData.imageData; - - const imgType = recognizeHeader(imageData); - if(imgType !== 'jpeg') - { - return { - code: code, - characterId: characterId, - imgType: imgType, - imgData: imageData - }; - } - - const bitmapAlphaData = tagData.bitmapAlphaData; - - return new Promise(function (resolve, reject) - { - const enc = new _encoder2.default(undefined, undefined, { colorSpace: 'rgba' }); - _zlib2.default.unzip(bitmapAlphaData, function (err: any, alphaBufPre: any) - { - // INVARIANT: alphaBuf is either null or a non-empty buffer - let alphaBuf: any = null; - if(err) - { - /* - Due to a bug present in node zlib (https://github.com/nodejs/node/issues/17041) - unzipping an empty buffer can raise "unexpected end of file" error. - We fix this here so that our impl does not depend on the version of node - being used. - Theoretically every zlib.unzip call needs to be guarded, but for this package, - other two zlib.unzip call happens at sites that an empty uncompressed Buffer - does not make sense. So I think the current fix is good enough. - */ - if(bitmapAlphaData && bitmapAlphaData.length > 0) - { - return reject(new Error(err)); - } - // leaving alphaBuf as null - } - else - { - // ensure alphaBuf is only assigned an non-empty Buffer - if(alphaBufPre.length > 0) alphaBuf = alphaBufPre; - } - const bufferStream = new _stream2.default.PassThrough(); - bufferStream.end(imageData); - bufferStream.pipe(new _decoder2.default()).pipe((_concatFrames2.default)(function (_ref: any) - { - const _ref2 = _slicedToArray(_ref, 1), - frame = _ref2[0]; - - const input = frame.pixels; - const pCount = frame.width * frame.height; - const output = Buffer.alloc(pCount * 4); - if(alphaBuf !== null && alphaBuf.length !== pCount) - { - console.error('expect alphaBuf to have size ' + pCount + ' while getting ' + alphaBuf.length); - } - const getAlphaBuf = alphaBuf === null ? function (_ignored: any) - { - return 0xff; - } : function (i: any) - { - return alphaBuf[i]; - }; - - for(let i = 0; i < pCount; ++i) - { - output[4 * i] = input[3 * i]; - output[4 * i + 1] = input[3 * i + 1]; - output[4 * i + 2] = input[3 * i + 2]; - output[4 * i + 3] = getAlphaBuf(i); - } - enc.format.width = frame.width; - enc.format.height = frame.height; - enc.end(output); - })); - }); - (_streamToArray2.default)(enc).then(function (parts: any) - { - const buffers = parts.map(function (part: any) - { - return Buffer.isBuffer(part) ? part : Buffer.from(part); - }); - resolve({ - code: code, - characterId: characterId, - imgType: 'png', - imgData: Buffer.concat(buffers) - }); - }); - }); -} - -export interface ImageTagData { - code: number, - characterId: number, - imgType: string, - imgData: Buffer, - bitmapWidth: number, - bitmapHeight: number -} - -export function readImagesDefineBitsLossless(tag: any) -{ - const characterId = tag.characterId, - bitmapFormat = tag.bitmapFormat, - bitmapWidth = tag.bitmapWidth, - bitmapHeight = tag.bitmapHeight, - bitmapColorTableSize = tag.bitmapColorTableSize, - zlibBitmapData = tag.zlibBitmapData; - - - return new Promise(function (resolve, reject) - { - const enc = new _encoder2.default(bitmapWidth, bitmapHeight, { colorSpace: 'rgba' }); - - _zlib2.default.unzip(zlibBitmapData, function (err: any, dataBuf: any) - { - if(err) - { - return reject(new Error(err)); - } - const output = Buffer.alloc(bitmapWidth * bitmapHeight * 4); - let index = 0; - let ptr = 0; - if(bitmapFormat === 5) - { - // 32-bit ARGB image - for(let y = 0; y < bitmapHeight; ++y) - { - for(let x = 0; x < bitmapWidth; ++x) - { - const alpha = dataBuf[ptr]; - output[index] = dataBuf[ptr + 1] * (255 / alpha); - output[index + 1] = dataBuf[ptr + 2] * (255 / alpha); - output[index + 2] = dataBuf[ptr + 3] * (255 / alpha); - output[index + 3] = alpha; - index += 4; - ptr += 4; - } - } - } - else if(bitmapFormat === 3) - { - // 8-bit colormapped image - const colorMap = []; - for(let i = 0; i < bitmapColorTableSize + 1; ++i) - { - colorMap.push([dataBuf[ptr], dataBuf[ptr + 1], dataBuf[ptr + 2], dataBuf[ptr + 3]]); - ptr += 4; - } - for(let _y2 = 0; _y2 < bitmapHeight; ++_y2) - { - for(let _x2 = 0; _x2 < bitmapWidth; ++_x2) - { - const idx = dataBuf[ptr]; - const color = idx < colorMap.length ? colorMap[idx] : [0, 0, 0, 0]; - output[index] = color[0]; - output[index + 1] = color[1]; - output[index + 2] = color[2]; - output[index + 3] = color[3]; - ptr += 1; - index += 4; - } - // skip padding - ptr += (4 - bitmapWidth % 4) % 4; - } - } - else - { - return reject(new Error('unhandled bitmapFormat: ' + bitmapFormat)); - } - enc.end(output); - }); - - (_streamToArray2.default)(enc).then(function (parts: any) - { - const buffers = parts.map(function (part: any) - { - return Buffer.isBuffer(part) ? part : Buffer.from(part); - }); - resolve({ - code: 36, - characterId: characterId, - imgType: 'png', - imgData: Buffer.concat(buffers), - bitmapWidth: bitmapWidth, - bitmapHeight: bitmapHeight - }); - }); - }).catch(function (e) - { - console.error(e); - }); -} diff --git a/tsconfig.json b/tsconfig.json index 5373a57..41b76b2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "declaration": true, + "declaration": false, "noImplicitAny": false, "noUnusedLocals": false, "removeComments": true, @@ -12,12 +12,13 @@ "target": "es6", "sourceMap": false, "allowJs": true, + "esModuleInterop": true, "baseUrl": "./src", "outDir": "./dist" }, "include": [ - "src/configuration.json", - "src/**/*" + "src/**/*", + "node_modules/wrappy/swf" ], "exclude": [ "node_modules", diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..112e7cf --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2120 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/highlight@^7.10.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jvitela/mustache-wax@^1.0.1": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@jvitela/mustache-wax/-/mustache-wax-1.0.4.tgz#18c54e8dc9793e01515674beadf80bd1dfb1dd29" + integrity sha512-cGugVYp0WO7w89KQlyyt2rQyCO5MbrKeqtIAkG8oBfOaiHoeGeKG7WYdBFHftvoZUuK4WFbWyn3hgFipdetC+Q== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@types/bytebuffer@^5.0.42": + version "5.0.42" + resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.42.tgz#1c602a77942d34c5c0879ad75c58d5d8c07dfb3b" + integrity sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw== + dependencies: + "@types/long" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.7": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/long@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/node-fetch@^2.5.8": + version "2.5.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.3.tgz#4b086e316ed4504f49bd78135d48642bf50aa135" + integrity sha512-bAKB1GcA28FR/D8HHQ5U4FYk7nvoZdp7TZSy9oIyQ8gpYCzpeESa3LCK2TbeocXic7GwIXCkCItJg0DttO3ZaQ== + +"@types/node@^14.14.28": + version "14.18.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.2.tgz#00fe4d1686d5f6cf3a2f2e9a0eef42594d06abfc" + integrity sha512-fqtSN5xn/bBzDxMT77C1rJg6CsH/R49E7qsGuvdPJa20HtV5zSTuLJPNfnlyVH3wauKnkHdLggTVkOW/xP9oQg== + +"@types/pako@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/pako/-/pako-1.0.2.tgz#17c9b136877f33d9ecc8e73cd26944f1f6dd39a1" + integrity sha512-8UJl2MjkqqS6ncpLZqRZ5LmGiFBkbYxocD4e4jmBqGvfRG1RS23gKsBQbdtV9O9GvRyjFTiRHRByjSlKCLlmZw== + +"@types/stream-to-array@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@types/stream-to-array/-/stream-to-array-2.3.0.tgz#d151f183748b52f2ec79f3b09696313912f1f753" + integrity sha512-s8Y6/EV1LPn9fDlJKSlD8r+14hWXVDn+wPAGwWRzTUq/4MqdoQNEzQxP6Jq91qvFYxR3OlFAPXcv6ToplnAgFQ== + dependencies: + "@types/node" "*" + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/xml2js@^0.4.8": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.9.tgz#a38267d8c2fe121c96922b12ee3bd89a58a6e20e" + integrity sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^4.15.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== + dependencies: + "@typescript-eslint/experimental-utils" "4.33.0" + "@typescript-eslint/scope-manager" "4.33.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.15.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +amdefine@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-0.1.1.tgz#b5c75c532052dccd6a39c0064c772c8d57a06cd2" + integrity sha1-tcdcUyBS3M1qOcAGTHcsjVegbNI= + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bignumber.js@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" + integrity sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg= + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^0.9.3: + version "0.9.5" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" + integrity sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ= + dependencies: + readable-stream "~1.0.26" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bmp-js@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" + integrity sha1-ZBE+nHzxICs3btYHvzBibr5XsYo= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-crc32@^0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-equal@0.0.1, buffer-equal@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytebuffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" + integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= + dependencies: + long "~3" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" + integrity sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg= + +concat-frames@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/concat-frames/-/concat-frames-1.0.3.tgz#cfe9a816f25c7b75963d99fef2f4aa0458fbf99b" + integrity sha1-z+moFvJce3WWPZn+8vSqBFj7+Zs= + dependencies: + pixel-stream "^1.0.3" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" + integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= + dependencies: + xtend "^4.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.20.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exif-parser@^0.1.9: + version "0.1.12" + resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= + +exif-reader@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/exif-reader/-/exif-reader-1.0.3.tgz#8eb63f878aeb49ec89bd5b7be10e393db78c3c2e" + integrity sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA== + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-type@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +free-tex-packer-core@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/free-tex-packer-core/-/free-tex-packer-core-0.3.4.tgz#f6c28e5a6daa7297dd8259256821695cebd4a1de" + integrity sha512-GRitycJ2wbqf6Bzj6W3TyFFEcV2MTBSGUDBGfXORfCXtuljScp9E7dx79ZzvHdZv48MKWf+S7u9qk8E2NIQhIQ== + dependencies: + "@jvitela/mustache-wax" "^1.0.1" + jimp "^0.2.28" + maxrects-packer "^2.5.0" + mustache "^2.3.0" + tinify "^1.5.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + 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" + +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4, ignore@^5.1.8: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jimp@^0.2.28: + version "0.2.28" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" + integrity sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI= + dependencies: + bignumber.js "^2.1.0" + bmp-js "0.0.3" + es6-promise "^3.0.2" + exif-parser "^0.1.9" + file-type "^3.1.0" + jpeg-js "^0.2.0" + load-bmfont "^1.2.3" + mime "^1.3.4" + mkdirp "0.5.1" + pixelmatch "^4.0.0" + pngjs "^3.0.0" + read-chunk "^1.0.1" + request "^2.65.0" + stream-to-buffer "^0.1.0" + tinycolor2 "^1.1.2" + url-regex "^3.0.0" + +jpeg-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" + integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII= + +jpg-stream@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/jpg-stream/-/jpg-stream-1.1.2.tgz#4dba159d9d19368df21318f648cee980a72be407" + integrity sha1-TboVnZ0ZNo3yExj2SM7pgKcr5Ac= + dependencies: + exif-reader "^1.0.0" + pixel-stream "^1.0.3" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +load-bmfont@^1.2.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" + integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + phin "^2.9.1" + xhr "^2.0.1" + xtend "^4.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +long@~3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lzma-purejs@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/lzma-purejs/-/lzma-purejs-0.9.3.tgz#c8917e894b1b4db5c865b927df864edde759ccde" + integrity sha1-yJF+iUsbTbXIZbkn34ZO3edZzN4= + dependencies: + amdefine "~0.1.0" + commander "~2.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +maxrects-packer@^2.5.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/maxrects-packer/-/maxrects-packer-2.7.2.tgz#47405e62353af117bab24874896839ec4f4e48db" + integrity sha512-akd5IRLPqQeWlpJyRJyfYq86VB05zzbMIdyTgLxRk4z1H0A8g4oTJW31Yo6zO9piSRsFNYdzmgudW7J2g1gEhQ== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@^1.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mustache@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" + integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +node-fetch@^2.6.1: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== + dependencies: + whatwg-url "^5.0.0" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +pako@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= + +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= + +parse-bmfont-xml@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" + integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== + dependencies: + xml-parse-from-string "^1.0.0" + xml2js "^0.4.5" + +parse-headers@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.4.tgz#9eaf2d02bed2d1eff494331ce3df36d7924760bf" + integrity sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +phin@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" + integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pixel-stream@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pixel-stream/-/pixel-stream-1.0.3.tgz#53e8c54b21d5508393b53bcb32b64a7755f1fa5e" + integrity sha1-U+jFSyHVUIOTtTvLMrZKd1Xx+l4= + dependencies: + shallow-copy "0.0.1" + +pixelmatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= + dependencies: + pngjs "^3.0.0" + +png-stream@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/png-stream/-/png-stream-1.0.5.tgz#5bc71687ea8959427e950e52c7cca49e2a6f04c6" + integrity sha1-W8cWh+qJWUJ+lQ5Sx8yknipvBMY= + dependencies: + bl "^0.9.3" + buffer-crc32 "^0.2.3" + buffer-equal "^0.0.1" + pixel-stream "^1.0.3" + +pngjs@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +"promise-nodeify@>= 0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/promise-nodeify/-/promise-nodeify-3.0.1.tgz#f0f5d9720ee9ec71dd2bfa92667be504c10229c2" + integrity sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg== + +"proxying-agent@>= 2.1": + version "2.4.0" + resolved "https://registry.yarnpkg.com/proxying-agent/-/proxying-agent-2.4.0.tgz#6796549fc46bf3423554440f64a4449220f9014d" + integrity sha512-b9vDqIcViJZVsWPpQlp9Py74u+Wqd0a+kMkkg7zX58mwNtrNbOChNlRTM7lUrlpiwNzyJCV8+5D8rnZYLDFh7Q== + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +read-chunk@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" + integrity sha1-X2jKswfmY/GZk1J9m1icrORmEZQ= + +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.0.26: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +request@^2.65.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + 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.3" + 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.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.0.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver@^7.2.1, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +shallow-copy@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-map-support@^0.5.12, source-map-support@^0.5.17: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + 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" + +stream-to-array@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" + integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M= + dependencies: + any-promise "^1.1.0" + +stream-to-buffer@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" + integrity sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk= + dependencies: + stream-to "~0.2.0" + +stream-to@~0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" + integrity sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0= + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^6.0.9: + version "6.7.5" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.5.tgz#f04478c351ef3d8c7904f0e8be90a1b62417d238" + integrity sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +tinify@^1.5.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/tinify/-/tinify-1.6.1.tgz#b27a032c447ebddd4231007489069a434ef72b5e" + integrity sha512-9XITdFE+p3+W/7HDgDEfxETbAh0vDdul33qo81P0Q+TNR8l6TALDb52MMhs7fWz7i4Pp3y1VdVYEy4EyiF4gUw== + dependencies: + promise-nodeify ">= 0.1" + proxying-agent ">= 2.1" + +tinycolor2@^1.1.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" + integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-node-dev@^1.1.1: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.1.8.tgz#95520d8ab9d45fffa854d6668e2f8f9286241066" + integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.5" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^9.0.0" + tsconfig "^7.0.0" + +ts-node@^9.0.0, ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tsyringe@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.6.0.tgz#14915d3d7f0db35e1cf7269bdbf7c440713c8d07" + integrity sha512-BMQAZamSfEmIQzH8WJeRu1yZGQbPSDuI9g+yEiKZFIcO46GPZuMOC2d0b52cVBdw1d++06JnDSIIZvEnogMdAw== + dependencies: + tslib "^1.9.3" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@^4.1.5: + version "4.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" + integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-regex@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + integrity sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ= + dependencies: + ip-regex "^1.0.1" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xhr@^2.0.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= + +xml2js@^0.4.23, xml2js@^0.4.5: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==