From 05463814b0063b81108cd3daffe777dc52075e28 Mon Sep 17 00:00:00 2001 From: taskmgr818 Date: Sun, 3 Nov 2024 17:22:24 +0800 Subject: [PATCH] first commit --- LICENSE | 661 +++++++++++++++++++++++++++++++++++++++ README.md | 66 ++++ crack.py | 533 +++++++++++++++++++++++++++++++ main.py | 82 +++++ mousepath.json | 336 ++++++++++++++++++++ predict/__init__.py | 8 + predict/icon/__init__.py | 0 predict/icon/icon.py | 73 +++++ predict/nine/__init__.py | 0 predict/nine/icon/0.jpg | Bin 0 -> 1116 bytes predict/nine/icon/1.jpg | Bin 0 -> 979 bytes predict/nine/icon/10.jpg | Bin 0 -> 994 bytes predict/nine/icon/11.jpg | Bin 0 -> 987 bytes predict/nine/icon/12.jpg | Bin 0 -> 1037 bytes predict/nine/icon/13.jpg | Bin 0 -> 861 bytes predict/nine/icon/14.jpg | Bin 0 -> 982 bytes predict/nine/icon/15.jpg | Bin 0 -> 1188 bytes predict/nine/icon/16.jpg | Bin 0 -> 1184 bytes predict/nine/icon/17.jpg | Bin 0 -> 1064 bytes predict/nine/icon/18.jpg | Bin 0 -> 1190 bytes predict/nine/icon/19.jpg | Bin 0 -> 1052 bytes predict/nine/icon/2.jpg | Bin 0 -> 956 bytes predict/nine/icon/20.jpg | Bin 0 -> 929 bytes predict/nine/icon/21.jpg | Bin 0 -> 1011 bytes predict/nine/icon/22.jpg | Bin 0 -> 1074 bytes predict/nine/icon/23.jpg | Bin 0 -> 921 bytes predict/nine/icon/24.jpg | Bin 0 -> 1185 bytes predict/nine/icon/25.jpg | Bin 0 -> 1149 bytes predict/nine/icon/26.jpg | Bin 0 -> 1097 bytes predict/nine/icon/27.jpg | Bin 0 -> 1134 bytes predict/nine/icon/28.jpg | Bin 0 -> 998 bytes predict/nine/icon/29.jpg | Bin 0 -> 1172 bytes predict/nine/icon/3.jpg | Bin 0 -> 1017 bytes predict/nine/icon/30.jpg | Bin 0 -> 1037 bytes predict/nine/icon/31.jpg | Bin 0 -> 882 bytes predict/nine/icon/32.jpg | Bin 0 -> 1054 bytes predict/nine/icon/33.jpg | Bin 0 -> 999 bytes predict/nine/icon/34.jpg | Bin 0 -> 908 bytes predict/nine/icon/35.jpg | Bin 0 -> 990 bytes predict/nine/icon/36.jpg | Bin 0 -> 1118 bytes predict/nine/icon/37.jpg | Bin 0 -> 964 bytes predict/nine/icon/38.jpg | Bin 0 -> 890 bytes predict/nine/icon/39.jpg | Bin 0 -> 1075 bytes predict/nine/icon/4.jpg | Bin 0 -> 1127 bytes predict/nine/icon/40.jpg | Bin 0 -> 1007 bytes predict/nine/icon/41.jpg | Bin 0 -> 1143 bytes predict/nine/icon/42.jpg | Bin 0 -> 1044 bytes predict/nine/icon/43.jpg | Bin 0 -> 827 bytes predict/nine/icon/44.jpg | Bin 0 -> 922 bytes predict/nine/icon/45.jpg | Bin 0 -> 1111 bytes predict/nine/icon/46.jpg | Bin 0 -> 952 bytes predict/nine/icon/47.jpg | Bin 0 -> 1046 bytes predict/nine/icon/48.jpg | Bin 0 -> 1066 bytes predict/nine/icon/49.jpg | Bin 0 -> 955 bytes predict/nine/icon/5.jpg | Bin 0 -> 953 bytes predict/nine/icon/50.jpg | Bin 0 -> 1029 bytes predict/nine/icon/51.jpg | Bin 0 -> 1278 bytes predict/nine/icon/52.jpg | Bin 0 -> 971 bytes predict/nine/icon/53.jpg | Bin 0 -> 914 bytes predict/nine/icon/54.jpg | Bin 0 -> 875 bytes predict/nine/icon/55.jpg | Bin 0 -> 1033 bytes predict/nine/icon/56.jpg | Bin 0 -> 1196 bytes predict/nine/icon/57.jpg | Bin 0 -> 884 bytes predict/nine/icon/58.jpg | Bin 0 -> 1122 bytes predict/nine/icon/59.jpg | Bin 0 -> 858 bytes predict/nine/icon/6.jpg | Bin 0 -> 870 bytes predict/nine/icon/60.jpg | Bin 0 -> 1055 bytes predict/nine/icon/61.jpg | Bin 0 -> 1127 bytes predict/nine/icon/62.jpg | Bin 0 -> 998 bytes predict/nine/icon/63.jpg | Bin 0 -> 934 bytes predict/nine/icon/64.jpg | Bin 0 -> 1020 bytes predict/nine/icon/65.jpg | Bin 0 -> 942 bytes predict/nine/icon/66.jpg | Bin 0 -> 998 bytes predict/nine/icon/67.jpg | Bin 0 -> 973 bytes predict/nine/icon/68.jpg | Bin 0 -> 994 bytes predict/nine/icon/69.jpg | Bin 0 -> 1054 bytes predict/nine/icon/7.jpg | Bin 0 -> 980 bytes predict/nine/icon/70.jpg | Bin 0 -> 1009 bytes predict/nine/icon/71.jpg | Bin 0 -> 987 bytes predict/nine/icon/72.jpg | Bin 0 -> 1044 bytes predict/nine/icon/73.jpg | Bin 0 -> 1077 bytes predict/nine/icon/74.jpg | Bin 0 -> 1062 bytes predict/nine/icon/75.jpg | Bin 0 -> 818 bytes predict/nine/icon/76.jpg | Bin 0 -> 994 bytes predict/nine/icon/77.jpg | Bin 0 -> 1132 bytes predict/nine/icon/78.jpg | Bin 0 -> 1099 bytes predict/nine/icon/79.jpg | Bin 0 -> 1212 bytes predict/nine/icon/8.jpg | Bin 0 -> 1075 bytes predict/nine/icon/80.jpg | Bin 0 -> 1037 bytes predict/nine/icon/81.jpg | Bin 0 -> 1050 bytes predict/nine/icon/82.jpg | Bin 0 -> 998 bytes predict/nine/icon/83.jpg | Bin 0 -> 980 bytes predict/nine/icon/84.jpg | Bin 0 -> 1200 bytes predict/nine/icon/85.jpg | Bin 0 -> 1108 bytes predict/nine/icon/86.jpg | Bin 0 -> 1147 bytes predict/nine/icon/87.jpg | Bin 0 -> 958 bytes predict/nine/icon/88.jpg | Bin 0 -> 1065 bytes predict/nine/icon/89.jpg | Bin 0 -> 946 bytes predict/nine/icon/9.jpg | Bin 0 -> 906 bytes predict/nine/icon/90.jpg | Bin 0 -> 962 bytes predict/nine/nine.py | 96 ++++++ requirements.txt | 7 + train.md | 28 ++ 103 files changed, 1890 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 crack.py create mode 100644 main.py create mode 100644 mousepath.json create mode 100644 predict/__init__.py create mode 100644 predict/icon/__init__.py create mode 100644 predict/icon/icon.py create mode 100644 predict/nine/__init__.py create mode 100644 predict/nine/icon/0.jpg create mode 100644 predict/nine/icon/1.jpg create mode 100644 predict/nine/icon/10.jpg create mode 100644 predict/nine/icon/11.jpg create mode 100644 predict/nine/icon/12.jpg create mode 100644 predict/nine/icon/13.jpg create mode 100644 predict/nine/icon/14.jpg create mode 100644 predict/nine/icon/15.jpg create mode 100644 predict/nine/icon/16.jpg create mode 100644 predict/nine/icon/17.jpg create mode 100644 predict/nine/icon/18.jpg create mode 100644 predict/nine/icon/19.jpg create mode 100644 predict/nine/icon/2.jpg create mode 100644 predict/nine/icon/20.jpg create mode 100644 predict/nine/icon/21.jpg create mode 100644 predict/nine/icon/22.jpg create mode 100644 predict/nine/icon/23.jpg create mode 100644 predict/nine/icon/24.jpg create mode 100644 predict/nine/icon/25.jpg create mode 100644 predict/nine/icon/26.jpg create mode 100644 predict/nine/icon/27.jpg create mode 100644 predict/nine/icon/28.jpg create mode 100644 predict/nine/icon/29.jpg create mode 100644 predict/nine/icon/3.jpg create mode 100644 predict/nine/icon/30.jpg create mode 100644 predict/nine/icon/31.jpg create mode 100644 predict/nine/icon/32.jpg create mode 100644 predict/nine/icon/33.jpg create mode 100644 predict/nine/icon/34.jpg create mode 100644 predict/nine/icon/35.jpg create mode 100644 predict/nine/icon/36.jpg create mode 100644 predict/nine/icon/37.jpg create mode 100644 predict/nine/icon/38.jpg create mode 100644 predict/nine/icon/39.jpg create mode 100644 predict/nine/icon/4.jpg create mode 100644 predict/nine/icon/40.jpg create mode 100644 predict/nine/icon/41.jpg create mode 100644 predict/nine/icon/42.jpg create mode 100644 predict/nine/icon/43.jpg create mode 100644 predict/nine/icon/44.jpg create mode 100644 predict/nine/icon/45.jpg create mode 100644 predict/nine/icon/46.jpg create mode 100644 predict/nine/icon/47.jpg create mode 100644 predict/nine/icon/48.jpg create mode 100644 predict/nine/icon/49.jpg create mode 100644 predict/nine/icon/5.jpg create mode 100644 predict/nine/icon/50.jpg create mode 100644 predict/nine/icon/51.jpg create mode 100644 predict/nine/icon/52.jpg create mode 100644 predict/nine/icon/53.jpg create mode 100644 predict/nine/icon/54.jpg create mode 100644 predict/nine/icon/55.jpg create mode 100644 predict/nine/icon/56.jpg create mode 100644 predict/nine/icon/57.jpg create mode 100644 predict/nine/icon/58.jpg create mode 100644 predict/nine/icon/59.jpg create mode 100644 predict/nine/icon/6.jpg create mode 100644 predict/nine/icon/60.jpg create mode 100644 predict/nine/icon/61.jpg create mode 100644 predict/nine/icon/62.jpg create mode 100644 predict/nine/icon/63.jpg create mode 100644 predict/nine/icon/64.jpg create mode 100644 predict/nine/icon/65.jpg create mode 100644 predict/nine/icon/66.jpg create mode 100644 predict/nine/icon/67.jpg create mode 100644 predict/nine/icon/68.jpg create mode 100644 predict/nine/icon/69.jpg create mode 100644 predict/nine/icon/7.jpg create mode 100644 predict/nine/icon/70.jpg create mode 100644 predict/nine/icon/71.jpg create mode 100644 predict/nine/icon/72.jpg create mode 100644 predict/nine/icon/73.jpg create mode 100644 predict/nine/icon/74.jpg create mode 100644 predict/nine/icon/75.jpg create mode 100644 predict/nine/icon/76.jpg create mode 100644 predict/nine/icon/77.jpg create mode 100644 predict/nine/icon/78.jpg create mode 100644 predict/nine/icon/79.jpg create mode 100644 predict/nine/icon/8.jpg create mode 100644 predict/nine/icon/80.jpg create mode 100644 predict/nine/icon/81.jpg create mode 100644 predict/nine/icon/82.jpg create mode 100644 predict/nine/icon/83.jpg create mode 100644 predict/nine/icon/84.jpg create mode 100644 predict/nine/icon/85.jpg create mode 100644 predict/nine/icon/86.jpg create mode 100644 predict/nine/icon/87.jpg create mode 100644 predict/nine/icon/88.jpg create mode 100644 predict/nine/icon/89.jpg create mode 100644 predict/nine/icon/9.jpg create mode 100644 predict/nine/icon/90.jpg create mode 100644 predict/nine/nine.py create mode 100644 requirements.txt create mode 100644 train.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + 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 AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9502a83 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# geetest-v3-click-server +极验三代九宫格、图标点选的打码服务端 + +**本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。** + +**本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。** + +**本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。** + +# 使用方法 + +## 服务端 +* [训练模型](https://github.com/taskmgr818/MihoyoBBS-gt-server/blob/main/train.md) + +* 将resnet18.onnx、siamese.onnx分别放入predict/nine、predict/icon + +* 安装依赖 + +```commandline +pip install -r requirements.txt +``` +* 运行 + +```commandline +python3 main.py +``` + +## 调用接口 + +``` python +import httpx + +def geetest(gt, challenge): +    data = httpx.post( +        "http://127.0.0.1:10721", +        json={"gt": gt, "challenge": challenge}, +        timeout=30, +    ).json() +    if data["status"] == "success": +        return data["validate"] +    return None +``` + +成功率接近100%(1000次测试全部成功) + +# 实现思路 + +## 九宫格 +* 采用均方误差(MSE)法对小图标进行分类 +* 使用resnet18对图片进行分类 + +## 图标点选 +* 使用ddddocr进行目标检测 +* 使用孪生神经网络计算相似度 + +# 协议 +本项目遵循 AGPL-3.0 协议开源,请遵守相关协议。 + +# 鸣谢 +[ravizhan/geetest-v3-click-crack](https://github.com/ravizhan/geetest-v3-click-crack) 提供极验接口逆向 + +[taisuii/ClassificationCaptchaOcr](https://github.com/taisuii/ClassificationCaptchaOcr) 提供九宫格识别思路及模型 + +[bubbliiiing/Siamese-pytorch](https://github.com/bubbliiiing/Siamese-pytorch) 提供孪生网络模型 + +[sml2h3/ddddocr](https://github.com/sml2h3/ddddocr) 提供目标检测SDK \ No newline at end of file diff --git a/crack.py b/crack.py new file mode 100644 index 0000000..3f33aa4 --- /dev/null +++ b/crack.py @@ -0,0 +1,533 @@ +import hashlib +import json +import math +import random +import time + +import httpx +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.primitives import padding, serialization +from cryptography.hazmat.primitives.asymmetric.padding import PKCS1v15 + + +class Crack: + def __init__(self, gt=None, challenge=None): + self.pic_path = None + self.s = None + self.c = None + self.session = httpx.Client(http2=True) + self.session.headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" + } + # self.session.verify = False + self.gt = gt + self.challenge = challenge + self.aeskey = "".join( + f"{int((1 + random.random()) * 65536):04x}"[1:] for _ in range(4) + ) + public_key = """-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDB45NNFhRGWzMFPn9I7k7IexS5 +XviJR3E9Je7L/350x5d9AtwdlFH3ndXRwQwprLaptNb7fQoCebZxnhdyVl8Jr2J3 +FZGSIa75GJnK4IwNaG10iyCjYDviMYymvCtZcGWSqSGdC/Bcn2UCOiHSMwgHJSrg +Bm1Zzu+l8nSOqAurgQIDAQAB +-----END PUBLIC KEY-----""" + self.public_key = serialization.load_pem_public_key(public_key.encode()) + self.enc_key = self.public_key.encrypt(self.aeskey.encode(), PKCS1v15()).hex() + with open("mousepath.json", "r") as f: + self.mouse_path = json.loads(f.read()) + + def get_type(self) -> dict: + url = f"https://api.geetest.com/gettype.php?gt={self.gt}" + res = self.session.get(url) + return json.loads(res.text[1:-1])["data"] + + @staticmethod + def encode(input_bytes: list): + def get_char_from_index(index): + char_table = ( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()" + ) + return char_table[index] if 0 <= index < len(char_table) else "." + + def transform_value(value, bit_mask): + result = 0 + for r in range(23, -1, -1): + if (bit_mask >> r) & 1: + result = (result << 1) + ((value >> r) & 1) + return result + + encoded_string = "" + padding = "" + input_length = len(input_bytes) + for i in range(0, input_length, 3): + chunk_length = min(3, input_length - i) + chunk = input_bytes[i : i + chunk_length] + if chunk_length == 3: + value = (chunk[0] << 16) + (chunk[1] << 8) + chunk[2] + encoded_string += ( + get_char_from_index(transform_value(value, 7274496)) + + get_char_from_index(transform_value(value, 9483264)) + + get_char_from_index(transform_value(value, 19220)) + + get_char_from_index(transform_value(value, 235)) + ) + elif chunk_length == 2: + value = (chunk[0] << 16) + (chunk[1] << 8) + encoded_string += ( + get_char_from_index(transform_value(value, 7274496)) + + get_char_from_index(transform_value(value, 9483264)) + + get_char_from_index(transform_value(value, 19220)) + ) + padding = "." + elif chunk_length == 1: + value = chunk[0] << 16 + encoded_string += get_char_from_index( + transform_value(value, 7274496) + ) + get_char_from_index(transform_value(value, 9483264)) + padding = ".." + return encoded_string + padding + + @staticmethod + def MD5(text: str): + return hashlib.md5(text.encode()).hexdigest() + + @staticmethod + def encode_mouse_path(path: list, c: list, s: str): + def preprocess(path: list): + def BFIQ(e): + t = 32767 + if not isinstance(e, int): + return e + else: + if t < e: + e = t + elif e < -t: + e = -t + return round(e) + + def BGAB(e): + t = "" + n = 0 + len(e or []) + while n < len(e) and not t: + if e[n]: + t = e[n][4] + n += 1 + if not t: + return e + r = "" + i = ["mouse", "touch", "pointer", "MSPointer"] + for s in range(len(i)): + if t.startswith(i[s]): + r = i[s] + _ = list(e) + for a in range(len(_) - 1, -1, -1): + c = _[a] + l = c[0] + if l in ["move", "down", "up"]: + value = c[4] or "" + if not value.startswith(r): + _.pop(a) + return _ + + t = 0 + n = 0 + r = [] + s = 0 + if len(path) <= 0: + return [] + o = None + _ = None + a = BGAB(path) + c = len(a) + for l in range(0 if c < 300 else c - 300, c): + u = a[l] + h = u[0] + if h in ["down", "move", "up", "scroll"]: + if not o: + o = u + _ = u + r.append([h, [u[1] - t, u[2] - n], BFIQ(u[3] - s if s else s)]) + t = u[1] + n = u[2] + s = u[3] + elif h in ["blur", "focus", "unload"]: + r.append([h, BFIQ(u[1] - s if s else s)]) + s = u[1] + return r + + def process(prepared_path: list): + h = { + "move": 0, + "down": 1, + "up": 2, + "scroll": 3, + "focus": 4, + "blur": 5, + "unload": 6, + "unknown": 7, + } + + def p(e, t): + n = bin(e)[2:] + r = "" + i = len(n) + 1 + while i <= t: + i += 1 + r += "0" + return r + n + + def d(e): + t = [] + n = len(e) + r = 0 + while r < n: + i = e[r] + s = 0 + while True: + if s >= 16: + break + o = r + s + 1 + if o >= n: + break + if e[o] != i: + break + s += 1 + r += 1 + s + _ = h[i] + if s != 0: + t.append(_ | 8) + t.append(s - 1) + else: + t.append(_) + a = p(n | 32768, 16) + c = "" + for l in range(len(t)): + c += p(t[l], 4) + return a + c + + def g(e, tt): + def temp1(e1): + n = len(e) + r = 0 + i = [] + while r < n: + s = 1 + o = e[r] + _ = abs(o) + while True: + if n <= r + s: + break + if e[r + s] != o: + break + if (_ >= 127) or (s >= 127): + break + s += 1 + if s > 1: + i.append((49152 if o < 0 else 32768) | s << 7 | _) + else: + i.append(o) + r += s + return i + + e = temp1(e) + + r = [] + i = [] + + def n(e, t): + return 0 if e == 0 else math.log(e) / math.log(t) + + for temp in e: + t = math.ceil(n(abs(temp) + 1, 16)) + if t == 0: + t = 1 + r.append(p(t - 1, 2)) + i.append(p(abs(temp), t * 4)) + + s = "".join(r) + o = "".join(i) + + def temp2(t): + return t != 0 and t >> 15 != 1 + + def temp3(e1): + n = [] + + def temp(e2): + if temp2(e2): + n.append(e2) + + for r in range(len(e1)): + temp(e1[r]) + return n + + def temp4(t): + if t < 0: + return "1" + else: + return "0" + + if tt: + n = [] + e1 = temp3(e) + for r in range(len(e1)): + n.append(temp4(e1[r])) + n = "".join(n) + else: + n = "" + return p(len(e) | 32768, 16) + s + o + n + + def u(e): + t = "" + n = len(e) // 6 + for r in range(n): + t += "()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"[ + int(e[6 * r : 6 * (r + 1)], 2) + ] + return t + + t = [] + n = [] + r = [] + i = [] + for a in range(len(prepared_path)): + _ = prepared_path[a] + a = len(_) + t.append(_[0]) + n.append(_[1] if a == 2 else _[2]) + if a == 3: + r.append(_[1][0]) + i.append(_[1][1]) + c = d(t) + g(n, False) + g(r, True) + g(i, True) + l = len(c) + if l % 6 != 0: + c += p(0, 6 - l % 6) + return u(c) + + def postprocess(e, t, n): + i = 0 + s = e + o = t[0] + _ = t[2] + a = t[4] + while True: + r = n[i : i + 2] + if not r: + break + i += 2 + c = int(r, 16) + l = chr(c) + u = (o * c * c + _ * c + a) % len(e) + s = s[:u] + l + s[u:] + return s + + return postprocess(process(preprocess(path)), c, s) + + def aes_encrypt(self, content: str): + cipher = Cipher( + algorithms.AES(self.aeskey.encode()), modes.CBC(b"0000000000000000") + ) + encryptor = cipher.encryptor() + padder = padding.PKCS7(128).padder() + padded_data = padder.update(content.encode()) + padded_data += padder.finalize() + ct = encryptor.update(padded_data) + encryptor.finalize() + return ct + + def get_c_s(self): + o = { + "gt": self.gt, + "challenge": self.challenge, + "offline": False, + "new_captcha": True, + "product": "embed", + "width": "300px", + "https": True, + "protocol": "https://", + } + o.update(self.get_type()) + o.update( + { + "cc": 16, + "ww": True, + "i": "-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1", + } + ) + o = json.dumps(o, separators=(",", ":")) + # print(o) + ct = self.aes_encrypt(o) + s = [] + for byte in ct: + s.append(byte) + i = self.encode(s) + r = self.enc_key + w = i + r + params = { + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "pt": 0, + "client_type": "web", + "callback": "geetest_" + str(int(round(time.time() * 1000))), + "w": w, + } + resp = self.session.get("https://api.geetest.com/get.php", params=params).text + # print(resp) + data = json.loads(resp[22:-1])["data"] + self.c = data["c"] + self.s = data["s"] + return data["c"], data["s"] + + def gettype(self): + url = f"https://api.geetest.com/gettype.php?gt={self.gt}&callback=geetest_{str(int(round(time.time() * 1000)))}" + return self.session.get(url).text + + def ajax(self): + def transform(e, t, n): + if not t or not n: + return e + o = 0 + i = list(e) + s = t[0] + a = t[2] + b = t[4] + while o < len(n): + r = n[o : o + 2] + o += 2 + c = int(r, 16) + l = chr(c) + u = (s * c * c + a * c + b) % len(i) + i.insert(u, l) + return "".join(i) + + mouse_path = [ + ["move", 385, 313, 1724572150164, "pointermove"], + ["move", 385, 315, 1724572150166, "pointermove"], + ["move", 386, 315, 1724572150174, "pointermove"], + ["move", 387, 315, 1724572150182, "pointermove"], + ["move", 387, 316, 1724572150188, "pointermove"], + ["move", 388, 316, 1724572150204, "pointermove"], + ["move", 388, 317, 1724572150218, "pointermove"], + ["down", 388, 317, 1724572150586, "pointerdown"], + ["focus", 1724572150587], + ["up", 388, 317, 1724572150632, "pointerup"], + ] + tt = transform( + self.encode_mouse_path(mouse_path, self.c, self.s), self.c, self.s + ) + rp = self.MD5(self.gt + self.challenge + self.s) + temp1 = ( + """"lang":"zh-cn","type":"fullpage","tt":"%s","light":"DIV_0","s":"c7c3e21112fe4f741921cb3e4ff9f7cb","h":"321f9af1e098233dbd03f250fd2b5e21","hh":"39bd9cad9e425c3a8f51610fd506e3b3","hi":"09eb21b3ae9542a9bc1e8b63b3d9a467","vip_order":-1,"ct":-1,"ep":{"v":"9.1.9-dbjg5z","te":false,"me":true,"ven":"Google Inc. (Intel)","ren":"ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)","fp":["scroll",0,1602,1724571628498,null],"lp":["up",386,217,1724571629854,"pointerup"],"em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0},"tm":{"a":1724571567311,"b":1724571567549,"c":1724571567562,"d":0,"e":0,"f":1724571567312,"g":1724571567312,"h":1724571567312,"i":1724571567317,"j":1724571567423,"k":1724571567330,"l":1724571567423,"m":1724571567545,"n":1724571567547,"o":1724571567569,"p":1724571568259,"q":1724571568259,"r":1724571568261,"s":1724571570378,"t":1724571570378,"u":1724571570380},"dnf":"dnf","by":0},"passtime":1600,"rp":"%s",""" + % (tt, rp) + ) + r = "{" + temp1 + '"captcha_token":"1198034057","du6o":"eyjf7nne"}' + # print(r) + ct = self.aes_encrypt(r) + s = [byte for byte in ct] + w = self.encode(s) + params = { + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "pt": 0, + "client_type": "web", + "callback": "geetest_" + str(int(round(time.time() * 1000))), + "w": w, + } + resp = self.session.get("https://api.geetest.com/ajax.php", params=params).text + return json.loads(resp[22:-1])["data"] + + def get_pic(self, retry): + params = { + "type": "click", + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "callback": "geetest_" + str(int(round(time.time() * 1000))), + } + if retry == 0: + url = "https://api.geevisit.com/get.php" + params.update( + { + "is_next": "true", + "https": "true", + "protocol": "https://", + "offline": "false", + "product": "float", + "api_server": "api.geevisit.com", + "isPC": True, + "autoReset": True, + "width": "100%", + } + ) + else: + url = "https://api.geetest.com/refresh.php" + resp = self.session.get(url, params=params).text + data = json.loads(resp[22:-1])["data"] + self.pic_path = data["pic"] + pic_url = "https://" + data["image_servers"][0][:-1] + data["pic"] + return data["pic_type"], self.session.get(pic_url).content + + def verify(self, points: list): + u = self.enc_key + o = { + "lang": "zh-cn", + "passtime": 1600, + "a": ",".join(points), + "pic": self.pic_path, + "tt": self.encode_mouse_path(self.mouse_path, self.c, self.s), + "ep": { + "ca": [ + {"x": 524, "y": 209, "t": 0, "dt": 1819}, + {"x": 558, "y": 299, "t": 0, "dt": 428}, + {"x": 563, "y": 95, "t": 0, "dt": 952}, + {"x": 670, "y": 407, "t": 3, "dt": 892}, + ], + "v": "3.1.0", + "$_FB": False, + "me": True, + "tm": { + "a": 1724585496403, + "b": 1724585496605, + "c": 1724585496613, + "d": 0, + "e": 0, + "f": 1724585496404, + "g": 1724585496404, + "h": 1724585496404, + "i": 1724585496404, + "j": 1724585496404, + "k": 0, + "l": 1724585496413, + "m": 1724585496601, + "n": 1724585496603, + "o": 1724585496618, + "p": 1724585496749, + "q": 1724585496749, + "r": 1724585496751, + "s": 1724585498068, + "t": 1724585498068, + "u": 1724585498069, + }, + }, + "h9s9": "1816378497", + } + o["rp"] = self.MD5(self.gt + self.challenge + str(o["passtime"])) + o = json.dumps(o, separators=(",", ":")) + # print(o) + ct = self.aes_encrypt(o) + s = [] + for byte in ct: + s.append(byte) + p = self.encode(s) + w = p + u + params = { + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "pt": 0, + "client_type": "web", + "w": w, + } + resp = self.session.get("https://api.geevisit.com/ajax.php", params=params).text + return resp[1:-1] diff --git a/main.py b/main.py new file mode 100644 index 0000000..cb778d3 --- /dev/null +++ b/main.py @@ -0,0 +1,82 @@ +import json +import os +import time +from crack import Crack +import predict + +from flask import Flask, request, jsonify + +app = Flask(__name__) + + +stats_file = "stats.json" + +if not os.path.exists(stats_file): + with open(stats_file, "w") as f: + json.dump({"total": 0, "success": 0, "failure": 0, "error": 0}, f) + + +def read_stats(): + with open(stats_file, "r") as f: + return json.load(f) + + +def update_stats(msg): + stats = read_stats() + stats[msg] += 1 + stats["total"] += 1 + with open(stats_file, "w") as f: + json.dump(stats, f) + + +@app.route("/statistic", methods=["get"]) +def statistic(): + stats = read_stats() + return f"调用{stats['total']}次,成功{stats['success']}次,失败{stats['failure']}次,错误{stats['error']}次" + + +@app.route("/", methods=["POST"]) +def handle_post(): + data = request.get_json() + if "gt" in data and "challenge" in data: + crack = Crack(data["gt"], data["challenge"]) + crack.get_type() + crack.get_c_s() + crack.ajax() + for retry in range(6): + a = [] + type, image = crack.get_pic(retry) + t = time.time() + if type == "nine": + points = predict.nine(image) + for x, y in points: + a.append(f"{x}_{y}") + elif type == "icon": + points = predict.icon(image) + for x, y in points: + left = round(x / 333 * 10000) + top = round(y / 333 * 10000) + a.append(f"{left}_{top}") + else: + update_stats("error") + return jsonify({"status": "error", "msg": "unsupported type"}) + wait_time = t + 2 - time.time() + if wait_time > 0: + time.sleep(wait_time) + res = eval(crack.verify(a)) + if res["data"]["result"] == "success": + update_stats("success") + return jsonify( + {"status": "success", "validate": res["data"]["validate"]} + ) + update_stats("failure") + return jsonify({"status": "failed"}) + else: + return ( + jsonify({"status": "error", "message": "Missing 'gt' or 'challenge'"}), + 400, + ) + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=10721) diff --git a/mousepath.json b/mousepath.json new file mode 100644 index 0000000..3e6aadb --- /dev/null +++ b/mousepath.json @@ -0,0 +1,336 @@ +[ + ["move", 170, 514, 1721639139496, "pointermove"], + ["move", 171, 514, 1721639139518, "pointermove"], + ["move", 172, 514, 1721639139564, "pointermove"], + ["move", 174, 514, 1721639139578, "pointermove"], + ["move", 174, 514, 1721639139586, "pointermove"], + ["move", 175, 514, 1721639139646, "pointermove"], + ["move", 178, 514, 1721639139651, "pointermove"], + ["move", 177, 513, 1721639139652, "mousemove"], + ["move", 179, 514, 1721639139660, "pointermove"], + ["move", 182, 514, 1721639139676, "pointermove"], + ["move", 186, 514, 1721639139682, "pointermove"], + ["move", 190, 514, 1721639139690, "pointermove"], + ["move", 195, 514, 1721639139697, "pointermove"], + ["move", 195, 513, 1721639139698, "mousemove"], + ["move", 202, 514, 1721639139705, "pointermove"], + ["move", 210, 514, 1721639139712, "pointermove"], + ["move", 218, 514, 1721639139719, "pointermove"], + ["move", 230, 513, 1721639139727, "pointermove"], + ["move", 242, 512, 1721639139735, "pointermove"], + ["move", 254, 510, 1721639139741, "pointermove"], + ["move", 263, 507, 1721639139749, "pointermove"], + ["move", 263, 507, 1721639139750, "mousemove"], + ["move", 274, 504, 1721639139757, "pointermove"], + ["move", 283, 503, 1721639139765, "pointermove"], + ["move", 283, 503, 1721639139766, "mousemove"], + ["move", 292, 501, 1721639139772, "pointermove"], + ["move", 302, 500, 1721639139779, "pointermove"], + ["move", 310, 500, 1721639139787, "pointermove"], + ["move", 316, 499, 1721639139795, "pointermove"], + ["move", 316, 499, 1721639139796, "mousemove"], + ["move", 322, 498, 1721639139801, "pointermove"], + ["move", 326, 498, 1721639139810, "pointermove"], + ["move", 328, 497, 1721639139817, "pointermove"], + ["move", 330, 497, 1721639139825, "pointermove"], + ["move", 331, 497, 1721639139831, "pointermove"], + ["move", 332, 497, 1721639139839, "pointermove"], + ["move", 334, 496, 1721639139856, "pointermove"], + ["move", 335, 496, 1721639139861, "pointermove"], + ["move", 336, 496, 1721639139869, "pointermove"], + ["move", 336, 496, 1721639139870, "mousemove"], + ["move", 338, 496, 1721639139886, "pointermove"], + ["move", 339, 496, 1721639139891, "pointermove"], + ["move", 342, 495, 1721639139900, "pointermove"], + ["move", 346, 495, 1721639139907, "pointermove"], + ["move", 350, 494, 1721639139916, "pointermove"], + ["move", 354, 493, 1721639139921, "pointermove"], + ["move", 359, 493, 1721639139929, "pointermove"], + ["move", 359, 493, 1721639139930, "mousemove"], + ["move", 364, 492, 1721639139937, "pointermove"], + ["move", 370, 491, 1721639139946, "pointermove"], + ["move", 375, 490, 1721639139951, "pointermove"], + ["move", 382, 489, 1721639139959, "pointermove"], + ["move", 387, 488, 1721639139967, "pointermove"], + ["move", 394, 487, 1721639139975, "pointermove"], + ["move", 400, 487, 1721639139981, "pointermove"], + ["move", 406, 486, 1721639139989, "pointermove"], + ["move", 411, 485, 1721639139997, "pointermove"], + ["move", 415, 483, 1721639140006, "pointermove"], + ["move", 419, 482, 1721639140011, "pointermove"], + ["move", 422, 481, 1721639140019, "pointermove"], + ["move", 426, 480, 1721639140028, "pointermove"], + ["move", 427, 479, 1721639140041, "pointermove"], + ["move", 430, 478, 1721639140050, "pointermove"], + ["move", 430, 477, 1721639140057, "pointermove"], + ["move", 431, 476, 1721639140066, "pointermove"], + ["move", 431, 475, 1721639140072, "pointermove"], + ["move", 431, 474, 1721639140088, "pointermove"], + ["move", 431, 472, 1721639140102, "pointermove"], + ["move", 431, 471, 1721639140110, "pointermove"], + ["move", 431, 469, 1721639140118, "pointermove"], + ["move", 431, 468, 1721639140126, "pointermove"], + ["move", 431, 466, 1721639140132, "pointermove"], + ["move", 431, 464, 1721639140148, "pointermove"], + ["move", 431, 462, 1721639140156, "pointermove"], + ["move", 431, 460, 1721639140186, "pointermove"], + ["move", 431, 459, 1721639140261, "pointermove"], + ["move", 432, 460, 1721639140530, "pointermove"], + ["move", 432, 462, 1721639140538, "pointermove"], + ["move", 434, 462, 1721639140546, "pointermove"], + ["move", 434, 463, 1721639140552, "pointermove"], + ["move", 432, 464, 1721639140912, "pointermove"], + ["move", 429, 466, 1721639140920, "pointermove"], + ["move", 426, 467, 1721639140928, "pointermove"], + ["move", 422, 470, 1721639140934, "pointermove"], + ["move", 417, 471, 1721639140942, "pointermove"], + ["move", 413, 472, 1721639140950, "pointermove"], + ["move", 408, 474, 1721639140964, "pointermove"], + ["move", 404, 475, 1721639140972, "pointermove"], + ["move", 399, 475, 1721639140980, "pointermove"], + ["move", 395, 476, 1721639140988, "pointermove"], + ["move", 390, 478, 1721639140994, "pointermove"], + ["move", 386, 478, 1721639141002, "pointermove"], + ["move", 381, 479, 1721639141010, "pointermove"], + ["move", 376, 479, 1721639141018, "pointermove"], + ["move", 370, 479, 1721639141024, "pointermove"], + ["move", 364, 479, 1721639141032, "pointermove"], + ["move", 357, 479, 1721639141040, "pointermove"], + ["move", 352, 479, 1721639141048, "pointermove"], + ["move", 347, 479, 1721639141054, "pointermove"], + ["move", 342, 479, 1721639141062, "pointermove"], + ["move", 339, 478, 1721639141070, "pointermove"], + ["move", 336, 478, 1721639141078, "pointermove"], + ["move", 334, 478, 1721639141084, "pointermove"], + ["move", 333, 478, 1721639141100, "pointermove"], + ["move", 332, 479, 1721639141138, "pointermove"], + ["move", 331, 479, 1721639141152, "pointermove"], + ["move", 330, 479, 1721639141160, "pointermove"], + ["move", 329, 480, 1721639141168, "pointermove"], + ["move", 328, 482, 1721639141182, "pointermove"], + ["move", 327, 483, 1721639141198, "pointermove"], + ["move", 326, 483, 1721639141204, "pointermove"], + ["move", 324, 484, 1721639141212, "pointermove"], + ["move", 322, 486, 1721639141220, "pointermove"], + ["move", 319, 487, 1721639141228, "pointermove"], + ["move", 316, 488, 1721639141234, "pointermove"], + ["move", 313, 491, 1721639141242, "pointermove"], + ["move", 310, 494, 1721639141250, "pointermove"], + ["move", 306, 495, 1721639141258, "pointermove"], + ["move", 304, 495, 1721639141264, "pointermove"], + ["move", 301, 498, 1721639141272, "pointermove"], + ["move", 299, 499, 1721639141280, "pointermove"], + ["move", 297, 499, 1721639141288, "pointermove"], + ["move", 295, 499, 1721639141294, "pointermove"], + ["move", 293, 499, 1721639141302, "pointermove"], + ["move", 292, 500, 1721639141310, "pointermove"], + ["move", 291, 500, 1721639141324, "pointermove"], + ["down", 291, 500, 1721639141543, "pointerdown"], + ["up", 291, 500, 1721639141580, "pointerup"], + ["move", 294, 500, 1721639141654, "pointermove"], + ["move", 299, 500, 1721639141662, "pointermove"], + ["move", 306, 500, 1721639141670, "pointermove"], + ["move", 314, 499, 1721639141678, "pointermove"], + ["move", 323, 498, 1721639141684, "pointermove"], + ["move", 334, 497, 1721639141692, "pointermove"], + ["move", 344, 495, 1721639141708, "pointermove"], + ["move", 356, 493, 1721639141714, "pointermove"], + ["move", 367, 491, 1721639141722, "pointermove"], + ["move", 378, 489, 1721639141730, "pointermove"], + ["move", 387, 487, 1721639141738, "pointermove"], + ["move", 395, 485, 1721639141744, "pointermove"], + ["move", 402, 483, 1721639141752, "pointermove"], + ["move", 407, 482, 1721639141760, "pointermove"], + ["move", 410, 481, 1721639141768, "pointermove"], + ["move", 412, 480, 1721639141774, "pointermove"], + ["move", 414, 479, 1721639141924, "pointermove"], + ["move", 415, 479, 1721639141932, "pointermove"], + ["move", 416, 478, 1721639141940, "pointermove"], + ["move", 419, 477, 1721639141949, "pointermove"], + ["move", 422, 475, 1721639141954, "pointermove"], + ["move", 426, 475, 1721639141962, "pointermove"], + ["move", 430, 473, 1721639141970, "pointermove"], + ["move", 434, 472, 1721639141978, "pointermove"], + ["move", 436, 470, 1721639141984, "pointermove"], + ["move", 440, 469, 1721639141992, "pointermove"], + ["move", 443, 468, 1721639142000, "pointermove"], + ["move", 446, 467, 1721639142008, "pointermove"], + ["move", 450, 466, 1721639142014, "pointermove"], + ["move", 450, 466, 1721639142022, "pointermove"], + ["move", 451, 466, 1721639142030, "pointermove"], + ["move", 452, 466, 1721639142038, "pointermove"], + ["move", 454, 466, 1721639142044, "pointermove"], + ["down", 454, 466, 1721639142082, "pointerdown"], + ["up", 454, 466, 1721639142134, "pointerup"], + ["move", 454, 467, 1721639142194, "pointermove"], + ["move", 454, 471, 1721639142202, "pointermove"], + ["move", 451, 475, 1721639142210, "pointermove"], + ["move", 448, 479, 1721639142216, "pointermove"], + ["move", 444, 483, 1721639142224, "pointermove"], + ["move", 439, 488, 1721639142232, "pointermove"], + ["move", 434, 494, 1721639142240, "pointermove"], + ["move", 429, 499, 1721639142246, "pointermove"], + ["move", 424, 503, 1721639142262, "pointermove"], + ["move", 419, 508, 1721639142270, "pointermove"], + ["move", 415, 512, 1721639142276, "pointermove"], + ["move", 411, 516, 1721639142284, "pointermove"], + ["move", 407, 520, 1721639142292, "pointermove"], + ["move", 404, 524, 1721639142300, "pointermove"], + ["move", 402, 527, 1721639142306, "pointermove"], + ["move", 399, 530, 1721639142314, "pointermove"], + ["move", 398, 531, 1721639142322, "pointermove"], + ["move", 397, 531, 1721639142330, "pointermove"], + ["move", 396, 532, 1721639142336, "pointermove"], + ["move", 395, 534, 1721639142344, "pointermove"], + ["move", 394, 535, 1721639142352, "pointermove"], + ["move", 393, 535, 1721639142360, "pointermove"], + ["move", 392, 536, 1721639142366, "pointermove"], + ["move", 391, 538, 1721639142374, "pointermove"], + ["move", 390, 539, 1721639142382, "pointermove"], + ["move", 389, 539, 1721639142390, "pointermove"], + ["move", 387, 540, 1721639142396, "pointermove"], + ["move", 386, 542, 1721639142404, "pointermove"], + ["move", 384, 543, 1721639142412, "pointermove"], + ["move", 383, 546, 1721639142420, "pointermove"], + ["move", 381, 547, 1721639142426, "pointermove"], + ["move", 379, 550, 1721639142434, "pointermove"], + ["move", 378, 551, 1721639142450, "pointermove"], + ["move", 377, 551, 1721639142456, "pointermove"], + ["move", 376, 554, 1721639142464, "pointermove"], + ["move", 376, 555, 1721639142472, "pointermove"], + ["move", 375, 556, 1721639142480, "pointermove"], + ["move", 373, 558, 1721639142486, "pointermove"], + ["move", 372, 559, 1721639142495, "pointermove"], + ["move", 371, 562, 1721639142502, "pointermove"], + ["move", 370, 563, 1721639142511, "pointermove"], + ["move", 370, 564, 1721639142516, "pointermove"], + ["move", 369, 566, 1721639142524, "pointermove"], + ["down", 369, 566, 1721639142554, "pointerdown"], + ["up", 369, 566, 1721639142606, "pointerup"], + ["move", 369, 564, 1721639142652, "pointermove"], + ["move", 369, 562, 1721639142661, "pointermove"], + ["move", 368, 558, 1721639142666, "pointermove"], + ["move", 366, 554, 1721639142674, "pointermove"], + ["move", 363, 548, 1721639142682, "pointermove"], + ["move", 359, 541, 1721639142690, "pointermove"], + ["move", 353, 534, 1721639142696, "pointermove"], + ["move", 346, 524, 1721639142704, "pointermove"], + ["move", 337, 514, 1721639142712, "pointermove"], + ["move", 328, 505, 1721639142720, "pointermove"], + ["move", 318, 496, 1721639142726, "pointermove"], + ["move", 308, 487, 1721639142734, "pointermove"], + ["move", 299, 480, 1721639142742, "pointermove"], + ["move", 291, 474, 1721639142750, "pointermove"], + ["move", 283, 468, 1721639142756, "pointermove"], + ["move", 277, 464, 1721639142764, "pointermove"], + ["move", 273, 460, 1721639142772, "pointermove"], + ["move", 270, 457, 1721639142780, "pointermove"], + ["move", 268, 455, 1721639142786, "pointermove"], + ["move", 266, 453, 1721639142794, "pointermove"], + ["move", 265, 451, 1721639142802, "pointermove"], + ["move", 264, 448, 1721639142816, "pointermove"], + ["move", 263, 446, 1721639142824, "pointermove"], + ["move", 262, 444, 1721639142832, "pointermove"], + ["move", 262, 442, 1721639142840, "pointermove"], + ["move", 261, 440, 1721639142846, "pointermove"], + ["move", 261, 438, 1721639142854, "pointermove"], + ["move", 261, 436, 1721639142862, "pointermove"], + ["move", 261, 434, 1721639142870, "pointermove"], + ["move", 261, 432, 1721639142876, "pointermove"], + ["move", 261, 430, 1721639142884, "pointermove"], + ["move", 261, 428, 1721639142892, "pointermove"], + ["move", 261, 426, 1721639142900, "pointermove"], + ["move", 261, 424, 1721639142906, "pointermove"], + ["move", 261, 423, 1721639142914, "pointermove"], + ["move", 261, 421, 1721639142922, "pointermove"], + ["move", 261, 420, 1721639142930, "pointermove"], + ["move", 261, 418, 1721639142936, "pointermove"], + ["move", 261, 415, 1721639142952, "pointermove"], + ["move", 260, 414, 1721639142960, "pointermove"], + ["move", 259, 412, 1721639142974, "pointermove"], + ["move", 258, 411, 1721639142982, "pointermove"], + ["move", 258, 410, 1721639142990, "pointermove"], + ["move", 258, 407, 1721639143012, "pointermove"], + ["move", 257, 406, 1721639143020, "pointermove"], + ["move", 256, 404, 1721639143034, "pointermove"], + ["move", 256, 403, 1721639143042, "pointermove"], + ["move", 255, 402, 1721639143050, "pointermove"], + ["down", 255, 401, 1721639143124, "pointerdown"], + ["up", 255, 401, 1721639143192, "pointerup"], + ["move", 256, 404, 1721639143252, "pointermove"], + ["move", 258, 410, 1721639143260, "pointermove"], + ["move", 262, 415, 1721639143266, "pointermove"], + ["move", 266, 423, 1721639143274, "pointermove"], + ["move", 271, 431, 1721639143282, "pointermove"], + ["move", 276, 439, 1721639143290, "pointermove"], + ["move", 282, 448, 1721639143296, "pointermove"], + ["move", 286, 459, 1721639143304, "pointermove"], + ["move", 294, 470, 1721639143312, "pointermove"], + ["move", 300, 482, 1721639143320, "pointermove"], + ["move", 307, 492, 1721639143326, "pointermove"], + ["move", 314, 503, 1721639143334, "pointermove"], + ["move", 322, 515, 1721639143342, "pointermove"], + ["move", 330, 523, 1721639143348, "pointermove"], + ["move", 336, 535, 1721639143356, "pointermove"], + ["move", 344, 544, 1721639143372, "pointermove"], + ["move", 354, 555, 1721639143378, "pointermove"], + ["move", 362, 563, 1721639143386, "pointermove"], + ["move", 370, 572, 1721639143394, "pointermove"], + ["move", 375, 580, 1721639143402, "pointermove"], + ["move", 380, 587, 1721639143408, "pointermove"], + ["move", 386, 595, 1721639143416, "pointermove"], + ["move", 391, 600, 1721639143424, "pointermove"], + ["move", 396, 607, 1721639143433, "pointermove"], + ["move", 402, 612, 1721639143438, "pointermove"], + ["move", 406, 619, 1721639143446, "pointermove"], + ["move", 410, 624, 1721639143454, "pointermove"], + ["move", 415, 630, 1721639143462, "pointermove"], + ["move", 419, 635, 1721639143468, "pointermove"], + ["move", 422, 640, 1721639143476, "pointermove"], + ["move", 426, 644, 1721639143484, "pointermove"], + ["move", 430, 647, 1721639143492, "pointermove"], + ["move", 431, 650, 1721639143498, "pointermove"], + ["move", 434, 651, 1721639143506, "pointermove"], + ["move", 434, 652, 1721639143514, "pointermove"], + ["move", 435, 655, 1721639143522, "pointermove"], + ["move", 436, 656, 1721639143528, "pointermove"], + ["move", 436, 658, 1721639143536, "pointermove"], + ["move", 438, 659, 1721639143544, "pointermove"], + ["move", 438, 659, 1721639143552, "pointermove"], + ["move", 438, 660, 1721639143574, "pointermove"], + ["move", 439, 660, 1721639143656, "pointermove"], + ["move", 440, 662, 1721639143672, "pointermove"], + ["move", 442, 663, 1721639143678, "pointermove"], + ["move", 443, 663, 1721639143686, "pointermove"], + ["move", 444, 664, 1721639143695, "pointermove"], + ["move", 446, 666, 1721639143702, "pointermove"], + ["move", 446, 666, 1721639143708, "pointermove"], + ["move", 447, 667, 1721639143716, "pointermove"], + ["move", 447, 666, 1721639143717, "mousemove"], + ["move", 448, 667, 1721639143724, "pointermove"], + ["move", 450, 667, 1721639143732, "pointermove"], + ["move", 450, 670, 1721639143746, "pointermove"], + ["move", 452, 671, 1721639143754, "pointermove"], + ["move", 454, 672, 1721639143762, "pointermove"], + ["move", 456, 675, 1721639143768, "pointermove"], + ["move", 458, 676, 1721639143776, "pointermove"], + ["move", 460, 679, 1721639143784, "pointermove"], + ["move", 462, 680, 1721639143792, "pointermove"], + ["move", 466, 683, 1721639143798, "pointermove"], + ["move", 467, 684, 1721639143806, "pointermove"], + ["move", 470, 687, 1721639143814, "pointermove"], + ["move", 470, 688, 1721639143822, "pointermove"], + ["move", 472, 691, 1721639143828, "pointermove"], + ["move", 474, 692, 1721639143836, "pointermove"], + ["move", 475, 695, 1721639143844, "pointermove"], + ["move", 478, 696, 1721639143852, "pointermove"], + ["move", 479, 699, 1721639143858, "pointermove"], + ["move", 482, 700, 1721639143866, "pointermove"], + ["move", 482, 703, 1721639143874, "pointermove"], + ["move", 483, 703, 1721639143882, "pointermove"], + ["move", 483, 704, 1721639143888, "pointermove"], + ["move", 483, 706, 1721639143912, "pointermove"], + ["down", 483, 706, 1721639143965, "pointerdown"], + ["focus", 1721639143965], + ["up", 483, 706, 1721639144024, "pointerup"] +] \ No newline at end of file diff --git a/predict/__init__.py b/predict/__init__.py new file mode 100644 index 0000000..fe6e45b --- /dev/null +++ b/predict/__init__.py @@ -0,0 +1,8 @@ +import sys +import os + +current_dir = os.path.dirname(__file__) +sys.path.append(current_dir) + +from nine.nine import nine +from icon.icon import icon diff --git a/predict/icon/__init__.py b/predict/icon/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/predict/icon/icon.py b/predict/icon/icon.py new file mode 100644 index 0000000..30ce41d --- /dev/null +++ b/predict/icon/icon.py @@ -0,0 +1,73 @@ +import os +import ddddocr +from PIL import Image +from io import BytesIO +import numpy as np +import onnxruntime as ort + +det = ddddocr.DdddOcr(det=True, ocr=False) +current_dir = os.path.dirname(os.path.abspath(__file__)) +model_path = os.path.join(current_dir, "siamese.onnx") +Siamese = ort.InferenceSession(model_path) + + +def get_icons(image_bytes): + def remove_subicon(data): + result = [] + for i in data: + remove = False + for j in data: + if ( + i != j + and i[0] >= j[0] + and i[1] >= j[1] + and i[2] <= j[2] + and i[3] <= j[3] + ): + remove = True + if not remove: + result.append(i) + return result + + img = Image.open(BytesIO(image_bytes)) + bboxes = det.detection(image_bytes) + small_bboxes = [i for i in bboxes if i[1] > 300] + big_bboxes = [i for i in bboxes if i[1] <= 300] + small_bboxes = sorted(small_bboxes, key=lambda x: x[0]) + big_bboxes = remove_subicon(big_bboxes) + small_images = [img.crop(i) for i in small_bboxes] + big_images = [img.crop(i) for i in big_bboxes] + return big_bboxes, small_images, big_images + + +def calculate_similarity(img1, img2): + def preprocess_image(img, size=(105, 105)): + img_resized = img.resize(size) + img_normalized = np.array(img_resized) / 255.0 + img_transposed = np.transpose(img_normalized, (2, 0, 1)) + img_expanded = np.expand_dims(img_transposed, axis=0).astype(np.float32) + return img_expanded + + image_data_1 = preprocess_image(img1) + image_data_2 = preprocess_image(img2) + + inputs = {"input": image_data_1, "input.53": image_data_2} + + output = Siamese.run(None, inputs) + + output_sigmoid = 1 / (1 + np.exp(-output[0])) + similarity_score = output_sigmoid[0][0] + + return similarity_score + + +def icon(image_bytes): + big_bboxes, small_images, big_images = get_icons(image_bytes) + ans = [] + for i in small_images: + similarities = [calculate_similarity(i, j) for j in big_images] + target_bbox = big_bboxes[similarities.index(max(similarities))] + x = (target_bbox[0] + target_bbox[2]) / 2 + y = (target_bbox[1] + target_bbox[3]) / 2 + ans.append((x, y)) + return ans diff --git a/predict/nine/__init__.py b/predict/nine/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/predict/nine/icon/0.jpg b/predict/nine/icon/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e755b0e52092f61f3c13c95f9b55f6adccac6937 GIT binary patch literal 1116 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnE1u7?&aPCSdB|02dYNs5q*{Z@il_4= z#7izM$-b<2fdAT_u6pV0@?-xQ0=HjN+}y_=uXJ`|xyO>nJSd)-{x-i z;Lk>n89%3A5Gd>qbY&>ndaUBxuk4o1AD(vpXYjfb!+!k3G5+AU^Dp|A8Ce~dwwBRq z@;sjP>96GCk9M0^W_@y%y?Xi7gxgVD{zV^^b4z(VkIkxntAo_7X>*s%)w*~4O<~-T zHM+VFBhDBv*1UD(G;G zCS(K(|at>UH*5`X8x(J>4$H%{8~Eq z?431IV!Nh98%W$0un2yC;j=44_I2AeKg>O^$)7jey7qx(^z8bnn_pGSKY#Bk!Z>?b zMRd5F(zadKwu`Y+lZ>ZohM&duImoEP_j2FWZJK@Y7^N+I~5*Zc<{-# fS0sS-$KyVUNg5M_Oc+B$5*Vx*T}1-e|K9`vA%es3 literal 0 HcmV?d00001 diff --git a/predict/nine/icon/1.jpg b/predict/nine/icon/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e181ee822560540eb1d34d5443f0ca284813409 GIT binary patch literal 979 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWSeH&}_W-s-xY}+>3rO#xVt6O1J?-t>n$1;C479Gg{G3}oAdY)H-ezPyXdH3UdsdVF? z1MBr>oj+Vq!E`S@;y=T-=RU`nHzxl+ld{4>UgMqi6&t_2{|pbM_Ipe4d^d7`x+EcG z?h#G<29mnRmVa5mZ@u%~dGa<{oe9YkzdsI{aep j>F7Q8VvjHgDe)M@RPhLZ`BkF9ylYXH1_Kl`|Gxq literal 0 HcmV?d00001 diff --git a/predict/nine/icon/10.jpg b/predict/nine/icon/10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89c65c75477086a22f5d8fbe684afcb517e4933e GIT binary patch literal 994 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}mLZjV}Z4+;vQ6_Ak^rF7#OEc%L8p>yZ5q zl`h#o|7Cyuj|Q_p^QFnmmp0o&g--luXqEpkF;o8YU->8XhZ;-`Y&F)rFnz1{>|yT1 zeXUFLnDP$V&lO>GKl)l{mPw(*?bJyRMg89Huz5W1&ZC_#O=h?4*j@1^*<)#Q>aN1)Q?flR2+rIkQ^UY7j zZ~AFnm2<8<{p0zX05-Szg1dKbD_m~aC7mklu6yjfZJ)!Glut&y(cM0?ba~e<-O%U# zx5w`Kx2q33E%J6g?mx9vw?@A_r@rD>=>?9B3wCbPQx5QCtbF`lYJKg3m@RMk=I2}z z3C#I6VUbJ!i50Qr%C`2YX_ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/11.jpg b/predict/nine/icon/11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..339f0c622ebe8ccf89c9245b6fd4da4a456a0c91 GIT binary patch literal 987 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>$097S*Ne}u8_K^dXGIxaAe=HF6`QU z=S%NPIn+b87T%AWlIYM{z2`m??yNn1 zd;QHh2Dy9dzVRAIemt{nR!ddw+HTi^)LvEdh@Z@VFEMRAzdnlLde>itkG)5`l(&={ ztlqrNYt897%`d!i{&70BOS?Btii}>p^Hs&mFN+#<16@TJXY#jinO*&{ yRsEgt9qAm^Q|2F~U#)xJB literal 0 HcmV?d00001 diff --git a/predict/nine/icon/12.jpg b/predict/nine/icon/12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8c043af1aba0e6f786b32186e2444e98c41559d GIT binary patch literal 1037 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>+OGZKavgh|CFP1IO?eWnY{9b^F1}I zn2lkLUfnpVQnr*W+Uj)7_V1VAH*$aKe(F>us6aq}FY( zHa*)m`&*~E*o1XXO*h~9*>f?x-zQr!jdShVKX%hTRZcke{<)ArUCx*P42|L0<*PHV z330sFf4lZ>+k;J~R(X7Va=ou2F8VF|v1!vTMR8X?otQ8&HF&}rx5D$U!}e5Hv+aCz zdRgJ+r6K{$U+mkjS;?*ETg?0P$RyX@Tn`J1mXyhT33O$s|9=wz5JaE= literal 0 HcmV?d00001 diff --git a/predict/nine/icon/13.jpg b/predict/nine/icon/13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..341d80abf6c4f17b30792f4bd880fb356ab55572 GIT binary patch literal 861 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyD;XJ>yR0wYhkN-{}ooy;Vujag!vE zxv~6i!4tBjyk~3vag;VzS+VWSg12{=^JOiTzZ4f+Sz66yq*y&EuyDJ*)|Ummvw+5M zt*^I=&ipRyaXV08lKZ7Kp}J8w?!GiPV7nD*#QDZu`DXxI{8X7~2{u``lV+@Q_X}R? zbz zEA$AuiZHfjF3;jsJrjIFsnJ_ScZ*?a^1RA#@z>^Uvugi#sj_E%im}=Urb)-y<@Scu P_lg9t-398G|9=wz#_}{A literal 0 HcmV?d00001 diff --git a/predict/nine/icon/14.jpg b/predict/nine/icon/14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e4db9d5769075849654be4451dda3b425a2c0d7 GIT binary patch literal 982 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnYwp&4`tE-*PjAcbl6j9*?+7`!9(d)i zye)&-tLxF4f66bfhntyo=G$C8w@Ni*I#-{&Lduf|&;K*55Bc(5Qg7?yh-tFUZ>p*^ z9eECSx1E%!Dm&)?c>%xUqAm@lWy^K%NaY^cW}x%kYiF041y8N^x%Yok*Sz}dxH#%& zN1kQZU)gY;BX6~g=kV9<`5nIey0+@tDf1NO{o_#fG*V0tJ@!q=#asUOYsqgWj5C+L zFtf_-)^b{NH1g8}GtS;~jK}liw(MHow&nKiqjPRET=Y7!Bt4;UUrcjE93{|s_x z|1-q&|Ld-r75{Zp{l5FZWWF%&&MlU`yUSP5I-*3GMc&C;N?YDnXz7nnUT-D{8_oL> z!q8th|41#X2;<(+Nr$d7aC0?SmHuZ)|Ig4Ff2vD^;Wz8LyZgKzOB}Z~aQ~z>y qXNQod`usBc-^O(%few6q*CgiG6t?CFPJG}0Po*v-(3PS7|4jgcKzD2a literal 0 HcmV?d00001 diff --git a/predict/nine/icon/15.jpg b/predict/nine/icon/15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae4cd69f3bafec8f1cb92055d71bf84515971548 GIT binary patch literal 1188 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}l}%j*-9SZC#$pCc0;K%48uWht`?r7cf*` zYc_C6OKuIERLfdm5b>YkP;jl<=IXL*zsigye)oP7stc-Ou$muq;~3+j10`kuRJPAD zR=HKSG-u(qXW7Yf@68DEP*;}QDzi^})3&MCz8(8_Nrhp{=jeZLgfFCeKEJg_Z#R#C zyUMod8*gp6E%I*m_Fn~@3H~{avsSJ=p1=OsH1mu1GC#?j=KIDNFY~#{@pz1k;FYQi zY+v_WxO4ls4bOU!E=h@U_Jxaf)^q#Y&92sKu2i3?5L_tS`qOLLKjAwv&9CPkzSPC= zO3$Y|+t|ri!zrL@PGOAis@p)1$m+hm>@wYvB`$iynXKM3_3zCt`LE1hT3&kS?$*Bc z;_4;$jXS<_Pv6~_VBxC$@;*zltmTuk1?-to|EA_Y^7V>%cQ;q{3D1^p<>#tX7?0PV zsnwb`eZ|Z7dMESRZ!OvHDHpl)XPkk=J4t4)O8E~8#$jn6N~~(HOk84K9I=sKvQ_YI z{Epnan_pP6G}T7^5}nqY@$1}*l;~v>-gFiiEf89HtiU5?62H6`!__U$*^gDXY!0}V zo%iM_pNn-LYAk9nSTH;I!`Z{fSNP<8dCAi&dp?}6aFdb!1KrC_5rOFs zU%!odsQ<_1uau?GF|$+Js~+pVp6AEDzDi>O-&(`UO2>>Tq B^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}mM^0*|In8m*IZ~-Q2a@ntx8LT=OS$@!gp2%${rFEDv0(1v};+U;aAu`oXk^%vn|U zmKU4XPOi+bzZ-aIW!623D>`o_ZpV18iPShVP5gPa;C}|6`>VDuvyYp?c>6(MjDD-> z#Ps6q<+D50FTD?$&6#R%z8 zwVgfU%8j~T&;GfbeA9Vo{ll{nAD7O#9w%>no9Vh((9$~zVI?&qpM7+5@BD<^wt ztFOVmx!xh!@2z4lrrRq#zrL*EL4l#$)Q69kWzXtclK*`6+ur%Aztk@bqhIUa?338&)Y8* z5t$vkkK^Me-*vG|54*V=-aPu^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>!bs&mF~4ZW;JnpaCst&;Az!`_69x) zo2r}V^!;4G_pIyb{)dSbC96bsPIF7W6R40B{`#o9eV=ZAn07qB=DsWHCtOlBHvZZ? zxsQD-L+O@q(+AzVU*8pbl4oXvN+um~x!7@~=abWahNwli*d`bC zFN}69&97W`WIfx0lTAxL89bJJ^2u(;%gB3bmukFMpZc~x`SUdGwrTfXSx@b$bg5sh zedmLvNw(pu{DE+Q2LK>D!_`m0=lG0$_x$65ivs=B3 zZ{2g4?DUwY&;FdD_aK YUfBh%o2}7)HGILME`}EwK;r*R09UrAZ~y=R literal 0 HcmV?d00001 diff --git a/predict/nine/icon/18.jpg b/predict/nine/icon/18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3acb8b6f4959b3cf59588268014d67f207aee1b GIT binary patch literal 1190 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWjtLrnD-8Mb?_DF%#{v&Vu4^++1(tn?L zIY)i(j@%80T5tTd=CAq~SrbwkFSPXE+Klbf9&Qv}y^~Yo{OccI7w|hxe&pA)=AY}f zg~d`uDQ%3~<@QVrE7>pqLTbq(#e#2_3=ge6_4fQDPWiQQAH_QVu70??*X-)ijaoJv z=4(AE5^20~ee#dugR|ysEX}pPCAeIYeWtcW>rsjK?EO61FCU(D zN}G4=f!Kx}b&LNt|EsmlSit#D*?4>V+O<==)?R%Ru>V4v{TZ&)%@2KN-S<`b)pG21 zp`p73W5e5NmM_1oy)Tz}>6M)L)CDYOvtAc9l;587ujTsO{|tvteq_3Tx?s}Lr`9Ra zdlFXlJ5>GK!npKNzxeB4ws()UiR>Ti>I0_nrxKml0>mPGUbVXPv&ULj6u) z_*Z+D+qZsfI_waB!^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnYyRd3%=WpoZ0Gi^lU_aGaTUpk*eo~m zc;2%H6OHxi+kVVmbHm%jYT3L=C!|{y4xN1C#v60tPxZQ2Rwv3Y&x$pjpS(t3vxMXO z9i`tF@cS(4(qQCd5b|Sqmwj|k?3(*OmWRzO`SC98^4q!)L2aWsrN#Ym_pZK{Q|zkz zW4+>N?quWJI~=SgZ~36jd_Zd6w0Xi!B0HKS7v25VQpQ!D^5?kSjprZUI>?2}ZPwV{ z$Gtkb`k$~5!Eqk}k@_4u}(>cvaWLHA6^Ulc^#dqp;sscmbKi__(PBSxi=`K$d!TDRg1y3B~ zXX)D`Q>PHlRwJyCGp*qFPfV(vJ zpd@qZUcchW??blE=g7GAW>NO;By|RUGqqbs_>OPG5o&?0MW*!$^ZZW literal 0 HcmV?d00001 diff --git a/predict/nine/icon/2.jpg b/predict/nine/icon/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b023b0b7d6ecba97842882d23cfaf45fb2f53153 GIT binary patch literal 956 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn%TB5k9J}Q8s$;RvnF9954t$F?PmaI1 zWb$d>sH5{Yb+?@So9%A-@=^nr<{}p(iNh-kjKXcYG?=V+w{F=y@9DvmHnWLMUln++ zt4#a${aV?q`yDsm9lgB#=33>T4+rGm{aO58rZoA>x)Tj<94Bmhix+!dHL;Z4qSjWe zrrI~Z;Aolf_0x3+e#vPt&6~YAbK5_Kt0tK`xzDy3F1@0y;&m_Xk+X(M$%zwR&PGf= zT>h^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>&-t->-sip>{a}>#-BfL0Cm?Fnpdjwy{ep^{*@>^|&-cQe) zLi~@5F9as2_dSx#Q*BfUo2FCQW#4XV>>7G0hqra!&FI=AYf|R^XV~+6{f|140M=g% z*JKvFmP)x+%qo2>@Md{V-Pyh$rgaN!dAzH^tfD>iR3y~Sy%e&_eREsUljfex(7LMuFij_@(OcNJkg p`y<(BxA5K9Ra>e}rLP_6ne)?-f7kr$pVm$5(qLHBrNR9FCICfEXovs+ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/21.jpg b/predict/nine/icon/21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..902b33b0442d9a67b0aaaea5a895e76b17bb4dbf GIT binary patch literal 1011 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniy8zr1Wt00Jgzn~zmWIpE`OG8l_1_z zuZlQUtbdbmWzEtpJA;xY6gM~V2ROcQJh7KdU+-(Q8qBv!L_PQ3-6&psnt9R6cOJ^3(;xa8z4qBKPkYCayieK<5;Ff@ UnX2~}TnTiLz7pulQ2+lX0Fxbp-T(jq literal 0 HcmV?d00001 diff --git a/predict/nine/icon/22.jpg b/predict/nine/icon/22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed4a9ce92a30645c4aad372cc5c5e4ff95f8b726 GIT binary patch literal 1074 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}ohr!s0u0r9QjO44fKgq$YhV5``2mM=R#J;>LK&Nqr! z{Il=E>n3*gbr#C@Q8zAZb6y%9we?Q$9k=;=ZamyjHSzj_mp=m7=86P5NdCHLf77^U zLT~HTDJg4G8lHa$%C?RXzqExvE%vR~I-5yH{nagRILjIK6kfMoy>MON+s7NOeP#O3 zkkNIvC%?NglEq<#^tP1;gPha*IL=ow%)4dzpW&h0Zr|9u3KfT%HBYC@Jdl}_F2O$k zLfD+B+_hJG*xnsuopEgGp#?#`eFg5y^SxN7%}%!|I`eSZKlYt7cFMndXHzHg?V8Ec zsY<_7eBK>oTAXL8&TMhcQh6;y%B`2v<3CI|seONAb*jVc$2=(=&m}F-74N7j;Nx7h zRoMQ+gfs4r88iPg?7J_2t&8Epn%;1aS%05rth=VDyR&iX;`5R!51I_;A72jiI(PQ6 zvnq#jeHEro5^ZIxIrDg0@>H35_FC&#yf7DD`Y7_wVU}`fzJr3Sk%m126;DbJnglvX kiG_XVEG{fAecGvdYhiNI!BEHJDttwrFI`0f*#F-I0Fg7JDF6Tf literal 0 HcmV?d00001 diff --git a/predict/nine/icon/23.jpg b/predict/nine/icon/23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11b718a48d6724a56d82d8ad68e189dcf328f2d3 GIT binary patch literal 921 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVni@F&?vrnH`vzS+Dx7Z06*EB6xGv zLhZXV#4W!6Zhm!zv3>oIRkcw!bJs4I#&J?t>B*$mJrCYKmpG|>du?8Yyx%9CwEYvB zO;5(~zgr+FGs*MZo3Ae$Z%wl`)0P#Ip823Dc4Jd=Msuozs-wEC#mla{mjd+WwX1A4 z7E|AOasl_2KvxFQ-qp8mAD77yOcuJc+UN03Wl8%<|3U&CMBgp{Tw|zY#Q<-x~1 h)^#>@rOTIC?VHJW=Rr!5?OBlk)>j&f8tnhy1OQArU^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!*}o3J92cT9)%{YZV(kOHWqGJP_8mTYyG#W z=j@-buBg8sQ2+5%+Wvowj{n>L_CLcHL!T=(4%^Co^F?>eoH#WleWp^t86yEPd*kFe z{DEh+71UxQbk7*v&HNrVuQ;dAbI+!w8|Ur}%Mre9y0r0y_RO8xo@;Z~trhY(du+9^ z&m`fUDeT!yoEFM?1{Uk)&28}EcXZViS;OXsWMPPDJ>S{#N|g<3gk81sGoDR+eCxK8 zj3~R-DF&@ttE+$O|GM`7t-t-B;YHGp?3w3Q#0TvE?Q;A1r%4*y=Id)oFi3j5aA07F zXgj%#J-jk0N2lb)lL?+Cvz8Q{dXQkeS*XC8@9@ij*w<;kVV~Hq&O2mX$>KFJ>Syb} z0BcMEh&^ZGjj)zkYjzdC%H#|w-!sc? z>hywMAr&2`CUZFlX4}6j7<<=Cdn!(|&GWvH>QbS)`R2~Zrb!YS2PMzj6uP>aZMFS2 zRd>(3P45g($}D6O-d5@s#xQY0VG|#RNdUX!BZ06(oF~+*t5>8=Xz&w^5h}1{H$8v% zR>r0{@8ZNq+0pjasu%OvEG;c=y(*mK$LHpG%-B_gQAO-mi01Menc)-T?wCF)_PS`b z@zz|=+lN-jFuuPtYo6n>rOy`TuZ&yUdtmo(*FC)oz1ucvJ@qbdJj`S%x2Q{lN%Fd< jS=+6{fqnn}J&On|^XNG!=5T|nfi-~9mH{Zw{Qo8ZTb0Vw literal 0 HcmV?d00001 diff --git a/predict/nine/icon/25.jpg b/predict/nine/icon/25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9607a26b333a949f791c2f08a5dd87bbd468e6c9 GIT binary patch literal 1149 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWluU>I$N9yIJMl9^fOHV!^YFhBm=*pAm zr)`qC)8BYa((=2(Z_~Tg;{BG?y;j1P8g#cGk+nXfEjNGVDP|U)3F{>06&T$-XL&p( ztgB*{?1Zz0%kM|sI=emh%&IoSc`Z|m8;UG#iepr#O;DZVl#|$9^K!Ynjqs$3^YeZj zIQKw)^5w=@-){?xb*Fwg$-?fmwK!9E-{E~8$4@J-WM|N~ko`7qP5^tXYx0k@N1j_k z+A?iUzE!D?l>dEHVugLj!9N)bc)LEw3wX81%&z&S5g*bcvfC-7rM1BGJon`0uX0mg zhCa7btJF1}z30x~d8&K1?>e~svtyXQ&PKWB?85u@UJTub0*`IqC9M^)+B(MLetORS zyB7Cf9+u(vy7=Mdq*$?kry?UC&i0FJntW)c&E5MmCD**?InNVr<#&6wC+prf*PbSH zEIhorHBEh;*E*|&q%9>U+9p5j%`2a=_lVauN3*||TBjMO^8{dAbZBp^+$;&yi3(TeW?af|0J?O$$ zdG)}}y?UiPr%G9SEY-2OU>8=vcYpft;|t`yG#2nJ_qcp)`jXp`Z1*mzpZm{nFZs0m Nkx3bgx)}c71OOEa(R2U+ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/26.jpg b/predict/nine/icon/26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd23315af2420d3fe7164e73e38039ab6c69d8b4 GIT binary patch literal 1097 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnYt9S2I_z@c-TD(eAJ-`d|M9C}{%pdi z`fvNP%)FJg_4&-(UCS9JzV6zZU(9-k+jh^zv%y?J8Km)9>H z1Te;Be-w{x4yvx_k1(HG{H@i zTWhQycnjK_nFmpHLpr*p>#yT$V7x){Dxecs>k zD{b@YyEhLeFWd6%qGG)%gLF;@JA2ApH zXSlXTxA>r(LU;Hach++YB^B15wA4RdGjB_vgWTGO>$maq-BkU%VcSlRZzj$gWcZf@ K%@Se!e-i-H54*nr literal 0 HcmV?d00001 diff --git a/predict/nine/icon/27.jpg b/predict/nine/icon/27.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22963752cda425dad94ed669908dfcb7683b3c60 GIT binary patch literal 1134 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>+P=8_^)+ed*^VvO+p~~qR`_?uTXa{jV+S#byw+6Mxl1 z6IrG2aZQh-q`qvsd~ch2+dTm$qd&X(-b`-1eQ)Kym8*XEpShr$m#|~&_8U?^7uvt5 zORkrYWMAig{lfx&??pS$b7z%Lzw|2XdU)V{)g=d&_x2ey#q>;UJm&bgKT3mn@jAKx z4B?l*?3c|lztu8v^{pF94(;zPRW@?Jzx{FDqaEGdw&p<}pRHbYk0aGQjC1?Kj1wm; zzT^nhO=0+}esJ3NZD~O5k<)&Cy!9yJ(bUBucZ$RrzR9l*optH-VezWAsbvRC=7zCl zESvIVNn=6ijDIX?YclrfOuKaC#@!oP=AR=^TsvEw&OT#Ot_8d0>z?|_0o}KA%YKJk zE0yqy$_$wCaPv+F$%u8{o94BAk^h^;aQ8!C@PoGotF+SeoO)88^!)V|m2XUK^Jl-I zVzj2sR8v7Vbdx9hh0m@GC8dX6*>PW0yP7`h)Te7KlU}Zy^kjAIA~j`JM;Xyy7hM_b zj{T1Kux@tlveOUm+lC$qJezHytu1_|$;haBo)-6e?(8_ly|aUMc*h#f45*!4ImLg= xlgcFp?w7hWm=}Kd)?c~&{EE2yd-va3za+fk?Uato83&G4o_v?FsEgtMO#n`h(cb_7 literal 0 HcmV?d00001 diff --git a/predict/nine/icon/28.jpg b/predict/nine/icon/28.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42b3aa96cc595185a325be4d3895ccc876cb0eb9 GIT binary patch literal 998 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnEArkg+_+`htA~f2g~ZEj8y0Y`Sm)&b zRyRE2^5QG0lP;Zlt6G>UERv%U!(LG2d3O>U!||#s{~21`U6>6cD~ka34w7%7gV7SEied5PI&g-iC3o;h)t~&bB+)S+FfJD@PE%~Pq@?GlL+}w2D%Q4z2ucTNUcRoGuu*ybhOqmdp!Q zn!0uCxtgiAk^SY$mm4g;F50$Y0mnNffojg*SDOuc%y5- zsYj4^r8aw*@|6V-<~@J*X6CG*myaS-rmoXh&%J!d;$ZO&#+&Ymx3*|3YTyE5 H`~NoqtSE%v literal 0 HcmV?d00001 diff --git a/predict/nine/icon/29.jpg b/predict/nine/icon/29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33f6a40d66ab945c1316bbbe989a05faf60a6a82 GIT binary patch literal 1172 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nV`lT-}1Oxm?bcZL@n7`no${tDN|T%~8Bb0A!p?H#+b+JzsRDhs{kHZx92aczzcSA^JzI|Z z;?|5l-AR|86ivRp!Y%lf!-EU#&aOpv64&(Kezn|VzINa57vd$t&;Qoc?R);8Vf{Q; z5ytG}+x4>_oc`7`;hdOFzgq(T%UPeZK{xXJiPc+*Z(toeIli?fKUAB>qoMA z|2XqaB;P)5v)7ohI6dsioF*gdYwz0b8O(RwcJWQg!(~UMrdFRk7+ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/3.jpg b/predict/nine/icon/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8d8ed0d5f1b0d3ea13a79392e40a538e9f652b8 GIT binary patch literal 1017 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn3ns96K5F37KBIPJ{T|o#zLkk(7uHTW zIw`%zF`w&+SmGa_=QdUReskxy>g&J%VzTp!{F(HLJw_5oQXii`b=2MGKZ8yH+f$K1 z*9PtGS@)hFwOV^~s>`m@sSmdPmYi~IZU27dT8(KqJ;ds5#frCmmw3|J%m9OV{uJ^Ux1ZRDkA;vQPE<<3W+ z-W|F3-0q)WzEy^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWS^VSxt&g-u&6|*^!`($GAWkpZXXY1F$ zy!i6kr<0F#%bxvBq!<^Zw=vWl9LXIKL(RK0|G0PQHnDuGhDVHl8b@G7q*)o1Z#$Dnrh@7*Q30 zdV>t+D=*fCAKdjNswKS4cSZNk+~D5^Htd-fbDok{gbGx^{>yx|7E!J zB5V2KUzu8*zjb2w-xQgr_@7~7cIbbG^_KNtnEfy8e-eMW{`EEezYGDacf0>y{j)-= zi&N1-_Qdi~-faKeaJStXJ$-a-Qknbi|IK1Jw0G}@Js;<{?>kzWYrX!K^G_pf0h@is zUE0cim-I{KOJtlb&rKGX`c6{n%KV>Cd-pW9%C_73iZI^I65F45Id9GPoX-y{wkI!p z;8q{?{7t@%=kkbyDfeW&`!^rkSh?}O(&|=;6D%nui@F##{@wV<{+Fo#KOW`9zmt#D wf6tJ0JT4t?EnA( literal 0 HcmV?d00001 diff --git a/predict/nine/icon/31.jpg b/predict/nine/icon/31.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22991096859b420eae2a3f2aaef607fa1ae79324 GIT binary patch literal 882 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyF8z)~O$ldbf7@Nzv9O6@xo2-gmbL zo@5QbFW+yw>jHbOYr#LBj|LfQzjSY#yiMO2!^r1Gct|FCa()OBT1gW{g(_RTYMRXpBt2}#|aw|d%Ni}gJzcgnt{etwq50^V0(Z!c=F|9=wzQ{6~e literal 0 HcmV?d00001 diff --git a/predict/nine/icon/32.jpg b/predict/nine/icon/32.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f06996145de3287bdbfef883429f01ceeb9a2f9 GIT binary patch literal 1054 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnYtDv8cKcT7UQ*w=cZZ5&t|a4pSx@x_ z_M!}Czpm34w|dX@Oc$?;J=!v1N6@BE@^?L6hve1xmS&fi?|0h!n|GyM?mdSGrK!QE z`TmqG;Opw@y7x$Xcf~t}i78#KJblZXctsdazdlj&n)AK7iYt?N4$mB}&u^JtN6il3 z`BC>;b7|?f7Vi8_uJKxWJ3^Bu-=4pIZTYRaEB9Sm_m+X>EcY?Smy_qWMLu?(>3wJPp59G&a8Df$N1~f(hpCs&TCD( zCHmy!ZU0Q=md`WP=Sn7>dN7Zlon4m0gt7af^y#9UrD?%9<4=`_aEzHa^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyF8z)&)P3JusneUyL8QVW2+^Fie+gw46NR9 z_3K|5RrDWaK0Hn8Oxd<&cc&GJ7)W2&zK$- zyyU`ux8PsZ@>$wlA7TtL=V@Nqa@Oj}oy_}bT?xOp^FGnHse1CCVWKNT`PG9rD%hS~ zj@~|XePXWNttWSmu+;C>J;p3k@}T?=FodkFe@oZ;9m>{Ta-Zk)*7mQzzOU1hXMMdZ zb<3}^nX7L8XGr(+`)IpEzxm*KcAM&dA%PCE;%zm?*$-!nHL)3;Rpiw^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyD;YJ(7-y%I*x(nEu|TM}+^#MV5~- zhbB8}c?5{1Zy=%VwzL2`P>EyZ=_ID<;zcn4+$LjyUv7asTKf|}n z{~6p&8A?I|T^U3I1J51ReVS^a)zbVUfL+c+Tekd|)$1&7ownO2Jhq)Wz162uxykx- z_#fH4X@ObS0^W&z`_(e>NYBx2>#kZzepmmzF8t80&}mx@qIa6|Z}ZODZXBa~Q~G3C zOtNgl*R^Mjefk|fo{G5XUzGbUXI5rVBsbH;hPz*nGL)5oY(IJ7Buj_YrU~|18VmTX zK0Lmg!86H!!E2+Kr5m;t$|x>=*m=V8`P$r^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyF8xOTt5R7S0e7x0zGAs%q)y8@JxI zDVrXiyV1qI|qo8ca0Ty%x#&WDpWKEzN?V>e6N{W$Ov67OPA? zAbL7$*5rFHpM6tUo3<&ZQ|5s&&!11}3nU);8F`#DGGJVsUbemJPDtb8pw&xM^OMlC)`-t(W)GNw==tirIg% zSlMWcj^XzPcGdPg_JxbO7_M#E(shboPiKZda08^oS Aa{vGU literal 0 HcmV?d00001 diff --git a/predict/nine/icon/36.jpg b/predict/nine/icon/36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b61c8c8f7af91f5cdd08e625a0f78eed32e7988 GIT binary patch literal 1118 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nX-_R%|LU3T9w@1DP&3&Z415Joufq zIXZmD#=U0!m6_E_0&4~3Ty`o5FsdiZ2p$(DelO_B=`IVtBE<&3bmF!qjqir74N8I1a9h__;0IKf97)*Jou; z6CdMmO9ES`8XqjMNPT@kd0W-3XEmV(n@;90n<#c&$^ElM%yaI^Hww-ao)eaQ)}VPK z;?}F}2CiBsUL?%fSkv?{CF79}|3_Bclh2ngbx*Z&%YBj^HZNqWutxFkjfUw$UhgX8 zONuI)8#HD;JCvJts`A~Q7fIXd&7P%bPP@C)LCb-q;RxR=_7$r>dGp*7ol_KJQgrb5 z$=sz5W)?}_JYQ4KdClXRH>cS_dYA6%JLjfPGOP%k~v&!Jmo*-i)5o4IJ3OHO34-gsHdG3<}yQIP=F gwRUGBBG>Mi`t-2z^a3Mq!{iH$S1!7WF#f*@0N$6rpa1{> literal 0 HcmV?d00001 diff --git a/predict/nine/icon/37.jpg b/predict/nine/icon/37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5e5408cb56c137d7a35a86017d417657b2a122f GIT binary patch literal 964 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nW0{9aKSj0U!>5^_^pD_3Wgo9E{)j67&Q z<*3@Ookbg!`&KbL?ReieS99B~ZEI6YCcNGj_VK7Pi}&tuUAfN(!q}&tU+?oEfZegt zRV08h;#Ygen=iZnGiXA|P_@@o%Ner?=(nmt1~#?wRF7MwNMQzbv^@ayHrj z!{56r=44%4cIVi}Es3fVFh}iU0X&{*T4;Kf}>L ZSB9K}EMXUQ0v0XOIKb4Uv4H>oO#qIdcy|B* literal 0 HcmV?d00001 diff --git a/predict/nine/icon/38.jpg b/predict/nine/icon/38.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55aa3e452b029603250d71a32132f89acf477294 GIT binary patch literal 890 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyD+8A6DLDoyv2uA(okEg)OJ-u0Y-+ z=3HlaRw{&Pco|qE9+Z!IvL`rSblprGv*x*_-Mq<427Y?hgmzRg!8fb|v7dG`Nr0sz55LpuNf literal 0 HcmV?d00001 diff --git a/predict/nine/icon/39.jpg b/predict/nine/icon/39.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92f80ebe9d868c86311216f520f1678bcab1a132 GIT binary patch literal 1075 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVntD;(uoO~J`H9=4P+%;uI5x(f3jPG0- zqSHfupIJRWxU28gD{k%dojWF|c=n!cDxBPR^zbac!-4#x3Z|*)4=xq z%zN{$TdvEn>f2ay|D!?37FT|rh?fe-?;Q_3_}o(Rf=i@m($G2z0j9!0ZdhEAjL-oY6HHC80 z$_-~Y5__JM%KBB$nsnIn>KiTyHz6a#^lLY3MV^A+wpZyc8K&V zJ8v>+S^chv$Dd{XnS{MkIx2OnOH_n4l(~UDOM~(1x!6}#OFo_zF*~0-DKO%owt?ia zB5_IO%gZtrHE31_{aoa~@$56k?PageJictQp?1?Hk6D*E6}gUV64_OnP&~1T<5lr2 mjRm}Sjefm)=Na_q>S7MYNHeR|={AWCmJ)w67IiWFzXYC& literal 0 HcmV?d00001 diff --git a/predict/nine/icon/4.jpg b/predict/nine/icon/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66e1e68cc04bf4244e6016f198b3c047b3e76705 GIT binary patch literal 1127 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWF?>^l+baP$abC1NBymAYs?$bMRbe`?r zSv%oS>)nlW7~`s0j80pfw|Z3`Zf<_&+P8E6Ja!5`JiKeePtmHv>&#sYU#zoN=;uy) zbSq_=xMaBVgsiO3AssJ2N5?vqTBmHqp8olJs=}*o?VB&Vcgv@H z&LZJnQesmN<+G$D+Z}7ryXaskDH6b99(Lj0t<$-M5|boD7O#BATX`q&WWqh)t4sfO z9jvLDy`^y5Me;c-8<8_MDJMCxglC(?Z{0WDchbw{yLRm?5PRyNapp`*&h7rG_1%qMck<4gt>bnv<;t|k+J+2&#@m-nJwH)ne;jehafc-bxQJsoxNlVytUOT6xnx_b3%b-YkSufBKW zvR%_6P8+sPh-OVVI%9%?o88U@oL_2_9-Zhv~f7)5CX!x%vL3 zuH~8K>HirxPv3F=rt1*D?ZncqfJ@PpnQbSIGdx~l`(gp#rM|`NOGN_M^;f@mpIW&r zE>p_K$TjVg&4k-iJ8w)qaPWcPE9;LT@7~%3{+;{ej`b_0UpF656Z!P;w@C{V-@_|> q?hjo>7%yg8`G}cqTla0+#(PV59aWidjIDsp!Qz~e#-c8U|2F~T^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWS%NDM@`7-QL_02six>skZg~9_wXMH~dTWZ#}PAtiLPzXIp{sN%sCz4OUj#4I8h>-S?dwv1!K+kKE;b zmbr3o*D05zF+8qnT0W=AR$~F*zs*}^`Teh^ch(WrwXNr+=(GO3H!pX_X`i3EFE#Gv zymk9qOShh`c*O0w<%IdMOZPjcznOS^(wlP41d-C8?sZlH%&NJ;(O0j#Us<$m%QlZo z?>rtBD|;>c5p;xsEnJ{+`@tTj$!-F9r{2=m#Rn~qom=pvE+o)_=dz7yeg3+e_s{7*?z`hTVS2Go TbkSpZd*^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nX93_?`_9?a@XE9<*zg0^SLe)mjP7TvNr zO#9m$8OapoxieW)zei5Ev z6e^P^A9y9a@BFGCo86hxyB_;BZkAefyVCGU^92UB>gMZR#c|nTb+O0xF1u@@*bu$F zfIryW>g?w)?uC?a^It`{TFhmD47N6ivjr%(^=|kG&~Ns7QS6$`Jjr^z^L? z|Db8c?Vr4uU+!o<|2odMp6O1-zIQhc^K6Lx&#-t&ajXt=N`k^+AJ>WLwe^#&o?(7{Hs_mam{5zR^h9+xx(E&OI}*#MZ9A;(slT{y}`Fc2Z7gR8=bSI zRp+iz*=O#$V(md2IkTq1udB~5JE+3yHg|cO_F>sPAnQW6fo zoWj<1@q=H#(!Ge=Ct6JWzx`g|e&?sxq4tYA(~d6`31DAw-E@6LMEpt9tJ5c`&0s9d zx0=j*K$bgsYU0gylRyU|;8f7>1JuL3yC~!Pr^PvCO`iy^^J0qug z*V=hR$mxAmTAse^(2_s*-wSChYOv+@yp;Q;+nGo8?%nRwChhv#^VS^Sxu{En`TtD- D%x=el literal 0 HcmV?d00001 diff --git a/predict/nine/icon/42.jpg b/predict/nine/icon/42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1eb8799b4358518402cf80dea711324669b9adb4 GIT binary patch literal 1044 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnYt|OWw7WE!W!%bqs^ZF3np5PzLH=5U zX~sGy^K0w2s`Uq5neVT6V_S4cu<*yr#Z2DSGU;1gHdQnodgp0(<9phLw%tuWX%V|^ z68Ik5q&F=oc92~va$Qb?w z+P;)4TMikju0AC@rGCTDw=ewjIM&2(i#PEuQB#We?w)IL*i!x|OGD%DGYLIkwd|#L z^&ag#x}`WiGhD1_ruf;piK*J>0}d3Qvry{Jc3g4a#I0;QapDHm-z?B35B-i9IFFc+nE#E5gJ0oe+NBNs;n^baBxZU<2-uf^2 z$9wy!B8;0OtM;|#ui6q^*`Hs^$!7WJ*u&;I0u{=(y&?gug%7(cb&rTo-+p}}gMGQq z?eP9ore${0mu}=5`nfOMHKqSASC6P|U-OoAX)NIXe-i*d Cd6S0# literal 0 HcmV?d00001 diff --git a/predict/nine/icon/43.jpg b/predict/nine/icon/43.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5780f52bf430f90f9f0c236f219fb0b7a85776bb GIT binary patch literal 827 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn%X~cAocK6`|EyrPix8>&5!yR8rj0Yd$7!$`OLr9)wT8KviJU|-@_YV zS2;y^?%kq0f9`zytHHcwQI`h8;>C*P6EscZfBd-gpW*d~`WM^RYB6Xm>H^~<*Vp8|*V}S^ go6~8Yhd0`}H&6Y!>+`XPKd#*s31D;uTJ!%V0Ne~O^8f$< literal 0 HcmV?d00001 diff --git a/predict/nine/icon/44.jpg b/predict/nine/icon/44.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6e1d26fb475c5c6585905af1ce78d920bba103d GIT binary patch literal 922 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>$N_%ACaEEYr6l%WuF%IOs$^s`&{)~ z+xGpz4s!EtuZSIxeCBabf%mwqpH^sUDbE@SxfYr0XM;|wT#{6s_@t;P@|@>ttFpB# zGJ`wU_0R5+}Z|^Q@E1V0v-F^N#K6o$F%w{Ca)cFVh}>!%5Eq zJ|F35J;1T%)sg~Bn|WDx_aFMpr>SbR_spsLg^}Oh$Om5Am7D(0M)=>pg#Qc|S4N32 zo_?{9^|Fcej&*O-cA5)ru6gsAXSs5w#4*EPJr`qLMHm8IMHtU!iJMP1-Zxuy&$0OJ fhdyj_DXY{vakTr(V;^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nX~uY6sttN2#vQ*7I-K#}_R;1^cK@3ftE z$ah7>T#xcyw@^T5Th1W|YwhG`e>mjlGL&C+54)OM5^LrC`j|FXg6y72o(CAp*Z4D4 zbpI}Q4w?D6GP~pH`7rrI_xnGy?bt8(TDYS5h{20#l9Mb{J{<`D{?tbP^z!Epa$7}K z+IZ^tNSOzmI=qm5LdFV{+s=tgZ$(bKlhCT9`?`TGV*z)l%m?@4d=+7ZiX}mP%NMdF zbg9p?&aTW;%iVZn>D~SWHqZ6?eeaLjS?}F3-FH_uubtSf850(KV_C0r_k5y*q`Log z8}&!KcgHGeE-U7qqS3nDrOI6P;PFS=)ermIJ2OpRFH!j{yY2nS*}v*aPe*3m)7W>l z|7PAh)xAx3AL|(SPur=kzTfuObJ66(*^m4MG%lC?jePrPbH}cgQzsPNwTtsS`QAb9 zwrjyW-j8~VN;CIZuX}Ru=zKl5-)9>qEx+F9_)cR1-}=~1(*rN$zj%)vi(Ai!TD&kmVY{o=OM^+4uex8X#<@GX>FnFL YxmPNC{Hin=(s!zS`Ld`>gZckW0CnHLa{vGU literal 0 HcmV?d00001 diff --git a/predict/nine/icon/46.jpg b/predict/nine/icon/46.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db94981e7f7b481ba36037ab60512249397c0efe GIT binary patch literal 952 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nX7n>;qUe6my&5L1_Y5U&1kZ&7XXk@DYX zkC>gB*>o=_rKcfYf`xB}%vYNW?6IzjsVqzm=Y75}UBJ|(v4CmM>0{G=HGK4`YMWfB zqH{1;rJ_h;8@IXt9;U~3GuHdAxvi@c9b36cP=Ct2*xfsI9{THe{`;7>;|(iAh0Uas z1-$PT7Zw`t7LC~#+3~8VxWP#K(m$DszUZ&By>?crdWA*jeX7P^S{6H=YQ$!@uO30-lXSmzPZll-WoYu@|L~eb@eWW zFS9fjHE^viWxcb>E%!YO*Umf36mIXeR0leqr~Sjzx91k7m)5Q^`OlDA`(kxY=RC(_ z?m3M=LuQ?COS^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWS+N(R>yj9ydW1@)0B}---#>tVMYvaA8 zPRwHc=*Bo@rlKVKKXwP{kZ{}T)vxcT|7URc@MT#}|JTp%+hu>*6?>;Y(hQ2uj?Fr8 zBi65MTl&+^W-GI>@q$1Ug9GQ~1v?F+1cx!+Ov9FU%4Dl&+L=%k$q}J4JU> z1jnq0p`F{M+0TCZWVi3?*0o1fez7eU@rZNZIyE#TWm3okt^@TV(WWgEb(>=&ZaYfd zxBfGmxv-(f=q~^A#}2|3VZZ))ch8m#^L(=~(`NNa^GVOoC}-+km$mq^V%?XMealyF zxhK;d*!RpKC~cZ)!oH|=Y?U(2m)70-(SG=v+3WnQw>;W&l%l*CPM-WHrDqerTx(HO z<#uzUUB^Y-)O(DD8>gi*1TdRu|8=^S@nvt)y@ve3TZ) z*Z8-!)xI6ko}y=`9y#>NfO}2-?gYLM297$mKVP~sl!kh}_PG2$@6oQEo4X<({q8$` z;^2v24?dq231Gd|_UhWbUpL>bTNs&Gzo*ZLS0sQb^5*S`Xx+U_G^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWS+_!hU$$7eKdfAETg`Eg~1Es9#o=Tys|IlJsk{y>rASy%Usq<$gE8%+7ANgZ;a%TkDE0 zWxqJLAotd#dlzC){=Pk3W###^pL+QB?&#U>q`@qA+VkIyj+-_!ceS7SoqFx!4m&B6 z9(f<0iFcBJU#)lU)GNISHcoi zw#$V$CJV8~E{)(R-Y#+S>$1#E9(|u2S38t)H>@qpujD&s#LCPp?ZGS|BgL>+v?t*8 zv~L@Qf{axk_Y`o-#Uxa--eLc}C1jSj->rSizwNlFXJ7hno$m|b%mXY9#dD8K{8Myg z$hoR^@yqkw*~>S#J}aJdZuicYbL1EwuN4Vky}-c0H&x`@g;@8ecN}F-{=F$;@Hb;o cgYxDLTQ|6SM}(=C-8oQhaa1JGLH_?u0L!nStN;K2 literal 0 HcmV?d00001 diff --git a/predict/nine/icon/49.jpg b/predict/nine/icon/49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84a059badcdbfe1d798bf85732f1f6ee1cfca607 GIT binary patch literal 955 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAJnPaczJ=nYblF5uov0hKT-%Wq# zEb(A>z2kp|S0*Z3Kf2CoIQ&T4`}To-i5sWgRp#4wMCNyTmkxWZYubydBT>($O`o{f z?WU%V?=^GTkc+MjmzH^JISZfGUgg%X*;s~wz1V-9aZvh4xvlkyrTRC&#A;{X)tbEP z!Q(PMD~;p+pBU6GsMIDO4Zrn8(CFo}J5h&K=16+vObh&b|MTnK=(GBsTd(easJuH- zZpsD!KAUYTdQ-^y=FE?Z~XhZD#7rHvl5x^Is=ytPEILfEmdbn4ru zGc->fH#zfSf1}Mm6NdAwDw87aztWX<7h71ZdPd`JnM}ezi$%Lq16GMTaIrDSu2{gj zF75ll4fo>j-CeeFWwi8}%8LgzLUVW$dWw&KUev{K=W>qHr7y3mHM~s<6kOAedC2Wp P9TMokDiY`*|NkZcD=%uL literal 0 HcmV?d00001 diff --git a/predict/nine/icon/5.jpg b/predict/nine/icon/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86add46dad38da02c4d28ad26680e98b2c19696a GIT binary patch literal 953 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnYyJkuTsDa~{7QV{!QJmxTBiMCJh_0E zOZ(Iw_s27~+WJZ4lzQK`wN+Mqvb~@0QgPpd$ID+w%SrxdUv4*@Me6Kh)mKlW+NjUr<*6Bomr!IC`rCc~3| zHWy>X58M9~5&pM(|CdD#)>04u1TV;*^!h);tz9MsXP@0NUDK(|5F*o5sl4&8#-av` z{vY9SYX2GLi~MKU|MH(n{h?hS&HwyZ{`WtF|HnmL3}5BhUu=G1C);-J<&^U~=N_8V Os`BN06;Px7|C<2kr*}~R literal 0 HcmV?d00001 diff --git a/predict/nine/icon/50.jpg b/predict/nine/icon/50.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c880368800d85919562a0cb409303e85b722ffca GIT binary patch literal 1029 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWSTmOEM%5C|+U3Z&Az;40oAHJ^(lb$d3 zqtA5b)(n$uPPSydc`4_XFFg35ZVKbgi!mJ^>Q?+Y`{-`q?0+-oHh(%R|DmU%?Ye&Q zqtoq$7xfkkG5?rUKb4{MO1Sp&AI%|~u0FVA)s^(&Ux8D7z| zi?u&=Yfev<$?K>3&(CH=S6n{4J+R$3jO9N=T2Mg$xs_RVc9#;4NEMqcu2#G)V!+&V zd|C7#V+RSHUC)+2ek-LLyTGl(^u)G?Cr*nOCf}LFUhG`SM$!e4vEmy-h6-9xu>bC_Clu30x_i?QA{h6fj2848R37_)BV+wjQnQ0Lo8LF~)? qwEp!!(2h0xCw;p6=DMei+g)b66t1p%EBj(mgVigIMGf}^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}pyk9?6+1r7nTf(kvLNCWo&1>MiSFxn*}( z?)(bnBHNEILu(vaCcpf+$t|@{@=|8vn74MYs5}0+!1m;y%Eh&Jmdxs5X>JnS{@_>PtgY#*BC;gKrWc$!kh03+ zj@{xF>-3L=ZNH|~@$O&XEPMS^Mk>kAgIoLb8d7*Rs?3}7Xxo>+qVIFPv#RF^{+@Jx zSH$`6lj5Y=Z6#957w}eWt+mQNoG$u?zre_5!(&TX_nqGs?f7YO*6G~Ol0=ow+N-uM zX=&)*dga}5Mo9+Cod>*-}3I!fc;n2Z+V-T|1M`?YwDJW ztIwu(EoMtgVGViOfBNe&woIk{doKPl&FA@GI@$Nx8ovnhDYs`%25aZH u;Nx|^A^~jo<}O;g^v$fPN7`!LQf})kRxF(OY1KDo=KI&WG#2pxzX<@Ys}u(S literal 0 HcmV?d00001 diff --git a/predict/nine/icon/52.jpg b/predict/nine/icon/52.jpg new file mode 100644 index 0000000000000000000000000000000000000000..116bc97c65cbf3f676640aee891bea4c48157520 GIT binary patch literal 971 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyF8z)_AWMdAX5O=$`*pznMo0Kkyk( z-t%X-n`O>}x+#q7O)f?sxpZF3UFvIj0>d9)(axm@&9*6A-D+}cf8DL~b0_|?PT@UM z)#T3b<*W$f{=l;)VITHf_Lz92x!8IRgRSQZQ(m|G-dlgWUN-12T5zMaQ{@2<*XQ*D z{`vJQw*K9+T`1beS+uC|(?jQ68`isr-Z4Kr@xqfqmi6r0?_K4G6DA#9(k^)F#X;36 zGEHuEFJxqwvrhT_Xlbq4sb3La)>_?_yL9P=zsdT~?%YhAo$N)GCtmEd{jqZG)vc+5 zFIRtyR__&i^vUGYy&Rq#$J?@;wpM&|O2n>Rh`jBdpDT2fCz-3uf~i4uQI`gj_Uw$j zw@bF~=uK&J)p~K4V_m%ehdmo#n{(H77cXbMFZcb#H0NW_{oaT-`Lle!GD~9tU$@_7 g-ICSuo1+vxPK#S69hrPzZS6%@29ZElhWh_E0pL4zLjV8( literal 0 HcmV?d00001 diff --git a/predict/nine/icon/53.jpg b/predict/nine/icon/53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1d6ff3b1eacf17c0d061a9660b6bcb71857a873 GIT binary patch literal 914 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnE1s2wGO|Vdo5Jwu6(6VMm!&KQClva# z4qv$!?H%zvQ!w;NsB|B{+WJNQd50}>`noSQ=m&c6xz%PYU|lt<|CSu1=#oX6bN;Mx zbC-F%&#Ls`>Qa$aJ{vZ?SX2B{is8w-x9grwtly%yE+}Aai`E&#{u#Ypj<2t+y{WdU zQ`)s$b4zde`zic0s~#}z?sG5h+PUKXvZ*U(J_((2T1?cr;e@!#*EjVuR-0wcm3W(? zAHRClG}O@l`+mHB|7B5^2J`=$0CJaD5C8xG literal 0 HcmV?d00001 diff --git a/predict/nine/icon/54.jpg b/predict/nine/icon/54.jpg new file mode 100644 index 0000000000000000000000000000000000000000..415cfceaa6be63437933fc5bc273b586b0ae3091 GIT binary patch literal 875 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAJ*^kas=|3D5u=9rMJU32}ln26h z<|o)ME#4>pqm%X7!h&5r_d<#`{I+ot@~Ub&yyE-u^$75Tx&BF}`R~i~7yM`7k779XG4#oK^>enq?ln6aRk`HUal;@XiRh+tRe8tU*!S0jmp;f^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>)hi%uBo!`c(di|Z|kGV8apS>pW&#y ze!0wN2ia25nc0tI<$gWQeOs!Xxvb``%LJk7YjYVy0$mwGub6V@>K%)|y(U_U3v{3xkpKJ(kV^1)kK&)<97d_`wI z(Dt?Vyc+wYx-)O7qe$)(rj?UVSVwkEK7Nn;!bJzUiRGEBUsvCbIi}M3?~`2noU4+1 z%op8pnRs$p)LZ}E+YEO6aTN(*G;jM7-Eqm%*iQ-n&a)lE4jDKn2lQ^F;k0Jm7 literal 0 HcmV?d00001 diff --git a/predict/nine/icon/56.jpg b/predict/nine/icon/56.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76f7d72c36532b0113da355c90d524dbdd223acf GIT binary patch literal 1196 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nV!uIzD7UN$9g->a~DK4nKEr)W(}DmpB| zv_-#MTDoE8{ioaRl%C_Q+~b>+Tk>>!HnYX1`32h;JlJnmel|S!_Vx?JIukeNEpLSRJ+<&!A_CJG9aa^&H zsF|+NtL(IE^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyF8z*2tD0Et8U7yOF=NUd?8A1Y6AW zWwrM6w=(1h#vI*yy=T3l{*98=8l5M)9^QR&eBV8d1-!BOFH-v(2K1_GLRQ zE&nrcJ+FV5{-gfV=YN0sKd!V>z3o}}P%PuhhPIN4A8%Gl{&lU`%1|BNWs@m3eevzR z9rtUirS=GJcq-b?bNDCU^Or#t_J@vpcf6{aXq@%k-e!_VQS$i@&97h8b3OVeli|Pe zwf(K>TIX}qds~0i^#a0E8w>c>n+a literal 0 HcmV?d00001 diff --git a/predict/nine/icon/58.jpg b/predict/nine/icon/58.jpg new file mode 100644 index 0000000000000000000000000000000000000000..552836bc2b4b9a19385626096c2acb2666df1964 GIT binary patch literal 1122 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nY3bE|VJJ}=#KS~>be(iHxO3C8``)`YVx zI`4Vqz2c55dM0}vyxxCXalIy7aQ9}#0>_x1iRbubGd9S+O^KPc{<_XR}C$voK@c=Gm~CnYS`zJ7fp zRXSyRx&AhZ={nVa*;lG}J=QHfEVsIP)qSV+MlOL#cR#z8YX}^(o)D3rAI7|uA?wAm zbJ^4PPdebu0LL6-w|Zrj#6v#Yyz3Hw1=XP))4 zWmn9sLeJj$-e7RA=N(Iln>8Gb|o3|#^Bj0c4qg~RrYVV>?4iFze3ep!xObabd{f$*v8aJdV^M?s|C<1DqP;8t literal 0 HcmV?d00001 diff --git a/predict/nine/icon/59.jpg b/predict/nine/icon/59.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90076aac587dd3d3637b49ad6c42be7195e160a8 GIT binary patch literal 858 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}mKO=HUi6qfQnVJXGxUHm>5D)x;>Ftkkek zL|pLB5tW{g7n-m77q}-`cdfNsnVnxPy4uiacgKmiGBK8Q?;Xk}@UJb})wW!}HUHmH z{$JhGnG~wrIN#1)wg2cz9Z!ZiTrWy=EgbXoo=dM=#@a1rcRPclrLRCtsj z`$1Kps|f1^Ai?I-YYDiI#W1EPm3-aotgrQ-aV zWj;Uat8FW9e@_4R!#?WW3Wh~p8X(Nv`tkbNH7`zn-}Im1)xU35{~7qt&j0=3Z}zT5 LT?`sP{Qo8Z2PHi^ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/6.jpg b/predict/nine/icon/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a58d23b93e57122c37add5489c9eee0b2eeb8d18 GIT binary patch literal 870 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyF8z)^Pugt6qJ4!=S#c~pe)(nZ(w`1_l7N8Q@QdFcJL@ZZy3{(biSi|oHC40rwBY?yTH?tv-Cd@fCH z-R@-fSw7zJ$Cp)AX)}4QT~u;OzN~D$xcB(kqWhmO{@u%dVcwy+i3!^~maOizG5Z>6 z_xJLDhV!1bK#4C0*4|>!Sk%Rk(|S!k<8pPYYPiM8FKc*>op;}g4xSlhsq*>Bw%{Em ddr~$hq@*wUA|YGoD#Cc-qN@l)AdvC@CIAUEN;?1m literal 0 HcmV?d00001 diff --git a/predict/nine/icon/60.jpg b/predict/nine/icon/60.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b98fb572efb72a424378c9a8c3f11d4a70d0ae84 GIT binary patch literal 1055 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnEA;Yp-(2-Qvd~;c<5lzvcC`k%&xfUR zCq-QOWz6XNJ9hh@Kd%27YP-%)`_JG$_xqV{7jaGpH=N%9N)`O zB2dw#xwMzZfju>TT1t|UgJjI}mGW~%&qwLZ&vik7X}zf|yux^y>Gq~YQ!ZTTtd)n&f^$yn5&_V4tS z{m&2k|7X~5c%fvjW7oTln;EROCA)+@Xg+vcR%20v&~>N1(cQ5h9HpF2e_nUt2wU(; Q=4bZ$uV(?}?El{c08Qzh6#xJL literal 0 HcmV?d00001 diff --git a/predict/nine/icon/61.jpg b/predict/nine/icon/61.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95d5247d592b3f7047ee7d3ba953fe677a409198 GIT binary patch literal 1127 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nV!`;XjGnZ7^8*Nbho#Q}T0TJw_g+p^uB zm2BHOtx`5n+3C%h3I?7h*TqVvcONnnY!&#s?V;4iv<}aITOKcblGyclg8Q`w>si`- z!DYRf3vb2R&)LAfV^87EtLzLtA9r@xRwc~K(tgi*`%aWm)ZLidcemMJx>YIr_di2N z=>opCu9KJ7r?r({djH5{otVv`7e^P*WMkCwSLie1^RJnu!DKHiVDh`(Tt4-8Onj#L zg8nkU+RfYTuGR-`^7Zzcb#=~y3B2p}hBlr^{GuSWSxIH%mLiRmgwQEHP5fDhyE1F6 z#O}Q=*%e{Y_IzbSS)~0pBHUk z_)6SP>S|uX)&7|_Yt~j4cq%Xo8zuif@iZ07_>Ox(Uh;Yhi$K=u4x9J0J3jQ6kGKid8JN6E`I zZ%Sr&U*FkyVNb^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn%XTmExa4ta#bTW^1q@$JBG>~Xs%r18 zT@|VOMBI#%r{_0gG+?jlDCo#M+TjO$%R z0vKc7tvCI*l=Y36*#%G5CEd?BBc7$jZW7^QcRuiZUG}1NMbXPI?ce$+Sw+}i+c)2Q z!Y8+)F5{`}3xg-rM=`8k_A1o zm&O8~tsg$E(&F_G;98*7Z&<;+{q9P|3zxK4=t+J1mdq^XI>~X15XT$#q>M!krWuR6 I82;Y`09@F5FaQ7m literal 0 HcmV?d00001 diff --git a/predict/nine/icon/63.jpg b/predict/nine/icon/63.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98500c09a2ed4b3f1d320fa3492f11caf9f291ea GIT binary patch literal 934 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAvUcKVBF5j_pVsa;2?J3>E(w=JY3VP2dl5j}(kE3v-hU3!dP< zR`gjt_q$Tf^?8r@j(hhSZ{4NS@^Sm+p64=w4svr{Mdz>1uBz+IN#DOCV!FK6*Yt0J z_ZlquWnPzSTEFbF+2SH3dfr(5d;1C&0rxoLHc95DOIv2Y7k-s==|WBOOjY|b)35dq z|A}r(*!N@dqp}??X4ec>_&!NbN|{r=@ucaiD8K&HMGe=1jAV-M#VqqV*RYI1X$Q;Jf6`Qnp?)pZUk^pzE`=A1X85w|%mHr`NB( rqPqE~x-^)tmGo*|cfFjnakKA6g(vgYRB!yMwm#66K?I2F|K9`vg4$jh literal 0 HcmV?d00001 diff --git a/predict/nine/icon/64.jpg b/predict/nine/icon/64.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00b933abec985659cddc82e211990a7f25122b28 GIT binary patch literal 1020 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVntE#r%zLD{L`@|LLP3#k$OH?$KO&E*1 zJ~uv+7mT`n``%f#MIWd2>^i<}H)_;m^ZORv!vqMpa$gyhdIyHsZ$KSI)UIDS!J; zs;g{J*WJ-moqVss+Dn`HP}SUL%a_Oe-Ca2E-pdC%A35$cFtSb&Vtl?;gmHhQoqDQ2 zch=Gw8oyPVRlaLEtj&71b?x+js+YIS-Y$5fmKiJ4ZuN&&r%VSy6dG z+`b!34JLbJ@+3Nr zi%0-lZ^-`3I$J$l%&%>XapQBCSls;frK<>|>E1PB(_ZH1^AtKYb4zJ3@GlMBe9>gD g-P3ovI=T;L{`-8aLH_XN4~x1O_PdG%u>Zda00>@<6951J literal 0 HcmV?d00001 diff --git a/predict/nine/icon/65.jpg b/predict/nine/icon/65.jpg new file mode 100644 index 0000000000000000000000000000000000000000..360d93490b2ec45cfca373898f089d7ac22e8d8d GIT binary patch literal 942 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWSZCk6=W-pGtcck$i$C=sw1y=v2PLw~w z&$B1%c+d@xlVPo&Z2MRlO0I-U{bvx~W3w(qdK<$7gYM?{Cs(fBr~ISn;SAd|+kVJM zCfWQooW<~3V_jlR{?hwdWoA+_{~0o8J&IlDlEb9HGWmqeM^}cDb=^uvR&8MtT5gVV zQxE*;fB1F(&F?RwQgn@lcc$zp-2V6CoVv8VOkE5=mp+=Lu=Gm9UC#HnwwB0p{SLn( zCY|l^{7~hZNjqI{PB5O}_^LW|zwFK9>5sX;bTIUtR%1^(#rd}=d)JTfbeSmLtJm1) z>K=5nJrH1EAM7A~OT6XFTES_L?wu8SvrO{)=C@zDqPM?x%@1^76$x~Z`M3SSS>?E0 zzkRP1EqTIlUij_ZzL_%p$F_Xgt999ZQ?$3nHW$w1NuFu8p6V+XbusLA6$xPfe-i*j CSZ7ZF literal 0 HcmV?d00001 diff --git a/predict/nine/icon/66.jpg b/predict/nine/icon/66.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d90a8a0c561c92b7390aa4ee88743c984fb002c GIT binary patch literal 998 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAJtv*L@+C2Ns?|F~jZ{51<=cGD? zl3#PU*8g3+cK(bE?d==PSMQehNw)80$hjDzV;Zr3>7=`hrrmm{z%%VLg9P&*XGtF0 zgNqvUeATD2Ov=^W=$$L;$L{smqO>*6 zw7)u9C0}OhfY72?~}8;!>;5qS~k6Ubk`-W zRW#-1kK8}m%lePV`DDvfc`Iog2;H@vq5g>%gD=1Tm3d#k>Lxxh=i(`QJtbh{9O0=k zJx{7;X0if z-`FbuYYemh!8iY*`!~6X{}~)s%l~2b|FEcwVb*QGO`D6pZ7cg=%p=yN8sxs5sY_!4 H|Nol+sRe#A literal 0 HcmV?d00001 diff --git a/predict/nine/icon/67.jpg b/predict/nine/icon/67.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e65fb92959b8cd2c0eeaea23b1ac11a760eb4bef GIT binary patch literal 973 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn3np02DSOtyrMWLjCh_{bIaks?-H1`$ zxue79agqC;yu?@RRSdJbPE0?tE2sQJoB!Km<*N4ns zCEs1kXI$6Xe=o10PF-}yuhcocQrW?#ch7WuO1#lAnITVWaqF>%O_kr*>IR*;|8lz6 zs)MoDpCn%}cp`s>>)AT}oMl&eeodTr^@vyRHn&LKn7q5+D>V-E&q$FezSW?&ZstSJ z)Gm#Mn
5=_dO7jD}xqj~V{?X}Le`43ms2e-;@`tXaA8*}0a(i);N`9yVuLz^Av+dHY7Xl0O hMGjVR3YghjX)NG$;9_8AC=uBb=)fux=pg_9CIE``bIbq$ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/68.jpg b/predict/nine/icon/68.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8f5bf63b3326892811c573bbcd84daa41f34387 GIT binary patch literal 994 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVntFC|lb}O}K`}87?2c6}{@=w1m;Ht9k zDEXVG^lj7If;aO*TG$`&yWlUnIxf0&S(cpg+)`h8$L*IxPN{aiiuCeSJXhRMVEpAz z_Ug-j0*hu%iHh65{BP5{JjIF8CBgCz)$&;kFJCO`V$kmV(O8-<@=JE_=eL*dy*OET z&@$vW3t!=9skf^qeoR{V(Y$qgL&%*IeC{%>3;4W`{8PB_b#B3y?Z#)9A5A))r^K@` zUFE@p$J^``gYN#A?s>&d?r>^pO?+6R=;Bjm4_@7=xpA!Q``N1go4NlPp5N2|{UA)d zXTkRVLsGLjl7kco(f>FFLt4vrBi0V0^TP`nCz*3U9xtKh&kcti>;PJ95SL>u=tb{JtVlkfhUB8`5|D z&*ac`>)!n-y9i81=W`da^B0#Iy)|Yi-pYP`|EG6>4zh=oj&*e~t?FU0=F(WyVE_Ln E0CS{_00000 literal 0 HcmV?d00001 diff --git a/predict/nine/icon/69.jpg b/predict/nine/icon/69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f4cdf4e09992e198e38e447484600d1f2095584 GIT binary patch literal 1054 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWS%a+&8N}F9+t7N=HBWBfCyQ_Vszke<& z|83gaw4_(ie0ze>;T4Q-{LdX^Wkt{Rmi<-y9HwjavwTVAmfcUi4FV^GFY|csGVAIm zufTOB8Z%@h=DqEdJMy4ji{ZtJb#?lJ=XT8rGmk1e^hu|##&}KVw6N4S{EGfr8cg+K z^(R)YtiLWCDdhQN%{$dk{kPY#{b#V!*!Y?MQGx&8Pj*|^Kf3=@)Kvf1qij~wS`FWl z-W8`NtKK=ox+d{PTVnH$l?NVg6k$x#^toU>bI&6^-M0S>cAER2ZmJh*xZfypa$Qfb zx5VyGR}BB&zn%N|{ok`o>e3eOxNcIhh;^&w>6r^Gc6G2ZriR%Y1kPi8thV&u^-F$l zXRTZObdvwO1)=@(zm*mLXm;S8k{rER;y=Um)&B4PGn|*K-+lb)QPDW--_mD`E=1l{ zIi;^VB_T&WC#d<;gXHZw#jXtHMQ)SbE}rUoahPX~5yuy$75^C$Gv&WlU0s#NxqvQYp literal 0 HcmV?d00001 diff --git a/predict/nine/icon/7.jpg b/predict/nine/icon/7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce89718b69f02258d343de6e52646c4d3902e437 GIT binary patch literal 980 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWluio7{rEm7?k%qFm^wWaHb~8;)i|tG& z9A19YOEltm=^l1TNkI=c_bP^~{~21^UH>yII5z)3L!;(D6Mlh=B@eQ`vCM0TS^ncv z=Cy6xtx}hKioBgaO{DCI_mvguTZ^LpO0R(VD?LY<=dUa+ z7V!P+(pbQ>bG?*iwyX`i=D!)72@CsJiqhLyp}vjX6?Fk20(Q@{o|oP}JySU1(*4NYGuP&R-%ydnt$z2^hn*64 z_IyA2W!-g${|pn0z5g?;_t^i1F~lZ1pX*0<$lSyppAU&kxXcY$5`^zHn7>%m#h@*G zy(DO{byZ87)96odb)Ip*~N?ij)%R;KCdJ#n3;cQ n?c4aDfs<|JQvbxi-TCtKcJs{7<=s4Q$1P)^jw^vc;{Qzm+&Oq~ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/70.jpg b/predict/nine/icon/70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7d0f6900c3a6acdadc17251655b23c438b9673d GIT binary patch literal 1009 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWS(mUtfJD0h*by>y5nMr=@9A4OMeRjQG z_^WpGMxI+n(VMovSDLczgS}5(2;<8y;d6dGKeoLrD8g}x|I^A1YfqotA{4ss)#uC0 z{I7($t^cU?E7tGQV;^17J%RmZk|Ki2^Y`#?PyBg-eci>#TWXtg*S#!^zcqjAF-gv+ z(z|A9FuU#9{Ag?I#eJKvu%xbai3=?Jqq}2Xtr7prxaB_6G@kV?o@P49Od_>#g8PmI z{IlQXE#EWy+>Qw+esE8I!N%~1VMX=@o9c%u+pa3_xUBna$wyD^V>7sRiwJKidpzsy zm-+lJ3Nr#cN?xZ3-O`_}tf9MQ`Ppf|(q}PzzTXzrdUbzi-Eo1m?K|8)hi`h2V*ce% z#_Ik2IjLJdMovwr-+Vq-+3lQxOZ9=UKZRWy%vWD5>S8!?)x>yZoO|)Nn~MycRXn;@ zg^06=JxQ5UCllnkpwmPMd>wVE6MC33QPEe-i*(#*EPb literal 0 HcmV?d00001 diff --git a/predict/nine/icon/71.jpg b/predict/nine/icon/71.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0893f45aabc47fad62bcde3307f1a42b6c1402f6 GIT binary patch literal 987 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVn>&%-pbVX63iSyeQA`O5evaGW|Yswy(}Nf3;j+qnKX3B8F{3 zJHPe>3m%8_4_FyWOo9Wix$yN!dYn*rBBjB2_2`Su?#Umea6F zz4gv7W0$66&y&7f<0!>_V}`fmsybUqGm=bpyi!uKoOL)~)$t6Ic4_;f^V1b2)48#pJND z)kkTkA3ha)I4WwxL9vNU{J$4K>)fuku&D_|-Ej_jiw1V7bcv_xeA7 vg=YMbtY2~0Rlnow^!;6Gceb6Ft*m}uwqE}jP}2qm#s&lSL|2gj_Ww5lz|Va9 literal 0 HcmV?d00001 diff --git a/predict/nine/icon/72.jpg b/predict/nine/icon/72.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dbdbbf86c50851994d843f3223e47a58f24498ba GIT binary patch literal 1044 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWGPEDQ%WY6jr-m{pn`{r%?v-wYAWA?br z-DDE@&f&%@qvF0Vj933|y8W*%@jt`9qgpYJ%DJA4)4qhUT<6VvuyWm+1v@^MO#Pf3 ze*5o?<&u)e@2!ej-p)6*IG5+x(LX<)r%t+c`NSl(KBHF$o2wcflxs=s6jtm@iBYE*I3(oibiXve#|(jVDYJ4rub~>*W*7MfbmWSCqQy?TE7cjLCdZ{D4koB8L}v)PsDx}SBTQnv`1 zh;td*oY$$}pJUXUM+%VXd#8=#lU=w`q^u z_jEqHcf4xt3gzZ^o-b!Hd^yioe`4d(`s;Jze=#iTN9Ht`yk;}R>CKlCk8u}{DJ wR;OEAVZyzWTE`^Kj9Ct_ZoBBpP#zYxGC46nQ&Lr-H#w+k0-MI7E{6X%0Y_q{cmMzZ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/73.jpg b/predict/nine/icon/73.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5452ff8439ca8376d06f3bd24385ba0c7ede70fe GIT binary patch literal 1077 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWm30;wWB0Q6-gRZG}ulMb5UH>Hb^PV~{ z#w*jUE51LsZ)I@Le^j=6d*7q`PFI(-IqsBEsYrZ%W@_5$Snsv2IjI}=Zl1X~Gx)7m zg9Qt7@0!XdVU|}+Z|iE^xb^bdwrLZ82DnYnIj_mm8Wd^~w^&)Ft3CLNsdQ|%>->-n z5woo4Yri%7l;1kdaZB?At~qaQe#vDpZ&}o(!LTkqVoyiKu0z^OW_jr5o;|fB&}8P+ z*-4WY$Ti!1Q`^<`yvAMelHS@Hr&Uqb1qr)cWw!XaE8j8Wvpvfo^=y0b!_(`x#Wvba z)!+~_V43LIRR6%?@rPw6WjFS={QW*s&;JE~?@ zP5DL-y|wpTdL-H&aT^3qyuIGk`-q%kyMIr_ty7b-w(BT1DHLy<@xZu>anA1xto_{g zylWq>mVBOj>1VZU=kKGQG5;*iispN7@YVO;wz21FLXX<}_j1oaTABo~o?5)-#(##) zjP2VhPWy6eJ>Q(%{PR(l2J@t*_Xn%yPThKK$+y7!HeTsJ&*bixH+#Dzea_dFZ`s<* l*S{>Q64;tuop1E+@k!YT-j$Q@JU#jR5>O{7sF?rX1OTSetiJ#N literal 0 HcmV?d00001 diff --git a/predict/nine/icon/74.jpg b/predict/nine/icon/74.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2c55171c8048226a587737f6005357590c66ca2 GIT binary patch literal 1062 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnYxa7FOp{)6`OA;6>Yw6uG7pvfX5Z<% z`GQ@o!Bk_7%76^%Rfjo0m*_3HHdBFze4l&=WhXg(+sz%u#Fv}>RIHIEc7EVFCinf3JX zZ`bYZ!ohk$zXNw|pOwx&VZBnre24ZtyM0?PzA{_(+h_L{-Yw_3k4RrGnmGU3&g{Q# zkAJJ3I``RU*ERv){BNt<1E0DHUYW+jdE&$$<8vC!%e%hYmETG-Td11itiAp{!|^kg zFS4z}uIL3BDR)H(>g!HS<1sYaz3xr&b_>fj{1SIFFZ$=NI9i%rYTep?q9W|6lkoRL z{~0(XUtjp3b@lPfZ*?M@H(!1q_APXt`u5(Gpw9*q%r3AyUcbS`aJ7Ti_$V(^V(wOz z%%)#HGw!(mKIQmp<)X#C?@D`%4n2P(9yTGevgd5kLhsFb7ZxxT8F-%en-ak8=n-Nx z!9k%%p!%XKL*l(3X?LG{_nI!eygXFvtn4PE9VhZa`WCEE__lgiUib2sfiBawZCHG) a(dNEx`3B~d36>^-4pJh4t_=16Zvp`ALa9su literal 0 HcmV?d00001 diff --git a/predict/nine/icon/75.jpg b/predict/nine/icon/75.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba7d7d48739e3405024044bace04d3d430f19966 GIT binary patch literal 818 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyD-xI|5JHTwKkQ>djDTAwTm$@FbV1 zXCRYO{}QJ~F%JSlc;Q)`n9{59(BYk(qVv!$kfCYr2Xi#rVB) zFE!f9)?lu&sEYxFpVuU3<`*w@xO`BiHSYmetfPXYh~SSt-V%;ZA)Ufit27R+>S3^D zO{_RnvGz;Gyi6wj+qysPE@|2?Q2(&@7uX1pG0$p>m)^_zC1du@;OC~bmn>rs)GSt* RSGV^9rCENf2 literal 0 HcmV?d00001 diff --git a/predict/nine/icon/76.jpg b/predict/nine/icon/76.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdfb0c8736d913bddb3f97dac69ee4186873873c GIT binary patch literal 994 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAvUcKVhj?~LbjablIZoTmVm)^RC zo3>7S_Q+AjP&2*w2G_%{+^^SW{SfD7aNuctJPP& zK1k|fc)w!N&b#qZne(z`tsW`~>b*YwsA$^Cx38XWcIwQi;9yoq^Yr?i{$QYXtr?l|`>jpg0s3}x=#ov#lZ z^a>D0EzL4L`Ra`C z>em{imt~gy3SB>$?^#;zr&G`MwdbulzH`yKiw+WXI#+nx+HR+0?7OIRd*%W4le|~Y z*|HVBb4`!T)LiMAE|j@8ec`RA*Es9Kc24eHbHbWO_;XQ_5io?Uz`+b;*#Ex?08lD| AIRF3v literal 0 HcmV?d00001 diff --git a/predict/nine/icon/77.jpg b/predict/nine/icon/77.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca4c2e3b44676837338abcb01c0dba83908c0fb3 GIT binary patch literal 1132 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nV&S7w>r@|$n^_4b=4#c2vD^A7MAW!+8v z(VIK}@b{Hv8@KpMN=$f=zWw$2hYq49{o*g9uCDfH_M08C+U=vz>91ec_mB74vQI`g@@{wI%;$$x_**DRA zo0H4@d&P73FU&u*C+^jMhRBa~>qUY*E}z%V?Gm+c`Nh|eynnmtJF9gQlh;OZ$2u{Z zC^k3l=rK5P&i%^ux%Y41sBnJdHd7~H?cQz|>q+7TDJqj+9$dg1ozGjbC&E3maP^JT zA}OMti;Z%Xm#Y>ZO{zG4c%Js8GxxK^KgK)enTvEky%&=^@=Y1ZhrapXJD*& zvyJSMEIG-|d#>n&Mc$oxSS)es9S0WX^IjUv7hX^L_`dDQ^)Ic{uA0Y1O}eoc!PaYar+N463p#4U`EyCz6XmNzr4#>)L`3o>6*5-MQ%duMyE!BYQ`>&MGf}^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}qh@e=q(FV31{4x?bzr(~n`@k1||-wVvFt zV>gp{_$g7{@BRyqXX%LBioD)swK42!jw3sZbj#zfE7xw-mcE{{W$*U6Q&KvXhAGss z?b&`{pU`E~ANlL@Z{9hsKW(G(+uO&=W$NZTM+PsMCvmOxhRN=eA_p3ULi1-Zy`12` z;zivQ#&;&+iVw2$1=eo)9`*Fhna!-9l%{SvWqDG0d!EJuzI}VvM}K7RQ1~cQmA5=M z@7l7DK6a@)6sOnoEWggSH)zl9=#RzsUT=IUHLX|vm+h-J`KD7Fc^mFp3I4pmYR_B| z=bM*~%=dGlBTq*Crk8!56h-=B5mgI@32 z_}X31{jT=SXQuinEfGFh@7h(C21KW#E)~ zM{4d!)lGkpn;mo||LI4zL~##puXR0VZeMxK@WH^IOJf1Q&-U$Ym+tDmeH`(yC)Xvg MfmI~XLH_?u0M+`vcmMzZ literal 0 HcmV?d00001 diff --git a/predict/nine/icon/79.jpg b/predict/nine/icon/79.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d46d21ef149d3474ab397af8c621a5481c7c0d7 GIT binary patch literal 1212 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}mM1e+e~=XR41;NdUx)zLG8@M%?=8k#yeI#nN(CYKZ>n{CB2S=Bc5CJn2A=v&`_HYZ*unPU&WkFW4GaIIItIm5O!sLEW-;3P^uT|H zX=WLz`N#8_KPojCeO)UaWEEL{MenPakm9WSNm_dnp0ql!`8zjN9<#nG&mJA?UXk~t z$2D)-n@Q&s4VD})&?=i?6q5gQgWU(2N829ny!23LWls~8yJO{S8;y*Z&mCa3J7w%D!ni$s;Va)v z(JkK>`)}?oTe@zZpTmEKtgt8ZV;I9GAF7ht_WbgtblbSHOwT_Nvosd)a(i>z+8IqN W+i-ie%tRs9li!bu1Ukt7zX^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}mM<^k8q?JHQyWiytiu-+H=&v0Vvs{ahv=j{K*xXNt%+T|5Y_r8V~J1$$&#b2b% z68c`C9;l!mEWe^8LV4GRw)y!+ZC%k47q4FtVd!F5{O~^C4PGtj(i>sqt zKixhr^ICdUSvdRUWv-EzOYVC8j`B^9^mvdFIO){?DMiysiH2>;DX{T^h^_Cz(t$>vQGl^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWF&pur{$$aKFX#QjOZ~uD#GdNcB|Karixb)xQ zOZG2Blm9a`y!mYUFwUYK?wlGPaE0^Y2rra#{;`RF%oR_^@UdO1O!PkT-%hla;C>r_9tsSXd1QCnZT z^5s00>-t;%Gi(xVIww9ePqb6{*|9r<@2@qO{b$%}5lymgZO`Hi+1k+sPk>p z;r|RAPn6F%?fiEk&dBiZt*ZJ%aUWNAme?4uzw`cQ>K}f^CUWu1N%wtj883-0S}C*B zGGXuey$qQZUZv9ymu<*RnRT)5td+r26$eK7>mL`buCRW~q?`QK&A9OIa{U=e?0Iij z&PksW=pd_`u&pC+>)F_Mk9dIS%FJJ46BPx# literal 0 HcmV?d00001 diff --git a/predict/nine/icon/81.jpg b/predict/nine/icon/81.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e401f655521e58686e000e4384c90955f4d3c052 GIT binary patch literal 1050 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWmse#iJ_=7`DW8HMsy?5-N8M(O8Tr}|H zxAnpw**2Q(ulRmF$fCbM(D6Bga_}4m!}EU8S1z#c35*MWuwUfl()+H9V@;-uT^H(j znDFq=vXgQAA2lsr#;tT<6$y0Uon$ggtt%wFw=pbClBG&8&i^q#i+^gl?cXUHx005< z?bdMSFTTFwq^)iCwbk7p=S^SZ&wKaK>#_@(Zidee7R(4>vu^M_`KLO7o$=v%fyft9 zEy6L8?&aH`W)^;SG5#a@{^a@fj(z{SSG}~F-=(iG?|PKkEo~<``^}SNZ~Xf5ucj)z z|FqQcT*b)biIE46ByL!ezU~44<&R(1hyRGJR6X9N+IUjwURlWbR0T78qk1cby#Cr% zKgy3>tf&s#ZNBZgSJb7a|2`<&$ow_zs}2nGwfZstk?o|LbH7!2O`n$fd+A@s_vhFj zWGvwOwbNcIF8q-d*Oa6WMpW#t< zy!QwF&b4pm`_;yAdrQXbSo;yM(N9m&O9V=PnoClyEa^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnEA;gyow{-6)%(v{s}!Ejn7|xY9NA~sdj9nLqq)~2FQ;!-{j&2&mZ#dS zoGmW%{a*ekeCxorb~U#^Qp>{mdEe5{otVDt*>UxGOnng_v}bLfRkF7~H0k%%C>K4) zNhRz;i~lo}PN_L$c;I*uuaJA;w>?<}n@+`7_Mg%E?0NjXQvEKkk`Q$Z$=3n*v+UEQ zr=Hnv^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nWV)vK#R_zP_URz8rF(fFGc^)TPZPWq$y z%r&h0Htth7UTF2RKfB3jxvj8{Rn-Odyh+EEw3l?fxL-QuiTqN#oxb5NmxF%$%@Vnp zTWUTnxv^_SQOlAQj0Y08uV1*<+WU96^olQkLz|7~Zu?$w=={Hv|6cztvE8e|oYbYU zfN5oxm2cZxDb=r=&aCjeGs$q?p1$Lk)?IXvxibd42F6L>uYB#n_n_zj`<&9zU zD+b;E@2l%xUE+S7sk<&IQn9ct>_3BzeATSYrqwqW2}VW=tSH~C?KJriFUpUYVN%`D*Mx4>Hm_>Ra|_Ca|AJHt?m>E@~&moz)w4hwxVfS?TsAJpX#iO%?@0-oewYe^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVY)7M1YzZY}s_L->Y;!Z{<>j@qzMMfNt zcP!7kroS??_~!9~YwtA}ymp>=B6p;qu=%`mT=BvTqwJ1DmXCT4=B%C`Zh2p2?H@hc zUC$b9t+;3CP1w8V5WKH~;mg$~f68_bqN` zYs!B=xu&0kId^dupIgoD=?qnGT;u;vYf$^}Zec3hT$AFs=wpvQJ=XfPLizjJ8?z=I zdL%txJd2;@;;H$`4S8-n#=HEz9-Ev{oT)ZDI8*n@+SqA&VPo87YlgnCAK_w$WRQsS*Uc_q+8e{spq-wmZIvqQu!8}%Zb%8 z3-;7!m3jK`iqDef@w@iC$>Wd4q6XD?Zdai<+pd~MSGeD4)1E((eZdKv(6#o?O^06G zH9dRx>anxks#kWO(zH}4VYZN;DiXl1x_0lEI`tiUT4VfKKKv9rbje+~HOP2Rf&Dd$ O{|pUXKtt{S-vj`-zUnXl literal 0 HcmV?d00001 diff --git a/predict/nine/icon/85.jpg b/predict/nine/icon/85.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c91bc68d44c71fb426095bdb3d58ada7c648c447 GIT binary patch literal 1108 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVnD|FxMuKRO-v%k!~;3>5|eAi?hznC!E ziXJ}vDE^JSz^kg%BipN{NVi;+2tQll`TNAZ!`qj}f2jSl>vERVn(aOJa*kQNH80HT zzN~$-zt}<6SCl1u+T|GEe36fPE<8Td8zD6F<-}WE4AVS?ByM@e28yK4>|>Bya-IEA zFl*aV*7xnD8V|3UvPbv`ye*ln{(j`UK-8=8p@3d*! zr~J)#_ng;x-EgC4{)F!m&p)28x^_kHZQ_S(Yg1XKe;1$ro?FY$Xw9dF8~xXr?Uyo? z-ji*1yPUJA?btWTr#t^X_PL}v>ETY5dC&LDu2^L!xcS4~t6R)}mCoICZ&ANRX~ldA zW%hU9Uv_CQuUXaXwIMq5?X`2PZIA7;v>4=Vi~F_&I>;=&fB5_slR~}iW!nPQG;wh7 zB;7G^$oYFe-_QElmM!s|YIAMG!>@08C2sbyV?id{l~#x2r}p+)Uvy>2JDQ%&duF>~ X^pVM@`;A;3BtO2YzUV5#`2QvV88pYM literal 0 HcmV?d00001 diff --git a/predict/nine/icon/86.jpg b/predict/nine/icon/86.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ce81abc4365907283b615fc20ed25802d682a67 GIT binary patch literal 1147 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVUuh>K{kGOBz6L>d1cK!XfQ~HLJU!P!_ z|LCk=toGs0r*rBrE!Ad``1f0e`A1Pb*RvYqh25`bil$GpHTK`}=|JbUt#@9Z_IP`x z=ZoC@J_oB@?W0y@t4ppW_-9vG{x-c*7t>PB_jP;3JoSsyLodyJB(49paoV-ihZB!0 zFuy45I&w+=sGQp6MOUVWZ@-){q3)eU?vd6F1>SitPuOrVyj`&_-S3*IwrrfObey2c zW=*s06M0vfS*?_v{pVN80=6F?WikX~7flljFN`sey&@z3JeGIWZSK-)m)^wb-y4oC zV7q(noo&^#C9@>nDNN#=U=ySn9(*U6Gjv54?!T;FwC$wHzL<&Sw<11n zNniO_gL&(feC5kuZqGjH!O4^J-0twwlnSL=-tp|2Cp8pj^31U7IokfhwOFroeTP-- z>EpV4=g!d!)xEfV=F%7e*neS&br)?nH*VDy>1*hC++(il=I8nKmrwxv z(rfbFi#O);-1n>(+NGkqaT{A|@`2kgid;nkSoVo;nRNPanV>IA!TG0}69bt(_dO^- zX8bfQFP5OfSbsq)uCeSVh40>0B;8)Egnw{7&4b8Tc|E1s0G JsEgtMO#uD7$zlKi literal 0 HcmV?d00001 diff --git a/predict/nine/icon/87.jpg b/predict/nine/icon/87.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a51cf04632640c66107dbe05b127507a3d08825 GIT binary patch literal 958 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAJ**=F|d6#$Zw$tXOe9bQ3(xRtH z?y@0_rv>lJS_S8B&5b(sQt^7u+Q(gP9Mj9zMcF=YSi`S9KW^rM1$<3i8Vi^@|NIk2^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAv9=*GD&h~q_z=8SqrXK3Qw%K%T zTy~`5G*OY#DZ10nLSNWBXcDA+MyY%T(q)GbqWt;yq^uK;RQ~asLoiGzi z8NS1EQy8z`&c5aP_Quw2SJtM@X>REYIP%x1{7nr$t=Y?6P|DUUtS0g>%w-W-;9Qu&h&UdQx6~l&7io0;%+=r#JDPoc!|7 zE7@|_jV*DngtN9=)h<2MzfHx5>GUz{CP(Eyt82CUk8nJ`+lWBB}3>kTmr`6CCCC;t;+tUi3r=zRI#jfHu+ ziv_r|rNdr}Fz>G4QefAR)b&zh0nghy?U{dUS2$<1zEf$uC?X@|akTi`x2V1)CE3YK zWUVgyO;r87bfWjRtH&;^zHIy1RfO?!mQ?As<;%U33tDcUV%iYg*RCu-Rc-Flo0(?! b(>FFI_RKvlsoK9%eNx7v2E9O_hW|GK$mFYU literal 0 HcmV?d00001 diff --git a/predict/nine/icon/89.jpg b/predict/nine/icon/89.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2da20ecbfa82f597e91882b9d0b7b0d2260e7800 GIT binary patch literal 946 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyFAJxKHoU(N)>Cvv$HUqvI_9nl_fa z7d>3Qx<38Rt&^E53v3q_&$lz4KfCeMmlw4e%nKKFX)yI|x}?@wb@A+zO$VNz{rBLw z`Ula+`;)FFZ~tApZNo?3C(vsInU_SpfUpVX6-8}(W;<+k?b6UAXgkL!v ztN-?vp%J-(nmg{?U|~Us_$*T zkp8KSZ{NE{UECu7=H$F*mDj4L^|&lm7F<&J+&Z+VYVsscm5UD2CV{RDB2Zla|0V#5 CIdS>` literal 0 HcmV?d00001 diff --git a/predict/nine/icon/9.jpg b/predict/nine/icon/9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52adcaa2e12f91da051737ffdc2fb667e3c3b4cf GIT binary patch literal 906 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nVniyF8z*3=fqwtI0hOfoDrziX79ll=Q_ z-@Uv48H^ZAdhhPoEw-%U=)u@Wx`zwpb}ZWYm)}|K@7C<)J9M7ccpCofJZ8S(jfXn- z4fzGE3?)}W#HV|vrrKU<>?v4S#%1KeY})jn;ls4MyH87O-t4NL<5Rwwe;voacrS)a z*S4-OsZKbLTVDo|KvxDck4q8rEJcj0rl#6**t#Zd zxLR`CQ|Dppy9^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nX7n>;2Q`E=sd#6{E6k{cLa`4&&Cm>jw< zxNuoTnfGip^;2`-P0}~uf5heH@MQttw65p%+iX1lGdQjP7oz;1fy*9+$M9ms8ejAH zNsj}q%9bYFDt+m1q;V@y>D1nD8y-x&6X?MEF>Y@8%9q@{3p-k7rp(feotoCeJVmAW zI{Sw;w#G;HDekYfu8y_$_P4uo$Azbl!Qo)xfd{|CGmHN-$X%}AQ9rdPj{kC6cCB;> z&pfBhvy3rwZ}-gnvtt1-zx6Ts&(9bCXSn~<{?NpAHVLadH(&f<`JW+H{YSXF$KxWS zzQ-br&xNz3?sr`~bS3KLx6i(kd$#QqvZyHAz|v>+yJXRpFS%B+>PMnXTi*2QSjDV5 zYL$M5z2~BX?E0vbKzE*O8IO&}7IUpKVE85y=)k|IOM|gZx KrLlnj|4jfy?`^~Y literal 0 HcmV?d00001 diff --git a/predict/nine/nine.py b/predict/nine/nine.py new file mode 100644 index 0000000..edb4d25 --- /dev/null +++ b/predict/nine/nine.py @@ -0,0 +1,96 @@ +import os + +import numpy as np + +from PIL import Image +from io import BytesIO +import onnxruntime as ort + +current_dir = os.path.dirname(os.path.abspath(__file__)) +model_path = os.path.join(current_dir, "resnet18.onnx") +session = ort.InferenceSession(model_path) +input_name = session.get_inputs()[0].name + + +def read_icon(): + folder_path = os.path.join(current_dir, "icon") + icon_list = [] + for i in range(91): + file_path = os.path.join(folder_path, f"{i}.jpg") + icon = Image.open(file_path) + icon_list.append(np.array(icon)) + return icon_list + + +icon_list = read_icon() + + +def get_target_id(target_image): + target_array = np.array(target_image) + for i, icon_array in enumerate(icon_list): + err = np.sum((target_array.astype("float") - icon_array.astype("float")) ** 2) + err /= float(target_array.shape[0] * target_array.shape[1]) + if err < 1000: + return i + + +def crop_image(image_bytes, coordinates): + cropped_images = [] + img = Image.open(BytesIO(image_bytes)) + width, height = img.size + + left = 0 + upper = width + right = height - width + lower = height + box = (left, upper, right, lower) + icon_img = img.crop(box) + + grid_edge_length = width // 3 + for coord in coordinates: + x, y = coord + left = (x - 1) * grid_edge_length + upper = (y - 1) * grid_edge_length + right = left + grid_edge_length + lower = upper + grid_edge_length + box = (left, upper, right, lower) + cropped_img = img.crop(box) + cropped_images.append(cropped_img) + return icon_img, cropped_images + + +def nine(image_bytes): + coordinates = [ + (1, 1), + (1, 2), + (1, 3), + (2, 1), + (2, 2), + (2, 3), + (3, 1), + (3, 2), + (3, 3), + ] + + def data_transforms(image): + image = image.resize((224, 224)) + image_array = np.array(image) + image_array = image_array.astype(np.float32) / 255.0 + mean = np.array([0.485, 0.456, 0.406], dtype=np.float32) + std = np.array([0.229, 0.224, 0.225], dtype=np.float32) + image_array = (image_array - mean) / std + image_array = np.transpose(image_array, (2, 0, 1)) + # image_array = np.expand_dims(image_array, axis=0) + return image_array + + icon_image, cropped_image = crop_image(image_bytes, coordinates) + target_id = get_target_id(icon_image) + target_images = [data_transforms(i) for i in cropped_image] + outputs = session.run(None, {input_name: target_images})[0] + class_ids = np.argmax(outputs, axis=1).tolist() + + ans = [] + for i, id in enumerate(class_ids): + if id == target_id: + ans.append(coordinates[i]) + return ans diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3bbe206 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +httpx[http2] +flask +ddddocr +numpy +Pillow +onnxruntime +cryptography diff --git a/train.md b/train.md new file mode 100644 index 0000000..c8e8234 --- /dev/null +++ b/train.md @@ -0,0 +1,28 @@ +# 训练模型 +## resnet18 +参见 [taisuii/ClassificationCaptchaOcr](https://github.com/taisuii/ClassificationCaptchaOcr) +## siamese +参见 [bubbliiiing/Siamese-pytorch](https://github.com/bubbliiiing/Siamese-pytorch) +* 每个分类图片数不得低于三张 +* 使用以下代码导出 +``` python +import torch +from nets.siamese import Siamese + +weights = "logs/last_epoch_weights.pth" # 选择合适的权重 +onnx_outpath = "siamese.onnx" + +model = Siamese([105, 105]) +model.load_state_dict(torch.load(weights)) +input_image = [torch.randn(1, 3, 105, 105), torch.randn(1, 3, 105, 105)] +torch.onnx.export( + model, + input_image, + onnx_outpath, + opset_version=13, + verbose=True, + do_constant_folding=True, + input_names=["input", "input.53"], + output_names=["output"], +) +``` \ No newline at end of file