diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 4c61ae6..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,139 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-lerna-debug.log*
-.pnpm-debug.log*
-
-# Diagnostic reports (https://nodejs.org/api/report.html)
-report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
-
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-*.lcov
-
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (https://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directories
-node_modules/
-jspm_packages/
-
-# Snowpack dependency directory (https://snowpack.dev/)
-web_modules/
-
-# TypeScript cache
-*.tsbuildinfo
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# Optional stylelint cache
-.stylelintcache
-
-# Microbundle cache
-.rpt2_cache/
-.rts2_cache_cjs/
-.rts2_cache_es/
-.rts2_cache_umd/
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-
-# Yarn Integrity file
-.yarn-integrity
-
-# dotenv environment variable files
-.env
-.env.development.local
-.env.test.local
-.env.production.local
-.env.local
-
-# parcel-bundler cache (https://parceljs.org/)
-.cache
-.parcel-cache
-
-# Next.js build output
-.next
-out
-
-# Nuxt.js build / generate output
-.nuxt
-dist
-
-# Gatsby files
-.cache/
-# Comment in the public line in if your project uses Gatsby and not Next.js
-# https://nextjs.org/blog/next-9-1#public-directory-support
-# public
-
-# vuepress build output
-.vuepress/dist
-
-# vuepress v2.x temp and cache directory
-.temp
-.cache
-
-# vitepress build output
-**/.vitepress/dist
-
-# vitepress cache directory
-**/.vitepress/cache
-
-# Docusaurus cache and generated files
-.docusaurus
-
-# Serverless directories
-.serverless/
-
-# FuseBox cache
-.fusebox/
-
-# DynamoDB Local files
-.dynamodb/
-
-# TernJS port file
-.tern-port
-
-# Stores VSCode versions used for testing VSCode extensions
-.vscode-test
-
-# yarn v2
-.yarn/cache
-.yarn/unplugged
-.yarn/build-state.yml
-.yarn/install-state.gz
-.pnp.*
-
-# pm2 ecosystem file
-ecosystem.config.js
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index f288702..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- 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
deleted file mode 100644
index 83a5f88..0000000
--- a/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# blahaj-srv
-scripts for blahaj.tr
-
-TODO: use anything other than pm2
diff --git a/api/exchange-rate/exchange-rate.js b/api/exchange-rate/exchange-rate.js
deleted file mode 100644
index 68fe455..0000000
--- a/api/exchange-rate/exchange-rate.js
+++ /dev/null
@@ -1,351 +0,0 @@
-const express = require('express');
-const axios = require('axios');
-const fs = require('fs');
-const path = require('path');
-const router = express.Router();
-
-// Get API key from environment variables
-const API_KEY = process.env.EXCHANGE_RATE_API_KEY;
-if (!API_KEY) {
- console.error('WARNING: EXCHANGE_RATE_API_KEY environment variable is not set!');
- console.error('Exchange rate functionality will not work correctly.');
-}
-
-const BASE_URL = 'https://v6.exchangerate-api.com/v6';
-
-// We'll use USD as our single base currency
-const BASE_CURRENCY = 'USD';
-
-// Path to the cache file
-const CACHE_FILE_PATH = path.join(__dirname, 'exchange-rates-cache.json');
-
-// In-memory storage for cached exchange rates
-let exchangeRatesCache = {
- USD: {
- lastUpdated: null,
- rates: {},
- nextUpdateTime: null
- }
-};
-
-// one day in milliseconds
-const UPDATE_INTERVAL = 1 * 24 * 60 * 60 * 1000;
-
-// Load cached exchange rates from file
-function loadCachedRates() {
- try {
- if (fs.existsSync(CACHE_FILE_PATH)) {
- const data = fs.readFileSync(CACHE_FILE_PATH, 'utf8');
- const parsedData = JSON.parse(data);
-
- // Convert string dates back to Date objects
- if (parsedData.USD) {
- if (parsedData.USD.lastUpdated) {
- parsedData.USD.lastUpdated = new Date(parsedData.USD.lastUpdated);
- }
- if (parsedData.USD.nextUpdateTime) {
- parsedData.USD.nextUpdateTime = new Date(parsedData.USD.nextUpdateTime);
- }
- }
-
- exchangeRatesCache = parsedData;
- console.log('Loaded exchange rates from cache file');
- } else {
- console.log('No cache file found, will create one when rates are fetched');
- }
- } catch (error) {
- console.error('Error loading cached exchange rates:', error.message);
- // Continue with default cache if file can't be loaded
- }
-}
-
-// Save exchange rates to cache file
-function saveCachedRates() {
- try {
- fs.writeFileSync(CACHE_FILE_PATH, JSON.stringify(exchangeRatesCache, null, 2));
- console.log('Exchange rates saved to cache file');
- } catch (error) {
- console.error('Error saving exchange rates to cache file:', error.message);
- }
-}
-
-// Function to fetch and update exchange rates using USD as base
-async function updateExchangeRates() {
- if (!API_KEY) {
- console.error('Cannot update exchange rates: API key is not set');
- return false;
- }
-
- try {
- console.log(`Fetching latest exchange rates using ${BASE_CURRENCY} as base...`);
- const response = await axios.get(`${BASE_URL}/${API_KEY}/latest/${BASE_CURRENCY}`);
-
- if (response.data && response.data.result === 'success') {
- exchangeRatesCache.USD = {
- lastUpdated: new Date(),
- rates: response.data.conversion_rates,
- nextUpdateTime: new Date(Date.now() + UPDATE_INTERVAL)
- };
-
- // Save to file after updating
- saveCachedRates();
-
- console.log('Exchange rates updated successfully');
- return true;
- }
- return false;
- } catch (error) {
- console.error('Failed to update exchange rates:', error.message);
- return false;
- }
-}
-
-// Check if rates need updating and update if necessary
-async function ensureRatesUpdated() {
- if (!exchangeRatesCache.USD.lastUpdated ||
- Date.now() > exchangeRatesCache.USD.nextUpdateTime.getTime()) {
- return await updateExchangeRates();
- }
- console.log(`Using cached rates, next update: ${exchangeRatesCache.USD.nextUpdateTime}`);
- return true;
-}
-
-// Calculate conversion rate between any two currencies using USD as base
-function calculateRate(from, to) {
- const rates = exchangeRatesCache.USD.rates;
-
- // If either currency is USD, we can use the rate directly
- if (from === 'USD') return rates[to];
- if (to === 'USD') return 1 / rates[from];
-
- // Otherwise, calculate cross rate: from -> USD -> to
- return rates[to] / rates[from];
-}
-
-// Load cached rates when the module is loaded
-loadCachedRates();
-
-// Initialize rates if needed
-ensureRatesUpdated();
-
-// Root endpoint
-router.get('/', (req, res) => {
- const availableCurrencies = exchangeRatesCache.USD.rates ?
- Object.keys(exchangeRatesCache.USD.rates) : [];
-
- res.json({
- message: 'Exchange Rate API is running',
- baseCurrency: BASE_CURRENCY,
- availableCurrencies,
- lastUpdated: exchangeRatesCache.USD.lastUpdated,
- nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
- updateInterval: '1 day',
- endpoints: {
- latest: '/latest',
- convert: '/convert/:from/:to/:amount',
- currencies: '/currencies'
- }
- });
-});
-
-// Get all cached exchange rates
-router.get('/latest', async (req, res) => {
- await ensureRatesUpdated();
-
- if (!exchangeRatesCache.USD.rates) {
- return res.status(503).json({ error: 'Exchange rate data not yet available' });
- }
-
- res.json({
- result: 'success',
- base: BASE_CURRENCY,
- lastUpdated: exchangeRatesCache.USD.lastUpdated,
- nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
- rates: exchangeRatesCache.USD.rates
- });
-});
-
-// Get rates for a specific currency as base
-router.get('/latest/:currency', async (req, res) => {
- const { currency } = req.params;
- const currencyCode = currency.toUpperCase();
-
- await ensureRatesUpdated();
-
- if (!exchangeRatesCache.USD.rates) {
- return res.status(503).json({ error: 'Exchange rate data not yet available' });
- }
-
- // Check if the currency is supported
- if (!exchangeRatesCache.USD.rates[currencyCode] && currencyCode !== 'USD') {
- return res.status(400).json({ error: `Currency '${currencyCode}' not supported` });
- }
-
- // Calculate rates with the requested currency as base
- const rates = {};
- const usdRates = exchangeRatesCache.USD.rates;
-
- // If the requested base is USD, return rates directly
- if (currencyCode === 'USD') {
- res.json({
- result: 'success',
- base: currencyCode,
- lastUpdated: exchangeRatesCache.USD.lastUpdated,
- nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
- rates: usdRates
- });
- return;
- }
-
- // Otherwise, calculate rates for all currencies with the requested currency as base
- const baseRate = usdRates[currencyCode]; // Rate of 1 USD in the requested currency
-
- // Add USD rate
- rates['USD'] = 1 / baseRate;
-
- // Add rates for all other currencies
- for (const toCurrency in usdRates) {
- if (toCurrency !== currencyCode) {
- // Convert through USD: from -> USD -> to
- rates[toCurrency] = usdRates[toCurrency] / baseRate;
- }
- }
-
- // Add rate for the base currency itself
- rates[currencyCode] = 1;
-
- res.json({
- result: 'success',
- base: currencyCode,
- lastUpdated: exchangeRatesCache.USD.lastUpdated,
- nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
- rates: rates
- });
-});
-
-// Get list of available currencies
-router.get('/currencies', async (req, res) => {
- await ensureRatesUpdated();
-
- const availableCurrencies = exchangeRatesCache.USD.rates ?
- Object.keys(exchangeRatesCache.USD.rates) : [];
-
- res.json({
- result: 'success',
- baseCurrency: BASE_CURRENCY,
- availableCurrencies,
- lastUpdated: exchangeRatesCache.USD.lastUpdated,
- nextUpdate: exchangeRatesCache.USD.nextUpdateTime
- });
-});
-
-// Convert between currencies using cached rates
-router.get('/convert/:from/:to/:amount', async (req, res) => {
- const { from, to, amount } = req.params;
- const fromCurrency = from.toUpperCase();
- const toCurrency = to.toUpperCase();
-
- await ensureRatesUpdated();
-
- if (!exchangeRatesCache.USD.rates) {
- return res.status(503).json({ error: 'Exchange rate data not yet available' });
- }
-
- // Check if currencies are supported
- if (fromCurrency !== 'USD' && !exchangeRatesCache.USD.rates[fromCurrency]) {
- return res.status(400).json({ error: `Currency '${fromCurrency}' not supported` });
- }
-
- if (toCurrency !== 'USD' && !exchangeRatesCache.USD.rates[toCurrency]) {
- return res.status(400).json({ error: `Currency '${toCurrency}' not supported` });
- }
-
- try {
- const numericAmount = parseFloat(amount);
-
- if (isNaN(numericAmount)) {
- return res.status(400).json({ error: 'Invalid amount' });
- }
-
- // Calculate conversion rate
- const rate = calculateRate(fromCurrency, toCurrency);
- const convertedAmount = numericAmount * rate;
-
- res.json({
- result: 'success',
- from: fromCurrency,
- to: toCurrency,
- amount: numericAmount,
- rate,
- convertedAmount: parseFloat(convertedAmount.toFixed(4)),
- lastUpdated: exchangeRatesCache.USD.lastUpdated,
- nextUpdate: exchangeRatesCache.USD.nextUpdateTime
- });
- } catch (error) {
- console.error('Conversion error:', error);
- res.status(500).json({ error: 'Failed to convert currency' });
- }
-});
-
-// Direct pair conversion (fallback to API if needed)
-router.get('/pair/:from/:to/:amount', async (req, res) => {
- const { from, to, amount } = req.params;
- const fromCurrency = from.toUpperCase();
- const toCurrency = to.toUpperCase();
-
- // First try to use our cached rates
- await ensureRatesUpdated();
-
- if (exchangeRatesCache.USD.rates &&
- (fromCurrency === 'USD' || exchangeRatesCache.USD.rates[fromCurrency]) &&
- (toCurrency === 'USD' || exchangeRatesCache.USD.rates[toCurrency])) {
-
- try {
- const numericAmount = parseFloat(amount);
-
- if (isNaN(numericAmount)) {
- return res.status(400).json({ error: 'Invalid amount' });
- }
-
- // Calculate conversion rate
- const rate = calculateRate(fromCurrency, toCurrency);
- const convertedAmount = numericAmount * rate;
-
- res.json({
- result: 'success',
- from: fromCurrency,
- to: toCurrency,
- amount: numericAmount,
- rate,
- convertedAmount: parseFloat(convertedAmount.toFixed(4)),
- lastUpdated: exchangeRatesCache.USD.lastUpdated,
- source: 'cache'
- });
- return;
- } catch (error) {
- console.error('Error using cached rates:', error);
- // Fall through to API call
- }
- }
-
- // If we can't use cached rates, call the API directly
- if (!API_KEY) {
- return res.status(503).json({ error: 'Exchange rate API key is not configured' });
- }
-
- try {
- const response = await axios.get(`${BASE_URL}/${API_KEY}/pair/${fromCurrency}/${toCurrency}/${amount}`);
-
- // Update our cache with the latest USD rates if it's time
- ensureRatesUpdated();
-
- res.json({
- ...response.data,
- source: 'api'
- });
- } catch (error) {
- res.status(500).json({ error: 'Failed to convert currency' });
- }
-});
-
-module.exports = router;
diff --git a/api/exchange-rate/exchange-rates-cache.json b/api/exchange-rate/exchange-rates-cache.json
deleted file mode 100644
index 5283db3..0000000
--- a/api/exchange-rate/exchange-rates-cache.json
+++ /dev/null
@@ -1,171 +0,0 @@
-{
- "USD": {
- "lastUpdated": "2025-04-07T19:30:40.700Z",
- "rates": {
- "USD": 1,
- "AED": 3.6725,
- "AFN": 71.3562,
- "ALL": 90.1377,
- "AMD": 391.1786,
- "ANG": 1.79,
- "AOA": 918.5748,
- "ARS": 1075.88,
- "AUD": 1.662,
- "AWG": 1.79,
- "AZN": 1.6999,
- "BAM": 1.7805,
- "BBD": 2,
- "BDT": 121.3674,
- "BGN": 1.7804,
- "BHD": 0.376,
- "BIF": 2960.3407,
- "BMD": 1,
- "BND": 1.3404,
- "BOB": 6.8885,
- "BRL": 5.7194,
- "BSD": 1,
- "BTN": 85.5708,
- "BWP": 13.8733,
- "BYN": 3.1354,
- "BZD": 2,
- "CAD": 1.423,
- "CDF": 2899.0345,
- "CHF": 0.8524,
- "CLP": 960.6602,
- "CNY": 7.2857,
- "COP": 4203.747,
- "CRC": 502.4294,
- "CUP": 24,
- "CVE": 100.3829,
- "CZK": 22.9524,
- "DJF": 177.721,
- "DKK": 6.7905,
- "DOP": 62.8304,
- "DZD": 132.995,
- "EGP": 50.8068,
- "ERN": 15,
- "ETB": 131.8684,
- "EUR": 0.9102,
- "FJD": 2.3154,
- "FKP": 0.7757,
- "FOK": 6.7935,
- "GBP": 0.7751,
- "GEL": 2.7559,
- "GGP": 0.7757,
- "GHS": 15.5067,
- "GIP": 0.7757,
- "GMD": 72.6441,
- "GNF": 8570.968,
- "GTQ": 7.6902,
- "GYD": 209.8017,
- "HKD": 7.7734,
- "HNL": 25.5147,
- "HRK": 6.8592,
- "HTG": 130.7844,
- "HUF": 369.6088,
- "IDR": 16757.5574,
- "ILS": 3.7448,
- "IMP": 0.7757,
- "INR": 85.5703,
- "IQD": 1309.7144,
- "IRR": 42008.9149,
- "ISK": 131.125,
- "JEP": 0.7757,
- "JMD": 157.719,
- "JOD": 0.709,
- "JPY": 145.2473,
- "KES": 129.2338,
- "KGS": 86.8492,
- "KHR": 3997.3556,
- "KID": 1.6621,
- "KMF": 447.8769,
- "KRW": 1457.9608,
- "KWD": 0.307,
- "KYD": 0.8333,
- "KZT": 510.3326,
- "LAK": 21751.6772,
- "LBP": 89500,
- "LKR": 295.3817,
- "LRD": 199.3433,
- "LSL": 19.1915,
- "LYD": 4.8358,
- "MAD": 9.5166,
- "MDL": 17.6443,
- "MGA": 4654.3433,
- "MKD": 55.9208,
- "MMK": 2090.2388,
- "MNT": 3479.6583,
- "MOP": 8.0068,
- "MRU": 39.8843,
- "MUR": 44.5309,
- "MVR": 15.4592,
- "MWK": 1740.2553,
- "MXN": 20.5515,
- "MYR": 4.437,
- "MZN": 63.6781,
- "NAD": 19.1915,
- "NGN": 1529.0612,
- "NIO": 36.6793,
- "NOK": 10.7699,
- "NPR": 136.9132,
- "NZD": 1.7956,
- "OMR": 0.3845,
- "PAB": 1,
- "PEN": 3.6809,
- "PGK": 4.0959,
- "PHP": 57.3644,
- "PKR": 280.7358,
- "PLN": 3.8787,
- "PYG": 8001.2022,
- "QAR": 3.64,
- "RON": 4.5185,
- "RSD": 106.3911,
- "RUB": 84.4536,
- "RWF": 1422.8596,
- "SAR": 3.75,
- "SBD": 8.3385,
- "SCR": 14.8196,
- "SDG": 458.3047,
- "SEK": 10.0072,
- "SGD": 1.3405,
- "SHP": 0.7757,
- "SLE": 22.7181,
- "SLL": 22718.051,
- "SOS": 571.0444,
- "SRD": 36.8241,
- "SSP": 4519.748,
- "STN": 22.3043,
- "SYP": 12873.9497,
- "SZL": 19.1915,
- "THB": 34.3823,
- "TJS": 10.9221,
- "TMT": 3.4983,
- "TND": 3.0571,
- "TOP": 2.3833,
- "TRY": 38.0295,
- "TTD": 6.7342,
- "TVD": 1.6621,
- "TWD": 33.1309,
- "TZS": 2647.2453,
- "UAH": 41.1747,
- "UGX": 3662.2001,
- "UYU": 42.042,
- "UZS": 12937.493,
- "VES": 72.1856,
- "VND": 25642.7185,
- "VUV": 121.865,
- "WST": 2.8015,
- "XAF": 597.1692,
- "XCD": 2.7,
- "XCG": 1.79,
- "XDR": 0.751,
- "XOF": 597.1692,
- "XPF": 108.6373,
- "YER": 244.8828,
- "ZAR": 19.2142,
- "ZMW": 27.9801,
- "ZWL": 6.7864
- },
- "nextUpdateTime": "2025-04-08T19:30:40.700Z"
- }
-}
\ No newline at end of file
diff --git a/api/server.js b/api/server.js
deleted file mode 100644
index 6437f76..0000000
--- a/api/server.js
+++ /dev/null
@@ -1,48 +0,0 @@
-const express = require("express");
-const cors = require("cors");
-const fs = require("fs");
-const https = require("https");
-const http = require("http");
-const path = require("path");
-// load environment variables from .env file
-require('dotenv').config({ path: path.join(__dirname, '../.env') });
-
-const status = require("./status/status");
-const exchangeRate = require("./exchange-rate/exchange-rate");
-const whois = require("./whois/whois");
-
-const app = express();
-const PORT = process.env.PORT || 2589;
-
-const key = process.env.SSL_KEY_PATH || "/etc/letsencrypt/live/blahaj.tr/privkey.pem";
-const cert = process.env.SSL_CERT_PATH || "/etc/letsencrypt/live/blahaj.tr/fullchain.pem";
-
-app.use(cors());
-app.use("/status", status);
-app.use("/exchange-rate", exchangeRate);
-app.use("/whois", whois);
-
-// try to load certificates
-try {
- const sslOptions = {
- key: fs.readFileSync(key),
- cert: fs.readFileSync(cert),
- };
-
- https.createServer(sslOptions, app).listen(PORT, () => {
- console.log(`API running at https://localhost:${PORT}`);
- });
-} catch (e) {
- if (e.code === 'ENOENT') {
- console.warn(`SSL certificate file(s) not found: ${e.path}`);
- } else {
- console.warn(`Error loading SSL certificates: ${e.message}`);
- }
-
- console.log("Starting server without SSL...");
-
- // start http server as fallback
- http.createServer(app).listen(PORT, () => {
- console.log(`API running at http://localhost:${PORT}`);
- });
-}
diff --git a/api/status/status.js b/api/status/status.js
deleted file mode 100644
index 6f4662c..0000000
--- a/api/status/status.js
+++ /dev/null
@@ -1,136 +0,0 @@
-
-const express = require("express");
-const ping = require("ping");
-const pm2 = require("pm2");
-
-const router = express.Router();
-
-const REMOTE_SERVERS = [
- { name: "blahaj.tr", host: "blahaj.tr" },
- { name: "xargana.com", host: "xargana.com" },
- { name: "home server", host: "31.223.36.208" }
-];
-
-const CHECK_INTERVAL = 5 * 1000;
-
-let serversStatus = {};
-REMOTE_SERVERS.forEach(server => {
- serversStatus[server.name] = {
- online: false,
- lastChecked: null,
- responseTime: null,
- };
-});
-
-// Add PM2 services status object
-let pm2ServicesStatus = {};
-
-async function checkServers() {
- try {
- for (const server of REMOTE_SERVERS) {
- try {
- const res = await ping.promise.probe(server.host, {
- timeout: 4, // Set a timeout of 4 seconds
- });
- serversStatus[server.name].online = res.alive;
- serversStatus[server.name].responseTime = res.time;
- } catch (error) {
- console.error(`Error pinging ${server.host}:`, error);
- serversStatus[server.name].online = false;
- serversStatus[server.name].responseTime = null;
- }
- serversStatus[server.name].lastChecked = new Date().toISOString();
- }
- } catch (error) {
- console.error("Error in checkServers function:", error);
- }
-}
-
-async function checkPM2Services() {
- return new Promise((resolve, reject) => {
- pm2.connect(function(err) {
- if (err) {
- console.error('Error connecting to PM2:', err);
- pm2.disconnect();
- resolve();
- return;
- }
-
- pm2.list((err, list) => {
- if (err) {
- console.error('Error getting PM2 process list:', err);
- pm2.disconnect();
- resolve();
- return;
- }
-
- // Update PM2 services status
- list.forEach(process => {
- // Calculate uptime correctly - pm_uptime is a timestamp, not a duration
- const uptimeMs = process.pm2_env.pm_uptime ?
- Date.now() - process.pm2_env.pm_uptime :
- null;
-
- pm2ServicesStatus[process.name] = {
- name: process.name,
- id: process.pm_id,
- status: process.pm2_env.status,
- cpu: process.monit ? process.monit.cpu : null,
- memory: process.monit ? process.monit.memory : null,
- uptime: uptimeMs, // Store the uptime in milliseconds
- restarts: process.pm2_env.restart_time,
- lastChecked: new Date().toISOString()
- };
- });
-
- pm2.disconnect();
- resolve();
- });
- });
- });
-}
-
-async function checkAll() {
- try {
- await checkServers();
- await checkPM2Services();
- } catch (error) {
- console.error("Error in checkAll function:", error);
- }
-}
-
-// Initial check with error handling
-try {
- checkAll();
-} catch (error) {
- console.error("Error during initial check:", error);
-}
-
-// Set interval with error handling
-setInterval(() => {
- try {
- checkAll();
- } catch (error) {
- console.error("Error during scheduled check:", error);
- }
-}, CHECK_INTERVAL);
-
-// Route with error handling
-router.get("/", (req, res) => {
- try {
- res.json({
- servers: serversStatus,
- pm2Services: pm2ServicesStatus
- });
- } catch (error) {
- console.error("Error sending status response:", error);
- res.status(500).json({ error: "Internal server error" });
- }
-});
-
-// Add a simple health check endpoint
-router.get("/health", (req, res) => {
- res.status(200).send("OK");
-});
-
-module.exports = router;
diff --git a/api/whois/whois.js b/api/whois/whois.js
deleted file mode 100644
index b7165c4..0000000
--- a/api/whois/whois.js
+++ /dev/null
@@ -1,69 +0,0 @@
-const express = require('express');
-const whois = require('whois-json');
-const router = express.Router();
-
-// GET endpoint for WHOIS lookup
-router.get('/:domain', async (req, res) => {
- try {
- const domain = req.params.domain;
-
- if (!domain) {
- return res.status(400).json({ error: 'Domain parameter is required' });
- }
-
- const result = await whois(domain);
-
- // Format the response in a clean structure
- const whoisData = {
- domain: domain,
- registrar: result.registrar || "Not available",
- creationDate: result.creationDate ? new Date(result.creationDate).toISOString() : "Not available",
- expirationDate: result.expirationDate ? new Date(result.expirationDate).toISOString() : "Not available",
- nameServers: Array.isArray(result.nameServers) ? result.nameServers : (result.nameServers ? [result.nameServers] : ["Not available"]),
- status: Array.isArray(result.status) ? result.status : (result.status ? [result.status] : ["Not available"]),
- raw: result // Include the full raw data for advanced usage
- };
-
- res.json(whoisData);
- } catch (error) {
- console.error('WHOIS API Error:', error);
- res.status(500).json({
- error: 'Failed to fetch WHOIS information',
- message: error.message
- });
- }
-});
-
-// POST endpoint for WHOIS lookup (alternative to GET with request body)
-router.post('/', async (req, res) => {
- try {
- const domain = req.body.domain;
-
- if (!domain) {
- return res.status(400).json({ error: 'Domain parameter is required in request body' });
- }
-
- const result = await whois(domain);
-
- // Format the response in a clean structure
- const whoisData = {
- domain: domain,
- registrar: result.registrar || "Not available",
- creationDate: result.creationDate ? new Date(result.creationDate).toISOString() : "Not available",
- expirationDate: result.expirationDate ? new Date(result.expirationDate).toISOString() : "Not available",
- nameServers: Array.isArray(result.nameServers) ? result.nameServers : (result.nameServers ? [result.nameServers] : ["Not available"]),
- status: Array.isArray(result.status) ? result.status : (result.status ? [result.status] : ["Not available"]),
- raw: result // Include the full raw data for advanced usage
- };
-
- res.json(whoisData);
- } catch (error) {
- console.error('WHOIS API Error:', error);
- res.status(500).json({
- error: 'Failed to fetch WHOIS information',
- message: error.message
- });
- }
-});
-
-module.exports = router;
diff --git a/discord/classes/Bot.js b/discord/classes/Bot.js
deleted file mode 100644
index c0f212e..0000000
--- a/discord/classes/Bot.js
+++ /dev/null
@@ -1,219 +0,0 @@
-const { Client, GatewayIntentBits, ChannelType } = require("discord.js");
-const CommandManager = require('./CommandManager');
-const NotificationService = require('./NotificationService');
-const fs = require('fs');
-const path = require('path');
-
-class Bot {
- constructor() {
- // Initialize client with minimal required intents
- this.client = new Client({
- intents: [
- GatewayIntentBits.Guilds,
- GatewayIntentBits.DirectMessages,
- GatewayIntentBits.MessageContent,
- GatewayIntentBits.DirectMessageReactions,
- GatewayIntentBits.DirectMessageTyping
- ],
- partials: ['CHANNEL', 'MESSAGE']
- });
-
- // Add reference to this bot instance on the client for access from commands
- this.client.bot = this;
-
- // THIS IS IMPORTANT: Make sure CommandManager is initialized AFTER the client
- this.commandManager = new CommandManager(this.client);
-
- // Authorized users for commands - Parse comma-separated list from env variable
- this.authorizedUserIds = process.env.AUTHORIZED_USER_IDS
- ? process.env.AUTHORIZED_USER_IDS.split(',').map(id => id.trim())
- : [];
-
- // For backward compatibility, add the old env var if it exists
- if (process.env.AUTHORIZED_USER_ID && !this.authorizedUserIds.includes(process.env.AUTHORIZED_USER_ID)) {
- this.authorizedUserIds.push(process.env.AUTHORIZED_USER_ID);
- }
-
- // Parse notification recipient IDs (separate from command authorization)
- this.notificationRecipientIds = process.env.NOTIFICATION_USER_IDS ?
- process.env.NOTIFICATION_USER_IDS.split(',').map(id => id.trim()) :
- this.authorizedUserIds; // Default to authorized users if not specified
-
- console.log(`Authorized users configured: ${this.authorizedUserIds.length}`);
- console.log(`Notification recipients configured: ${this.notificationRecipientIds.length}`);
-
- // Setup temp directory
- this.setupTempDirectory();
-
- // Setup event handlers
- this.setupEventHandlers();
-
- // Initialize notification service
- this.notificationService = null;
- }
-
- setupTempDirectory() {
- const tempDir = path.join(__dirname, '../../temp');
- if (fs.existsSync(tempDir)) {
- console.log("Cleaning up temp directory...");
- const files = fs.readdirSync(tempDir);
- for (const file of files) {
- fs.unlinkSync(path.join(tempDir, file));
- }
- } else {
- fs.mkdirSync(tempDir, { recursive: true });
- }
- }
-
- setupEventHandlers() {
- // Ready event
- this.client.once("ready", async () => {
- console.log(`Logged in as ${this.client.user.tag}`);
-
- // Only register global commands for direct messages
- await this.commandManager.registerGlobalCommands();
-
- // Send startup notification
- await this.sendStartupNotification();
- });
-
- // Interaction event
- this.client.on("interactionCreate", async (interaction) => {
- // Only process commands if the user is authorized
- if (!this.authorizedUserIds.includes(interaction.user.id)) {
- console.log(`Unauthorized access attempt by ${interaction.user.tag} (${interaction.user.id})`);
- await interaction.reply({
- content: "You are not authorized to use this bot.",
- ephemeral: true
- });
- return;
- }
-
- console.log(`Authorized command: ${interaction.commandName} from ${interaction.user.tag}`);
-
- // Handle the interaction
- await this.commandManager.handleInteraction(interaction);
- });
-
- // Error handling
- process.on('unhandledRejection', error => {
- console.error('Unhandled promise rejection:', error);
- });
- }
-
- async sendStartupNotification() {
- // Create startup embed
- const startupEmbed = {
- title: "blahaj.tr bot status update",
- description: `Bot started successfully at `,
- color: 0x00ff00,
- fields: [
- {
- name: "Bot Name",
- value: this.client.user.tag,
- inline: true
- },
- {
- name: "Relative Time",
- value: ``,
- inline: true
- }
- ],
- footer: {
- text: "blahaj.tr"
- }
- };
-
- // Notify all recipients
- for (const userId of this.notificationRecipientIds) {
- try {
- const user = await this.client.users.fetch(userId);
- await user.send({ embeds: [startupEmbed] });
- console.log(`Sent startup notification to recipient: ${user.tag}`);
- } catch (error) {
- console.error(`Failed to send startup notification to user ${userId}:`, error.message);
- }
- }
- }
-
- async sendShutdownNotification(reason = "Manual shutdown", error = null) {
- // Create shutdown embed
- const shutdownEmbed = {
- title: "blahaj.tr bot status update",
- description: `Bot is shutting down at `,
- color: 0xFF0000,
- fields: [
- {
- name: "Bot Name",
- value: this.client.user.tag,
- inline: true
- },
- {
- name: "Shutdown Reason",
- value: reason || "Unknown",
- inline: true
- },
- {
- name: "Relative Time",
- value: ``,
- inline: true
- }
- ],
- footer: {
- text: "blahaj.tr"
- }
- };
-
- if (error) {
- shutdownEmbed.fields.push({
- name: "Error Details",
- value: `\`\`\`\n${error.message || String(error).substring(0, 1000)}\n\`\`\``,
- inline: false
- });
- }
-
- // Stop notification service if running
- if (this.notificationService?.isRunning) {
- this.notificationService.stop();
- }
-
- // Notify authorized user
- try {
- const owner = await this.client.users.fetch(this.authorizedUserId);
- await owner.send({ embeds: [shutdownEmbed] });
- console.log(`Sent shutdown notification to authorized user: ${owner.tag}`);
- } catch (error) {
- console.error("Failed to send shutdown notification to authorized user:", error.message);
- }
-
- // Also notify in status channel if available
- if (this.notificationService?.statusChannel) {
- try {
- await this.notificationService.statusChannel.send({ embeds: [shutdownEmbed] });
- console.log(`Sent shutdown notification to status channel: ${this.notificationService.statusChannel.name}`);
- } catch (error) {
- console.error("Failed to send shutdown notification to status channel:", error.message);
- }
- }
- }
-
- async start() {
- // Login to Discord
- await this.client.login(process.env.DISCORD_TOKEN);
- return this;
- }
-
- async stop() {
- // Stop notification service
- if (this.notificationService) {
- this.notificationService.stop();
- }
-
- // Destroy the client
- if (this.client) {
- this.client.destroy();
- }
- }
-}
-
-module.exports = Bot;
diff --git a/discord/classes/CommandBase.js b/discord/classes/CommandBase.js
deleted file mode 100644
index 03aab87..0000000
--- a/discord/classes/CommandBase.js
+++ /dev/null
@@ -1,82 +0,0 @@
-const { SlashCommandBuilder } = require('discord.js');
-
-class CommandBase {
- constructor(client) {
- this.client = client;
- this.name = '';
- this.description = '';
- this.options = [];
- }
-
- /**
- * Execute the command
- * @param {Interaction} interaction - The interaction object
- */
- async execute(interaction) {
- throw new Error('Method not implemented');
- }
-
- /**
- * Defer the reply to the interaction
- * @param {Interaction} interaction - The interaction object
- * @param {boolean} ephemeral - Whether the reply should be ephemeral
- */
- async deferReply(interaction, ephemeral = false) {
- if (!interaction.deferred && !interaction.replied) {
- await interaction.deferReply({ ephemeral });
- }
- }
-
- /**
- * Send a response to the interaction
- * @param {Interaction} interaction - The interaction object
- * @param {Object} options - The response options
- * @param {boolean} ephemeral - Whether the response should be ephemeral
- */
- async sendResponse(interaction, options, ephemeral = false) {
- if (interaction.deferred || interaction.replied) {
- await interaction.editReply(options);
- } else {
- options.ephemeral = ephemeral;
- await interaction.reply(options);
- }
- }
-
- /**
- * Send an error response to the interaction
- * @param {Interaction} interaction - The interaction object
- * @param {string} message - The error message
- */
- async sendErrorResponse(interaction, message) {
- const errorEmbed = {
- title: "Error",
- description: message,
- color: 0xFF0000,
- timestamp: new Date()
- };
-
- if (interaction.deferred || interaction.replied) {
- await interaction.editReply({ embeds: [errorEmbed] });
- } else {
- await interaction.reply({ embeds: [errorEmbed], ephemeral: true });
- }
- }
-
- /**
- * Convert the command to JSON for registration
- */
- toJSON() {
- const builder = new SlashCommandBuilder()
- .setName(this.name)
- .setDescription(this.description);
-
- // Add options if defined in the child class
- if (typeof this.addOptions === 'function') {
- this.addOptions(builder);
- }
-
- return builder.toJSON();
- }
-}
-
-module.exports = CommandBase;
diff --git a/discord/classes/CommandManager.js b/discord/classes/CommandManager.js
deleted file mode 100644
index 955feca..0000000
--- a/discord/classes/CommandManager.js
+++ /dev/null
@@ -1,130 +0,0 @@
-const { Collection, REST, Routes, SlashCommandBuilder } = require('discord.js');
-const fs = require('fs');
-const path = require('path');
-
-class CommandManager {
- constructor(client) {
- this.client = client;
- this.commands = new Collection();
- this.commandFolders = ['info', 'system']; // Only include info and system commands
- this.rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
- this.authorizedUserId = process.env.AUTHORIZED_USER_ID;
-
- // Add this line to load commands when the CommandManager is created
- this.loadCommands();
- }
-
- async loadCommands() {
- const commandsPath = path.join(__dirname, '../commands');
-
- // Only load commands from allowed folders
- for (const folder of this.commandFolders) {
- const folderPath = path.join(commandsPath, folder);
-
- // Skip if folder doesn't exist
- if (!fs.existsSync(folderPath)) continue;
-
- const commandFiles = fs.readdirSync(folderPath).filter(file => file.endsWith('.js'));
-
- for (const file of commandFiles) {
- const filePath = path.join(folderPath, file);
- const CommandClass = require(filePath);
- const command = new CommandClass(this.client);
-
- // Add authorization check to command
- const originalExecute = command.execute;
- command.execute = async function(interaction) {
- if (interaction.user.id !== process.env.AUTHORIZED_USER_ID) {
- return interaction.reply({
- content: "You are not authorized to use this command.",
- ephemeral: true
- });
- }
- return originalExecute.call(this, interaction);
- };
-
- this.commands.set(command.name, command);
- console.log(`Loaded command: ${command.name}`);
- }
- }
- }
-
- async registerGlobalCommands() {
- try {
- console.log("Registering global commands...");
-
- const commandsData = this.commands.map(command => {
- const data = {
- name: command.name,
- description: command.description,
- options: command.options || [],
- // Add these lines for global availability in all contexts
- integration_types: [1], // Add integration type for global availability
- contexts: [0, 1, 2], // Available in all contexts (DM, GROUP_DM, GUILD)
- };
-
- // If the command has an addOptions method, call it
- if (typeof command.addOptions === 'function') {
- data.options = command.addOptions(new SlashCommandBuilder()).options;
- }
-
- return data;
- });
-
- const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
- await rest.put(
- Routes.applicationCommands(this.client.user.id),
- { body: commandsData },
- );
-
- console.log(`Successfully registered ${commandsData.length} global commands`);
- } catch (error) {
- console.error('Error registering global commands:', error);
- }
- }
-
- async handleInteraction(interaction) {
- if (!interaction.isChatInputCommand()) return;
-
- // We don't need to double-check authorization here since Bot.js already checks
- // This avoids potential inconsistencies in the authorization check
-
- const command = this.commands.get(interaction.commandName);
- if (!command) return;
-
- try {
- await command.execute(interaction);
- } catch (error) {
- console.error(`Error executing command ${interaction.commandName}:`, error);
-
- const errorMessage = {
- content: "There was an error while executing this command!",
- ephemeral: true
- };
-
- if (interaction.replied || interaction.deferred) {
- await interaction.followUp(errorMessage);
- } else {
- await interaction.reply(errorMessage);
- }
- }
- }
-
- async handleAutocomplete(interaction) {
- const command = this.commands.get(interaction.commandName);
-
- if (!command || typeof command.handleAutocomplete !== 'function') {
- return;
- }
-
- try {
- await command.handleAutocomplete(interaction);
- } catch (error) {
- console.error(`Error handling autocomplete for ${interaction.commandName}:`, error);
- // Respond with empty array as fallback
- await interaction.respond([]);
- }
- }
-}
-
-module.exports = CommandManager;
diff --git a/discord/classes/NotificationService.js b/discord/classes/NotificationService.js
deleted file mode 100644
index 5894db8..0000000
--- a/discord/classes/NotificationService.js
+++ /dev/null
@@ -1,300 +0,0 @@
-const axios = require('axios');
-
-class NotificationService {
- constructor(client, options = {}) {
- this.client = client;
-
- // Parse notification recipient IDs (separate from command authorization)
- this.notificationRecipientIds = process.env.NOTIFICATION_USER_IDS ?
- process.env.NOTIFICATION_USER_IDS.split(',').map(id => id.trim()) :
- [];
-
- // For backward compatibility - if no notification IDs specified, use authorized IDs
- if (this.notificationRecipientIds.length === 0) {
- // Use the bot's authorizedUserIds as fallback
- this.notificationRecipientIds = client.bot.authorizedUserIds ||
- (process.env.AUTHORIZED_USER_IDS ?
- process.env.AUTHORIZED_USER_IDS.split(',').map(id => id.trim()) :
- []);
-
- // Add legacy single user ID for backward compatibility
- if (process.env.AUTHORIZED_USER_ID && !this.notificationRecipientIds.includes(process.env.AUTHORIZED_USER_ID)) {
- this.notificationRecipientIds.push(process.env.AUTHORIZED_USER_ID);
- }
- }
-
- console.log(`Notification recipients configured: ${this.notificationRecipientIds.length}`);
-
- this.statusChannel = null;
- this.checkInterval = options.checkInterval || 10000; // Changed to 10 seconds default
- this.statusEndpoint = options.statusEndpoint || 'https://blahaj.tr:2589/status';
- this.notificationChannelId = process.env.STATUS_NOTIFICATION_CHANNEL;
-
- // Store the previous status to compare for changes
- this.previousStatus = {
- servers: {},
- pm2Services: {} // Changed from services to pm2Services to match API response
- };
-
- // Track if this is the first check (to avoid notifications on startup)
- this.isFirstCheck = true;
-
- // Indicate if the service is running
- this.isRunning = false;
- }
-
- async initialize() {
- // Fetch the channel if a channel ID is provided
- if (this.notificationChannelId) {
- try {
- this.statusChannel = await this.client.channels.fetch(this.notificationChannelId);
- console.log(`Status notification channel set to: ${this.statusChannel.name}`);
- } catch (error) {
- console.error(`Failed to fetch status notification channel: ${error.message}`);
- }
- }
-
- // Do an initial check to populate the previous status
- try {
- const initialStatus = await this.fetchStatus();
- this.previousStatus = initialStatus;
- console.log('Initial status check complete');
- } catch (error) {
- console.error(`Initial status check failed: ${error.message}`);
- }
- }
-
- start() {
- if (this.isRunning) return;
-
- console.log(`Starting status notification service (checking every ${this.checkInterval/1000} seconds)`);
- this.isRunning = true;
- this.checkTimer = setInterval(() => this.checkStatus(), this.checkInterval);
-
- // Run the first check
- this.checkStatus();
- }
-
- stop() {
- if (!this.isRunning) return;
-
- console.log('Stopping status notification service');
- clearInterval(this.checkTimer);
- this.isRunning = false;
- }
-
- async fetchStatus() {
- try {
- const response = await axios.get(this.statusEndpoint);
- return response.data;
- } catch (error) {
- console.error(`Error fetching status: ${error.message}`);
- throw error;
- }
- }
-
- async checkStatus() {
- try {
- const currentStatus = await this.fetchStatus();
- const changes = this.detectChanges(this.previousStatus, currentStatus);
-
- // If changes detected and not the first check, send notifications
- if (changes.length > 0 && !this.isFirstCheck) {
- await this.sendNotifications(changes, currentStatus);
- }
-
- // Update previous status and set first check to false
- this.previousStatus = currentStatus;
- this.isFirstCheck = false;
- } catch (error) {
- console.error(`Status check failed: ${error.message}`);
- }
- }
-
- detectChanges(previousStatus, currentStatus) {
- const changes = [];
-
- // Check for server status changes
- if (previousStatus.servers && currentStatus.servers) {
- for (const server in currentStatus.servers) {
- // New server or status changed
- if (!previousStatus.servers[server] ||
- previousStatus.servers[server].online !== currentStatus.servers[server].online) {
- changes.push({
- type: 'server',
- name: server,
- status: currentStatus.servers[server].online ? 'online' : 'offline',
- previous: previousStatus.servers[server]?.online ? 'online' : 'offline',
- isNew: !previousStatus.servers[server],
- responseTime: currentStatus.servers[server].responseTime
- });
- }
- }
-
- // Check for removed servers
- for (const server in previousStatus.servers) {
- if (!currentStatus.servers[server]) {
- changes.push({
- type: 'server',
- name: server,
- status: 'removed',
- previous: previousStatus.servers[server].online ? 'online' : 'offline'
- });
- }
- }
- }
-
- // Check for PM2 service status changes - updated to use pm2Services
- if (previousStatus.pm2Services && currentStatus.pm2Services) {
- for (const service in currentStatus.pm2Services) {
- if (!previousStatus.pm2Services[service] ||
- previousStatus.pm2Services[service].status !== currentStatus.pm2Services[service].status) {
- changes.push({
- type: 'service',
- name: service,
- status: currentStatus.pm2Services[service].status,
- previous: previousStatus.pm2Services[service]?.status || 'unknown',
- isNew: !previousStatus.pm2Services[service],
- details: currentStatus.pm2Services[service]
- });
- }
- }
-
- // Check for removed services
- for (const service in previousStatus.pm2Services) {
- if (!currentStatus.pm2Services[service]) {
- changes.push({
- type: 'service',
- name: service,
- status: 'removed',
- previous: previousStatus.pm2Services[service].status
- });
- }
- }
- }
-
- return changes;
- }
-
- async sendNotifications(changes, currentStatus) {
- if (changes.length === 0) return;
-
- // Create an embed for the notification
- const embed = {
- title: 'Status Change Detected',
- color: 0xFFAA00, // Amber color for notifications
- timestamp: new Date(),
- fields: [],
- footer: {
- text: 'blahaj.tr Status Monitor'
- }
- };
-
- // Add fields for each change
- changes.forEach(change => {
- let fieldContent = '';
-
- if (change.type === 'server') {
- const statusEmoji = change.status === 'online' ? '🟢' : (change.status === 'offline' ? '🔴' : '⚪');
- const previousEmoji = change.previous === 'online' ? '🟢' : (change.previous === 'offline' ? '🔴' : '⚪');
-
- if (change.isNew) {
- fieldContent = `${statusEmoji} New server detected: **${change.status}**`;
- } else if (change.status === 'removed') {
- fieldContent = `⚪ Server removed (was ${previousEmoji} **${change.previous}**)`;
- } else {
- fieldContent = `${previousEmoji} **${change.previous}** → ${statusEmoji} **${change.status}**`;
- if (change.responseTime !== 'unknown') {
- fieldContent += `\nResponse time: ${change.responseTime}ms`;
- }
- }
- } else if (change.type === 'service') {
- let statusEmoji = '⚪';
- switch (change.status) {
- case 'online': statusEmoji = '🟢'; break;
- case 'stopping': statusEmoji = '🟠'; break;
- case 'stopped': statusEmoji = '🔴'; break;
- case 'errored': statusEmoji = '❌'; break;
- case 'launching': statusEmoji = '🟡'; break;
- }
-
- let previousEmoji = '⚪';
- switch (change.previous) {
- case 'online': previousEmoji = '🟢'; break;
- case 'stopping': previousEmoji = '🟠'; break;
- case 'stopped': previousEmoji = '🔴'; break;
- case 'errored': previousEmoji = '❌'; break;
- case 'launching': previousEmoji = '🟡'; break;
- }
-
- if (change.isNew) {
- fieldContent = `${statusEmoji} New service detected: **${change.status}**`;
- } else if (change.status === 'removed') {
- fieldContent = `⚪ Service removed (was ${previousEmoji} **${change.previous}**)`;
- } else {
- fieldContent = `${previousEmoji} **${change.previous}** → ${statusEmoji} **${change.status}**`;
-
- // Add resource usage if available
- if (change.details) {
- const memory = change.details.memory ? Math.round(change.details.memory / (1024 * 1024) * 10) / 10 : 0;
- fieldContent += `\nCPU: ${change.details.cpu}% | Memory: ${memory}MB`;
- fieldContent += `\nUptime: ${Math.floor(change.details.uptime / 1000)}s | Restarts: ${change.details.restarts}`;
- }
- }
- }
-
- embed.fields.push({
- name: `${change.type === 'server' ? 'Server' : 'Service'}: ${change.name}`,
- value: fieldContent,
- inline: false
- });
- });
-
- // Add a detailed status field if there are many services
- if (Object.keys(currentStatus.pm2Services || {}).length > 0) {
- let servicesStatus = '';
- for (const [name, info] of Object.entries(currentStatus.pm2Services)) {
- let statusEmoji = '⚪';
- switch (info.status) {
- case 'online': statusEmoji = '🟢'; break;
- case 'stopping': statusEmoji = '🟠'; break;
- case 'stopped': statusEmoji = '🔴'; break;
- case 'errored': statusEmoji = '❌'; break;
- case 'launching': statusEmoji = '🟡'; break;
- }
- servicesStatus += `${statusEmoji} **${name}**: ${info.status}\n`;
- }
-
- if (servicesStatus) {
- embed.fields.push({
- name: 'Current Services Status',
- value: servicesStatus,
- inline: false
- });
- }
- }
-
- // Send to channel if available
- if (this.statusChannel) {
- try {
- await this.statusChannel.send({ embeds: [embed] });
- console.log('Status change notification sent to channel');
- } catch (error) {
- console.error(`Failed to send status notification to channel: ${error.message}`);
- }
- }
-
- // Send to all notification recipients
- for (const userId of this.notificationRecipientIds) {
- try {
- const user = await this.client.users.fetch(userId);
- await user.send({ embeds: [embed] });
- console.log(`Status change notification sent to recipient: ${user.tag}`);
- } catch (error) {
- console.error(`Failed to send status notification to user ${userId}: ${error.message}`);
- }
- }
- }
-}
-
-module.exports = NotificationService;
diff --git a/discord/classes/SystemCommandBase.js b/discord/classes/SystemCommandBase.js
deleted file mode 100644
index a50a268..0000000
--- a/discord/classes/SystemCommandBase.js
+++ /dev/null
@@ -1,44 +0,0 @@
-const CommandBase = require('./CommandBase');
-const { exec } = require('child_process');
-const util = require('util');
-
-const execPromise = util.promisify(exec);
-
-class SystemCommandBase extends CommandBase {
- constructor(client) {
- super(client);
-
- // Add security check for all system commands
- const originalExecute = this.execute;
- this.execute = async function(interaction) {
- // Get authorized users from the bot instance
- const authorizedUserIds = client.bot?.authorizedUserIds || [];
-
- // Check if user ID is in the authorized users array
- if (!authorizedUserIds.includes(interaction.user.id)) {
- return interaction.reply({
- content: "You are not authorized to use system commands.",
- ephemeral: true
- });
- }
-
- return originalExecute.call(this, interaction);
- };
- }
-
- async execCommand(command, options = {}) {
- try {
- const { stdout, stderr } = await execPromise(command, options);
- return { success: true, stdout, stderr };
- } catch (error) {
- return {
- success: false,
- error: error.message,
- stdout: error.stdout,
- stderr: error.stderr
- };
- }
- }
-}
-
-module.exports = SystemCommandBase;
diff --git a/discord/commands/info/sysinfo.js b/discord/commands/info/sysinfo.js
deleted file mode 100644
index a73627c..0000000
--- a/discord/commands/info/sysinfo.js
+++ /dev/null
@@ -1,91 +0,0 @@
-const SystemCommandBase = require('../../classes/SystemCommandBase');
-const os = require('os');
-
-class SystemInfo extends SystemCommandBase {
- constructor(client) {
- super(client);
- this.name = 'sysinfo';
- this.description = 'Get system information from the VPS';
- }
-
- async execute(interaction) {
- try {
- await interaction.deferReply();
-
- // Get basic system info using Node.js
- const uptime = Math.floor(os.uptime());
- const days = Math.floor(uptime / 86400);
- const hours = Math.floor((uptime % 86400) / 3600);
- const minutes = Math.floor((uptime % 3600) / 60);
- const seconds = uptime % 60;
- const uptimeString = `${days}d ${hours}h ${minutes}m ${seconds}s`;
-
- const memTotal = Math.round(os.totalmem() / (1024 * 1024 * 1024) * 100) / 100;
- const memFree = Math.round(os.freemem() / (1024 * 1024 * 1024) * 100) / 100;
- const memUsed = Math.round((memTotal - memFree) * 100) / 100;
- const memPercent = Math.round((memUsed / memTotal) * 100);
-
- // Get more detailed info using system commands
- const { stdout: diskInfo } = await this.execCommand('df -h / | tail -n 1');
- const diskParts = diskInfo.trim().split(/\s+/);
- const diskTotal = diskParts[1] || 'N/A';
- const diskUsed = diskParts[2] || 'N/A';
- const diskFree = diskParts[3] || 'N/A';
- const diskPercent = diskParts[4] || 'N/A';
-
- const { stdout: loadAvg } = await this.execCommand('cat /proc/loadavg');
- const loadParts = loadAvg.trim().split(' ');
- const load1m = loadParts[0] || 'N/A';
- const load5m = loadParts[1] || 'N/A';
- const load15m = loadParts[2] || 'N/A';
-
- const infoEmbed = {
- title: "VPS System Information",
- color: 0x3498db,
- fields: [
- {
- name: "Hostname",
- value: os.hostname(),
- inline: true
- },
- {
- name: "Platform",
- value: `${os.type()} ${os.release()}`,
- inline: true
- },
- {
- name: "Uptime",
- value: uptimeString,
- inline: true
- },
- {
- name: "Memory",
- value: `${memUsed}GB / ${memTotal}GB (${memPercent}%)`,
- inline: true
- },
- {
- name: "Disk",
- value: `${diskUsed} / ${diskTotal} (${diskPercent})`,
- inline: true
- },
- {
- name: "Load Average",
- value: `${load1m} | ${load5m} | ${load15m}`,
- inline: true
- }
- ],
- timestamp: new Date(),
- footer: {
- text: "VPS Control Bot"
- }
- };
-
- await interaction.editReply({ embeds: [infoEmbed] });
- } catch (error) {
- console.error(error);
- await interaction.editReply("Failed to get system information.");
- }
- }
-}
-
-module.exports = SystemInfo;
diff --git a/discord/commands/system/pm2.js b/discord/commands/system/pm2.js
deleted file mode 100644
index 99d32b5..0000000
--- a/discord/commands/system/pm2.js
+++ /dev/null
@@ -1,539 +0,0 @@
-const SystemCommandBase = require('../../classes/SystemCommandBase');
-const { SlashCommandBuilder } = require('discord.js');
-
-class PM2Control extends SystemCommandBase {
- constructor(client) {
- super(client);
- this.name = 'pm2';
- this.description = 'Control PM2 processes';
- }
-
- addOptions(builder) {
- return builder
- .addSubcommand(subcommand =>
- subcommand
- .setName('list')
- .setDescription('List all PM2 processes')
- )
- .addSubcommand(subcommand =>
- subcommand
- .setName('info')
- .setDescription('Get detailed information about a PM2 process')
- .addStringOption(option =>
- option
- .setName('process')
- .setDescription('Process name or ID')
- .setRequired(true)
- .setAutocomplete(true)
- )
- )
- .addSubcommand(subcommand =>
- subcommand
- .setName('start')
- .setDescription('Start a PM2 process')
- .addStringOption(option =>
- option
- .setName('process')
- .setDescription('Process name or ID')
- .setRequired(true)
- .setAutocomplete(true)
- )
- )
- .addSubcommand(subcommand =>
- subcommand
- .setName('stop')
- .setDescription('Stop a PM2 process')
- .addStringOption(option =>
- option
- .setName('process')
- .setDescription('Process name or ID')
- .setRequired(true)
- .setAutocomplete(true)
- )
- )
- .addSubcommand(subcommand =>
- subcommand
- .setName('restart')
- .setDescription('Restart a PM2 process')
- .addStringOption(option =>
- option
- .setName('process')
- .setDescription('Process name or ID')
- .setRequired(true)
- .setAutocomplete(true)
- )
- )
- .addSubcommand(subcommand =>
- subcommand
- .setName('logs')
- .setDescription('Show recent logs for a PM2 process')
- .addStringOption(option =>
- option
- .setName('process')
- .setDescription('Process name or ID')
- .setRequired(true)
- .setAutocomplete(true)
- )
- .addIntegerOption(option =>
- option
- .setName('lines')
- .setDescription('Number of log lines to show')
- .setRequired(false)
- )
- );
- }
-
- async execute(interaction) {
- await interaction.deferReply();
-
- const subcommand = interaction.options.getSubcommand();
-
- try {
- switch (subcommand) {
- case 'list':
- await this.handleListCommand(interaction);
- break;
-
- case 'info':
- await this.handleInfoCommand(interaction);
- break;
-
- case 'start':
- await this.handleStartCommand(interaction);
- break;
-
- case 'stop':
- await this.handleStopCommand(interaction);
- break;
-
- case 'restart':
- await this.handleRestartCommand(interaction);
- break;
-
- case 'logs':
- await this.handleLogsCommand(interaction);
- break;
-
- default:
- await interaction.editReply(`Unknown subcommand: ${subcommand}`);
- }
- } catch (error) {
- console.error(`Error executing PM2 command:`, error);
- await interaction.editReply({
- content: `Error executing command: ${error.message}`
- });
- }
- }
-
- async handleListCommand(interaction) {
- const { stdout } = await this.execCommand('pm2 jlist');
-
- try {
- const processes = JSON.parse(stdout);
-
- if (processes.length === 0) {
- await interaction.editReply('No PM2 processes found.');
- return;
- }
-
- const embed = {
- title: 'PM2 Process List',
- color: 0x3498db,
- fields: [],
- timestamp: new Date(),
- footer: { text: 'PM2 Process Manager' }
- };
-
- processes.forEach(proc => {
- // Format memory to MB
- const memory = Math.round(proc.monit.memory / (1024 * 1024) * 10) / 10;
-
- // Get appropriate status emoji
- let statusEmoji = '⚪';
- switch (proc.pm2_env.status) {
- case 'online': statusEmoji = '🟢'; break;
- case 'stopping': statusEmoji = '🟠'; break;
- case 'stopped': statusEmoji = '🔴'; break;
- case 'errored': statusEmoji = '❌'; break;
- case 'launching': statusEmoji = '🟡'; break;
- }
-
- // Calculate uptime
- const uptime = proc.pm2_env.status === 'online' ?
- this.formatUptime(Date.now() - proc.pm2_env.pm_uptime) :
- 'Not running';
-
- embed.fields.push({
- name: `${statusEmoji} ${proc.name} (ID: ${proc.pm_id})`,
- value: [
- `**Status:** ${proc.pm2_env.status}`,
- `**CPU:** ${proc.monit.cpu}%`,
- `**Memory:** ${memory} MB`,
- `**Uptime:** ${uptime}`,
- `**Restarts:** ${proc.pm2_env.restart_time}`
- ].join('\n'),
- inline: true
- });
- });
-
- await interaction.editReply({ embeds: [embed] });
-
- } catch (error) {
- console.error('Error parsing PM2 process list:', error);
- await interaction.editReply({
- content: `Failed to parse PM2 process list: ${error.message}`,
- files: stdout.length > 0 ? [{
- attachment: Buffer.from(stdout),
- name: 'pm2-list.json'
- }] : []
- });
- }
- }
-
- async handleInfoCommand(interaction) {
- const processName = interaction.options.getString('process');
-
- // Get detailed info about the process
- const { success, stdout, stderr } = await this.execCommand(`pm2 show ${processName} --format json`);
-
- if (!success) {
- await interaction.editReply(`Failed to get info for PM2 process "${processName}":\n\`\`\`${stderr}\`\`\``);
- return;
- }
-
- try {
- // Parse the JSON output
- const procInfo = JSON.parse(stdout);
-
- // Get status emoji
- let statusEmoji = '⚪';
- switch (procInfo.status) {
- case 'online': statusEmoji = '🟢'; break;
- case 'stopping': statusEmoji = '🟠'; break;
- case 'stopped': statusEmoji = '🔴'; break;
- case 'errored': statusEmoji = '❌'; break;
- case 'launching': statusEmoji = '🟡'; break;
- }
-
- // Format memory
- const memory = procInfo.memory ?
- Math.round(procInfo.memory / (1024 * 1024) * 10) / 10 :
- 0;
-
- // Create embed
- const embed = {
- title: `${statusEmoji} PM2 Process: ${procInfo.name}`,
- color: procInfo.status === 'online' ? 0x00FF00 : 0xFF0000,
- fields: [
- {
- name: 'General',
- value: [
- `**ID:** ${procInfo.pm_id}`,
- `**Status:** ${procInfo.status}`,
- `**Version:** ${procInfo.version || 'N/A'}`,
- `**Instances:** ${procInfo.exec_instances || 1}`,
- `**Exec Mode:** ${procInfo.exec_mode || 'N/A'}`
- ].join('\n'),
- inline: true
- },
- {
- name: 'Resources',
- value: [
- `**CPU:** ${procInfo.cpu || 0}%`,
- `**Memory:** ${memory} MB`,
- `**Uptime:** ${this.formatUptime(procInfo.pm_uptime) || 'Not running'}`,
- `**Restarts:** ${procInfo.restart_time || 0}`,
- `**Unstable Restarts:** ${procInfo.unstable_restarts || 0}`
- ].join('\n'),
- inline: true
- },
- {
- name: 'Paths',
- value: [
- `**Path:** ${procInfo.path || 'N/A'}`,
- `**Current Path:** ${procInfo.cwd || 'N/A'}`,
- `**Script:** ${procInfo.script || 'N/A'}`
- ].join('\n'),
- inline: false
- }
- ],
- timestamp: new Date(),
- footer: { text: 'PM2 Process Manager' }
- };
-
- // Add logs section if available
- if (procInfo.out_log_path || procInfo.error_log_path) {
- embed.fields.push({
- name: 'Logs',
- value: [
- `**Output:** ${procInfo.out_log_path || 'N/A'}`,
- `**Error:** ${procInfo.error_log_path || 'N/A'}`
- ].join('\n'),
- inline: false
- });
- }
-
- await interaction.editReply({ embeds: [embed] });
-
- } catch (error) {
- console.error('Error parsing PM2 process info:', error);
- await interaction.editReply(`Failed to parse info for PM2 process "${processName}":\n\`\`\`${error.message}\`\`\``);
- }
- }
-
- async handleStartCommand(interaction) {
- const processName = interaction.options.getString('process');
-
- // First get current status
- const { success: infoSuccess, stdout: infoStdout } = await this.execCommand(`pm2 jlist`);
- let beforeStatus = 'unknown';
-
- if (infoSuccess) {
- try {
- const processes = JSON.parse(infoStdout);
- const proc = processes.find(p => p.name === processName || p.pm_id.toString() === processName);
- if (proc) {
- beforeStatus = proc.pm2_env.status;
- }
- } catch (error) {
- console.error('Error parsing PM2 process list before start:', error);
- }
- }
-
- // Start the process
- await interaction.editReply(`Starting PM2 process \`${processName}\`...`);
- const { success, stdout, stderr } = await this.execCommand(`pm2 start ${processName}`);
-
- if (!success) {
- await interaction.editReply(`Failed to start PM2 process "${processName}":\n\`\`\`${stderr}\`\`\``);
- return;
- }
-
- // Get new status
- const { success: newInfoSuccess, stdout: newInfoStdout } = await this.execCommand(`pm2 jlist`);
- let afterStatus = 'unknown';
-
- if (newInfoSuccess) {
- try {
- const processes = JSON.parse(newInfoStdout);
- const proc = processes.find(p => p.name === processName || p.pm_id.toString() === processName);
- if (proc) {
- afterStatus = proc.pm2_env.status;
- }
- } catch (error) {
- console.error('Error parsing PM2 process list after start:', error);
- }
- }
-
- // Create status emoji
- let statusEmoji = '⚪';
- switch (afterStatus) {
- case 'online': statusEmoji = '🟢'; break;
- case 'stopping': statusEmoji = '🟠'; break;
- case 'stopped': statusEmoji = '🔴'; break;
- case 'errored': statusEmoji = '❌'; break;
- case 'launching': statusEmoji = '🟡'; break;
- }
-
- await interaction.editReply(`PM2 process \`${processName}\` started.\n\nStatus: ${statusEmoji} ${afterStatus}\nPrevious status: ${beforeStatus}`);
- }
-
- async handleStopCommand(interaction) {
- const processName = interaction.options.getString('process');
-
- // First get current status
- const { success: infoSuccess, stdout: infoStdout } = await this.execCommand(`pm2 jlist`);
- let beforeStatus = 'unknown';
-
- if (infoSuccess) {
- try {
- const processes = JSON.parse(infoStdout);
- const proc = processes.find(p => p.name === processName || p.pm_id.toString() === processName);
- if (proc) {
- beforeStatus = proc.pm2_env.status;
- }
- } catch (error) {
- console.error('Error parsing PM2 process list before stop:', error);
- }
- }
-
- // Stop the process
- await interaction.editReply(`Stopping PM2 process \`${processName}\`...`);
- const { success, stdout, stderr } = await this.execCommand(`pm2 stop ${processName}`);
-
- if (!success) {
- await interaction.editReply(`Failed to stop PM2 process "${processName}":\n\`\`\`${stderr}\`\`\``);
- return;
- }
-
- // Get new status
- const { success: newInfoSuccess, stdout: newInfoStdout } = await this.execCommand(`pm2 jlist`);
- let afterStatus = 'unknown';
-
- if (newInfoSuccess) {
- try {
- const processes = JSON.parse(newInfoStdout);
- const proc = processes.find(p => p.name === processName || p.pm_id.toString() === processName);
- if (proc) {
- afterStatus = proc.pm2_env.status;
- }
- } catch (error) {
- console.error('Error parsing PM2 process list after stop:', error);
- }
- }
-
- // Create status emoji
- let statusEmoji = '⚪';
- switch (afterStatus) {
- case 'online': statusEmoji = '🟢'; break;
- case 'stopping': statusEmoji = '🟠'; break;
- case 'stopped': statusEmoji = '🔴'; break;
- case 'errored': statusEmoji = '❌'; break;
- case 'launching': statusEmoji = '🟡'; break;
- }
-
- await interaction.editReply(`PM2 process \`${processName}\` stopped.\n\nStatus: ${statusEmoji} ${afterStatus}\nPrevious status: ${beforeStatus}`);
- }
-
- async handleRestartCommand(interaction) {
- const processName = interaction.options.getString('process');
-
- // First get current status
- const { success: infoSuccess, stdout: infoStdout } = await this.execCommand(`pm2 jlist`);
- let beforeStatus = 'unknown';
-
- if (infoSuccess) {
- try {
- const processes = JSON.parse(infoStdout);
- const proc = processes.find(p => p.name === processName || p.pm_id.toString() === processName);
- if (proc) {
- beforeStatus = proc.pm2_env.status;
- }
- } catch (error) {
- console.error('Error parsing PM2 process list before restart:', error);
- }
- }
-
- // Restart the process
- await interaction.editReply(`Restarting PM2 process \`${processName}\`...`);
- const { success, stdout, stderr } = await this.execCommand(`pm2 restart ${processName}`);
-
- if (!success) {
- await interaction.editReply(`Failed to restart PM2 process "${processName}":\n\`\`\`${stderr}\`\`\``);
- return;
- }
-
- // Get new status
- const { success: newInfoSuccess, stdout: newInfoStdout } = await this.execCommand(`pm2 jlist`);
- let afterStatus = 'unknown';
-
- if (newInfoSuccess) {
- try {
- const processes = JSON.parse(newInfoStdout);
- const proc = processes.find(p => p.name === processName || p.pm_id.toString() === processName);
- if (proc) {
- afterStatus = proc.pm2_env.status;
- }
- } catch (error) {
- console.error('Error parsing PM2 process list after restart:', error);
- }
- }
-
- // Create status emoji
- let statusEmoji = '⚪';
- switch (afterStatus) {
- case 'online': statusEmoji = '🟢'; break;
- case 'stopping': statusEmoji = '🟠'; break;
- case 'stopped': statusEmoji = '🔴'; break;
- case 'errored': statusEmoji = '❌'; break;
- case 'launching': statusEmoji = '🟡'; break;
- }
-
- await interaction.editReply(`PM2 process \`${processName}\` restarted.\n\nStatus: ${statusEmoji} ${afterStatus}\nPrevious status: ${beforeStatus}`);
- }
-
- async handleLogsCommand(interaction) {
- const processName = interaction.options.getString('process');
- const lines = interaction.options.getInteger('lines') || 20;
-
- // Get logs for the process
- await interaction.editReply(`Fetching logs for PM2 process \`${processName}\`...`);
- const { success, stdout, stderr } = await this.execCommand(`pm2 logs ${processName} --lines ${lines} --nostream --raw`);
-
- if (!success) {
- await interaction.editReply(`Failed to get logs for PM2 process "${processName}":\n\`\`\`${stderr}\`\`\``);
- return;
- }
-
- // Format the logs
- const logs = stdout.trim();
-
- if (!logs) {
- await interaction.editReply(`No logs found for PM2 process \`${processName}\`.`);
- return;
- }
-
- // If logs are too long, split into files
- if (logs.length > 1950) {
- await interaction.editReply({
- content: `Logs for PM2 process \`${processName}\` (last ${lines} lines):`,
- files: [{
- attachment: Buffer.from(logs),
- name: `${processName}-logs.txt`
- }]
- });
- } else {
- await interaction.editReply(`Logs for PM2 process \`${processName}\` (last ${lines} lines):\n\`\`\`\n${logs}\n\`\`\``);
- }
- }
-
- // Helper method to autocomplete process names
- async handleAutocomplete(interaction) {
- try {
- const focusedValue = interaction.options.getFocused();
- const { success, stdout } = await this.execCommand('pm2 jlist');
-
- if (!success) {
- return interaction.respond([]);
- }
-
- const processes = JSON.parse(stdout);
- const choices = processes.map(proc => ({
- name: `${proc.name} (${proc.pm2_env.status})`,
- value: proc.name
- }));
-
- // Filter choices based on user input
- const filtered = choices.filter(choice =>
- choice.name.toLowerCase().includes(focusedValue.toLowerCase())
- );
-
- await interaction.respond(filtered.slice(0, 25));
- } catch (error) {
- console.error('Error in PM2 autocomplete:', error);
- await interaction.respond([]);
- }
- }
-
- // Helper to format uptime
- formatUptime(ms) {
- if (!ms || ms <= 0) return 'Not running';
-
- const seconds = Math.floor(ms / 1000);
- const minutes = Math.floor(seconds / 60);
- const hours = Math.floor(minutes / 60);
- const days = Math.floor(hours / 24);
-
- if (days > 0) {
- return `${days}d ${hours % 24}h ${minutes % 60}m`;
- } else if (hours > 0) {
- return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
- } else if (minutes > 0) {
- return `${minutes}m ${seconds % 60}s`;
- } else {
- return `${seconds}s`;
- }
- }
-}
-
-module.exports = PM2Control;
diff --git a/index.js b/index.js
deleted file mode 100644
index bf703fb..0000000
--- a/index.js
+++ /dev/null
@@ -1,92 +0,0 @@
-// Main application entry point
-const path = require('path');
-require('dotenv').config();
-
-// Import the Bot class
-const Bot = require('./discord/classes/Bot');
-
-// Global variables to hold our services
-let apiServer;
-let discordBot;
-
-async function startServices() {
- try {
- // Start API server
- console.log('Starting API server...');
- apiServer = require('./api/server');
- console.log('API server started successfully');
-
- // Initialize and start Discord bot
- console.log('Starting Discord bot...');
- discordBot = new Bot();
- await discordBot.start();
- console.log('Discord bot started successfully');
-
- console.log('All services started - System fully operational');
- } catch (error) {
- console.error('Error starting services:', error);
- process.exit(1);
- }
-}
-
-// Handle graceful shutdown
-async function shutdown(signal) {
- console.log(`Received ${signal}. Shutting down gracefully...`);
-
- // Shutdown Discord bot if it exists
- if (discordBot) {
- try {
- await discordBot.sendShutdownNotification(`Manual shutdown triggered by ${signal}`);
- await discordBot.stop();
- console.log('Discord bot shutdown complete');
- } catch (error) {
- console.error('Error shutting down Discord bot:', error);
- }
- }
-
- // Add any API server shutdown logic here if needed
-
- console.log('Shutdown complete');
- process.exit(0);
-}
-
-// Register shutdown handlers
-process.on('SIGINT', async () => {
- console.log('Received SIGINT. Shutting down gracefully...');
- try {
- // If you have the bot instance available, call shutdown method
- if (global.discordBot) {
- await global.discordBot.sendShutdownNotification("SIGINT received");
- }
- } catch (error) {
- console.error("Error shutting down Discord bot:", error);
- }
- process.exit(0);
-});
-
-process.on('SIGTERM', async () => {
- console.log('Received SIGTERM. Shutting down gracefully...');
- try {
- // If you have the bot instance available, call shutdown method
- if (global.discordBot) {
- await global.discordBot.sendShutdownNotification("SIGTERM received");
- }
- } catch (error) {
- console.error("Error shutting down Discord bot:", error);
- }
- process.exit(0);
-});
-
-// Catch uncaught exceptions
-process.on('uncaughtException', (error) => {
- console.error('Uncaught exception:', error);
- if (discordBot) {
- discordBot.sendShutdownNotification('Uncaught exception', error)
- .finally(() => process.exit(1));
- } else {
- process.exit(1);
- }
-});
-
-// Start all services
-startServices();
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 3c142a8..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,3142 +0,0 @@
-{
- "name": "blahaj-srv",
- "version": "1.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "blahaj-srv",
- "version": "1.0.0",
- "license": "ISC",
- "dependencies": {
- "axios": "^1.8.4",
- "cors": "^2.8.5",
- "dotenv": "^16.4.7",
- "express": "^4.21.2",
- "nodejs": "^0.0.0",
- "ping": "^0.4.4",
- "pm2": "^6.0.5",
- "whois-json": "^2.0.4"
- }
- },
- "node_modules/@pm2/agent": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.1.1.tgz",
- "integrity": "sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==",
- "license": "AGPL-3.0",
- "dependencies": {
- "async": "~3.2.0",
- "chalk": "~3.0.0",
- "dayjs": "~1.8.24",
- "debug": "~4.3.1",
- "eventemitter2": "~5.0.1",
- "fast-json-patch": "^3.1.0",
- "fclone": "~1.0.11",
- "pm2-axon": "~4.0.1",
- "pm2-axon-rpc": "~0.7.0",
- "proxy-agent": "~6.4.0",
- "semver": "~7.5.0",
- "ws": "~7.5.10"
- }
- },
- "node_modules/@pm2/agent/node_modules/dayjs": {
- "version": "1.8.36",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz",
- "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==",
- "license": "MIT"
- },
- "node_modules/@pm2/agent/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@pm2/agent/node_modules/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==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@pm2/agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/@pm2/agent/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@pm2/agent/node_modules/ws": {
- "version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/@pm2/io": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@pm2/io/-/io-6.1.0.tgz",
- "integrity": "sha512-IxHuYURa3+FQ6BKePlgChZkqABUKFYH6Bwbw7V/pWU1pP6iR1sCI26l7P9ThUEB385ruZn/tZS3CXDUF5IA1NQ==",
- "license": "Apache-2",
- "dependencies": {
- "async": "~2.6.1",
- "debug": "~4.3.1",
- "eventemitter2": "^6.3.1",
- "require-in-the-middle": "^5.0.0",
- "semver": "~7.5.4",
- "shimmer": "^1.2.0",
- "signal-exit": "^3.0.3",
- "tslib": "1.9.3"
- },
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/@pm2/io/node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.17.14"
- }
- },
- "node_modules/@pm2/io/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@pm2/io/node_modules/eventemitter2": {
- "version": "6.4.9",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz",
- "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==",
- "license": "MIT"
- },
- "node_modules/@pm2/io/node_modules/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==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@pm2/io/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/@pm2/io/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@pm2/io/node_modules/tslib": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
- "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
- "license": "Apache-2.0"
- },
- "node_modules/@pm2/js-api": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.0.tgz",
- "integrity": "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==",
- "license": "Apache-2",
- "dependencies": {
- "async": "^2.6.3",
- "debug": "~4.3.1",
- "eventemitter2": "^6.3.1",
- "extrareqp2": "^1.0.0",
- "ws": "^7.0.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/@pm2/js-api/node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.17.14"
- }
- },
- "node_modules/@pm2/js-api/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@pm2/js-api/node_modules/eventemitter2": {
- "version": "6.4.9",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz",
- "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==",
- "license": "MIT"
- },
- "node_modules/@pm2/js-api/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/@pm2/js-api/node_modules/ws": {
- "version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/@pm2/pm2-version-check": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz",
- "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.1"
- }
- },
- "node_modules/@pm2/pm2-version-check/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@pm2/pm2-version-check/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/@tootallnate/quickjs-emscripten": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
- "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
- "license": "MIT"
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/agent-base": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
- "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/amp": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz",
- "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==",
- "license": "MIT"
- },
- "node_modules/amp-message": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz",
- "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==",
- "license": "MIT",
- "dependencies": {
- "amp": "0.3.1"
- }
- },
- "node_modules/ansi-colors": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
- "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0"
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
- },
- "node_modules/ast-types": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
- "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "license": "MIT"
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/axios": {
- "version": "1.8.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
- "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/basic-ftp": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
- "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/blessed": {
- "version": "0.1.81",
- "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz",
- "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==",
- "license": "MIT",
- "bin": {
- "blessed": "bin/tput.js"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/bodec": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz",
- "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==",
- "license": "MIT"
- },
- "node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "license": "MIT"
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
- "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/change-case": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz",
- "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==",
- "license": "MIT",
- "dependencies": {
- "camel-case": "^3.0.0",
- "constant-case": "^2.0.0",
- "dot-case": "^2.1.0",
- "header-case": "^1.0.0",
- "is-lower-case": "^1.1.0",
- "is-upper-case": "^1.1.0",
- "lower-case": "^1.1.1",
- "lower-case-first": "^1.0.0",
- "no-case": "^2.3.2",
- "param-case": "^2.1.0",
- "pascal-case": "^2.0.0",
- "path-case": "^2.1.0",
- "sentence-case": "^2.1.0",
- "snake-case": "^2.1.0",
- "swap-case": "^1.1.0",
- "title-case": "^2.1.0",
- "upper-case": "^1.1.1",
- "upper-case-first": "^1.1.0"
- }
- },
- "node_modules/charm": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz",
- "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==",
- "license": "MIT/X11"
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "license": "MIT",
- "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"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/cli-tableau": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz",
- "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==",
- "dependencies": {
- "chalk": "3.0.0"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
- },
- "node_modules/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==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/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==",
- "license": "MIT"
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/commander": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
- "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
- "license": "MIT"
- },
- "node_modules/constant-case": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
- "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==",
- "license": "MIT",
- "dependencies": {
- "snake-case": "^2.1.0",
- "upper-case": "^1.1.1"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- },
- "node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "dependencies": {
- "object-assign": "^4",
- "vary": "^1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/croner": {
- "version": "4.1.97",
- "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz",
- "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==",
- "license": "MIT"
- },
- "node_modules/culvert": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz",
- "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==",
- "license": "MIT"
- },
- "node_modules/data-uri-to-buffer": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
- "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/dayjs": {
- "version": "1.11.13",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
- "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
- "license": "MIT"
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/dedent-js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz",
- "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==",
- "license": "MIT"
- },
- "node_modules/degenerator": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
- "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
- "license": "MIT",
- "dependencies": {
- "ast-types": "^0.13.4",
- "escodegen": "^2.1.0",
- "esprima": "^4.0.1"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/dot-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz",
- "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0"
- }
- },
- "node_modules/dotenv": {
- "version": "16.4.7",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
- "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "node_modules/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==",
- "license": "MIT"
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "license": "MIT",
- "dependencies": {
- "ansi-colors": "^4.1.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=6.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/eventemitter2": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
- "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==",
- "license": "MIT"
- },
- "node_modules/express": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
- "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.12",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/extrareqp2": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz",
- "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.14.0"
- }
- },
- "node_modules/fast-json-patch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
- "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==",
- "license": "MIT"
- },
- "node_modules/fclone": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz",
- "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==",
- "license": "MIT"
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
- "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/get-uri": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz",
- "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==",
- "license": "MIT",
- "dependencies": {
- "basic-ftp": "^5.0.2",
- "data-uri-to-buffer": "^6.0.2",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/get-uri/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/get-uri/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/git-node-fs": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz",
- "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==",
- "license": "MIT"
- },
- "node_modules/git-sha1": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz",
- "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==",
- "license": "MIT"
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/header-case": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz",
- "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.3"
- }
- },
- "node_modules/html-entities": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz",
- "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==",
- "license": "MIT"
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/http-proxy-agent/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/http-proxy-agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/https-proxy-agent": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
- "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/https-proxy-agent/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/https-proxy-agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "license": "ISC"
- },
- "node_modules/ip-address": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
- "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
- "license": "MIT",
- "dependencies": {
- "jsbn": "1.1.0",
- "sprintf-js": "^1.1.3"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/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==",
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-lower-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz",
- "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==",
- "license": "MIT",
- "dependencies": {
- "lower-case": "^1.1.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-upper-case": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz",
- "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==",
- "license": "MIT",
- "dependencies": {
- "upper-case": "^1.1.0"
- }
- },
- "node_modules/js-git": {
- "version": "0.7.8",
- "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz",
- "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==",
- "license": "MIT",
- "dependencies": {
- "bodec": "^0.1.0",
- "culvert": "^0.1.2",
- "git-sha1": "^0.1.2",
- "pako": "^0.2.5"
- }
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsbn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
- "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
- "license": "MIT"
- },
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "license": "ISC",
- "optional": true
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
- "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==",
- "license": "MIT"
- },
- "node_modules/lower-case-first": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz",
- "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==",
- "license": "MIT",
- "dependencies": {
- "lower-case": "^1.1.2"
- }
- },
- "node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/module-details-from-path": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz",
- "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==",
- "license": "MIT"
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "license": "ISC"
- },
- "node_modules/needle": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz",
- "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
- "license": "MIT",
- "dependencies": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- },
- "bin": {
- "needle": "bin/needle"
- },
- "engines": {
- "node": ">= 4.4.x"
- }
- },
- "node_modules/needle/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/needle/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/netmask": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
- "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
- "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
- "license": "MIT",
- "dependencies": {
- "lower-case": "^1.1.1"
- }
- },
- "node_modules/nodejs": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/nodejs/-/nodejs-0.0.0.tgz",
- "integrity": "sha512-1V+0HwaB/dhxzidEFc4uJ3k52gLI4B6YBZgJIofjwYCSAkD6CI0me6TDBT2QM2nbGWNxCHcq9/wVynzQYZOhUg==",
- "license": "ISC"
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pac-proxy-agent": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
- "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
- "license": "MIT",
- "dependencies": {
- "@tootallnate/quickjs-emscripten": "^0.23.0",
- "agent-base": "^7.1.2",
- "debug": "^4.3.4",
- "get-uri": "^6.0.1",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.6",
- "pac-resolver": "^7.0.1",
- "socks-proxy-agent": "^8.0.5"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/pac-proxy-agent/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/pac-proxy-agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/pac-resolver": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
- "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
- "license": "MIT",
- "dependencies": {
- "degenerator": "^5.0.0",
- "netmask": "^2.0.2"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
- "license": "MIT"
- },
- "node_modules/param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
- "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/pascal-case": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz",
- "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==",
- "license": "MIT",
- "dependencies": {
- "camel-case": "^3.0.0",
- "upper-case-first": "^1.1.0"
- }
- },
- "node_modules/path-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz",
- "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "license": "MIT"
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pidusage": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz",
- "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.2.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ping": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.4.tgz",
- "integrity": "sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/pm2": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/pm2/-/pm2-6.0.5.tgz",
- "integrity": "sha512-+O43WPaEiwYbm6/XSpAOO1Rtya/Uof0n7x8hJZGfwIuepesNTIVArpZh4KqFfze0cvvqZMr0maTW3ifhvmyeMQ==",
- "license": "AGPL-3.0",
- "dependencies": {
- "@pm2/agent": "~2.1.1",
- "@pm2/io": "~6.1.0",
- "@pm2/js-api": "~0.8.0",
- "@pm2/pm2-version-check": "latest",
- "async": "~3.2.6",
- "blessed": "0.1.81",
- "chalk": "3.0.0",
- "chokidar": "^3.5.3",
- "cli-tableau": "^2.0.0",
- "commander": "2.15.1",
- "croner": "~4.1.92",
- "dayjs": "~1.11.13",
- "debug": "^4.3.7",
- "enquirer": "2.3.6",
- "eventemitter2": "5.0.1",
- "fclone": "1.0.11",
- "js-yaml": "~4.1.0",
- "mkdirp": "1.0.4",
- "needle": "2.4.0",
- "pidusage": "~3.0",
- "pm2-axon": "~4.0.1",
- "pm2-axon-rpc": "~0.7.1",
- "pm2-deploy": "~1.0.2",
- "pm2-multimeter": "^0.1.2",
- "promptly": "^2",
- "semver": "^7.6.2",
- "source-map-support": "0.5.21",
- "sprintf-js": "1.1.2",
- "vizion": "~2.2.1"
- },
- "bin": {
- "pm2": "bin/pm2",
- "pm2-dev": "bin/pm2-dev",
- "pm2-docker": "bin/pm2-docker",
- "pm2-runtime": "bin/pm2-runtime"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "optionalDependencies": {
- "pm2-sysmonit": "^1.2.8"
- }
- },
- "node_modules/pm2-axon": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz",
- "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==",
- "license": "MIT",
- "dependencies": {
- "amp": "~0.3.1",
- "amp-message": "~0.1.1",
- "debug": "^4.3.1",
- "escape-string-regexp": "^4.0.0"
- },
- "engines": {
- "node": ">=5"
- }
- },
- "node_modules/pm2-axon-rpc": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz",
- "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.1"
- },
- "engines": {
- "node": ">=5"
- }
- },
- "node_modules/pm2-axon-rpc/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/pm2-axon-rpc/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/pm2-axon/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/pm2-axon/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/pm2-deploy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz",
- "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==",
- "license": "MIT",
- "dependencies": {
- "run-series": "^1.1.8",
- "tv4": "^1.3.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/pm2-multimeter": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz",
- "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==",
- "license": "MIT/X11",
- "dependencies": {
- "charm": "~0.1.1"
- }
- },
- "node_modules/pm2-sysmonit": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz",
- "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==",
- "license": "Apache",
- "optional": true,
- "dependencies": {
- "async": "^3.2.0",
- "debug": "^4.3.1",
- "pidusage": "^2.0.21",
- "systeminformation": "^5.7",
- "tx2": "~1.0.4"
- }
- },
- "node_modules/pm2-sysmonit/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/pm2-sysmonit/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/pm2-sysmonit/node_modules/pidusage": {
- "version": "2.0.21",
- "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz",
- "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "safe-buffer": "^5.2.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pm2/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/pm2/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/pm2/node_modules/sprintf-js": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
- "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
- "license": "BSD-3-Clause"
- },
- "node_modules/promptly": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz",
- "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==",
- "license": "MIT",
- "dependencies": {
- "read": "^1.0.4"
- }
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-agent": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz",
- "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.0.2",
- "debug": "^4.3.4",
- "http-proxy-agent": "^7.0.1",
- "https-proxy-agent": "^7.0.3",
- "lru-cache": "^7.14.1",
- "pac-proxy-agent": "^7.0.1",
- "proxy-from-env": "^1.1.0",
- "socks-proxy-agent": "^8.0.2"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/proxy-agent/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/proxy-agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "dependencies": {
- "side-channel": "^1.0.6"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/read": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
- "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
- "license": "ISC",
- "dependencies": {
- "mute-stream": "~0.0.4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-in-the-middle": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz",
- "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.1.1",
- "module-details-from-path": "^1.0.3",
- "resolve": "^1.22.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/require-in-the-middle/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/require-in-the-middle/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "license": "ISC"
- },
- "node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/run-series": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz",
- "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/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==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/sax": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
- "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
- "license": "ISC"
- },
- "node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/sentence-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz",
- "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0",
- "upper-case-first": "^1.1.2"
- }
- },
- "node_modules/serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "license": "ISC"
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/shimmer": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
- "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==",
- "license": "BSD-2-Clause"
- },
- "node_modules/side-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3",
- "side-channel-list": "^1.0.0",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-list": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-weakmap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3",
- "side-channel-map": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "license": "ISC"
- },
- "node_modules/smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "license": "MIT",
- "engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/snake-case": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz",
- "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0"
- }
- },
- "node_modules/socks": {
- "version": "2.8.4",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz",
- "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==",
- "license": "MIT",
- "dependencies": {
- "ip-address": "^9.0.5",
- "smart-buffer": "^4.2.0"
- },
- "engines": {
- "node": ">= 10.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/socks-proxy-agent": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
- "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "^4.3.4",
- "socks": "^2.8.3"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/socks-proxy-agent/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/socks-proxy-agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/sprintf-js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
- "license": "BSD-3-Clause"
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/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==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/swap-case": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz",
- "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==",
- "license": "MIT",
- "dependencies": {
- "lower-case": "^1.1.1",
- "upper-case": "^1.1.1"
- }
- },
- "node_modules/systeminformation": {
- "version": "5.25.11",
- "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.25.11.tgz",
- "integrity": "sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==",
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin",
- "linux",
- "win32",
- "freebsd",
- "openbsd",
- "netbsd",
- "sunos",
- "android"
- ],
- "bin": {
- "systeminformation": "lib/cli.js"
- },
- "engines": {
- "node": ">=8.0.0"
- },
- "funding": {
- "type": "Buy me a coffee",
- "url": "https://www.buymeacoffee.com/systeminfo"
- }
- },
- "node_modules/title-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz",
- "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0",
- "upper-case": "^1.0.3"
- }
- },
- "node_modules/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==",
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
- },
- "node_modules/tv4": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz",
- "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==",
- "license": [
- {
- "type": "Public Domain",
- "url": "http://geraintluff.github.io/tv4/LICENSE.txt"
- },
- {
- "type": "MIT",
- "url": "http://jsonary.com/LICENSE.txt"
- }
- ],
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/tx2": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz",
- "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "json-stringify-safe": "^5.0.1"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/underscore": {
- "version": "1.13.7",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
- "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
- "license": "MIT"
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/upper-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
- "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==",
- "license": "MIT"
- },
- "node_modules/upper-case-first": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz",
- "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==",
- "license": "MIT",
- "dependencies": {
- "upper-case": "^1.1.1"
- }
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/vizion": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz",
- "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==",
- "license": "Apache-2.0",
- "dependencies": {
- "async": "^2.6.3",
- "git-node-fs": "^1.0.0",
- "ini": "^1.3.5",
- "js-git": "^0.7.8"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/vizion/node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.17.14"
- }
- },
- "node_modules/which-module": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
- "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
- "license": "ISC"
- },
- "node_modules/whois": {
- "version": "2.14.2",
- "resolved": "https://registry.npmjs.org/whois/-/whois-2.14.2.tgz",
- "integrity": "sha512-JzH7/WUC4L59hPKwc6lZ59OpeBDcG+axt9vBYeQg1DCtrlwyxTUzorhI58nEWHmN+R/RtiUi9MdQ6NE9TmPREQ==",
- "license": "FreeBSD",
- "dependencies": {
- "punycode": "^2.3.1",
- "socks": "^2.2.2",
- "underscore": "^1.9.1",
- "yargs": "^15.4.1"
- },
- "bin": {
- "whois": "bin.js"
- }
- },
- "node_modules/whois-json": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/whois-json/-/whois-json-2.0.4.tgz",
- "integrity": "sha512-ui9Qe0qS4yWtFAPw0q+QPuuH+m4vDDtoO/YtqmF00YoPMMNplhya7SqTVAxThWIVXhWHPEKajFEulegmysdlwQ==",
- "license": "MIT",
- "dependencies": {
- "change-case": "^3.0.2",
- "dedent-js": "^1.0.1",
- "html-entities": "^1.2.1",
- "whois": "^2.6.0"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "license": "ISC"
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "license": "ISC"
- },
- "node_modules/yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "license": "ISC",
- "dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
- "engines": {
- "node": ">=6"
- }
- }
- }
-}
diff --git a/package.json b/package.json
deleted file mode 100644
index b8af57f..0000000
--- a/package.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "name": "blahaj-srv",
- "version": "1.0.0",
- "description": "scripts for blahaj.tr",
- "main": "index.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "start": "pm2 start api/status/server.js --name api_status-server",
- "restart": "pm2 restart api_status-server"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/Xargana/blahaj-srv.git"
- },
- "keywords": [],
- "author": "",
- "license": "ISC",
- "bugs": {
- "url": "https://github.com/Xargana/blahaj-srv/issues"
- },
- "homepage": "https://github.com/Xargana/blahaj-srv#readme",
- "dependencies": {
- "axios": "^1.8.4",
- "cors": "^2.8.5",
- "dotenv": "^16.4.7",
- "express": "^4.21.2",
- "nodejs": "^0.0.0",
- "ping": "^0.4.4",
- "pm2": "^6.0.5",
- "whois-json": "^2.0.4"
- }
-}
diff --git a/update.sh b/update.sh
deleted file mode 100755
index b8b4578..0000000
--- a/update.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-cd /var/server/blahaj-srv
-git commit -a -m "auto update"
-git pull origin main
-chown -R www-data:www-data /var/server/blahaj-srv
-pm2 delete api
-pm2 start ecosystem.config.js
-