├── .github └── workflows │ └── go.yml ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── README_zh_CN.md ├── api ├── html.go └── router.go ├── config ├── config.go └── config.yaml ├── doc ├── 1.png ├── 2.png ├── WhatsNew.md └── gobindata.sh ├── go.mod ├── internal ├── app │ ├── get.go │ └── task.go ├── cache │ ├── cache.go │ └── vars.go └── cron │ └── cron.go └── main.go /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: Go 2 | on: [push, pull_request] 3 | jobs: 4 | 5 | build: 6 | name: Build 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Setup Go environment 10 | uses: actions/setup-go@v2.1.3 11 | with: 12 | go-version: 1.16.x 13 | 14 | - name: Checkout Code 15 | uses: actions/checkout@v2.3.3 16 | 17 | - name: Cache go module 18 | uses: actions/cache@v2 19 | with: 20 | path: ~/go/pkg/mod 21 | key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} 22 | restore-keys: | 23 | ${{ runner.os }}-go- 24 | 25 | - name: Get dependencies and run test 26 | run: | 27 | go get 28 | go build 29 | go test ./... 30 | 31 | - name: Build 32 | if: startsWith(github.ref, 'refs/tags/') 33 | env: 34 | NAME: proxypool 35 | BINDIR: bin 36 | run: make -j releases 37 | 38 | - name: Release 39 | uses: softprops/action-gh-release@v0.1.5 40 | if: startsWith(github.ref, 'refs/tags/') 41 | env: 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | with: 44 | files: bin/* 45 | draft: true 46 | prerelease: true 47 | body: "Place config.yaml in work dir and run with `-c config.yaml`" 48 | 49 | - name: Upload artifacts 50 | uses: actions/upload-artifact@v2.2.0 51 | if: startsWith(github.ref, 'refs/tags/') 52 | with: 53 | name: build 54 | path: bin 55 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | go.sum 8 | proxypoolCheck 9 | bin/* 10 | tmp/* 11 | 12 | # Test binary, build with `go test -c` 13 | *.test 14 | # Manually add it if neccessary 15 | *_test.* 16 | 17 | # Output of the go coverage tool, specifically when used with LiteIDE 18 | *.out 19 | 20 | # dep 21 | vendor 22 | 23 | # GoLand 24 | .idea/* 25 | 26 | # macOS file 27 | .DS_Store 28 | 29 | # assets 30 | assets/html/* 31 | assets/css/* 32 | 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | NAME=proxypoolCheck 2 | BINDIR=bin 3 | VERSION=$(shell git describe --tags || echo "unknown version") 4 | GOBUILD=CGO_ENABLED=0 go build -trimpath -ldflags '-w -s' 5 | 6 | PLATFORM_LIST = \ 7 | darwin-amd64 \ 8 | linux-386 \ 9 | linux-amd64 \ 10 | linux-armv5 \ 11 | linux-armv6 \ 12 | linux-armv7 \ 13 | linux-armv8 \ 14 | linux-mips-softfloat \ 15 | linux-mips-hardfloat \ 16 | linux-mipsle-softfloat \ 17 | linux-mipsle-hardfloat \ 18 | linux-mips64 \ 19 | linux-mips64le \ 20 | freebsd-386 \ 21 | freebsd-amd64 22 | 23 | 24 | all: linux-amd64 darwin-amd64 25 | 26 | docker: 27 | $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 28 | 29 | darwin-amd64: 30 | GOARCH=amd64 GOOS=darwin $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 31 | 32 | linux-386: 33 | GOARCH=386 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 34 | 35 | linux-amd64: 36 | GOARCH=amd64 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 37 | 38 | linux-armv5: 39 | GOARCH=arm GOOS=linux GOARM=5 $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 40 | 41 | linux-armv6: 42 | GOARCH=arm GOOS=linux GOARM=6 $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 43 | 44 | linux-armv7: 45 | GOARCH=arm GOOS=linux GOARM=7 $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 46 | 47 | linux-armv8: 48 | GOARCH=arm64 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 49 | 50 | linux-mips-softfloat: 51 | GOARCH=mips GOMIPS=softfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 52 | 53 | linux-mips-hardfloat: 54 | GOARCH=mips GOMIPS=hardfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 55 | 56 | linux-mipsle-softfloat: 57 | GOARCH=mipsle GOMIPS=softfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 58 | 59 | linux-mipsle-hardfloat: 60 | GOARCH=mipsle GOMIPS=hardfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 61 | 62 | linux-mips64: 63 | GOARCH=mips64 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 64 | 65 | linux-mips64le: 66 | GOARCH=mips64le GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 67 | 68 | freebsd-386: 69 | GOARCH=386 GOOS=freebsd $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 70 | 71 | freebsd-amd64: 72 | GOARCH=amd64 GOOS=freebsd $(GOBUILD) -o $(BINDIR)/$(NAME)-$@ 73 | 74 | gz_releases=$(addsuffix .gz, $(PLATFORM_LIST)) 75 | 76 | $(gz_releases): %.gz : % 77 | chmod +x $(BINDIR)/$(NAME)-$(basename $@) 78 | gzip -f -S -$(VERSION).gz $(BINDIR)/$(NAME)-$(basename $@) 79 | 80 | all-arch: $(PLATFORM_LIST) 81 | 82 | releases: $(gz_releases) 83 | clean: 84 | rm $(BINDIR)/* 85 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Proxypool Health Check 2 | ## [中文教程](README_zh_CN.md) 3 | 4 | ## Info 5 | 6 | This is proxy health check and provider part of proxypool. You should have had a 7 | [proxypool](https://github.com/ssrlive/proxypool) server available at first. 8 | 9 | Due to the poor availability of proceeding proxy health check on servers overseas, The best usage of this project is to run on your own server within Mainland China. 10 | 11 | ## Install&Run 12 | 13 | Choose either. 14 | 15 | ### 1. Use release version 16 | 17 | Download from [releases](https://github.com/ssrlive/proxypoolCheck/releases) 18 | 19 | Don't forget to add 755 permissions 20 | 21 | ``` 22 | chmod +775 proxypoolcheck 23 | ``` 24 | 25 | Put config.yaml into directory and run. You can use -c to specify configuration path. 26 | 27 | ```shell 28 | ./proxypoolCheck 29 | # or 30 | ./proxypoolCheck -c PathToConfig 31 | ``` 32 | 33 | ### 2. Use Source 34 | 35 | Make sure golang 1.16 installed. Then download source 36 | ```sh 37 | $ go get -u -v github.com/ssrlive/proxypoolCheck 38 | ``` 39 | 40 | And run 41 | ```shell script 42 | $ go run main.go -c ./config/config.yaml 43 | ``` 44 | Compile into bin directory 45 | ``` 46 | make 47 | ``` 48 | 49 | ## Configuration 50 | 51 | ```yaml 52 | # proxypool remote server url. Blank for http://127.0.0.1:8080 53 | server_url: 54 | - https://example.proxypoolserver.com 55 | - https://example.proxypoolserver.com/clash/proxies?type=vmess 56 | 57 | 58 | # For your local server 59 | request: http # http / https 60 | domain: # default: 127.0.0.1 61 | port: # default: 80 62 | 63 | cron_interval: 15 # default: 15 minutes 64 | show_remote_speed: true # default false 65 | 66 | healthcheck_timeout: # default 5 67 | healthcheck_connection: # default 100 68 | 69 | speedtest: # default false 70 | speed_timeout: # default 10 71 | speed_connection: # default 5 72 | ``` 73 | 74 | If your web server port is not the same as proxypoolCheck serving port, you should put web server port in configuration, and set an environment variable `PORT` for proxypoolCheck to serve. This will be really helpful when you are doing frp. 75 | 76 | ``` 77 | export PORT=ppcheckport 78 | ``` 79 | 80 | ## 声明 81 | 82 | 本项目遵循 GNU General Public License v3.0 开源,在此基础上,所有使用本项目提供服务者都必须在网站首页保留指向本项目的链接 83 | 84 | 本项目仅限个人自己使用,**禁止使用本项目进行营利**和**做其他违法事情**,产生的一切后果本项目概不负责。 85 | 86 | ## Screenshots 87 | 88 | ![](doc/1.png) 89 | 90 | ![](doc/2.png) 91 | -------------------------------------------------------------------------------- /README_zh_CN.md: -------------------------------------------------------------------------------- 1 | # Proxypool 健康检查 2 | 3 | ## 导航 4 | - [简介](#简介) 5 | - [安装和运行](#安装和运行) 6 | - [配置](#配置) 7 | - [添加自启](#添加自启) 8 | - [声明](#声明) 9 | 10 | ## 简介 11 | 12 | 此项目为[proxypool](https://github.com/ssrlive/proxypool)的代理池节点可用性检测部分,并提供检测后可用的代理。 13 | 14 | 此项目推荐在本地(即您家里)部署,或是的中国大陆服务器上运行,以提升代理池节点的实际可用比例。 15 | 16 | 在使用此项目之前,您应该有一个(或知道一个)可用的[proxypool](https://github.com/ssrlive/proxypool)服务器。 17 | 18 | 19 | ## 安装和运行 20 | 21 | 二选一 22 | 23 | ### 1. 用构建好的(推荐) 24 | 25 | 从[releases](https://github.com/ssrlive/proxypoolCheck/releases)中下载 26 | 27 | 将下载的文件重命名为proxypoolcheck(可选) 28 | 29 | 不要忘了给文件添加755权限,否则无法运行 30 | 31 | ``` 32 | chmod +775 proxypoolcheck 33 | ``` 34 | 35 | 您可以将config.yaml放在与proxypoolcheck文件同一文件夹内,或使用 -c 指定配置路径 36 | 37 | ```shell 38 | ./proxypoolCheck 39 | # or 40 | ./proxypoolCheck -c /指定目录/config.yaml 41 | ``` 42 | 43 | ### 2. 源代码运行 44 | 45 | 确保安装golang,然后下载源码 46 | ```sh 47 | $ go get -u -v github.com/ssrlive/proxypoolCheck 48 | ``` 49 | 50 | 运行 51 | ```shell script 52 | $ go run main.go -c ./config/config.yaml 53 | ``` 54 | 55 | ## 配置 56 | 57 | 基本的配置 58 | 59 | ```yaml 60 | # proxypool远程服务器的地址,空白为http://127.0.0.1:8080 61 | server_url: 62 | - https://example.proxypoolserver.com 63 | - https://example.proxypoolserver.com/clash/proxies?type=vmess 64 | 65 | 66 | # 对于您的本地服务器 67 | request: http # http / https 68 | domain: # default: 127.0.0.1 69 | port: # default: 80 70 | 71 | cron_interval: 15 # default: 15 minutes 72 | show_remote_speed: true # default false 73 | 74 | healthcheck_timout: # default 5 75 | healthcheck_connection: # default 100 76 | 77 | speedtest: # default false 78 | speed_connection: # default 5 79 | speed_timeout: # default 10 80 | ``` 81 | 82 | 需要修改的参数: 83 | 84 | - `server_url`:远程服务器链接,可以使用筛选参数。支持多种来源 85 | - `request`:要显示到网页的协议,默认 http,可选 https。 86 | - `domain`:要显示到网页的域名,默认 127.0.0.1。 87 | - `port`:要显示到网页上的端口,默认 80。如果本机有其他程序占用需要修改。 88 | 89 | 可选参数: 90 | 91 | - `show_remote_speed`:显示远程速度,默认false,但建议改成true(因为作者写的就是true) 92 | - `cron_interval`:工作间隔,默认15分钟 93 | - `speedtest`:是否开启测速,默认关闭。开启测速会消耗大量流量。 94 | - `speed_connection`:测速并发连接数,默认值为 5。 95 | - `speed_timeout`:单个节点测速时间限制,默认值为 10,单位为秒。超过此时间限制的节点会测速失败 96 | - `healthcheck_timeout`:单个节点健康检测时间限制,默认值为 5,单位为秒。超过此时间限制的节点为无效节点 97 | - `healthcheck_connection`:节点健康检测并发连接数,默认值为 100。丢失大量可用节点时可大幅减少此项数值。 98 | 99 | 100 | 如果您的Web服务器端口与proxypoolCheck服务端口不同,应该将web服务器端口放在配置中,并且设置环境变量`PORT`以供proxypoolCheck服务。当您使用frp时,这将非常有帮助。 101 | 102 | ```shell 103 | export PORT=ppcheckport 104 | ``` 105 | ## 添加自启 106 | 107 | 此部分适用于Linux。 108 | 109 | **配置 systemd 服务** 110 | 111 | `vim /etc/systemd/system/proxypoolcheck.service` 填入下面内容: 112 | ``` 113 | [Unit] 114 | Description=proxypoolcheck 115 | After=network-online.target 116 | 117 | [Service] 118 | Type=simple 119 | Restart=on-abort 120 | ExecStart=/proxypoolcheck所在的目录/proxypoolcheck -c /指定配置文件目录/config.yaml 121 | 122 | [Install] 123 | WantedBy=default.target 124 | ``` 125 | 126 | **重载 systemd 服务** 127 | 128 | ``` 129 | systemctl daemon-reload 130 | ``` 131 | 132 | **启动proxypoolcheck服务** 133 | ``` 134 | systemctl start proxypoolcheck 135 | ``` 136 | 执行`systemctl status proxypoolcheck`确认有以下信息 137 | 138 | ``` 139 | ● proxypoolcheck.service - proxypoolcheck 140 | Loaded: loaded (/etc/systemd/system/proxypoolcheck.service; enabled; vendor preset: enabled) 141 | Active: active (running) since Sun 2021-03-21 14:53:55 UTC; 9s ago 142 | ``` 143 | 144 | **添加开机启动** 145 | ``` 146 | systemctl enable proxypoolcheck 147 | ``` 148 | 149 | **查询服务是否开机启动,enabled即开启自启** 150 | ``` 151 | systemctl is-enabled proxypoolcheck.service 152 | ``` 153 | **`reboot`重启后`systemctl status proxypoolcheck`看看是否正常,如果正常,您就可以给个star,然后关闭网页,尽情享受** 154 | 155 | 156 | ## 声明 157 | 158 | 本项目遵循 GNU General Public License v3.0 开源,在此基础上,所有使用本项目提供服务者都必须在网站首页保留指向本项目的链接 159 | 160 | 本项目仅限个人自己使用,**禁止使用本项目进行营利**和**做其他违法事情**,产生的一切后果本项目概不负责。 161 | 162 | ## Screenshots 163 | 164 | ![](doc/1.png) 165 | 166 | ![](doc/2.png) 167 | -------------------------------------------------------------------------------- /api/html.go: -------------------------------------------------------------------------------- 1 | // Code generated by go-bindata. DO NOT EDIT. 2 | // sources: 3 | // assets/html/clash-config-local.yaml 4 | // assets/html/clash-config.yaml 5 | // assets/html/clash.html 6 | // assets/html/index.html 7 | // assets/html/surge.conf 8 | // assets/html/surge.html 9 | // assets/css/index.css 10 | package api 11 | 12 | import ( 13 | "bytes" 14 | "compress/gzip" 15 | "fmt" 16 | "io" 17 | "io/ioutil" 18 | "os" 19 | "path/filepath" 20 | "strings" 21 | "time" 22 | ) 23 | 24 | func bindataRead(data []byte, name string) ([]byte, error) { 25 | gz, err := gzip.NewReader(bytes.NewBuffer(data)) 26 | if err != nil { 27 | return nil, fmt.Errorf("Read %q: %v", name, err) 28 | } 29 | 30 | var buf bytes.Buffer 31 | _, err = io.Copy(&buf, gz) 32 | clErr := gz.Close() 33 | 34 | if err != nil { 35 | return nil, fmt.Errorf("Read %q: %v", name, err) 36 | } 37 | if clErr != nil { 38 | return nil, err 39 | } 40 | 41 | return buf.Bytes(), nil 42 | } 43 | 44 | type asset struct { 45 | bytes []byte 46 | info os.FileInfo 47 | } 48 | 49 | type bindataFileInfo struct { 50 | name string 51 | size int64 52 | mode os.FileMode 53 | modTime time.Time 54 | } 55 | 56 | func (fi bindataFileInfo) Name() string { 57 | return fi.name 58 | } 59 | func (fi bindataFileInfo) Size() int64 { 60 | return fi.size 61 | } 62 | func (fi bindataFileInfo) Mode() os.FileMode { 63 | return fi.mode 64 | } 65 | func (fi bindataFileInfo) ModTime() time.Time { 66 | return fi.modTime 67 | } 68 | func (fi bindataFileInfo) IsDir() bool { 69 | return false 70 | } 71 | func (fi bindataFileInfo) Sys() interface{} { 72 | return nil 73 | } 74 | 75 | var _assetsHtmlClashConfigLocalYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xeb\xaf\x24\xc7\x75\xdf\x77\x02\xfc\x1f\x2e\xec\x0f\x4e\x80\xe9\xde\x3b\x33\xf7\x0d\x04\x01\x4d\xea\x41\x5b\x96\x04\x52\x82\x93\x4f\xc1\xe9\xaa\xea\xee\x73\xbb\x5e\x5b\x8f\xe9\xe9\x31\x0c\x30\x46\x84\xb5\xa8\x48\x8a\x13\x45\x06\x6c\x29\xb4\x62\xc9\xa2\x6c\x39\xb2\x22\x47\x52\x24\x51\xfa\x67\x78\x97\x9b\x4f\xe6\x9f\x10\x74\xcf\xcc\xbd\x7b\x5f\x5d\x67\x88\xcd\x6e\x82\xd0\x16\x05\xea\xce\xaf\xaa\x4e\x55\x9d\x3a\x75\x5e\x75\xfa\xb7\xf7\x1e\x7f\xf9\xad\xc7\xdf\xfa\xf2\x93\xb7\xff\xe4\x83\x3f\xf9\x9f\x17\xdf\x7e\xf4\xfe\x2f\xbf\x76\xf1\xa5\x1f\x5e\xfc\xea\xad\xf7\x7f\xf1\x1f\x9f\xfc\xdb\x6f\x7c\xf0\xde\x9f\xbd\xff\xf3\xb7\x1f\xbf\xfd\x9f\x2e\xbe\xfe\xcd\x7f\xfa\xd5\xbf\x7f\xff\xbd\xdf\x7c\xf0\x8d\x77\x99\x04\x5f\x3f\x79\xf4\xb7\x17\x6f\xbf\xfb\xf8\xaf\xdf\x7a\xfc\xce\xf7\x2e\xbe\xfe\xa3\x0f\xbe\xf1\xee\xe3\xb7\xbe\x7f\xf1\xd5\x9f\x5c\x7c\xfd\x47\x2f\xbf\xf4\xdb\x7b\xeb\x26\x1f\xbc\xfb\x95\x8b\x5f\x7c\xfd\xe2\x67\xff\xfd\xe2\x57\x6f\x3d\xfe\xc5\x7f\xf8\xa7\x5f\xfd\xc5\x5e\x1d\x82\xf5\x67\x0f\x1e\x54\x18\xea\x58\xe4\xcc\xa8\x07\xab\x38\x6d\x1e\x58\x67\x96\x9d\x35\x46\xbe\xfc\x52\xdf\xde\x1a\x17\xf6\x4c\xb9\xf7\xe9\x2f\x7c\xe1\xf3\x2f\xbf\xd4\xff\xaf\xb3\xbd\xe3\x93\xd3\xfd\xeb\xbf\xbe\xf9\xb9\x57\x7f\xff\xcd\xc3\x97\x5f\xf2\x86\x35\x3e\xbb\x44\x4d\xd7\xa8\x7f\xd6\x37\xde\x03\xcd\x37\xb8\x3d\xd4\x7b\x46\x8b\xa1\xf5\x3f\xef\x01\x0a\x97\x82\x67\x37\x3b\x77\x82\xa3\x5b\x0f\x51\x1a\xb7\xf7\x19\xd4\x71\x39\xf4\xa2\x80\x7d\xee\xcd\x4b\xc4\x55\xbb\x59\xdf\x0e\xa4\x34\x6d\x26\x41\x9f\xed\x95\x20\xbd\x78\xf9\x25\x65\xb8\x38\xdb\x73\x51\x8a\x97\x5f\x92\xa6\xca\xa4\x58\x08\x79\xb6\x87\xba\x34\x2f\xbf\x24\x96\x41\x38\x0d\x32\x63\x46\x07\x67\xa4\x14\xee\x6c\x6f\x3a\x3b\xce\xf7\xf3\xfd\x7c\x7a\x76\xba\xbf\xa6\xa6\x5f\x15\x14\xfe\x6c\xfb\xef\x5d\x56\x39\x13\x6d\xff\x87\xbd\xbd\x6c\x4f\x83\x12\x67\x7b\x17\x5f\x7a\xf7\xe2\xc7\x6f\xfd\xaf\xb7\xbe\xfc\xf8\x2b\x3f\xe8\xff\xbe\xb7\x17\x3a\x2b\xce\xf6\xbc\x90\x82\x85\xf5\x5f\xae\x3a\xda\x1b\xfe\x2f\xdb\xbb\xf8\xe5\x4f\x9f\xfc\xe6\x9d\xc7\xdf\x7a\xeb\xfd\xf7\xbe\x76\xf5\xd7\x75\x2f\x17\x7f\xf9\xde\xc5\x7f\xfb\xe9\xcd\xbf\xae\x99\xe4\xa9\x1e\xbe\xfb\xe3\x27\xff\xf8\xbd\x8b\x3f\x7d\xf4\xf8\xab\xff\xf5\xea\xaf\x4f\xfe\xf1\x9d\x27\xef\xbd\x77\xf1\xed\x47\x4f\xbe\xf3\x9d\xa7\xa9\xbc\xdd\x33\x85\xca\x0f\xdf\x79\xf4\xee\x87\xef\x3c\xfa\xc9\xde\xfb\x3f\xff\xfb\x8b\xbf\x7c\xef\xda\x0f\x3f\xfa\xf0\x9d\x47\xff\x63\xef\xf1\x9f\x7f\xef\xf1\xb7\x7e\x78\xed\x87\x9f\x7f\xf8\xce\xa3\x1f\xee\x3d\xfe\xe6\x3f\x5c\xbc\xfd\x57\x17\xdf\xfe\xce\xb5\xdf\x7e\xd1\xff\xbe\xf7\xc1\xaf\xbf\x76\xb3\xb7\x7e\x98\xbf\xd9\xbb\x78\xfb\xaf\x1e\x7f\xe5\x37\x17\xdf\xfd\xfe\xb5\xdf\x7e\xd6\x37\xdc\x7b\xff\x37\xff\xee\x83\xf7\xfe\xfc\xf1\x37\x7f\x74\xed\xb7\xbf\x19\x7e\x7b\xfc\xeb\x9f\x5c\x7c\xf7\xfb\x17\x7f\xfa\x83\xf7\x7f\xf1\x17\xb7\xba\xfd\xfb\xbd\x0f\xfe\xec\xbf\x5c\xfc\xf5\xdf\x5d\xfb\xe1\x07\x1f\xbe\xf3\xe8\x6f\xf7\x2e\x7e\xfd\xb3\x9b\x84\xfc\x5d\x3f\xe0\xde\xe3\x9f\xfc\xe7\x9b\x3f\xfc\xf0\xc3\x77\x1e\x7d\x7f\xef\xc9\x57\x7e\x7c\xf3\x87\x9f\x7c\xf8\xce\xa3\x1f\xef\x3d\xf9\xea\xcf\x2e\xbe\xf4\x0f\x4f\x6d\xcf\x97\x7e\xfa\xfe\x2f\xbf\x79\xb5\xe0\xd7\x37\xe2\xe9\xcd\xbc\xbd\x11\xd1\x8b\xa7\x36\x01\xa4\x7c\xba\x83\x3b\xf7\x64\xdd\x47\x74\x32\x0b\xc2\x6f\x7b\x71\xf2\x6c\xef\x77\xfa\x13\x7f\xf6\xe0\x41\xdb\xb6\x79\xe5\x03\x04\x64\xc3\xa9\xaf\x84\x16\x0e\x82\xf8\x37\xb3\xfd\x83\xdf\x59\xe3\x51\x07\xe1\x16\x20\xcf\xf6\xe6\xfb\xfb\x77\x11\xc2\xf4\x0d\x3a\x6e\xb3\xc0\x73\xa1\xe3\xdc\xde\xa0\xe3\x4e\x8e\x7b\x2e\xa4\xf8\xea\x06\x29\xb7\x19\xfc\xb9\xd0\x11\xfd\x1d\x2c\x72\xeb\x3c\x3d\x1f\x2e\x81\x1b\xa4\xdc\x79\x7c\x9f\x0b\x29\x2e\xde\x20\xe5\x3e\x69\xf1\x5c\xa8\x81\x9b\xd4\xdc\x16\x4e\xcf\x67\x83\xea\x1b\x74\xdc\x96\x85\xcf\x85\x0e\x2e\x6e\xd0\x71\x5b\xf4\x3e\x17\x3a\x4a\x77\x83\x8e\xdb\x92\xfe\xb9\xd0\x51\x15\x37\xe8\xb8\x7d\xb1\x3c\x17\x3a\xb4\xbc\xae\xde\x5c\xbf\xc7\x9e\x13\x11\x26\xd4\xc2\x5d\x13\x6a\xb7\x35\xa6\x3b\x09\xb9\xeb\xea\x7c\x06\xf4\x6d\xa9\xb8\xa9\x5f\x6d\xa9\x90\x06\x78\x56\x80\x04\xcd\xc4\xf3\xa1\xe4\xb6\xfe\xb7\xa6\xa4\x04\x29\x0b\x60\xcd\xff\x49\x2a\xb6\xea\xb0\x75\x66\x81\x5c\xb8\xb5\xce\x08\xf1\xec\x69\x42\xfa\xde\x9f\x1a\xed\xb7\x36\xa3\x5d\xa9\xd9\x7f\xf4\x47\x7b\xf9\xa0\xe8\xff\xf1\x1f\x3f\x18\xac\x9a\x07\x1b\x0d\xf4\x5f\xb2\x7f\xf1\xca\x17\x7f\x6b\xa3\x94\x42\xa8\xcf\xf6\xac\x65\xb5\x60\xcd\xe5\x78\x0f\xb6\xff\x96\x41\xcc\x3b\x50\x9b\x69\xd5\x02\x64\xa8\xb3\x01\x7b\x39\x6d\xa1\xa1\x90\xe2\x6c\x2f\xb8\x28\xb6\x7f\xbb\x9a\xcf\xd1\x96\xff\x36\x64\x12\xd6\xa4\xc7\x33\xfd\xec\xe6\xfa\xea\x67\x27\x9f\xfe\xfd\xc9\x17\xfe\x90\x38\x63\xa6\x5f\xc8\x8c\xa3\x7f\x76\x33\xfe\xe2\x9b\xc4\xb9\x46\xff\x62\x76\x17\x9e\xe1\xee\xbe\x42\xdd\x57\x78\x21\x73\x3d\xb7\xcf\x6e\xae\xbf\xf7\x79\xe2\x5c\xcf\xed\x0b\x99\xab\xaf\x9e\xdd\x5c\xdf\xfc\x14\x71\xae\xbe\x7a\x21\x73\x75\xcf\x50\x1a\xbf\x41\x95\xc6\xee\x05\x49\xe3\xfa\x19\x9e\xd7\x4f\x53\xcf\x6b\xfd\x42\xe6\xca\xc5\xb3\x9b\xeb\x6b\x9f\x20\xce\x95\x8b\x17\x32\xd7\xd2\x3d\xbb\xb9\x7e\xf2\x0d\xe2\x5c\x4b\xf7\x42\xe6\x5a\x15\xcf\x6e\xae\x9f\xfa\x5d\xe2\x5c\xab\xe2\x85\xcc\x55\xcb\x67\x37\xd7\xcf\x7e\x86\x38\x57\x2d\x5f\xc8\x5c\xd7\x96\xcc\xb3\x9a\xaf\xbe\x52\x17\x27\x5f\x7c\x73\xf2\xea\x2b\x93\xdf\xfb\xfc\xe4\xcd\x4f\x4d\x5e\xf9\xe2\xe4\xd5\x4f\x4f\x5e\xfb\xc4\xe4\x53\xbf\x3b\xf9\xec\x67\x26\x9f\x7c\x63\x42\x96\xd9\x6b\x02\x5f\xc8\xda\x80\x7c\x56\x8c\x40\x9b\xeb\x0b\x98\xe4\xcb\x2f\xb9\x28\xc5\x36\x64\xf0\xda\xe7\xfe\xe0\x95\xd7\x3f\x9b\xbd\xf9\xc5\x4f\x7e\xf2\xf5\x7f\x35\xf1\x2a\xd8\xc9\x6b\xaf\xbf\xf1\x89\x57\xbf\x70\xed\xe7\xdf\xff\xc4\xbf\xfe\xc3\xcf\xbd\xf1\xda\x04\x1c\xc2\xec\x12\x70\x57\x0f\xa0\xac\x75\xe6\x5c\xb0\x90\x1b\x57\x4d\x6e\xc6\x22\x6e\xc1\xad\xf5\xd6\x84\x9e\xcc\x24\xb6\x90\xa6\xaa\x84\x23\x61\x2b\x11\x4c\x0c\x12\xb5\x20\x91\x51\x2d\xc2\x3e\xad\xdf\x45\x98\x52\x81\x73\x12\x70\xa9\xb3\x4c\x57\x3e\xb8\x4c\x3a\x38\x39\x1f\x6f\xb3\xdd\x87\xca\x98\x4a\x8a\x34\xae\x5f\xb2\x7e\x7d\x93\x54\x18\x2d\xb8\xc3\x85\xc8\x65\xff\x5f\x24\xba\x0b\xb3\x24\x83\x19\xd7\xa8\x7d\x80\xca\x81\x22\x35\x28\x0b\x2a\x4c\x8d\x2c\xc3\x25\x0a\x38\x47\xed\x89\x5d\x32\xae\x73\x2d\xd2\x6b\x56\x16\xbe\x58\x12\xfb\x6c\x8d\x6b\x14\xa0\x24\xc1\x77\x5b\x2a\x45\x59\x02\x25\xbc\x17\x9a\x7a\x7a\x0c\x8b\x32\xd2\x96\x6b\x0d\xed\x97\x8c\x82\x76\x86\x35\x9e\x17\xa4\x33\xd9\xd6\x10\x3c\x58\x4b\xea\xf8\x12\x3c\xba\x71\xdb\x63\x51\x02\x13\x85\x31\xcd\x1d\xc8\xd7\x3f\x9f\xbd\xfa\xfa\x6b\x6f\x4c\xe6\xf9\x74\x36\xcf\xe7\x47\xf9\x74\x76\xf4\x60\x3e\xbb\x86\x9c\x68\x93\x39\xe1\x8d\x5c\x88\x1b\x8d\x0e\xf3\xe9\xe1\x71\x3e\x9b\x1e\xe6\x27\x07\xbb\xb7\x3a\xce\x67\x87\x87\xe4\x66\x87\xb3\xfc\xf0\x24\x9f\xed\x9f\xe6\xd3\x39\x7d\xb0\xc3\x83\xfc\xb4\x9f\xdb\x41\x3e\x9f\xee\xd2\x68\x7a\x34\xcb\x67\x07\xf3\xfc\x64\x7f\xa7\x56\xc7\xf3\x7c\x7e\x90\x4f\x0f\x76\x1a\x6b\x36\x3f\xcc\x67\xf3\x7c\x76\x30\x23\xb7\x9a\x1e\x9d\xe6\x07\x87\xf9\xec\xe0\x24\x9f\x4e\x4f\x92\xcd\xae\x33\x8f\xf5\xcc\xe6\x61\x91\x64\x32\x2b\x1c\x7a\x66\xac\xa0\x80\xfb\x3b\x2d\x0d\x6a\x51\x55\xbb\x00\xd3\x27\x21\xb4\x18\xec\xfa\xe2\x4f\x62\x17\xfd\xfd\x38\x36\xfa\xf6\xc0\xf4\x9d\x06\xe1\x08\x93\x26\xc8\xa2\xc0\x85\x6f\x82\xa1\x1d\xec\x20\xa4\xa8\x1c\xe4\xb6\xa6\x42\x49\xf2\xf0\x12\x7b\xb7\x24\xda\xb2\xd5\xe9\x34\x9f\xee\x9f\xe4\x07\xf9\xfe\x83\x19\x91\x13\x37\x4d\x4e\x76\x6f\x32\x9d\x7d\x84\x36\x47\xbb\xb7\x39\xdc\xa5\xcd\xf4\xe0\x34\x9f\x0e\xe7\x7f\xbf\x6f\xb5\x4f\x6a\x75\x34\x99\xed\xef\x4f\xcf\x8a\xd9\xc9\x59\x39\x9b\xf3\xb3\xb3\x07\x07\x27\x1f\xa1\x61\xb9\x73\xc3\xa3\x63\x76\x76\x20\x4e\x08\xed\xae\xb3\xc3\xa0\x28\x12\xd8\xa6\xc7\x65\xbd\xce\x4a\xe2\xdd\x01\xed\xa9\xea\x84\x86\x85\x70\xf9\xb9\x1d\x61\xc7\xe9\xfe\x3c\x9f\xe5\xf3\x61\x27\xe6\xc4\xfd\x9b\x1d\x0e\x77\xc4\x6c\xff\x84\xbe\x7f\x93\xe9\xc1\x71\x7e\x3a\xcb\xa7\xb3\xbe\xd1\xf4\x98\xd6\x68\xb6\x3f\xcf\xa7\xfb\xbd\xb4\x1f\xce\xcb\x74\x97\x0d\x38\xf0\x35\x38\xc1\x49\xcb\x7a\x38\xdb\x67\x2c\x67\x2c\x09\x3c\x39\x99\x9e\xee\xd3\xb4\xf0\x53\x06\xac\xa6\xe9\xb2\xa7\x15\xd0\x24\x31\x14\x34\x29\xdc\xe3\xb4\x08\x39\x44\x02\x74\xd0\x5b\x68\xec\x07\x0a\x56\xa6\xd7\xcb\xee\x66\xaa\x9b\x86\x18\x56\x82\xb6\x00\x60\x9b\x8c\xd3\x34\x59\xb0\x4d\x89\x9a\xb6\xad\x60\x1b\x85\xce\x19\x9a\x8a\xda\xa3\x8d\x6e\xa8\x58\x1b\x1d\x75\x72\xc1\x20\x27\x62\x1d\xab\x7b\x0b\x08\x3d\x19\x4a\xb2\x89\x5d\x20\x69\x18\xe0\xc2\x60\xe4\x1b\x9a\xee\x0d\x2e\x36\xe0\x73\x4c\x2b\x1b\xe0\x89\xeb\xba\x20\x1e\x84\x45\x25\x69\x2b\x5a\x00\x37\x86\x88\xd4\xbc\x85\xca\xe8\xda\x78\xa2\xfb\x80\x78\x1c\x0b\x51\x83\x66\x82\x24\xb3\x0b\x2c\x0c\xcd\x04\x2c\xb0\xaa\x86\x99\xe5\xa1\x25\x80\xf5\x40\x02\xad\xe3\xc0\x0c\xea\x00\xb2\x21\x71\x57\x81\xa1\x44\x2d\xa8\x54\x07\x45\x87\x66\x2b\xb2\x1f\x47\x9a\x05\xd2\xd8\xb6\x90\xc6\xa8\x42\xb8\x2a\x67\x7a\x17\x30\xa9\xeb\x58\x38\xd7\xd1\xb0\xc6\x34\xe4\xed\x33\xa6\x19\x5c\x23\x04\xb9\x7b\x29\xce\x69\x1d\x7b\x89\x25\x91\x35\xa9\x8c\x19\x3d\x6a\xe1\x3d\x6a\x3f\x38\x24\x49\x6d\xda\x7a\x4a\x22\x82\x81\x0f\x3d\x21\x25\xc1\x45\xd4\x1f\x4f\x20\x78\x92\x5a\x9a\xc7\xa9\x06\x5d\xd1\xe4\x6d\x0f\xd5\x42\x6a\xd1\x7a\xf0\x08\xb4\xee\x9b\xe9\x3e\xcd\x11\xc8\x24\x38\x34\x7a\x17\xa7\x28\x93\x9d\xcd\x91\xb0\xba\x1a\xa8\x9c\xc3\x8c\xb2\xe0\x30\x08\x56\xd3\xa8\x36\xda\xd4\x40\x61\x60\xe6\x22\x43\xa0\xa9\x03\x2c\x90\x59\x9d\xb5\x64\x64\x57\x08\xc7\x02\xcd\x59\xc6\x01\x65\xa7\x0c\xf9\xd2\x1c\xf0\x0b\x14\x2d\x85\x12\x0e\x51\x91\x8e\x45\x0f\xa4\x9a\x05\x9c\x81\xe3\xa4\xd1\x85\xb0\x1c\x3d\x33\x51\xd3\x2e\x44\x2e\xac\xf1\x18\x6c\x6d\x82\xa1\x69\x94\x5c\x2c\x10\x74\x00\x47\x1c\xa0\xa7\x46\xeb\x9e\xed\x09\xb6\xd5\x80\x76\x9c\xea\xf1\x7b\x0a\x4e\x5a\x46\xf4\x0f\x89\x2e\x4d\x2e\x85\x63\xd2\x44\x9a\xda\xca\xb5\x9f\x55\x34\x9d\x85\x9b\xf6\xdc\x68\x41\xa4\xc2\x19\x4b\x95\xe1\x1b\x6c\xf4\xc2\x31\xa3\x83\xa0\x32\x40\x64\x4d\xff\x0f\x95\x7c\x9a\xe4\xe5\x9d\x8e\x24\xa0\x00\x17\x6a\x46\xf4\x72\xaf\xed\x1e\xe1\x16\xc8\x04\xe5\x34\x88\x5e\x82\x29\x24\xea\x86\x82\x57\xa2\xbf\xab\xa8\x87\x52\xf0\xb4\xad\x26\xa4\x05\xa4\xed\xb5\xd0\xa0\x3b\xd0\x55\xae\x3a\x02\x96\x75\x4c\x1a\x2b\x38\xf1\xaa\x12\xde\xa0\xcb\x8b\xf4\x01\x14\x43\xd8\x95\x81\xa6\xd8\x08\x22\x3a\xd3\xdf\x98\x34\x12\x16\x66\x85\xb4\x48\x89\x10\x5c\xd2\x34\xb2\x12\x5d\x7f\x9b\x01\x21\x50\x23\x91\x35\x34\xcd\xa6\x94\x18\x02\xed\x38\x94\xc6\x09\xac\xb4\x35\x12\x19\x8d\xe2\xa7\x7f\x2f\x9c\x69\xbd\x70\x24\x7d\xe0\xe9\xdf\x5b\xc1\x6a\xa0\x31\xf5\xf5\x66\x58\x10\xa7\xe5\x90\x43\x47\x39\x62\x65\x60\x75\xaf\x3a\xd2\xec\x94\x32\xa0\xaa\x48\x87\xab\x82\x20\x28\x2c\x58\x89\x20\x41\x07\xe1\x34\x2d\xc6\x2b\x82\xef\x34\xcd\x06\xac\xa4\x29\x40\x2e\x0c\x32\xe1\x69\x9d\x1b\x93\x6b\x92\xc2\x5f\x19\xc3\x9d\x00\x4e\x3b\x39\x95\x49\xfb\x01\x2a\xb3\xa0\x6c\x57\xe5\x04\x84\xfe\xd0\xd0\x26\x14\x95\x33\x40\xbb\x02\xeb\x82\x66\x6f\xd5\xc2\x99\x86\x76\x37\xd4\x58\xd5\x81\x1a\x2f\xad\x1b\xa2\x2e\x5e\x37\x45\x49\x9a\x7d\xdd\xf4\xd7\x0d\xc3\x40\x3b\xd8\x75\x23\x12\x81\xfb\x2b\x20\xed\xec\xd6\x4d\x65\x24\x17\x34\x25\xb5\x36\x26\xf8\x88\x81\x76\x10\xeb\xc8\xbd\xa1\x1d\x99\xba\xeb\x39\x95\xaa\x88\x63\x11\x50\x11\xb5\x1b\xcc\x18\x14\x44\xa7\x10\x32\x3c\x27\x91\x8b\xcc\x30\x9a\x90\x43\x55\x45\xda\x85\x80\x1a\x03\x46\xa5\x40\x92\x63\xf7\x82\xdd\x1b\x57\xba\x81\xb5\x25\xc9\x1f\x87\xde\x47\xda\xb1\x41\x1f\x0c\x6b\x06\x8d\x9e\x84\x3f\x07\x0b\x7a\xbb\x6b\x14\xe9\x75\x8e\xe7\xb4\x8b\xfc\x1c\x35\x4d\x77\x3d\x6f\x4a\xe3\x88\x76\xd3\xb9\x41\xad\xc0\x07\xc3\x89\x0c\x7c\x1e\x7d\x50\xdd\xf0\x1c\x9c\x36\x40\xf4\xc1\x82\xef\xef\x9f\x34\xb8\x81\x06\x68\xcb\x3c\x20\x99\x71\x34\xcb\xa6\x41\x9a\xfb\xb5\x31\xc4\x2b\xbd\x07\xd2\xc3\x06\x8d\xe1\xa8\x2b\xa2\xe8\x91\x42\x19\xcd\x45\x5e\xa6\x63\xc3\x52\x58\x83\x3a\x90\xa0\x58\x37\xb4\x2b\x45\xa2\x0f\x42\x6b\x13\x88\x72\x47\xe2\x42\xf8\xe0\x04\xd1\xea\x90\xa6\x52\x82\xe8\xa8\x1c\xd2\x7b\x5c\xda\x2e\xe8\x71\xac\x46\x45\x63\x06\x05\x8e\xe5\xa8\xcb\xb4\x94\x50\x10\x82\x70\x3d\x9f\xb7\xe9\x78\x84\x82\x0e\x35\x29\xf3\x40\x09\x8e\x91\x98\x89\x24\x2a\xc8\xf5\x2a\x8d\x43\x49\xc0\xe8\xca\x12\x8f\x97\x32\x05\x4a\x41\xd4\x01\x54\xe7\x2d\x10\x7d\xeb\x1b\x2c\x35\xbb\x69\x6b\xc5\xd1\xb0\x0b\xa2\xb3\x55\x0b\xd3\x22\x31\x84\x2c\x5a\x1f\xc0\x02\x49\x36\x6a\xb1\xc4\x00\x92\x68\x6d\xe9\xba\xc9\xcd\x3d\xe1\xe9\x1b\x48\x64\x43\x6e\x2b\xe9\x3e\xd1\x88\x39\x30\x1a\xb2\x69\x04\xed\xee\xd1\xa6\x44\x49\x32\x21\xb4\xa1\xf9\x34\xb4\x6b\x72\x4d\xe8\xae\xa3\x69\x77\xba\x1b\x4c\x27\x9a\xfd\xde\x83\x35\xc5\x81\xd6\x03\x69\x07\x46\x77\x74\x4d\x6d\xc0\x12\x79\xba\x0b\xd2\x90\xa1\x3e\x74\x44\x05\xd0\x34\x14\xb9\x6a\x1a\x62\xa4\xca\x68\x4a\xf2\x80\x71\x28\x74\x00\x39\x78\x80\x07\x15\x98\xe0\x9c\x31\x0b\xe1\x18\xf8\x40\x09\x78\x58\x90\x43\xd0\x8e\x42\xb2\x05\x93\xf5\xd2\x90\x22\x04\x2c\x38\x2f\xd6\x07\x90\xd4\x75\xb1\x24\x72\x82\x65\x7c\x41\x36\x06\x2c\xab\x8d\x12\x74\x34\xd9\xdf\x6a\x91\x01\x33\x8a\x98\xe1\x66\x51\x53\xb9\xd7\xe2\x12\x17\xb4\x15\x96\xd0\x09\x47\xda\x63\x19\x1d\x71\x87\xcd\xf4\x84\xb4\x52\x26\x40\x30\x39\x52\x7a\x0c\x10\x3c\x91\x09\x1c\x7a\x95\x15\x4e\x00\x2d\x88\x3c\xbc\x71\x28\x91\x78\x83\xd9\x40\xa2\x37\x0c\xae\x16\xd2\x22\xc4\x22\x92\x59\xab\xc7\x92\x70\x4e\x80\xa5\x6d\xd6\xc3\x68\x1c\x4d\x78\x0f\x48\xaa\x57\xd9\x41\x13\x83\xa0\x66\xec\xf4\xa6\x39\xea\xea\x52\x92\x53\x26\xd9\xb7\x51\xc4\x0c\x0b\x27\x78\x11\x0b\xaa\x91\xee\x04\xe7\x48\xbb\xfd\xd6\x50\x45\x76\x60\x3b\xe1\x51\x22\x95\xe8\x38\x28\xc1\x3b\x60\xd7\x84\x90\xf6\xa7\x44\x8a\xf5\xe2\x70\x49\x17\x67\xce\x00\xf7\xb5\x69\xf3\xfa\xae\x6c\xf4\xeb\x58\xcf\x88\x46\x83\x67\x0e\x0b\xda\xf8\x5e\x40\xa8\xa2\xa3\xb9\x17\x7c\x0d\xdc\xb4\x6b\x73\x9a\x22\x26\x7c\x6d\xac\x20\x85\x6b\xbc\x44\x2e\x86\x1c\x40\xd2\x4e\x78\x53\x86\x12\x94\x21\x46\xf4\xbc\x89\x9a\xd3\xf7\xc4\xfb\x4d\xfc\x8f\x34\xc7\x00\x2e\x58\xa8\x68\xc7\xc4\x07\x01\x8a\x19\xa5\xa2\xa6\x3a\x17\x7d\x10\x42\x11\x8f\xd6\x06\xdb\x82\x94\x44\x47\x63\x38\x3a\xa2\x91\xd1\xdb\x15\x64\x7d\x25\x08\x66\xb2\x9a\x76\x97\x0c\x58\x65\x88\x58\xce\x3b\x1f\x69\xe6\x58\x10\xcb\xd0\x2b\xf8\x94\x74\xf0\x5a\x54\x11\x1c\x47\x20\x76\x5d\x8b\x8d\x63\x90\x0a\x0f\x0b\x4e\x7b\xd2\x14\x50\x8b\x8e\xc6\x4c\xc1\xb8\x5d\xd2\x4a\x42\x54\x85\xa4\xdd\xd8\x21\xba\xc2\x14\x18\x48\x87\x31\xc4\x00\xda\x04\x9a\x30\x0f\x8b\xc2\x2c\xa9\x66\x57\x24\x1a\xde\x51\x7b\x21\x34\x25\x0f\x33\xda\xb5\xb8\x57\xe9\xe5\x8a\x36\x18\x6e\x5a\x22\x05\xae\x00\xcd\x91\x05\x34\x1a\x88\x29\x65\x71\xe3\x88\x22\xa4\x7a\xc6\x16\x74\xa0\xc9\xba\xc5\xcc\x01\x6d\xfc\x05\x16\x44\x05\x6e\xb0\x26\xac\x13\x9e\x48\x02\x2a\xa2\xf1\xb1\x30\xb0\x4b\x0c\x71\x61\x80\x1c\x73\x5e\x98\x25\x75\x76\x2b\x1a\x37\xb6\x73\xcf\x6a\x63\x24\x6d\xfc\x16\x7c\xdd\xab\x67\x46\x5b\x6a\x86\x6a\x0b\x21\x58\x62\xcc\xad\xad\x8d\x70\xa4\xe3\xd9\x62\x83\x0a\x2c\xd2\xbc\x42\x3d\x7a\x9d\x5b\x40\x45\x3f\x8c\x26\xd0\x62\x8a\x3d\xba\x05\x62\x3a\x78\x8b\x3a\xf2\x92\x08\x25\x26\x77\xb7\xc6\x71\x3a\x1b\xb7\xc6\x35\xa5\x34\x2d\x45\xae\xb4\xc6\x49\xce\x80\x26\x88\x5b\x4f\x8b\x16\xf6\x38\xca\x0e\x2f\x6b\x50\x3e\x10\xb9\x7d\xa9\xb3\xec\x74\xbf\x6d\x17\x61\x7f\x4e\x7c\xe9\xab\xb3\x0c\x67\x2e\x9e\x3c\x9c\x3d\xa4\x99\xd2\x4b\xbd\xa4\xb9\x62\x96\x83\x64\xa1\x6d\x47\x07\x35\xd1\x72\xe9\x40\x73\xb1\xa4\xf8\x8c\x3a\x66\x54\x81\x1a\x02\xf1\xd5\x41\x27\xe8\x29\xa2\x9d\xf0\x19\x59\x5a\x75\x46\x61\x74\x48\x34\xfd\x3a\x13\xb3\x4a\xd0\x98\x6d\x05\xa6\x20\xfa\xd1\x57\x34\x0d\x65\x25\xa4\x24\x76\x28\x9c\xd1\x22\x50\x3c\xb1\x2b\x63\x54\x1e\x47\x0e\xda\xe5\xd3\xf7\xa1\x50\x74\x1a\x77\x0e\x23\xd7\xea\x16\x64\x87\x5a\x0a\xc2\x13\xde\x0c\x5b\xe3\x46\xf2\xcf\xb7\xa8\x5e\xc4\x49\x01\x0d\xe1\x45\x88\x05\x17\x94\xd0\xc1\x41\x40\x5d\x11\x9f\xf4\x6c\x1b\xd1\xe0\x05\xe8\x66\x1d\x1c\xe9\xef\x7a\x5a\x13\x24\x06\x30\x0a\x63\x9a\x60\xec\xfa\x30\x50\xde\x2e\x31\xd6\xcb\x47\x02\x2b\x30\xa1\x03\x44\xb7\x7e\x2d\x51\xa4\xed\x6d\x26\x05\x38\x1f\x1d\xf9\xc9\x04\x33\x9e\xea\x29\x67\x0e\x58\x43\x74\x81\xdc\xc8\xa7\x4d\xbf\x56\xe0\xe8\x69\xd9\xd8\x5c\x29\xa2\x64\x58\x23\x09\x3d\xea\x85\xe1\x14\xcd\x53\xec\xb2\xb0\x62\x19\x14\x04\x87\xc4\xaa\x08\xe0\x87\x97\xca\x04\x39\x5d\x4a\xb4\x85\x01\x47\x53\x1d\x4a\x0d\x8c\x92\xf0\x38\xe0\x48\x1d\x46\xdd\x74\x54\x3f\x72\xb9\xd4\x22\xf4\xba\x03\x31\xc3\x4b\x84\xd0\xa1\x82\x8a\xe8\x85\x27\x26\xeb\xd6\x82\xa8\x13\x9d\x33\x2b\xb4\x16\x34\x93\xe1\x1c\x45\x1d\x81\xc2\x37\x0a\x50\x96\x82\xca\x38\x7a\x78\xc6\xd6\x52\x1f\xde\x69\xe2\x53\x2e\x2d\x96\xc4\x3c\x7f\x6d\x1c\xf7\xc1\x19\xda\xe9\xb9\x44\x0f\xfb\xb6\x5b\x93\x5e\xa0\xd0\x7c\x39\xd1\x0a\x67\xc9\x7c\x11\xc0\x55\x54\x9f\x4f\x8d\xba\xa9\x84\x20\xfa\x72\x1c\xb0\xd2\x68\xda\x34\x07\xb7\xd6\x9c\x76\x4c\xa3\x95\x06\xf8\x7d\x6f\x9e\x6f\xd8\x68\x62\x41\xb4\x28\x31\x52\xd8\x73\x41\x9b\xfb\xc2\x0f\xf7\x44\x5a\x8f\x2d\x91\xec\xcf\x5b\x41\x08\x09\x45\x76\x12\x84\x0f\xa5\xc4\xaa\x0e\x39\x58\x4b\xbc\x7f\xc0\x5a\x1f\x4c\xee\xee\x17\x7c\x9b\xd7\x66\x18\xa2\x16\x9e\xd0\xf3\xa4\x96\xbb\xa0\x87\x87\xf1\x04\xdc\x2e\x3d\x62\x56\xc9\x22\xf3\x02\x72\xaf\x8c\xa1\x2c\xc7\x44\x1a\xd3\x44\x9b\x81\xc5\x5d\x16\xaf\x60\xf9\xb2\x4b\xe7\xae\x80\xe6\xce\x20\xf1\x45\xf3\x1a\x8b\x25\x8d\x31\x38\x82\x34\xd5\x60\x71\x92\x7a\x8f\xc1\x70\x07\xc4\xe7\x70\x60\x31\x80\xa4\xdd\x60\x4c\xb8\x80\x25\x32\x08\x22\x0b\x0e\xb4\xb7\xe0\x84\x66\x1d\xf1\x35\x9d\xdb\x04\x7e\x89\x50\xb1\xb4\xc2\x21\x5d\xa9\x5d\xb7\xf2\x01\x02\xd1\xfb\x3f\x34\xc0\x48\xcb\xc9\x64\x4e\x40\xc0\x85\x90\x50\x1c\x12\xb5\xbe\x22\xd2\x96\x95\x0b\x61\x15\xf5\x35\x7c\x89\x4e\x14\xe0\x05\x31\xee\x55\x89\xa0\xb8\x24\x65\xcd\x57\xb6\xa6\x5d\x13\x15\xb9\x60\x55\xa5\x0c\x8f\x92\xac\xc0\x70\xc3\x88\x49\xf5\x12\x74\x45\x83\x5e\x95\xbb\x4b\x63\x17\x34\x58\x1b\x76\xf1\xae\x63\x00\x6f\xca\xd0\x02\x51\xef\x52\xc0\x45\x8b\xa1\x66\x86\xa8\xf4\x28\x08\xc2\x21\x90\x36\xd9\x1a\xd9\x29\xe1\xb2\x9d\x4a\xf1\x71\x85\x3a\x77\x82\x81\x0d\xac\x26\x46\x44\x77\x42\xfb\x7a\x48\x51\x14\x9c\x32\x05\xdf\x69\xe1\xaa\x8e\xe8\x19\x0e\x42\x7b\xe3\x06\xd9\x49\x0a\x85\x94\x75\x2c\x72\x2e\x08\x65\x9c\x50\x86\xc2\x45\xa2\xa1\xd6\xc2\x42\x58\x67\x82\x61\x46\xd2\x5c\x81\xd0\x29\xda\x09\x6f\x45\xa1\x76\xd9\xce\x56\x14\x2e\xd0\xce\x59\x5b\x43\xd8\xe5\x3d\x52\xaf\xa7\x6f\x4a\x47\x11\x5c\x7c\xf9\xf0\xf6\x58\xa7\x93\xa7\x3a\x13\x43\xa4\xd8\x6d\x5d\xa0\xa1\xa8\x16\xdb\x94\x3b\x9a\x48\x18\x80\x2a\xed\xdb\x29\xa4\x29\x72\x66\x9c\xc8\x5b\xd4\xdc\xb4\xb4\xe4\x73\x89\x0b\x51\xa2\x14\x3e\x18\xa2\x0c\xb9\xac\xda\x48\x8b\x0d\x1b\xd7\x5b\x2b\xe4\xa2\x8d\xdb\x06\xca\x8f\xdb\x50\x3d\x19\x4c\xa2\xd0\x21\xf7\xe5\x92\xb2\x3e\xfb\x6e\x45\x49\x0a\x38\x28\x64\xec\x57\xa3\x57\x16\x0b\x4c\xeb\x66\xa7\x05\xd2\x56\x1a\xa4\xdc\x3c\x4c\x1e\x4a\x0e\xa5\xf1\x86\x76\x0f\x16\x6c\xb8\x81\x68\x25\x3e\x42\x2e\xd3\x67\xa2\xc0\xb0\xce\x8a\x20\x0d\x2f\x4d\x45\xaa\x39\x21\x4d\xd5\x9f\x0d\x22\x34\xd0\x12\x21\x0a\x67\x80\x0f\xc9\x8f\xcc\x50\xb2\xc0\x19\xa8\xd2\x11\xd3\x45\x59\x69\x7c\xce\xd3\x67\x9e\x61\xe8\xac\xb1\x51\xae\xcb\xe2\x50\x5a\x48\x13\x79\xe9\x8c\xa6\xc5\xba\x59\xc0\xb0\xa0\xee\x31\x8b\x75\x93\x0b\x1e\x29\xb9\x3d\x2c\x7a\x12\x6e\xf3\xec\x3d\xaf\xd2\x1b\xd2\x43\xe3\x3a\xd6\x45\xea\x79\xfd\x88\xbc\x37\x9b\x48\xda\x6c\x34\x12\x75\x65\x28\x8e\xce\x21\xe1\x6b\x07\x0d\x6d\xfd\x60\x17\xa9\x19\xf2\xa5\x61\xd1\x07\xc0\x16\x34\x65\x5b\x9e\xfe\x9d\x92\xcf\x55\x61\x05\x0c\x1d\x23\x5a\x92\x75\x93\xd9\x48\x8b\xa4\xd4\xc6\x87\xb5\xbf\x3d\x8f\xe9\x0d\xaa\x5b\x6a\x22\x21\x96\xb8\x24\x66\x0c\xa1\xad\x8d\x16\x07\xb5\xd1\x55\x63\x88\xae\xff\x75\x9b\xcd\x82\xd3\x1e\xba\x85\x45\x41\x7c\x46\x23\x51\x37\x1e\xa4\xad\x69\x51\x36\x05\xba\x5b\x20\xf1\x35\xad\xea\x80\xed\x90\xf9\x2e\x5a\x5f\x48\xe2\x3b\x41\x6d\x5a\x4a\x92\xab\x36\xed\x2e\xf9\x94\x92\x5a\xc0\xc0\xcf\xf3\x75\xb9\x37\x20\x06\x1c\x3d\x56\x1a\x68\x3a\xaa\x57\xe0\xc2\xf0\x6a\x89\x9e\x41\x67\xc1\x35\xf4\x57\x59\x3e\x38\x21\xc2\xf0\xdc\x9a\xee\x1a\x5d\x57\x10\x4d\x2b\xf0\x34\xd5\x2e\x74\x56\x50\x73\x2f\x22\xd7\x45\x43\x73\x20\x0e\x79\x41\x80\xce\xd7\x48\x2d\x64\x8c\xde\x0a\xe7\x3b\x1f\x84\xa2\x65\x59\xb6\xd8\x10\x43\xd2\xc4\x64\xa6\xd6\xc8\xd2\x81\xa2\x1f\xc2\x65\x46\x2d\x09\x93\x8c\xa2\x4c\xfa\xfb\x67\xc8\x92\xb4\xa6\x15\xa9\x92\x90\x93\xb5\xae\x9c\xc0\xdf\xa9\xd2\x81\x95\x5b\x5a\xee\x28\x78\x7f\xe5\x52\x1d\xa4\x3e\x01\x92\xec\x26\x1b\x8e\x4f\xb3\x91\xcb\xa3\xe0\x2b\x0b\xe0\x7e\x18\xe3\x3a\xa3\x8c\xcd\x1c\xf8\x5a\x76\x01\x99\x4f\x20\xf1\xea\x7c\xa7\x40\xd9\xd3\x65\x66\xee\x07\xab\x14\x71\x6a\xf5\x94\x56\x70\x1b\x36\x69\xdb\x36\xeb\x2f\xbd\x2b\xd2\x72\x68\x80\xeb\xb5\x9a\x3f\xf6\x1d\x82\x8f\x2b\x11\x7f\x5c\x89\xf8\xff\xfe\x4a\xc4\x77\x7b\x3d\x4d\x25\x77\x78\xc0\x35\xb8\x4d\x12\xd9\x1d\x5b\x10\xe6\xeb\xde\xc1\xde\x59\x99\xe8\x6e\x2d\x28\x94\x92\x18\xd1\xdf\x62\x49\x6f\x55\x4b\xb9\x14\x4b\xe2\x7b\xc9\x52\x2e\xc9\x8f\x10\x37\x58\x2a\x0d\x9e\xf6\xaa\xae\x87\xae\xf7\x84\xf6\x10\x77\x58\x08\xae\x7d\x10\x9e\xf8\x69\x91\xeb\x6d\x68\x8f\x99\xaf\xb7\x99\x7d\x84\x36\xb4\xf2\xc8\xd7\xdb\x1c\x7c\x84\x36\xb4\x60\xca\xf5\x36\x47\x1f\xa1\xcd\xf1\x47\x68\x73\xf2\x11\xda\x9c\xde\xd3\xe6\xb2\x18\xf6\x3c\x9f\x1d\x1c\xe5\xbd\xa8\x9a\xd2\x04\xc7\x64\x7e\x9c\x1f\x1f\xe7\xd3\x13\x4a\xf5\xec\x6d\x9b\x83\xc3\xfc\xf0\x78\x3d\x0a\xb1\x4a\xf7\xd1\x41\x3e\x9d\xed\xef\x58\xda\xfb\xe8\x28\x9f\x9e\x1e\xef\xd8\x68\xb8\x15\x8e\x0f\xf3\xf9\x6c\x97\xca\xe3\xa7\xb3\xe1\xab\x11\x47\x07\x3b\xac\xdc\xf4\xf4\x24\x9f\x9f\xe4\xa7\xfd\x75\x32\x3d\xa5\xb7\x39\x38\xcc\x0f\x52\x65\xd1\xef\xf4\x7d\x08\xb1\x22\xfa\x26\xf8\x8a\x6a\xb4\x37\x0d\xb5\xdc\xdf\x25\x92\xe2\xed\x68\x68\x35\x66\xce\x0d\x71\x70\x0b\x9a\x53\x5f\x3f\xda\x41\x79\x1b\xcb\xea\xdc\x1a\x74\x9a\x53\x8b\x2c\xec\xf8\x96\xcb\x6e\xbe\x4d\x93\xee\x97\x8a\xb3\x26\x50\x23\xfa\x03\x36\x2f\xf1\x7e\xe0\x36\x6f\x94\xd4\xeb\x16\x9c\x6d\xd0\x19\x49\x6d\x45\x4e\xad\xce\x7a\x00\xde\x0b\x72\x14\x7e\x28\x9a\x4b\xbb\x0a\xa0\x10\x0a\x48\x95\xc7\x95\x28\x48\x55\x67\xd7\x3d\x12\x12\x7d\x6a\xe8\xa0\x88\x7e\x74\xf4\x75\x6f\x61\xd1\xdb\x16\x0a\x70\x25\xf8\xe8\x81\x9d\x70\x9f\x49\xd4\x02\x5c\xb6\x7b\xc3\x85\xe1\xbb\xb6\xfa\x48\x63\x5d\x2e\x14\x2e\x32\xaa\x04\xea\xb1\x5c\x48\x5c\x08\xd7\xd1\x1a\x0c\x2e\xa7\x1d\x6a\x0d\x38\x54\x04\xcd\x76\x02\x0b\xc3\x95\x3d\xf0\xf3\xb6\xcd\x60\x33\xe1\x3a\xb5\xb6\xb3\xc3\x25\x1e\xec\x2f\x4f\x8f\x25\x46\x96\x13\xfd\xfa\x13\xae\x1e\x72\x7e\x54\xb7\xb3\x83\xc8\x4a\x7a\xab\xd9\xec\xe1\x79\xd5\x2c\x96\xed\x6c\xe6\x8e\xe8\xcd\xa6\x8b\x43\x74\x33\x69\x5b\x77\x62\x3c\xb5\xd9\xd5\xd7\xf7\x16\x86\x73\xf0\x35\x21\x00\x09\x35\xa8\x18\xa8\x77\x44\x05\x6a\x7d\x9d\x8d\x81\xd7\xa8\x8c\x71\x9f\xf7\x0c\x55\xa3\x16\x89\xe9\x0e\x0d\x66\x3b\xb4\xb8\x24\x7f\xc8\xef\xa4\xf8\xc4\x8b\x82\x61\x0a\x7a\xf9\x31\xbc\x82\x95\x8a\xb0\xcc\xb1\xc9\xfa\x33\x90\xbe\xda\x61\x45\x2d\x22\xbd\xd2\x59\x2a\xae\x32\xe1\xd3\xc3\xa9\x3c\x5a\x9c\x08\x77\x58\x70\xb5\x33\x73\x0c\xbc\xb1\x22\x94\xc8\x07\x55\x39\x62\x02\x1b\x47\xaf\x45\x97\x59\x19\x69\x71\xd5\x35\xde\x52\xbf\x1d\xc7\xbd\x37\x61\xdc\x02\x9c\xf4\x8c\xe3\x44\x85\x3e\x08\xb7\xee\x3e\x27\x66\x40\x0b\xcd\x8c\x13\x61\x31\x1e\x8a\x19\x4a\xff\xe6\xfd\xe6\x14\x0e\xab\x3a\x30\x93\x88\x8e\x4f\x0a\x56\x18\x19\x0e\x0e\x8e\xd8\xe1\xec\x78\x4a\x95\x4f\x57\xb1\x2a\x62\x72\xbc\x59\x72\x46\xfc\xe2\x57\x2d\xac\x84\x50\x1a\x47\xcb\x5e\x8e\x56\x76\xc4\x2f\xa7\xd4\xc4\x0a\x73\x75\x61\xa8\x79\xe9\x85\xa1\xbe\xfe\x1d\x3a\x25\x3f\xb7\xba\x42\x8f\xc4\x3a\x37\x9b\x57\x17\x06\xc8\x17\xcb\xba\xda\x8b\x7f\x9a\x3f\x46\xf1\x7e\x9e\x81\xcd\xbc\x89\xa1\x16\xe0\x43\x36\x25\x46\x66\x26\x1c\x70\x5e\xf2\xa9\xa9\xe7\xb3\xc3\x8e\x7c\xa7\x1c\x1c\xb4\x28\x6b\x2b\xcf\xcb\x5c\x2c\x05\x8b\x41\x6c\x32\x5f\x3f\x0a\x09\xfd\xc2\x78\x84\x69\x86\xc4\xc5\xd9\x34\x98\xed\xda\x60\xbe\x6b\x83\x83\x5d\x1b\x1c\x92\x1b\xb0\x32\xdb\xbc\xbf\xb8\xb1\x68\xd6\x19\x9e\xf7\xfc\xb2\x75\x38\xa7\x78\xf0\x10\xc3\x82\xa2\x94\x1a\xa6\x03\x31\x2e\x55\x47\x49\xac\x98\x1b\x65\x44\x9a\x00\xe8\xa1\x3b\x14\x41\xac\xc1\xda\xce\x68\x8a\x5a\x3e\x50\x4b\xc0\x21\x71\xf6\x18\x16\x84\xb4\x81\x1e\x66\xb5\x5d\xbf\x74\xdb\x55\x20\x37\x0d\x3d\xa1\x63\xc0\x8e\xf8\xf4\x07\x40\xd6\xf3\x4f\x10\x2e\x6f\x9a\x7c\xbd\xca\xc9\x7e\x7b\x0d\x3f\x8c\x16\x71\x9e\xf0\x39\x3b\x76\xa8\x9a\x87\xc7\xa7\x5d\x19\xc9\xda\xc1\xe5\x00\xe3\x8c\x39\x00\x9e\xfe\x71\xb3\x96\x35\x6e\xec\xbc\x1d\x15\xb8\x4d\x2b\x9a\xd3\x4f\x75\x87\xa3\xb4\xf1\xf9\xc1\x69\x75\xba\x8a\x28\xf6\x8f\xa2\xd9\x75\xea\xaa\x0b\x8b\x21\x5e\x4c\xbb\x4b\x13\xea\xc2\xc7\x5e\xf1\x8f\xbd\xe2\x1f\x7b\xc5\x3f\xf6\x8a\xff\xff\xee\x15\xbf\xc3\x98\x53\x2c\xd7\x48\x70\xa0\xee\x58\x1f\x96\x96\xa7\xea\x0d\xe3\x34\x6d\xc6\x16\xb4\xac\x1a\x5b\x6b\xaa\x4b\xda\x1a\xa7\x6b\x62\xca\xdf\x06\x6b\x9d\x50\xd4\xea\x51\xbe\xe9\x9a\xcd\xab\xfc\x51\x15\xa1\x06\x85\x25\x68\x9f\x0b\x65\x14\xad\x8e\x5a\x68\x31\xb0\x9a\xf4\x39\xeb\x01\x49\xf5\x24\x86\xb0\xd0\x2d\xad\xe2\x3a\x19\xb9\x40\x9a\x22\x9c\x78\x01\x3a\x24\x18\xf5\x98\x94\x19\x3a\xe1\xd3\x66\x16\xfd\xd1\xf1\xf4\x21\x33\x40\x56\xb9\x26\x7c\x06\x1a\xea\xba\x56\x76\x5a\x96\x2b\x7a\xb3\xd2\x1e\xb9\x4a\x56\xe7\x0f\xfd\xaa\xd9\x55\xc9\x79\x81\x39\x03\x77\x78\x98\x50\xe2\xd6\xdb\x75\x7f\xea\xcf\x16\xf5\x74\x22\xcf\xdd\xa8\xfe\x1f\x42\x67\x03\x2c\x2c\x12\xa8\xab\x35\x1a\xcb\x1e\x92\x86\x81\xbc\xd6\xd3\x35\x49\x7c\x74\xb2\xbe\x5c\x8e\x36\x90\x11\x61\x9f\x0f\xff\xff\xe0\x24\x89\x3c\x9e\x0d\x29\x34\x7d\xb7\xb3\x24\x78\x76\x4c\xee\x77\x7f\x7f\xb8\x35\xfa\x7e\xf7\x13\xe0\xa3\xc9\xd9\xd9\xf4\xc1\x74\x96\xea\xf4\x68\x52\xb2\xfd\xfd\xb3\xb3\x07\xc7\x69\xa0\x38\xe9\x81\x84\xa1\x4b\x3e\x74\x79\xef\xd8\x97\xa7\xd7\xe6\xc0\xcf\xa3\x4f\xe5\x9e\xad\x99\x36\x38\x58\x08\x09\x7c\xf3\xe5\xb0\xfb\x52\xe0\x26\x5c\x6e\xb8\xfc\x3e\x80\x1a\x6a\x1f\x8e\x63\x24\x2e\x44\x9b\xcb\xfc\xe1\xc3\xfb\x10\x0b\x3e\xfa\x33\x68\xd8\x64\xea\xf9\x9e\x70\xb8\x97\x18\x5f\xe5\x51\x09\x7d\x5f\xfa\xe2\x15\x80\x92\xd2\xf7\xb0\x76\xf7\x2e\xcc\x15\x86\x90\x2c\x79\x3b\x33\xef\x0e\x90\xc4\x02\x8a\xfb\x66\xf6\x14\x6a\x7b\xf9\x8e\x82\x9a\xa8\x65\x24\xe0\xec\xa6\x24\xde\x08\x48\x81\x4d\x41\x62\x30\x1a\x16\x29\x59\x34\x14\xe5\xdd\x16\xca\x1c\x49\x7d\x5c\xf6\xc6\xf5\xb6\x08\xfc\xfd\x38\xbf\xfd\x64\xd2\xfd\x90\x70\x55\xe2\x69\x04\x74\xf9\x09\x9b\x14\xa6\x6e\x46\x20\x5d\x93\x66\x84\xce\xc4\x24\xcd\x4b\x04\x95\x5a\xc9\x35\x26\xc1\x4f\x1f\xe7\xf1\xde\x72\x9a\xfd\xbf\x9a\xc7\x7b\xc7\x8d\x0d\xc8\x53\x9c\x34\x60\x0a\xe6\x52\x30\x3e\x4a\xe2\x25\xef\x46\x7d\x8e\xe0\xe3\x65\xd0\x7c\x64\x83\x59\x75\x5b\x9b\xb8\xc3\x27\xca\xbd\x2c\x52\xc4\x49\x5c\xad\xb6\xe5\x8d\xc6\xa6\x1a\x82\x14\xf7\x90\x35\x29\xe4\x8a\x73\xf4\xe1\x56\x4c\xea\xfe\x0e\x4b\xd1\x6b\x61\xa9\x19\xd8\x7e\xe5\x52\xd2\xd1\x6b\xef\x79\x4a\xe8\xa1\xf0\xdc\xc4\x0e\x53\x22\x3b\x98\x18\xd2\x74\x31\xb6\x71\x23\x8f\x43\x6c\x72\xd3\xfb\x8b\x9b\x22\x8b\x39\x72\x04\x89\x65\xea\xbc\xf4\xb8\xf5\x27\x04\x13\xc0\xc8\x81\xd5\xa9\xc3\x35\x3f\x98\x1f\x9c\xec\x27\x59\x83\xc7\x15\x76\x11\x52\x4b\xcb\x8c\xca\x6a\x9f\xd5\x0d\x4f\x5d\x89\x6c\xd5\x15\xe7\xab\xd4\x54\x41\x73\xd0\xab\xe4\xb0\xe5\x79\x6d\x53\x82\xab\x89\x5d\xd4\x85\xc9\x99\x8c\xc5\x08\x6c\x36\x65\xa9\xd1\x6a\x4c\x72\x86\xaa\x92\x10\x7c\x88\x5d\xea\x8e\x1a\x30\x69\x0e\x3b\x9e\xe6\x9b\x68\xcb\xfd\x98\xf3\xd4\xf1\x3f\xe7\xe3\x77\xf3\x39\x4f\xeb\x39\xf3\xa3\xfd\x22\x76\xe9\x1b\x13\x19\x26\xb5\xb4\xc6\x1b\x6f\x92\x87\x41\x09\x0c\x29\x19\x3e\x60\x38\x84\xd4\x88\x03\xae\x97\x46\x69\x9c\x85\xa4\xa2\x16\x4d\x93\xe4\x5b\x85\x59\x7a\xb1\x14\xc6\xd4\x60\x0a\x5b\x2c\x09\x0a\x8f\x49\x6a\x45\x0a\x99\x23\xad\xbb\x17\x4c\xa7\x2e\x00\x53\x96\xc8\xc4\xfc\xe8\x30\xd1\x99\x89\x41\x1a\x93\x12\xef\x3e\xa3\x12\xb7\x40\x1f\x41\xfa\x10\x39\xa6\xa4\xfc\xb6\x84\x02\x09\x15\x2d\x87\x70\xaf\x81\xb6\x9e\x6d\xaf\x71\x5d\xd2\x99\x6d\x74\x91\xa7\x52\xea\xee\x1f\x64\x7a\x34\x4f\x90\x31\x9d\x1d\xa5\xfa\x98\x1d\xa7\x47\xe9\x92\x46\x8d\x34\xe5\xb6\xe2\xef\xfd\x20\x2d\x82\x00\x9f\xba\x5f\x3a\x9a\x66\xe4\xd3\xf7\xe3\xd5\x57\x86\x13\x98\xb4\x71\xe7\x4d\x9d\x12\x1a\x3d\x24\xa9\x0c\xf7\xa0\x0c\x75\x6a\x72\x8b\xec\xf0\x28\xd9\x53\x95\x9a\x5b\x0f\x49\x53\x5d\x99\x48\x98\xff\xcd\x27\x8d\x09\x68\x76\xf9\x59\xe8\x04\xb0\x02\x95\xb4\xf6\x07\xe0\xcd\xaf\xc9\x27\xe0\x3b\x40\x69\xec\x36\x74\xda\x1b\x47\x54\x65\xf6\xb2\xef\x3c\xfa\x31\xc7\x50\x20\xdc\x7e\xfc\xe1\x43\x02\xaa\x5f\x4b\x76\x9e\x92\xc3\x1d\xd8\x94\xf2\xac\xba\x87\x24\x4f\xcd\x7d\x9e\xa3\x4b\xbd\x59\x68\x96\xde\x84\x0d\x6a\x6d\xc8\x26\x16\xf5\xdc\x07\x02\xb7\xae\x50\xc5\x55\xcc\x71\xcc\xc0\xde\x60\x46\x3d\xb4\x2b\xb5\x9a\xed\x4f\x4f\x53\xa3\xa9\x55\xda\xbf\xbc\x01\x8d\xcf\x6e\xa5\x56\xc3\xa7\x02\x53\x46\x44\x95\x36\xe1\x36\xa0\xf1\xf1\x06\x23\x43\x8b\xd0\x2f\x7f\x52\x7a\x2b\x81\x4b\xd4\xe9\xc5\x37\xd1\xf1\x45\xfa\x48\xf7\x67\x2e\x69\xd3\xb6\xa0\x2b\x9f\x12\x61\x68\xd1\x26\xfa\x41\x9b\x4b\x18\xfd\x3d\x4b\x4f\x0c\xed\xe2\x28\x0b\x22\xe9\xea\xed\x21\x59\x0f\x4e\x5d\x3d\x35\x04\xf4\xaa\xc3\xd4\x71\xd4\x22\x78\x2b\x04\xef\x3b\x56\xe0\xef\xdf\xaa\xc9\x25\x2c\x57\xc0\xec\xa6\x18\xe3\x88\xcb\xa0\x15\xde\x28\x91\xd5\x3c\x57\x62\xcc\x9a\xdb\xd6\xd2\xa9\xef\xb3\xf6\xaf\x38\x8a\x17\x38\xbc\xd9\x18\x03\x49\xf0\x1e\x97\x59\xd4\x12\x15\xae\x8b\x1e\xe5\x71\xcc\x94\x10\xca\x1a\xa7\x31\xaa\x71\x3a\x2b\x58\x09\x29\xc5\xfa\x4e\x19\x27\xb4\xe6\x6b\x0b\xdb\xb8\x6a\xdc\x59\xd2\x74\xe3\x63\x22\x13\xc1\x38\xd7\x8b\xb9\xf1\xbe\xce\xad\xb1\x3e\x36\x98\x8b\x38\x66\xc4\x08\x61\x4b\xc7\x53\xe7\x47\x01\xf7\x4e\x2c\x8c\x8c\x43\x65\xa1\xf1\xb9\xaa\x2c\x0c\xc9\x75\x6c\x8c\xc7\xd6\x1f\x8b\xb5\x29\xe6\x1e\xb2\x98\xc7\xbb\x32\x56\xe8\x9c\xf1\x71\x11\xb1\xe6\x92\x71\xcb\xda\x82\xef\x59\xce\x1a\xcb\x8c\xd3\xe3\xdb\x60\x1d\x2e\x20\x88\x9a\xe7\x61\x8c\xf5\x9c\xe0\xb0\x2e\xb3\x55\x8f\x49\x27\xeb\xb0\x17\x3c\x9a\x43\x97\x58\xdb\x70\x1e\x6d\x6a\xe7\x83\x09\xb5\xa8\xa4\x71\x5d\x8e\xa3\xc7\x91\xa9\x44\x4f\xc0\x7c\x0a\x81\x36\x85\x50\xc9\x3e\xb4\x8e\x20\x9d\x58\xa0\x68\x93\x58\x9b\x44\x78\x26\x24\x16\x0e\x5c\x97\x44\x26\xe7\xef\x95\x48\x42\x42\xaa\x97\x42\xa5\x94\x24\x06\xaa\x70\xc8\xab\xd4\x60\x0c\x52\xb3\x67\x12\xd6\x9c\x99\x18\x51\x14\x9e\x99\xda\x24\x2f\x17\xa1\x84\x03\x99\xd2\xcc\x84\xae\x50\x0b\xd1\x73\xf1\x02\xa5\xdc\x56\x05\x1f\x95\x62\x0b\x74\x21\x82\xdc\x6e\x55\xca\x73\x2a\x52\x6b\x83\xaa\x4c\x21\x4c\x8a\x57\xcf\x41\xc1\xa6\x7c\x7d\xca\x19\x55\xc7\x5c\xf0\x31\xc9\x7a\xee\x83\x71\x89\xf1\x1a\x70\x55\x52\x11\x92\x58\x54\x11\x79\xd2\x6c\xd9\x4d\x46\xdb\x2a\xe7\x63\x02\x4e\x75\x48\xdb\x1a\x0d\x21\x26\xc3\x3c\x46\x30\x9e\x21\xed\x58\x1a\x0f\x36\x16\x12\x87\x0f\x48\xa5\xb0\x31\xa5\xcc\x98\x05\xa6\xb8\xd7\x2c\x4b\xe3\x38\xb8\x60\xb4\xdc\xd6\xf5\x4c\xa1\x0b\x2c\x24\x9a\xca\x81\xad\x31\xb9\x33\xeb\x26\x2a\x7a\x64\xa4\x21\xac\x4e\x9e\x73\xeb\xcc\xc3\x98\xd6\x0d\x9d\x67\x89\x8e\x3c\x54\x62\x5b\xb0\x6d\x04\xc5\xb0\xb7\x9a\x38\x3a\xc1\x92\x46\xee\x1a\xab\x20\xb5\x79\x9e\x19\x1b\x93\x9a\x3b\x42\x4a\xbe\x7a\x8b\x82\x63\x35\x7c\xce\x9d\xc4\x61\xeb\xfb\x36\x79\xf0\xb6\x30\x89\x3a\x25\x0e\x02\x68\x5e\x92\xf6\x36\xea\x04\x71\x51\x63\x56\xa0\x90\xa2\x14\x92\x8f\x9f\xd1\x56\x14\xa6\x6c\xb4\x69\xe5\xf0\x8c\x2b\xe5\x79\xf2\x41\x26\x55\xf4\x16\xa5\x48\x9d\xf8\xe1\x6b\x5f\x05\xe8\x26\x31\x93\x01\x37\x70\xc3\x50\x4f\x3d\x75\x07\xea\x91\x1f\xe7\x47\xfb\xc9\xa8\xd9\xe1\xb4\x4b\xe8\xeb\x27\x47\x27\x47\x29\x32\xa0\xa0\x84\xc2\x80\xb1\xd8\x0a\x08\x75\x92\x89\x00\x99\x41\xdd\xdf\x05\xc9\x1d\x02\x74\x99\x1a\x6a\x44\xa7\x0e\xc5\xd3\xc8\x51\xaf\x03\xe0\x12\xcb\xa4\x97\x1f\x54\x32\xf4\x7a\x34\x9d\xa5\x82\xd5\x1c\x92\x81\x8e\x42\x60\x00\x64\x75\x2c\xe1\xde\xec\x9d\x4b\xec\x39\xe8\xa4\xcb\xb1\x30\x66\x9b\x1c\x3a\x86\x22\xb9\xdc\x18\xa0\x44\xd0\x57\x5f\xc8\x1b\xd5\xd7\x84\x83\xf9\x51\x2a\x2c\x39\xb0\x92\x4f\x06\x72\xeb\x08\xb9\x75\xa3\x26\x6c\x1d\xd3\x0e\x39\x56\x47\xdd\xc5\x5c\x99\x02\xc7\x51\xbe\x36\x09\x4f\x14\x53\xa4\x63\xc0\x54\x41\x20\x2b\xb8\xa4\xcb\x81\x97\xac\x4c\x89\x26\x6e\x98\xa7\x18\xd1\xdc\xc4\x22\xc9\xf2\x6b\x50\x32\xfa\xc2\x4d\xec\x52\x4c\xcd\x97\x5d\xda\x99\xc3\xbb\x10\x4e\x12\x27\x48\xf4\xb6\x84\xd1\x49\xf9\x2b\x22\x47\x96\x4c\x6d\x48\x9e\x8a\x1e\xd2\x18\x5a\x92\x5c\xe9\x78\xf2\xfc\x94\x31\xc4\x54\x20\xad\xc7\xe8\xd4\x5a\x55\xa0\x79\xca\x75\x59\x09\xa4\x24\xc9\x55\x22\x58\x87\x4c\x04\x48\xad\x46\x85\xe5\xf0\x21\xf2\x04\xca\xa4\x97\xbe\x26\x65\x20\xd5\x46\x57\x4b\x4c\xf1\x56\x6f\xa1\x15\xb1\x4c\xa1\xe2\x12\x09\x6e\xea\x3a\x76\xa9\x03\x8d\x7a\xfd\x29\x1f\x2d\xda\x00\x29\xa5\x10\x43\x6d\x92\xb9\x51\xe7\xf7\x27\x72\x5e\x42\x70\xf8\xf2\xf4\xa8\xaf\xa2\x01\xec\x40\xa7\x43\x09\x0d\x0c\xf5\x43\x9b\x2e\x93\x50\x24\x33\x2e\x84\xb0\xe9\x65\x6b\x1a\x55\x27\x4d\xb4\x74\x37\xbd\x16\x29\x78\x52\x8b\x91\x46\xa6\x78\x5f\x46\x73\x8e\x32\xb9\x3d\x0a\x4c\x97\x0e\xf0\x83\xe9\xa2\x1e\xbf\x0c\x86\xb4\x83\x74\x4f\x1b\x54\xc2\xee\x34\x05\x36\xc9\x7c\x3a\x93\x86\xc4\x22\x99\x55\xd1\xad\xa0\x49\x07\x89\x51\x65\x12\x74\x95\xb1\x94\x62\xae\x17\x3d\x9f\xa6\x4c\x3d\x07\x2c\x19\x51\xb1\xd0\xd9\x64\x72\xd4\x1a\x64\x8a\x73\xc1\x42\x32\x3f\x99\x03\xca\xd4\xb5\xf1\x10\x2f\x3f\xf0\x3e\x02\xea\x92\x2b\xd6\x43\x48\x0a\x95\x83\x8e\xd5\xe0\x53\x3e\x7c\x67\x74\x55\x27\x2d\x50\x17\xab\x68\xd2\xe7\xdf\x67\x4e\x0c\x5f\x55\x4b\xc0\x40\x37\x31\x99\x22\xe3\x99\x51\x56\xb8\x71\xa3\xc2\x0b\x20\x04\xd1\xbc\xca\xd5\x58\x58\xd6\xab\x15\x4f\x65\x48\x79\x0d\x96\x3b\x93\x0a\x3e\x79\xdd\x2e\x53\x3d\xf9\x74\x7e\x50\x80\x26\xea\xca\xa6\x33\xab\x05\xa8\x05\x8a\x36\xb9\xe6\x01\x07\x9f\x3f\xab\x53\x67\x28\x72\x60\xdb\xcf\xc9\x8d\xda\xc9\x49\x15\x67\xa1\x2e\x3f\x48\x34\x66\x18\x53\xec\xb8\x56\x20\x33\xe3\x81\x88\x56\x50\x4e\xd8\x12\x81\x66\x00\x2d\x51\x81\x84\xe4\x95\xbd\x44\x5d\x47\xd0\x22\xe5\x96\x59\xaa\xf4\x1d\xd5\x81\xae\x1a\xc1\x63\x6a\xcf\x57\x35\xe8\x6a\x85\xbe\xc6\xf1\x15\x59\xd5\x98\xcc\x63\x59\x11\xde\x56\xac\xea\x88\xf5\x7d\x1a\xd5\x84\x9b\x56\x4b\x03\x3c\x3f\x17\xa1\x70\x80\xfa\xde\x77\x2e\xeb\x42\x17\xbd\xa8\xf7\x5e\x6e\xca\x5e\x64\xeb\xe2\x20\xb7\x9a\x5c\x3e\x21\x9a\x9e\xe6\xb3\x93\xf5\x7f\x1e\xcc\xef\x7d\x9c\xf4\xa9\x4f\x7c\xee\xf5\xcf\x4f\x5e\xfd\xec\x65\x1f\xeb\x3f\xff\xc1\x2b\x5f\x78\xf5\xd3\xd7\xde\x8c\xfd\xef\x00\x00\x00\xff\xff\x51\x89\x74\x74\x65\xd4\x00\x00") 76 | 77 | func assetsHtmlClashConfigLocalYamlBytes() ([]byte, error) { 78 | return bindataRead( 79 | _assetsHtmlClashConfigLocalYaml, 80 | "assets/html/clash-config-local.yaml", 81 | ) 82 | } 83 | 84 | func assetsHtmlClashConfigLocalYaml() (*asset, error) { 85 | bytes, err := assetsHtmlClashConfigLocalYamlBytes() 86 | if err != nil { 87 | return nil, err 88 | } 89 | 90 | info := bindataFileInfo{name: "assets/html/clash-config-local.yaml", size: 54373, mode: os.FileMode(420), modTime: time.Unix(1603794154, 0)} 91 | a := &asset{bytes: bytes, info: info} 92 | return a, nil 93 | } 94 | 95 | var _assetsHtmlClashConfigYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xeb\xaf\x24\xc7\x75\xdf\x77\x02\xfc\x1f\x2e\xec\x0f\x4e\x80\xe9\xde\x3b\x33\xf7\x0d\x04\x01\x4d\xea\x41\x4b\x96\x04\x52\x82\x93\x4f\xc1\xe9\xaa\xea\xee\x73\xbb\x5e\x5b\x8f\xe9\xe9\x31\x04\x30\x46\x84\xb5\xa8\x48\x8a\x13\x45\x06\x6c\x29\xb4\x62\xc9\xa2\x6c\x39\xb2\x22\x47\x52\x28\x51\xfa\x67\x78\x97\xcc\x27\xf3\x4f\x08\xba\x67\xe6\xde\xbd\xaf\xae\x33\x44\x76\x37\x41\x28\x69\x85\xdd\xe9\x5f\x55\x9f\xaa\x3a\x75\xea\xbc\xea\xf4\xef\xee\x3d\xfe\xea\x1b\x8f\xbf\xf3\xd5\x0f\xde\xfc\x93\xf7\xff\xe4\x7f\x5e\x7c\xf7\xd1\x7b\xbf\xfa\xc6\xc5\x57\x7e\x7c\xf1\xeb\x37\xde\x7b\xe7\x3f\x7e\xf0\x6f\xbf\xf5\xfe\xbb\x7f\xf6\xde\x2f\xdf\x7c\xfc\xe6\x7f\xba\xf8\xe6\xb7\xff\xe9\xd7\xff\xfe\xbd\x77\x7f\xfb\xfe\xb7\xde\x66\x12\x7c\xfd\xc1\xa3\xbf\xbd\x78\xf3\xed\xc7\x7f\xfd\xc6\xe3\xb7\x7e\x70\xf1\xcd\x9f\xbc\xff\xad\xb7\x1f\xbf\xf1\xc3\x8b\xaf\xff\xec\xe2\x9b\x3f\x79\xf1\x85\xdf\xdd\x5b\x37\x79\xff\xed\xaf\x5d\xbc\xf3\xcd\x8b\x5f\xfc\xf7\x8b\x5f\xbf\xf1\xf8\x9d\xff\xf0\x4f\xbf\xfe\x8b\xbd\x3a\x04\xeb\xcf\x1e\x3c\xa8\x30\xd4\xb1\xc8\x99\x51\x0f\x56\x71\xda\x3c\xb0\xce\x2c\x3b\x6b\x8c\x7c\xf1\x85\xbe\xbd\x35\x2e\xec\x99\x72\xef\xd3\x5f\xfc\xe2\x17\x5e\x7c\xa1\xff\xd7\xd9\xde\xf1\xc9\xe9\xfe\xf5\xa7\xaf\x7f\xfe\xe5\xcf\xbc\x7e\xf8\xe2\x0b\xde\xb0\xc6\x67\x97\xa8\xe9\x1a\xf5\xcf\xfa\xc6\x7b\xa0\xf9\x06\xb7\x87\x7a\xcf\x68\x31\xb4\xfe\xe7\x3d\x40\xe1\x52\xf0\xec\x66\xe7\x4e\x70\x74\xeb\x57\x94\xc6\xed\x7d\x16\x75\x5c\x0e\xbd\x28\x60\x9f\x7f\xfd\x12\x71\xd5\x6e\xd6\xb7\x03\x29\x4d\x9b\x49\xd0\x67\x7b\x25\x48\x2f\x5e\x7c\x41\x19\x2e\xce\xf6\x5c\x94\xe2\xc5\x17\xa4\xa9\x32\x29\x16\x42\x9e\xed\xa1\x2e\xcd\x8b\x2f\x88\x65\x10\x4e\x83\xcc\x98\xd1\xc1\x19\x29\x85\x3b\xdb\x9b\xce\x8e\xf3\xfd\x7c\x3f\x9f\x9e\x9d\xee\xaf\xa9\xe9\x67\x05\x85\x3f\xdb\xfe\xbd\xcb\x2a\x67\xa2\xed\x7f\xd8\xdb\xcb\xf6\x34\x28\x71\xb6\x77\xf1\x95\xb7\x2f\x7e\xfa\xc6\xff\x7a\xe3\xab\x8f\xbf\xf6\xa3\xfe\xf7\xbd\xbd\xd0\x59\x71\xb6\xe7\x85\x14\x2c\xac\x7f\xb9\xea\x68\x6f\xf8\x4f\xb6\x77\xf1\xab\x9f\x7f\xf0\xdb\xb7\x1e\x7f\xe7\x8d\xf7\xde\xfd\xc6\xd5\xaf\xeb\x5e\x2e\xfe\xf2\xdd\x8b\xff\xf6\xf3\x9b\xbf\xae\x99\xe4\x89\x1e\xbe\xff\xd3\x0f\xfe\xf1\x07\x17\x7f\xfa\xe8\xf1\xd7\xff\xeb\xd5\xaf\x1f\xfc\xe3\x5b\x1f\xbc\xfb\xee\xc5\x77\x1f\x7d\xf0\xbd\xef\x3d\x49\xe5\xed\x9e\x29\x54\x7e\xf8\xd6\xa3\xb7\x3f\x7c\xeb\xd1\xcf\xf6\xde\xfb\xe5\xdf\x5f\xfc\xe5\xbb\xd7\x1e\xfc\xe4\xc3\xb7\x1e\xfd\x8f\xbd\xc7\x7f\xfe\x83\xc7\xdf\xf9\xf1\xb5\x07\xbf\xfc\xf0\xad\x47\x3f\xde\x7b\xfc\xed\x7f\xb8\x78\xf3\xaf\x2e\xbe\xfb\xbd\x6b\xcf\xde\xe9\x9f\xef\xbd\xff\x9b\x6f\xdc\xec\xad\x7f\xcd\xdf\xec\x5d\xbc\xf9\x57\x8f\xbf\xf6\xdb\x8b\xef\xff\xf0\xda\xb3\x5f\xf4\x0d\xf7\xde\xfb\xed\xbf\x7b\xff\xdd\x3f\x7f\xfc\xed\x9f\x5c\x7b\xf6\x37\xc3\xb3\xc7\xbf\xf9\xd9\xc5\xf7\x7f\x78\xf1\xa7\x3f\x7a\xef\x9d\xbf\xb8\xd5\xed\xdf\xef\xbd\xff\x67\xff\xe5\xe2\xaf\xff\xee\xda\x83\x1f\x7d\xf8\xd6\xa3\xbf\xdd\xbb\xf8\xcd\x2f\x6e\x12\xf2\x77\xfd\x0b\xf7\x1e\xff\xec\x3f\xdf\x7c\xf0\xe3\x0f\xdf\x7a\xf4\xc3\xbd\x0f\xbe\xf6\xd3\x9b\x0f\x7e\xf6\xe1\x5b\x8f\x7e\xba\xf7\xc1\xd7\x7f\x71\xf1\x95\x7f\x78\x62\x79\xbe\xf2\xf3\xf7\x7e\xf5\xed\xab\x09\xbf\xbe\x10\x4f\x2e\xe6\xed\x85\x88\x5e\x3c\xb1\x08\x20\xe5\x93\x1d\xdc\xb9\x26\xeb\x3e\xa2\x93\x59\x10\x7e\xdb\x8b\x93\x67\x7b\xbf\xd7\xef\xf8\xb3\x07\x0f\xda\xb6\xcd\x2b\x1f\x20\x20\x1b\x76\x7d\x25\xb4\x70\x10\xc4\xbf\x99\xed\x1f\xfc\xde\x1a\x8f\x3a\x08\xb7\x00\x79\xb6\x37\xdf\xdf\xbf\x8b\x10\xa6\x6f\xd0\x71\x9b\x05\x9e\x09\x1d\xe7\xf6\x06\x1d\x77\x72\xdc\x33\x21\xc5\x57\x37\x48\xb9\xcd\xe0\xcf\x84\x8e\xe8\xef\x60\x91\x5b\xfb\xe9\xd9\x70\x09\xdc\x20\xe5\xce\xed\xfb\x4c\x48\x71\xf1\x06\x29\xf7\x49\x8b\x67\x42\x0d\xdc\xa4\xe6\xb6\x70\x7a\x36\x0b\x54\xdf\xa0\xe3\xb6\x2c\x7c\x26\x74\x70\x71\x83\x8e\xdb\xa2\xf7\x99\xd0\x51\xba\x1b\x74\xdc\x96\xf4\xcf\x84\x8e\xaa\xb8\x41\xc7\xed\x83\xe5\x99\xd0\xa1\xe5\x75\xf5\xe6\xfa\x39\xf6\x8c\x88\x30\xa1\x16\xee\x9a\x50\xbb\xad\x31\xdd\x49\xc8\x5d\x47\xe7\xff\x01\xfa\xb6\x54\xdc\xd4\xaf\xb6\x54\x48\x03\x3c\x2b\x40\x82\x66\xe2\xd9\x50\x72\x5b\xff\x5b\x53\x52\x82\x94\x05\xb0\xe6\x69\x52\xb1\x55\x87\xad\x33\x0b\xe4\xc2\xad\x75\x46\x88\x67\x4f\x12\xd2\xf7\xfe\xc4\xdb\x7e\xe7\x8f\xff\x78\x2f\x77\xe2\x61\x14\x3e\xec\x7d\xf9\xcb\x67\x0f\x1e\xf4\x3f\x70\xa3\x00\x75\xff\xef\xfe\x5f\x83\xda\xff\xe5\x2f\x3f\x18\x6c\x9c\x07\x1b\x7d\xf4\x5f\xb2\x7f\xf1\xd2\x97\x7e\x67\xa3\xa2\x42\xa8\xcf\xf6\x2e\x5f\xfb\x60\xfb\xb7\x0c\x62\xde\x81\xda\x8c\xae\x16\x20\x43\x9d\xb1\x5a\xb0\xe6\x72\xf4\x42\x43\x21\xc5\xd9\x5e\x70\x51\x6c\x7f\xbb\x1a\xd6\xd1\x96\x0d\x37\xd4\x12\xa6\xa6\xc7\x33\xfd\xb4\x86\xfc\xf2\xe7\x26\x9f\xfe\xcc\xe4\x8b\x7f\x94\x1a\x38\xd3\xcf\x65\xe0\xd1\x3f\xad\x81\x7f\xe9\xf5\xd4\x90\xa3\x7f\x3e\x6b\x0d\x4f\x6d\xad\x5f\x4a\xae\x32\x3c\x97\x21\x9f\xdb\xa7\x35\xe4\x3f\xf8\x42\x6a\xc8\xe7\xf6\xb9\x0c\xd9\x57\x4f\x6b\xc8\xaf\x7f\x2a\x35\x64\x5f\x3d\x97\x21\xbb\xa7\x26\xb7\x5f\x4b\xca\x6d\xf7\x9c\xe4\x76\xfd\xd4\xf6\xf2\xa7\x93\x7b\xb9\x7e\x2e\x43\xe6\xe2\x69\x0d\xf9\x95\x4f\xa4\x86\xcc\xc5\x73\x19\x72\xe9\x9e\xd6\x90\x3f\xf9\x5a\x6a\xc8\xa5\x7b\x2e\x43\xae\x8a\xa7\x35\xe4\x4f\xfd\x7e\x6a\xc8\x55\xf1\x5c\x86\xac\xe5\xd3\x1a\xf2\xe7\x3e\x9b\x1a\xb2\x96\xcf\x65\xc8\x6b\xeb\xe8\xe9\x0c\x5b\x5f\xe9\x9e\x93\x2f\xbd\x3e\x79\xf9\xa5\xc9\x1f\x7c\x61\xf2\xfa\xa7\x26\x2f\x7d\x69\xf2\xf2\xa7\x27\xaf\x7c\x62\xf2\xa9\xdf\x9f\x7c\xee\xb3\x93\x4f\xbe\x36\x49\x4b\xf7\x35\x9d\xcf\x65\x8a\x40\x3e\x1d\xb6\x48\x0c\xf9\x39\x8c\xf5\xc5\x17\x5c\x94\x62\x1b\x94\x78\xe5\xf3\x7f\xf8\xd2\xab\x9f\xcb\x5e\xff\xd2\x27\x3f\xf9\xea\xbf\x9a\x78\x15\xec\xe4\x95\x57\x5f\xfb\xc4\xcb\x5f\xbc\xf6\xf8\x33\x9f\xf8\xd7\x7f\xf4\xf9\xd7\x5e\x99\x80\x43\x98\x5d\x02\xee\xea\x01\x94\xb5\xce\x9c\x0b\x16\x72\xe3\xaa\xc9\xcd\x68\xc7\x2d\xb8\xb5\xde\x9a\xd0\x93\x99\xc4\x16\xd2\x54\x95\x70\x24\x6c\x25\x82\x89\x41\xa2\x16\x24\x32\xaa\x45\xd8\xa7\xf5\xbb\x08\x53\x2a\x70\x4e\x02\x2e\x75\x96\xe9\xca\x07\x97\x49\x07\x27\xe7\xe3\x6d\xb6\xeb\x50\x19\x53\x49\x91\xc6\xf5\x53\xd6\xcf\x6f\x92\x0a\xa3\x05\x77\xb8\x10\xb9\xec\xff\x8f\x44\x77\x61\x96\x64\x30\xe3\x1a\xb5\x0f\x50\x39\x50\xa4\x06\x65\x41\x85\xa9\x91\x69\xb8\x44\x01\xe7\xa8\x3d\xb1\x4b\xc6\x75\xae\x45\x7a\xce\xca\xc2\x17\x4b\x62\x9f\xad\x71\x8d\x02\x94\x24\xf8\x6e\x53\xa5\x28\x53\xa0\x84\xf7\x42\x53\x77\x8f\x61\x51\x46\xda\x74\xad\xa1\xfd\x94\x51\xd0\xce\xb0\xc6\xf3\x82\xb4\x27\xdb\x1a\x82\x07\x6b\x49\x1d\x5f\x82\x47\x17\x6e\xbb\x2d\x4a\x60\xa2\x30\xa6\xb9\x03\xf9\xea\x17\xb2\x97\x5f\x7d\xe5\xb5\xc9\x3c\x9f\xce\xe6\xf9\xfc\x28\x9f\xce\x8e\x1e\xcc\x67\xd7\x90\x13\x6d\x32\x27\xbc\x91\x0b\x71\xa3\xd1\x61\x3e\x3d\x3c\xce\x67\xd3\xc3\xfc\xe4\x60\xf7\x56\xc7\xf9\xec\xf0\x90\xdc\xec\x70\x96\x1f\x9e\xe4\xb3\xfd\xd3\x7c\x3a\xa7\xbf\xec\xf0\x20\x3f\xed\xc7\x76\x90\xcf\xa7\xbb\x34\x9a\x1e\xcd\xf2\xd9\xc1\x3c\x3f\xd9\xdf\xa9\xd5\xf1\x3c\x9f\x1f\xe4\xd3\x83\x9d\xde\x35\x9b\x1f\xe6\xb3\x79\x3e\x3b\x98\x91\x5b\x4d\x8f\x4e\xf3\x83\xc3\x7c\x76\x70\x92\x4f\xa7\x27\xc9\x66\xd7\x99\xc7\x7a\x66\xf3\xb0\x48\x32\x99\x15\x0e\x3d\x33\x56\x50\xc0\xfd\x99\x96\x06\xb5\xa8\xaa\x5d\x80\xe9\x9d\x10\x5a\x0c\x76\x7d\xf0\x27\xb1\x8b\xfe\x7c\x1c\x7b\xfb\x76\xc3\xf4\x9d\x06\xe1\x08\x83\x26\xc8\xa2\xc0\x85\x6f\x82\xa1\x6d\xec\x20\xa4\xa8\x1c\xe4\xb6\xa6\x42\x49\xf2\xf0\x12\x7b\xb7\x24\xda\xb2\xd5\xe9\x34\x9f\xee\x9f\xe4\x07\xf9\xfe\x83\x19\x91\x13\x37\x4d\x4e\x76\x6f\x32\x9d\x7d\x84\x36\x47\xbb\xb7\x39\xdc\xa5\xcd\xf4\xe0\x34\x9f\x0e\xfb\x7f\xbf\x6f\xb5\x4f\x6a\x75\x34\x99\xed\xef\x4f\xcf\x8a\xd9\xc9\x59\x39\x9b\xf3\xb3\xb3\x07\x07\x27\x1f\xa1\x61\xb9\x73\xc3\xa3\x63\x76\x76\x20\x4e\x08\xed\xae\xb3\xc3\xa0\x28\x12\xd8\xa6\xc7\x65\xbd\xce\x4a\xe2\xdd\x01\xed\xa9\xea\x84\x86\x85\x70\xf9\xb9\x1d\x61\xc7\xe9\xfe\x3c\x9f\xe5\xf3\x61\x25\xe6\xc4\xf5\x9b\x1d\x0e\x67\xc4\x6c\xff\x84\xbe\x7e\x93\xe9\xc1\x71\x7e\x3a\xcb\xa7\xb3\xbe\xd1\xf4\x98\xd6\x68\xb6\x3f\xcf\xa7\xfb\xbd\xb4\x1f\xf6\xcb\x74\x97\x05\x38\xf0\x35\x38\xc1\x49\xd3\x7a\x38\xdb\x67\x2c\x67\x2c\x09\x3c\x39\x99\x9e\xee\xd3\xb4\xf0\x53\x06\xac\xa6\xe9\xb2\xa7\x15\xd0\x24\x31\x14\x34\x29\xdc\xe3\xb4\x08\x39\x44\x02\x74\xd0\x5b\x68\xec\x07\x0a\x56\xa6\xd7\xcb\xee\x66\xaa\x9b\x86\x18\x56\x82\x36\x01\x60\x9b\x8c\xd3\x34\x59\xb0\x4d\x89\x9a\xb6\xac\x60\x1b\x85\xce\x19\x9a\x8a\xda\xa3\x8d\x6e\xa8\x58\x1b\x1d\x75\x70\xc1\x20\x27\x62\x1d\xab\x7b\x0b\x08\x3d\x19\x4a\xb2\x89\x5d\x20\x69\x18\xe0\xc2\x60\xe4\x1b\x9a\xee\x0d\x2e\x36\xe0\x73\x4c\x2b\x1b\xe0\x89\xf3\xba\x20\x6e\x84\x45\x25\x69\x33\x5a\x00\x37\x86\x88\xd4\xbc\x85\xca\xe8\xda\x78\xa2\xfb\x80\xb8\x1d\x0b\x51\x83\x66\x82\x24\xb3\x0b\x2c\x0c\xcd\x04\x2c\xb0\xaa\x86\x91\xe5\xa1\x25\x80\xf5\x40\x02\xad\xe3\xc0\x0c\xea\x00\xb2\x21\x71\x57\x81\xa1\x44\x2d\xa8\x54\x07\x45\x87\x66\x2b\xb2\x1f\x47\x9a\x05\xd2\xd8\xb6\x90\xc6\xa8\x42\xb8\x2a\x67\x7a\x17\x30\xa9\xeb\x58\x38\xd7\xd1\xb0\xc6\x34\xe4\xe5\x33\xa6\x19\x5c\x23\x04\xb9\x7b\x29\xce\x69\x1d\x7b\x89\x25\x91\x35\xa9\x8c\x19\x3d\x6a\xe1\x3d\x6a\x3f\x38\x24\x49\x6d\xda\x7a\x4a\x22\x82\x81\x0f\x3d\x21\x25\xc1\x45\xd4\x6f\x4f\x20\x78\x92\x5a\x9a\xc7\xa9\x06\x5d\xd1\xe4\x6d\x0f\xd5\x42\x6a\xd1\x7a\xf0\x08\xb4\xee\x9b\xe9\x3e\xcd\x11\xc8\x24\x38\x34\x7a\x17\xa7\x28\x93\x9d\xcd\x91\x30\xbb\x1a\xa8\x9c\xc3\x8c\xb2\xe0\x30\x08\x56\xd3\xa8\x36\xda\xd4\x40\x61\x60\xe6\x22\x43\xa0\xa9\x03\x2c\x90\x59\x9d\xb5\x64\x64\x57\x08\xc7\x02\xcd\x59\xc6\x01\x65\xa7\x0c\xf9\xd0\x1c\xf0\x0b\x14\x2d\x85\x12\x0e\x51\x91\xb6\x45\x0f\xa4\x9a\x05\x9c\x81\xe3\xa4\xb7\x0b\x61\x39\x7a\x66\xa2\xa6\x1d\x88\x5c\x58\xe3\x31\xd8\xda\x04\x43\xd3\x28\xb9\x58\x20\xe8\x00\x8e\xf8\x82\x9e\x1a\xad\x7b\xb6\x27\xd8\x56\x03\xda\x71\xaa\xc7\xef\x09\x38\x69\x1a\xd1\x3f\x24\xba\x34\xb9\x14\x8e\x49\x13\x69\x6a\x2b\xd7\x7e\x56\xd1\x74\x16\x6e\xda\x73\xa3\x05\x91\x0a\x67\x2c\x55\x86\x6f\xb0\xd1\x0b\xc7\x8c\x0e\x82\xca\x00\x91\x35\xfd\x1f\x2a\xf9\x34\xc9\xcb\x3b\x1d\x49\x40\x01\x2e\xd4\x8c\xe8\xe5\x5e\xdb\x3d\xc2\x2d\x90\x09\xca\x6e\x10\xbd\x04\x53\x48\xd4\x0d\x05\xaf\x44\x7f\x56\x51\x37\xa5\xe0\x69\x5b\x4d\x48\x0b\x48\x5b\x6b\xa1\x41\x77\xa0\xab\x5c\x75\x04\x2c\xeb\x98\x34\x56\x70\xe2\x51\x25\xbc\x41\x97\x17\xe9\x0d\x28\x86\xe8\x2b\x03\x4d\xb1\x11\x44\x74\xa6\x3f\x31\x69\x24\x2c\xcc\x0a\x69\x91\x12\x21\xb8\xa4\x69\x64\x25\xba\xfe\x34\x03\x42\xa0\x46\x22\x6b\x68\x9a\x4d\x29\x31\x04\xda\x76\x28\x8d\x13\x58\x69\x6b\x24\x32\x1a\xc5\x4f\x3e\x2f\x9c\x69\xbd\x70\x24\x7d\xe0\xc9\xe7\xad\x60\x35\xd0\x98\xfa\x7a\x33\x2c\x88\xc3\x72\xc8\xa1\xa3\x6c\xb1\x32\xb0\xba\x57\x1d\x69\x76\x4a\x19\x50\x55\xa4\xcd\x55\x41\x10\x14\x16\xac\x44\x90\xa0\x83\x70\x9a\x16\xe3\x15\xc1\x77\x9a\x66\x03\x56\xd2\x14\x20\x17\x06\x99\xf0\xb4\xce\x8d\xc9\x35\x49\xe1\xaf\x8c\xe1\x4e\x00\xa7\xed\x9c\xca\xa4\xfd\x00\x95\x59\x50\x96\xab\x72\x02\x42\xbf\x69\x68\x03\x8a\xca\x19\xa0\x1d\x81\x75\x41\xb3\xb7\x6a\xe1\x4c\x43\x3b\x1b\x6a\xac\xea\x40\x8d\x97\xd6\x0d\x51\x17\xaf\x9b\xa2\x24\x8d\xbe\x6e\xfa\xe3\x86\x61\xa0\x6d\xec\xba\x11\x89\xc0\xfd\x15\x90\xb6\x77\xeb\xa6\x32\x92\x0b\x9a\x92\x5a\x1b\x13\x7c\xc4\x40\xdb\x88\x75\xe4\xde\xd0\xb6\x4c\xdd\xf5\x9c\x4a\x55\xc4\xb1\x08\xa8\x88\xda\x0d\x66\x0c\x0a\xa2\x53\x08\x19\x9e\x93\xc8\x45\x66\x18\x4d\xc8\xa1\xaa\x22\xed\x40\x40\x8d\x01\xa3\x52\x20\xc9\xb1\x7b\xc1\xee\x8d\x2b\xdd\xc0\xda\x92\xe4\x8f\x43\xef\x23\x6d\xdb\xa0\x0f\x86\x35\x83\x46\x4f\xc2\x9f\x83\x05\xbd\x5d\x35\x8a\xf4\x3a\xc7\x73\xda\x41\x7e\x8e\x9a\xa6\xbb\x9e\x37\xa5\x71\x44\xbb\xe9\xdc\xa0\x56\xe0\x83\xe1\x44\x06\x3e\x8f\x3e\xa8\x6e\xb8\x70\x4e\x7b\x41\xf4\xc1\x82\xef\xcf\x9f\x34\xb8\x81\x06\x68\xd3\x3c\x20\x99\x71\x34\xcb\xa6\x41\x9a\xfb\xb5\x31\xc4\x23\xbd\x07\xd2\xc3\x06\x8d\xe1\xa8\x2b\xa2\xe8\x91\x42\x19\xcd\x45\x5e\xa6\x63\xc3\x52\x58\x83\x3a\x90\xa0\x58\x37\xb4\x23\x45\xa2\x0f\x42\x6b\x13\x88\x72\x47\xe2\x42\xf8\xe0\x04\xd1\xea\x90\xa6\x52\x82\xe8\xa8\x1c\xd2\x7b\x5c\xda\x2e\xe8\x71\xac\x46\x45\x63\x06\x05\x8e\xe5\xa8\xcb\xb4\x94\x50\x10\x82\x70\x3d\x9f\xb7\xe9\x78\x84\x82\x0e\x35\x29\xf3\x40\x09\x8e\x91\x98\x89\x24\x2a\xc8\xf5\x2a\x8d\x43\x49\xc0\xe8\xca\x12\xb7\x97\x32\x05\x4a\x41\xd4\x01\x54\xe7\x2d\x10\x7d\xeb\x1b\x2c\x35\xbb\x69\x6b\xc5\xd1\xb0\x0b\xa2\xb3\x55\x0b\xd3\x22\x31\x84\x2c\x5a\x1f\xc0\x02\x49\x36\x6a\xb1\xc4\x00\x92\x68\x6d\xe9\xba\xc9\xcd\x3d\xe1\xe9\x1b\x48\x64\x43\x6e\x2b\xe9\x3c\xd1\x88\x39\x30\x1a\xb2\x69\x04\xed\xec\xd1\xa6\x44\x49\x32\x21\xb4\xa1\xf9\x34\xb4\x6b\x72\x4d\xe8\xae\xa3\x69\x77\xba\x1b\x4c\x27\x9a\xfd\xde\x83\x35\xc5\x81\xd6\x03\x69\x1b\x46\x77\x74\x4d\x6d\xc0\x12\x79\xba\x0b\xd2\x90\xa1\x3e\x74\x44\x05\xd0\x34\x14\xb9\x6a\x1a\x62\xa4\xca\x68\x4a\xf2\x80\x71\x28\x74\x00\x39\x78\x80\x07\x15\x98\xe0\x9c\x31\x0b\xe1\x18\xf8\x40\x09\x78\x58\x90\x43\xd0\x8e\x42\xb2\x05\x93\xf5\xd2\x90\x22\x04\x2c\x38\x2f\xd6\x1b\x90\xd4\x75\xb1\x24\x72\x82\x65\x7c\x41\x36\x06\x2c\xab\x8d\x12\x74\x34\xd9\xdf\x6a\x91\x01\x33\x8a\x98\xe1\x66\x51\x53\xb9\xd7\xe2\x12\x17\xb4\x19\x96\xd0\x09\x47\x5a\x63\x19\x1d\x71\x85\xcd\xf4\x84\x34\x53\x26\x40\x30\x39\x52\x7a\x0c\x10\x3c\x91\x09\x1c\x7a\x95\x15\x4e\x00\x2d\x88\x3c\x5c\x6e\x28\x91\x78\x82\xd9\x40\xa2\x37\x0c\xae\x16\xd2\x24\xc4\x22\x92\x59\xab\xc7\x92\x70\x4e\x80\xa5\x2d\xd6\xc3\x68\x1c\x4d\x78\x0f\x48\xaa\x57\xd9\x41\x13\x83\xa0\x66\xec\xf4\xa6\x39\xea\xea\x52\x92\x53\x06\xd9\xb7\x51\xc4\x0c\x0b\x27\x78\x11\x0b\xaa\x91\xee\x04\xe7\x48\x3b\xfd\xd6\x50\x45\x76\x60\x3b\xe1\x51\x22\x95\xe8\x38\x28\xc1\x3b\x60\xd7\x84\x90\xd6\xa7\x44\x8a\xf5\xe2\x70\x49\x17\x67\xce\x00\xf7\xb5\x69\xf3\xfa\xae\x6c\xf4\xeb\x58\xcf\x88\x46\x83\x67\x0e\x0b\xda\xfb\xbd\x80\x50\x45\x47\x73\x2f\xf8\x1a\xb8\x69\xd7\xe6\x34\x45\x4c\xf8\xda\x58\x41\x0a\xd7\x78\x89\x5c\x0c\x39\x80\xa4\x95\xf0\xa6\x0c\x25\x28\x43\x8c\xe8\x79\x13\x35\xa7\xaf\x89\xf7\x9b\xf8\x1f\x69\x8c\x01\x5c\xb0\x50\xd1\xb6\x89\x0f\x02\x14\x33\x4a\x45\x4d\x75\x2e\xfa\x20\x84\x22\x6e\xad\x0d\xb6\x05\x29\x89\x8e\xc6\x70\x74\x44\x23\xa3\xb7\x2b\xc8\xfa\x4a\x10\xcc\x64\x35\xed\x2c\x19\xb0\xca\x10\xb1\x9c\x77\x3e\xd2\xcc\xb1\x20\x96\xa1\x57\xf0\x29\xe9\xe0\xb5\xa8\x22\x38\x8e\x40\xec\xba\x16\x1b\xc7\x20\x15\x1e\x16\x9c\x76\xa5\x29\xa0\x16\x1d\x8d\x99\x82\x71\xbb\xa4\x95\x84\xa8\x0a\x49\x3b\xb1\x43\x74\x85\x29\x30\x90\x36\x63\x88\x01\xb4\x09\x34\x61\x1e\x16\x85\x59\x52\xcd\xae\x48\x34\xbc\xa3\xf6\x42\x68\x4a\x1e\x66\xb4\x6b\x71\xaf\xd2\xd3\x15\x6d\x30\xdc\xb4\x44\x0a\x5c\x01\x9a\x23\x0b\x68\x34\x10\x53\xca\xe2\xc6\x11\x45\x48\xf5\x8c\x2d\xe8\x40\x93\x75\x8b\x99\x03\xda\xfb\x17\x58\x10\x15\xb8\xc1\x9a\xb0\x4e\x78\x22\x09\xa8\x88\xc6\xc7\xc2\xc0\x2e\x31\xc4\x85\x01\x72\xcc\x79\x61\x96\xd4\xd1\xad\x68\xdc\xd8\xce\x3d\xab\x8d\x91\xb4\xf7\xb7\xe0\xeb\x5e\x3d\x33\xda\x52\x33\x54\x5b\x08\xc1\x12\x63\x6e\x6d\x6d\x84\x23\x6d\xcf\x16\x1b\x54\x60\x91\xe6\x15\xea\xd1\xeb\xdc\x02\x2a\xfa\x61\x34\x81\x16\x53\xec\xd1\x2d\x10\xd3\xc1\x5b\xd4\x91\x97\x44\x28\x31\xb9\xbb\x35\x8e\xd3\xd9\xb8\x35\xae\x29\xa5\x69\x29\x72\xa5\x35\x4e\x72\x06\x34\x41\xdc\x7a\x5a\xb4\xb0\xc7\x51\x56\x78\x59\x83\xf2\x81\xc8\xed\x4b\x9d\x65\xa7\xfb\x6d\xbb\x08\xfb\x73\xe2\x4d\x5f\x9d\x65\x38\x73\xf1\xe4\xe1\xec\x21\xcd\x94\x5e\xea\x25\xcd\x15\xb3\x1c\x24\x0b\x6d\x39\x3a\xa8\x89\x96\x4b\x07\x9a\x8b\x25\xc5\x67\xd4\x31\xa3\x0a\xd4\x10\x88\xb7\x0e\x3a\x41\x4f\x11\xed\x84\xcf\xc8\xd2\xaa\x33\x0a\xa3\x43\xa2\xe9\xd7\x99\x98\x55\x82\xc6\x6c\x2b\x30\x05\xd1\x8f\xbe\xa2\x69\x28\x2b\x21\x25\xb1\x43\xe1\x8c\x16\x81\xe2\x89\x5d\x19\xa3\xf2\x38\xb2\xd1\x2e\xaf\xbe\x0f\xa5\xa8\xd3\xb8\x73\x18\x39\x56\xb7\x20\x3b\xd4\x52\x10\x9e\x70\x67\xd8\x1a\x37\x92\x7f\xbe\x45\xf5\x22\x4e\x0a\x68\x08\x37\x42\x2c\xb8\xa0\x84\x0e\x0e\x02\xea\x8a\x78\xa5\x67\xdb\x88\x06\x2f\x40\x37\xeb\xe0\x48\x7f\xd6\xd3\x9a\x20\x31\x80\x51\x18\xd3\x04\x63\xd7\x9b\x81\x72\x77\x89\xb1\x5e\x3e\x12\x58\x81\x09\x1d\x20\xba\xf5\x6d\x89\x22\x6d\x6f\x33\x29\xc0\xf9\xe8\xc8\x57\x26\x98\xf1\x54\x4f\x39\x73\xc0\x1a\xa2\x0b\xe4\x46\x3e\x6d\xfa\xb6\x02\x47\x4f\xcb\xc6\xe6\x4a\x11\x25\xc3\x1a\x49\xe8\x51\x2f\x0c\xa7\x68\x9e\x62\x97\x89\x15\xcb\xa0\x20\x38\x24\x56\x45\x00\x3f\xdc\x54\x26\xc8\xe9\x52\xa2\x2d\x0c\x38\x9a\xea\x50\x6a\x60\x94\x84\xc7\x01\x47\xea\x30\xea\xa6\xa3\xfa\x91\xcb\xa5\x16\xa1\xd7\x1d\x88\x19\x5e\x22\x84\x0e\x15\x54\x44\x2f\x3c\x31\x59\xb7\x16\x44\x9d\xe8\x9c\x59\xa1\xb5\xa0\x99\x0c\xe7\x28\xea\x08\x14\xbe\x51\x80\xb2\x14\x54\xc6\xd1\xc3\x35\xb6\x96\x7a\xf1\x4e\x13\xaf\x72\x69\xb1\x24\xe6\xf9\x6b\xe3\xb8\x0f\xce\xd0\x76\xcf\x25\x7a\x58\xb7\xdd\x9a\xf4\x02\x85\xe6\xcb\x89\x56\x38\x4b\xe6\x8b\x00\xae\xa2\xfa\x7c\x6a\xd4\x4d\x25\x04\xd1\x97\xe3\x80\x95\x46\xd3\x86\x39\xb8\xb5\xe6\xb4\x6d\x1a\xad\x34\xc0\xef\xbb\xf3\x7c\xc3\x46\x13\x0b\xa2\x45\x89\x91\xc2\x9e\x0b\xda\xd8\x17\x7e\x38\x27\xd2\x7a\x6c\x89\x64\x7f\xde\x0a\x42\x48\x28\xb2\x93\x20\x7c\x28\x25\x56\x75\xc8\xc1\x5a\xe2\xf9\x03\xd6\xfa\x60\x72\x77\xbf\xe0\xdb\xdc\x36\xc3\x10\xb5\xf0\x84\x9e\x27\xb5\xdc\x05\x3d\x5c\x8c\x27\xe0\x76\xe9\x11\xb3\x4a\x16\x99\x17\x90\x7b\x65\x0c\x65\x3a\x26\xd2\x98\x26\xda\x0c\x2c\xee\x32\x79\x05\xcb\x97\x5d\x3a\x77\x05\x34\x77\x06\x89\x37\x9a\xd7\x58\x2c\x69\x8c\xc1\x11\xa4\xa9\x06\x8b\x93\xd4\x7b\x0c\x86\x3b\x20\x5e\x87\x03\x8b\x01\x24\xed\x04\x63\xc2\x05\x2c\x91\x41\x10\x59\x70\xa0\xbd\x05\x27\x34\xeb\x88\xb7\xe9\xdc\x26\xf0\x4b\x84\x8a\xa5\x15\x0e\xe9\x4a\xed\xba\x95\x0f\x10\x88\xde\xff\xa1\x01\x46\x5a\x4e\x26\x73\x02\x02\x2e\x84\x84\xe2\x90\xa8\xf5\x15\x91\x36\xad\x5c\x08\xab\xa8\xb7\xe1\x4b\x74\xa2\x00\x2f\x88\x71\xaf\x4a\x04\xc5\x25\x29\x6b\xbe\xb2\x35\xed\x98\xa8\xc8\x05\xab\x2a\x65\x78\x94\x64\x05\x86\x1b\x46\x4c\xaa\x97\xa0\x2b\x1a\xf4\xaa\xdc\x5d\x1a\xbb\xa0\xc1\xda\xb0\x8b\x77\x1d\x03\x78\x53\x86\x16\x88\x7a\x97\x02\x2e\x5a\x0c\x35\x33\x44\xa5\x47\x41\x10\x0e\x81\xb4\xc8\xd6\xc8\x4e\x09\x97\xed\x54\x8a\x8f\x2b\xd4\xb9\x13\x0c\x6c\x60\x35\x31\x22\xba\x13\xda\xd7\x43\x8a\xa2\xe0\x94\x21\xf8\x4e\x0b\x57\x75\x44\xcf\x70\x10\xda\x1b\x37\xc8\x4e\x52\x28\xa4\xac\x63\x91\x73\x41\x28\xe3\x84\x32\x14\x2e\x12\x0d\xb5\x16\x16\xc2\x3a\x13\x0c\x33\x92\xe6\x0a\x84\x4e\xd1\x76\x78\x2b\x0a\xb5\xcb\x72\xb6\xa2\x70\x81\xb6\xcf\xda\x1a\xc2\x2e\xf7\x91\x7a\x3d\x7d\x53\x3a\x8a\xe0\xe2\xcb\x87\xbb\xc7\x3a\x9d\x3c\xd5\x99\x18\x22\xc5\x6e\xeb\x02\x0d\x45\xb5\xd8\xa6\xdc\xd1\x44\xc2\x00\x54\x69\xdf\x4e\x21\x4d\x91\x33\xe3\x44\xde\xa2\xe6\xa6\xa5\x25\x9f\x4b\x5c\x88\x12\xa5\xf0\xc1\x10\x65\xc8\x65\xd5\x46\x5a\x6c\xd8\xb8\xde\x5a\x21\x17\x6d\xdc\x36\x50\x7e\xdc\x86\xea\xc9\x60\x12\x85\x0e\xb9\x2f\x97\x94\xf9\xd9\x77\x2b\x4a\x52\xc0\x41\x21\x63\x3f\x1b\xbd\xb2\x58\x60\x5a\x37\x3b\x2d\x90\x36\xd3\x20\xe5\xe6\x62\xf2\x50\x72\x28\x8d\x37\xb4\x73\xb0\x60\xc3\x09\x44\x2b\xf1\x11\x72\x99\xde\x13\x05\x86\x75\x56\x04\xe9\xf5\xd2\x54\xa4\x9a\x13\xd2\x54\xfd\xde\x20\x42\x03\x2d\x11\xa2\x70\x06\xf8\x90\xfc\xc8\x0c\x25\x0b\x9c\x81\x2a\x1d\x31\x5d\x94\x95\xc6\xe7\x3c\xbd\xe7\x19\x86\xce\x1a\x1b\xe5\xba\x2c\x0e\xa5\x85\x34\x91\x97\xce\x68\x5a\xac\x9b\x05\x0c\x0b\xea\x1a\xb3\x58\x37\xb9\xe0\x91\x92\xdb\xc3\xa2\x27\xe1\x36\xd7\xde\xf3\x2a\xbd\x20\x3d\x34\xae\x63\x5d\xa4\x9e\xd7\x97\xc8\x7b\xb3\x89\xa4\xcd\x46\x23\x51\x57\x86\xe2\xe8\x1c\x12\xbe\x76\xd0\xd0\xd6\x17\x76\x91\x9a\x21\x5f\x1a\x16\x7d\x00\x6c\x41\x53\x96\xe5\xc9\xe7\x94\x7c\xae\x0a\x2b\x60\xe8\x18\xd1\x92\xac\x9b\xcc\x46\x5a\x24\xa5\x36\x3e\xac\xfd\xed\x79\x4c\x2f\x50\xdd\x52\x13\x09\xb1\xc4\x25\x31\x63\x08\x6d\x6d\xb4\x38\xa8\x8d\xae\x1a\x43\x74\xfd\xaf\xdb\x6c\x26\x9c\x76\xd1\x2d\x2c\x0a\xe2\x35\x1a\x89\xba\xf1\x20\x6d\x4d\x8b\xb2\x29\xd0\xdd\x02\x89\xb7\x69\x55\x07\x6c\x87\xcc\x77\xd1\xfa\x42\x12\xef\x09\x6a\xd3\x52\x92\x5c\xb5\x69\x77\xc9\xa7\x94\xd4\x02\x06\x7e\x9e\xaf\xcb\xbd\x01\x31\xe0\xe8\xb1\xd2\x40\xd3\x51\xbd\x02\x17\x86\x5b\x4b\xf4\x0c\x3a\x0b\xae\xa1\xdf\xca\xf2\xc1\x09\x11\x86\xeb\xd6\x74\xd7\xe8\xba\x82\x68\x5a\x81\xa7\xa9\x76\xa1\xb3\x82\x9a\x7b\x11\xb9\x2e\x1a\x9a\x03\x71\xc8\x0b\x02\x74\xbe\x46\x6a\x21\x63\xf4\x56\x38\xdf\xf9\x20\x14\x2d\xcb\xb2\xc5\x86\x18\x92\x26\x26\x33\xb5\x46\x96\x0e\x14\x7d\x13\x2e\x33\x6a\x49\x98\x64\x14\x65\xd2\x9f\x3f\x43\x96\xa4\x35\xad\x48\x95\x84\x9c\xac\x75\xe5\x04\xfe\x4e\x95\x0e\xac\xdc\xd2\x72\x47\xc1\xfb\x2b\x97\xea\x20\xf5\x09\x90\x64\x37\xd9\xb0\x7d\x9a\x8d\x5c\x1e\x05\x5f\x59\x00\xf7\xc3\x18\xd7\x19\xe5\xdd\xcc\x81\xaf\x65\x17\x90\xf9\x04\x12\xaf\xf6\x77\x0a\x94\x3d\x59\x66\xe6\x7e\xb0\x4a\x11\xa7\x56\x4f\x68\x05\xb7\x61\x93\xb6\x6d\xb3\xfe\xd0\xbb\x22\x2d\x87\x06\xb8\x5e\xab\xf9\x63\xdf\x21\xf8\xb8\x12\xf1\xc7\x95\x88\xff\xef\xaf\x44\x7c\xb7\xd7\xd3\x54\x72\x87\x0b\x5c\x83\xdb\x24\x91\xdd\xb1\x05\x61\xbe\xee\x1d\xec\x9d\x95\x89\xee\xd6\x82\x42\x29\x89\x11\xfd\x2d\x96\x74\x57\xb5\x94\x4b\xb1\x24\xde\x97\x2c\xe5\x92\x7c\x09\x71\x83\xa5\xd2\xe0\x69\xb7\xea\x7a\xe8\x7a\x4d\x68\x17\x71\x87\x89\xe0\xda\x07\xe1\x89\x9f\x16\xb9\xde\x86\x76\x99\xf9\x7a\x9b\xd9\x47\x68\x43\x2b\x8f\x7c\xbd\xcd\xc1\x47\x68\x43\x0b\xa6\x5c\x6f\x73\xf4\x11\xda\x1c\x7f\x84\x36\x27\x1f\xa1\xcd\xe9\x3d\x6d\x2e\x8b\x61\xcf\xf3\xd9\xc1\x51\xde\x8b\xaa\x29\x4d\x70\x4c\xe6\xc7\xf9\xf1\x71\x3e\x3d\xa1\x54\xcf\xde\xb6\x39\x38\xcc\x0f\x8f\xd7\x6f\x21\x56\xe9\x3e\x3a\xc8\xa7\xb3\xfd\x1d\x4b\x7b\x1f\x1d\xe5\xd3\xd3\xe3\x1d\x1b\x0d\xa7\xc2\xf1\x61\x3e\x9f\xed\x52\x79\xfc\x74\x36\x7c\x35\xe2\xe8\x60\x87\x99\x9b\x9e\x9e\xe4\xf3\x93\xfc\xb4\x3f\x4e\xa6\xa7\xf4\x36\x07\x87\xf9\x41\xaa\x2c\xfa\x9d\xbe\x0f\x21\x56\x44\xdf\x04\x5f\x51\x8d\xf6\xa6\xa1\x96\xfb\xbb\x44\x52\xbc\x1d\x0d\xad\xc6\xcc\xb9\x21\xbe\xdc\x82\xe6\xd4\xdb\x8f\x76\x50\xde\xc6\xb2\x3a\xb7\x06\x9d\xe6\xd4\x22\x0b\x3b\xde\xe5\xb2\x9b\x6f\xd3\xa4\xfb\xa5\xe2\xac\x09\xd4\x88\xfe\x80\xcd\x4b\xbc\x1f\xb8\xcd\x1b\x25\xf5\xba\x05\x67\x1b\x74\x46\x52\x5b\x91\x53\xab\xb3\x1e\x80\xf7\x82\x1c\x85\x1f\x8a\xe6\xd2\x8e\x02\x28\x84\x02\x52\xe5\x71\x25\x0a\x52\xd5\xd9\x75\x8f\x84\x44\x9f\x1a\x3a\x28\xa2\x1f\x7d\xfb\xba\xb7\xb0\xe8\x6d\x0b\x05\xb8\x12\x7c\x74\xc3\x4e\xb8\xcf\x24\x6a\x01\x2e\xdb\xbd\xe1\xc2\xf0\x5d\x5b\x7d\xa4\x77\x5d\x4e\x14\x2e\x32\xaa\x04\xea\xb1\x5c\x48\x5c\x08\xd7\xd1\x1a\x0c\x2e\xa7\x1d\x6a\x0d\x38\x54\x04\xcd\x76\x02\x0b\xc3\x95\x3d\xf0\xf3\xb6\xcd\x60\x33\xe0\x3a\x35\xb7\xb3\xc3\x25\x1e\xec\x2f\x4f\x8f\x25\x46\x96\x13\xfd\xfa\x13\xae\x1e\x72\x7e\x54\xb7\xb3\x83\xc8\x4a\x7a\xab\xd9\xec\xe1\x79\xd5\x2c\x96\xed\x6c\xe6\x8e\xe8\xcd\xa6\x8b\x43\x74\x33\x69\x5b\x77\x62\x3c\xb5\xd9\xd5\xd7\xf7\x16\x86\x73\xf0\x35\x21\x00\x09\x35\xa8\x18\xa8\x67\x44\x05\x6a\x7d\x9c\x8d\x81\xd7\xa8\x8c\x71\x9f\xf7\x0c\x55\xa3\x16\x89\xe1\x0e\x0d\x66\x3b\xb4\xb8\x24\x7f\xc8\xef\xa4\xf8\xc4\x8b\x82\x61\x0a\x7a\xf9\x31\xbc\x82\x95\x8a\x30\xcd\xb1\xc9\xfa\x3d\x90\x3e\xda\x61\x45\x2d\x22\xbd\xd2\x59\x2a\xae\x32\xe1\xd3\xc3\xa9\x3c\x5a\x9c\x08\x77\x58\x70\xb5\x33\x73\x0c\xbc\xb1\x22\x94\xc8\x07\x55\x39\x62\x02\x1b\x47\xaf\x45\x97\x59\x19\x69\x71\xd5\x35\xde\x52\xbf\x1d\xc7\xbd\x37\x61\xdc\x02\x9c\xf4\x8c\xe3\x44\x85\x3e\x08\xb7\xee\x3e\x27\x66\x40\x0b\xcd\x8c\x13\x61\x31\x1e\x8a\x19\x4a\xff\xe6\xfd\xe2\x14\x0e\xab\x3a\x30\x93\x88\x8e\x4f\x0a\x56\x18\x19\x0e\x0e\x8e\xd8\xe1\xec\x78\x4a\x95\x4f\x57\xb1\x2a\x62\x72\xbc\x59\x72\x46\xfc\xe2\x57\x2d\xac\x84\x50\x1a\x47\xcb\x5e\x8e\x56\x76\xc4\x2f\xa7\xd4\xc4\x0a\x73\x75\x61\xa8\x79\xe9\x85\xa1\xde\xfe\x1d\x3a\x25\x5f\xb7\xba\x42\x8f\xc4\x3a\x37\x8b\x57\x17\x06\xc8\x07\xcb\xba\xda\x8b\x7f\x92\x3f\x46\xf1\x7e\x9e\x81\xcd\xbc\x89\xa1\x16\xe0\x43\x36\x25\x46\x66\x26\x1c\x70\x5e\xf2\xa9\xa9\xe7\xb3\xc3\x8e\x7c\xa6\x1c\x1c\xb4\x28\x6b\x2b\xcf\xcb\x5c\x2c\x05\x8b\x41\x6c\x32\x5f\x3f\x0a\x09\xfd\xc4\x78\x84\x69\x86\xc4\xc9\xd9\x34\x98\xed\xda\x60\xbe\x6b\x83\x83\x5d\x1b\x1c\x92\x1b\xb0\x32\xdb\xdc\xbf\xb8\x31\x69\xd6\x19\x9e\xf7\xfc\xb2\x75\x38\xa7\x78\xf0\x10\xc3\x82\xa2\x94\x1a\xa6\x03\x31\x2e\x55\x47\x49\xac\x98\x1b\x65\x44\x9a\x00\xe8\xa1\x3b\x14\x41\xac\xc1\xda\xce\x68\x8a\x5a\x3e\x50\x4b\xc0\x21\x71\xf4\x18\x16\x84\xb4\x81\x1e\x66\xb5\x5d\xdf\x74\xdb\x55\x20\x37\x0d\x3d\xa1\x63\xc0\x8e\xf8\xf4\x07\x40\xd6\xf3\x4f\x10\x2e\x6f\x9a\x7c\x3d\xcb\xc9\x7e\x7b\x0d\x3f\x8c\x16\x71\x9e\xf0\x39\x3b\x76\xa8\x9a\x87\xc7\xa7\x5d\x19\xc9\xda\xc1\xe5\x0b\xc6\x19\x73\x00\x3c\xf9\x70\x33\x97\x35\x6e\xec\xbc\x1d\x15\xb8\x4d\x2b\x9a\xd3\x4f\x75\x87\xa3\xb4\xf1\xf9\xc1\x69\x75\xba\x8a\x28\xf6\x8f\xa2\xd9\x75\xe8\xaa\x0b\x8b\x21\x5e\x4c\x3b\x4b\x13\xea\xc2\xc7\x5e\xf1\x8f\xbd\xe2\x1f\x7b\xc5\x3f\xf6\x8a\xff\xff\xee\x15\xbf\xc3\x98\x53\x2c\xd7\x48\x70\xa0\xee\x58\x1f\x96\x96\xa7\xea\x0d\xe3\x34\x6d\xc6\x16\xb4\xac\x1a\x5b\x6b\xaa\x4b\xda\x1a\xa7\x6b\x62\xca\xdf\x06\x6b\x9d\x50\xd4\xea\x51\xbe\xe9\x9a\xcd\xad\xfc\x51\x15\xa1\x06\x85\x25\x68\x9f\x0b\x65\x14\xad\x8e\x5a\x68\x31\xb0\x9a\xf4\x39\xeb\x01\x49\xf5\x24\x86\xb0\xd0\x2d\xad\xe2\x3a\x19\xb9\x40\x9a\x22\x9c\xb8\x01\x3a\x24\x18\xf5\x98\x94\x19\x3a\xe1\xd3\x66\x16\xfd\xd1\xf1\xf4\x21\x33\x40\x56\xb9\x26\x7c\x06\x1a\xea\xba\x56\x76\x5a\x96\x2b\x7a\xb3\xd2\x1e\xb9\x4a\x56\xe7\x0f\xfd\xaa\xd9\x55\xc9\x79\x8e\x39\x03\x77\x78\x98\x50\xe2\xd6\xdb\x75\x7f\xea\xcf\x16\xf5\x64\x22\xcf\xdd\xa8\xfe\x0f\xa1\xb3\x01\x16\x16\x09\xd4\xd5\x1c\x8d\x65\x0f\x49\xc3\x40\x5e\xeb\xe9\x9a\x24\x3e\x3a\x59\x1f\x2e\x47\x1b\xc8\x88\xb0\xcf\x87\xff\x3e\x38\x49\x22\x8f\x67\x43\x0a\x4d\xdf\xed\x2c\x09\x9e\x1d\x93\xfb\xdd\xdf\x1f\x4e\x8d\xbe\xdf\xfd\x04\xf8\x68\x72\x76\x36\x7d\x30\x9d\xa5\x3a\x3d\x9a\x94\x6c\x7f\xff\xec\xec\xc1\x71\x1a\x28\x4e\x7a\x20\xe1\xd5\x25\x1f\xba\xbc\xf7\xdd\x97\xbb\xd7\xe6\xc0\xcf\xa3\x4f\xe5\x9e\xad\x99\x36\x38\x58\x08\x09\x7c\xf3\xe5\xb0\xfb\x52\xe0\x26\x5c\x6e\xb8\xfc\x3e\x80\x1a\x6a\x1f\x8e\x63\x24\x2e\x44\x9b\xcb\xfc\xe1\xc3\xfb\x10\x0b\x3e\xfa\x18\x34\x6c\x32\xf5\x7c\x4f\x38\xdc\x4b\x8c\xaf\xf2\xa8\x84\xbe\x2f\x7d\xf1\x0a\x40\x49\xe9\x7b\x58\xbb\x7b\x27\xe6\x0a\x43\x48\x96\xbc\x9d\x99\x77\x07\x48\x62\x01\xc5\x7d\x23\x7b\x02\xb5\x3d\x7c\x47\x41\x4d\xd4\x32\x12\x70\x76\x53\x12\x6f\x04\xa4\xc0\xa6\x20\x31\x18\x0d\x8b\x94\x2c\x1a\x8a\xf2\x6e\x0b\x65\x8e\xa4\x3e\x2e\x7b\xe3\x7a\x5b\x04\xfe\x7e\x9c\xdf\x7e\x32\xe9\x7e\x48\xb8\x2a\xf1\x34\x02\xba\xfc\x84\x4d\x0a\x53\x37\x23\x90\xae\x49\x33\x42\x67\x62\x92\xe6\x25\x82\x4a\xcd\xe4\x1a\x93\xe0\xa7\x8f\xf3\x78\x6f\x39\xcd\xfe\x5f\xcd\xe3\xbd\xe3\xc4\x06\xe4\x29\x4e\x1a\x30\x05\x73\x29\x18\x1f\x25\xf1\x92\x77\xa3\x3e\x47\xf0\xf1\x32\x68\x3e\xb2\xc0\xac\xba\xad\x4d\xdc\xe1\x13\xe5\x5e\x16\x29\xe2\x24\xae\x56\xdb\xf2\x46\x63\x43\x0d\x41\x8a\x7b\xc8\x9a\x14\x72\xc5\x39\xfa\x70\x2b\x26\x75\x7f\x87\xa5\xe8\xb5\xb0\xd4\x08\x6c\x3f\x73\x29\xe9\xe8\xb5\xf7\x3c\x25\xf4\x50\x78\x6e\x62\x87\x29\x91\x1d\x4c\x0c\x69\xba\x18\xdb\xb8\x91\xc7\x21\x36\xb9\xe8\xfd\xc1\x4d\x91\xc5\x1c\x39\x82\xc4\x32\xb5\x5f\x7a\xdc\xfa\x13\x82\x09\x60\xe4\xc0\xea\xd4\xe6\x9a\x1f\xcc\x0f\x4e\xf6\x93\xac\xc1\xe3\x0a\xbb\x08\xa9\xa9\x65\x46\x65\xb5\xcf\xea\x86\xa7\x8e\x44\xb6\xea\x8a\xf3\x55\x6a\xa8\xa0\x39\xe8\x55\xf2\xb5\xe5\x79\x6d\x53\x82\xab\x89\x5d\xd4\x85\xc9\x99\x8c\xc5\x08\x6c\x36\x65\xa9\xb7\xd5\x98\xe4\x0c\x55\x25\x21\xf8\x10\xbb\xd4\x19\x35\x60\xd2\x1c\x76\x3c\xcd\x37\xd1\x96\xfb\x31\xe7\xa9\xed\x7f\xce\xc7\xcf\xe6\x73\x9e\xd6\x73\xe6\x47\xfb\x45\xec\xd2\x27\x26\x32\x4c\x6a\x69\x8d\x37\xde\x24\x37\x83\x12\x18\x52\x32\x7c\xc0\x70\x08\xa9\x37\x0e\xb8\x5e\x1a\xa5\x71\x16\x92\x8a\x5a\x34\x4d\x92\x6f\x15\x66\xe9\xc9\x52\x18\x53\x2f\x53\xd8\x62\x49\x50\x78\x4c\x52\x2b\x52\xc8\x1c\x69\xde\xbd\x60\x3a\x75\x00\x98\xb2\x44\x26\xe6\x47\x87\x89\xce\x4c\x0c\xd2\x98\x94\x78\xf7\x19\x95\xb8\x05\xfa\x08\xd2\x87\xc8\x31\x25\xe5\xb7\x25\x14\x48\xa8\x68\x39\x84\x7b\x0d\xb4\xf5\x68\x7b\x8d\xeb\x92\xce\x6c\xa3\x8b\x3c\x91\x52\x77\xff\x4b\xa6\x47\xf3\x04\x19\xd3\xd9\x51\xaa\x8f\xd9\x71\xfa\x2d\x5d\xd2\xa8\x91\xa6\xdc\x56\xfc\xbd\x1f\xa4\x45\x10\xe0\x53\xe7\x4b\x47\xd3\x8c\x7c\xfa\x7c\xbc\xfa\xca\x70\x02\x93\x36\xee\xbc\xa9\x53\x42\xa3\x87\x24\x95\xe1\x1e\x94\xa1\x4e\x0d\x6e\x91\x1d\x1e\x25\x7b\xaa\x52\x63\xeb\x21\x69\xaa\x2b\x13\x09\xe3\xbf\x79\xa5\x31\x01\xcd\x2e\x3f\x0b\x9d\x00\x56\xa0\x92\xd6\xfe\x00\xbc\xf9\x35\xf9\x04\x7c\x07\x28\x8d\xdd\x86\x4e\x7b\xe3\x88\xaa\xcc\x5e\xf6\x9d\x47\x3f\xe6\x18\x0a\x84\xd3\x8f\x3f\x7c\x48\x40\xf5\x73\xc9\xce\x53\x72\xb8\x03\x9b\x52\x9e\x55\xf7\x90\xe4\xa9\xb9\xcf\x73\x74\xa9\x37\x0b\xcd\xd2\x8b\xb0\x41\xad\x0d\xd9\xc4\xa4\x9e\xfb\x40\xe0\xd6\x15\xaa\xb8\x8a\x39\x8e\x19\xd8\x1b\xcc\xa8\x87\x76\xa5\x56\xb3\xfd\xe9\x69\xea\x6d\x6a\x95\xf6\x2f\x6f\x40\xe3\xa3\x5b\xa9\xd5\xf0\xa9\xc0\x94\x11\x51\xa5\x4d\xb8\x0d\x68\xfc\x7d\x83\x91\xa1\x45\xe8\xa7\x3f\x29\xbd\x95\xc0\x25\xea\xf4\xe4\x9b\xe8\xf8\x22\xbd\xa5\xfb\x3d\x97\xb4\x69\x5b\xd0\x95\x4f\x89\x30\xb4\x68\x13\xfd\xa0\xcd\x25\x8c\x3e\xcf\xd2\x03\x43\xbb\x38\xca\x82\x48\xba\x7a\x7b\x48\xd6\x83\x53\x47\x4f\x0d\x01\xbd\xea\x30\xb5\x1d\xb5\x08\xde\x0a\xc1\xfb\x8e\x15\xf8\xfb\x97\x6a\x72\x09\xcb\x15\x30\xbb\x29\xc6\x38\xe2\x32\x68\x85\x37\x4a\x64\x35\xcf\x95\x18\xb3\xe6\xb6\xb5\x74\xea\xfb\xac\xfd\x2b\x8e\xe2\x05\x0e\x77\x36\xc6\x40\x12\xbc\xc7\x65\x16\xb5\x44\x85\xeb\xa2\x47\x79\x1c\x33\x25\x84\xb2\xc6\x69\x8c\x6a\x9c\xce\x0a\x56\x42\x4a\xb1\x3e\x53\xc6\x09\xad\xf9\xda\xc2\x36\xae\x1a\x77\x96\x34\xdd\xf8\x3b\x91\x89\x60\x9c\xeb\xc5\xdc\x78\x5f\xe7\xd6\x58\x1f\x1b\xcc\x45\x1c\x33\x62\x84\xb0\xa5\xe3\xa9\xfd\xa3\x80\x7b\x27\x16\x46\xc6\xa1\xb2\xd0\xf8\x58\x55\x16\x86\xe4\x3a\x36\xc6\x63\xeb\x8f\xc5\xda\x14\x73\x0f\x59\xcc\xe3\x5d\x19\x2b\x74\xce\xf8\xb8\x88\x58\x73\xc9\xb8\x65\x6d\xc1\xf7\x2c\x67\x8d\x65\xc6\xe9\xf1\x65\xb0\x0e\x17\x10\x44\xcd\xf3\x30\xc6\x7a\x4e\x70\x58\x97\xd9\xaa\xc7\xa4\x93\x75\xd8\x0b\x1e\xcd\xa1\x4b\xcc\x6d\x38\x8f\x36\xb5\xf2\xc1\x84\x5a\x54\xd2\xb8\x2e\xc7\xd1\xed\xc8\x54\xa2\x27\x60\x3e\x85\x40\x9b\x42\xa8\x64\x1f\x5a\x47\x90\x4e\x2c\x50\xb4\x49\xac\x4d\x22\x3c\x13\x12\x0b\x07\xae\x4b\x22\x93\xe3\xf7\x4a\x24\x21\x21\xd5\x4b\xa1\x52\x4a\x12\x03\x55\x38\xe4\x55\xea\x65\x0c\x52\xa3\x67\x12\xd6\x9c\x99\x78\xa3\x28\x3c\x33\xb5\x49\x1e\x2e\x42\x09\x07\x32\xa5\x99\x09\x5d\xa1\x16\xa2\xe7\xe2\x05\x4a\xb9\xad\x0a\x3e\x2a\xc5\x16\xe8\x42\x04\xb9\x5d\xaa\x94\xe7\x54\xa4\xe6\x06\x55\x99\x42\x98\x14\xaf\x9e\x83\x82\x4d\xf9\xfa\x94\x33\xaa\x8e\xb9\xe0\x63\x92\xf5\xdc\x07\xe3\x12\xef\x6b\xc0\x55\x49\x45\x48\x62\x51\x45\xe4\x49\xb3\x65\x37\x19\x6d\xab\x9c\x8f\x09\x38\xd5\x21\x6d\x69\x34\x84\x98\x0c\xf3\x18\xc1\x78\x86\xb4\x6d\x69\x3c\xd8\x58\x48\x1c\x3e\x20\x95\xc2\xc6\x94\x32\x63\x16\x98\xe2\x5e\xb3\x2c\x8d\xe3\xe0\x82\xd1\x72\x5b\xd7\x33\x85\x2e\xb0\x90\x68\x2a\x07\xb6\xc6\xe4\xca\xac\x9b\xa8\xe8\x91\x91\x5e\x61\x75\x72\x9f\x5b\x67\x1e\xc6\xb4\x6e\xe8\x3c\x4b\x74\xe4\xa1\x12\xdb\x82\x6d\x23\x28\x86\xbd\xd5\xc4\xd1\x09\x96\x34\x72\xd7\x58\x05\xa9\xc5\xf3\xcc\xd8\x98\xd4\xdc\x11\x52\xf2\xd5\x5b\x14\x1c\xab\xe1\x73\xee\x24\x0e\x5b\x9f\xb7\xc9\x8d\xb7\x85\x49\xd4\x29\x71\x10\x40\xf3\x92\xb4\xb6\x51\x27\x88\x8b\x1a\xb3\x02\x85\x14\xa5\x90\x7c\x7c\x8f\xb6\xa2\x30\x65\xa3\x4d\x2b\x87\x6b\x5c\x29\xcf\x93\x0f\x32\xa9\xa2\xb7\x28\x45\x6a\xc7\x0f\x5f\xfb\x2a\x40\x37\x89\x91\x0c\xb8\x81\x1b\x86\x7a\xea\xa9\x33\x50\x8f\x3c\x9c\x1f\xed\x27\xa3\x66\x87\xd3\x2e\xa1\xaf\x9f\x1c\x9d\x1c\xa5\xc8\x80\x82\x12\x0a\x03\xc6\x62\x2b\x20\xd4\x49\x26\x02\x64\x06\x75\x7f\x16\x24\x57\x08\xd0\x65\x6a\xa8\x11\x9d\xda\x14\x4f\x22\x47\xbd\x0e\x80\x4b\x2c\x93\x5e\x7e\x50\xc9\xd0\xeb\xd1\x74\x96\x0a\x56\x73\x48\x06\x3a\x0a\x81\x01\x90\xd5\xb1\x84\x7b\xb3\x77\x2e\xb1\xe7\xa0\x93\x2e\xc7\xc2\x98\x6d\x72\xe8\x18\x8a\xe4\x72\x63\x80\x12\x41\x5f\x7d\x21\x6f\x54\x5f\x13\x0e\xe6\x47\xa9\xb0\xe4\xc0\x4a\x3e\x19\xc8\xad\x23\xe4\xd6\x8d\x9a\xb0\x75\x4c\x3b\xe4\x58\x1d\x75\x17\x73\x65\x0a\x1c\x47\xf9\xda\x24\x3c\x51\x4c\x91\xb6\x01\x53\x05\x81\xac\xe0\x92\x2e\x07\x5e\xb2\x32\x25\x9a\xb8\x61\x9e\x62\x44\x73\x13\x8b\x24\xcb\xaf\x41\xc9\xe8\x0b\x37\xb1\x4b\x31\x35\x5f\x76\x69\x67\x0e\xef\x42\x38\x49\xec\x20\xd1\xdb\x12\x46\x27\xe5\xaf\x88\x1c\x59\x32\xb5\x21\xb9\x2b\x7a\x48\x63\x68\x49\x72\xa5\xe3\xc9\xfd\x53\xc6\x10\x53\x81\xb4\x1e\xa3\x53\x73\x55\x81\xe6\x29\xd7\x65\x25\x90\x92\x24\x57\x89\x60\x1d\x32\x11\x20\x35\x1b\x15\x96\xc3\x87\xc8\x13\x28\x93\x9e\xfa\x9a\x94\x81\x54\x1b\x5d\x2d\x31\xc5\x5b\xbd\x85\x56\xc4\x32\x85\x8a\x4b\x24\xb8\xa9\xeb\xd8\xa5\x36\x34\xea\xf5\xa7\x7c\xb4\x68\x03\xa4\x94\x42\x0c\xb5\x49\xe6\x46\x9d\xdf\x9f\xc8\x79\x09\xc1\xe1\xcb\xd3\xa3\xbe\x8a\x06\xb0\x03\x9d\x0e\x25\x34\x30\xd4\x0f\x6d\xba\x4c\x42\x91\xcc\xb8\x10\xc2\xa6\xa7\xad\x69\x54\x9d\x34\xd1\xd2\xdd\xf4\x5a\xa4\xe0\x49\x2d\x46\x1a\x99\xe2\x7d\x19\xcd\x39\xca\xe4\xf2\x28\x30\x5d\x3a\xc0\x0f\xa6\x8b\x7a\xfc\x30\x18\xd2\x0e\xd2\x3d\x6d\x50\x09\xbb\xd3\x14\xd8\x24\xf3\xe9\x4c\x1a\x12\x8b\x64\x56\x45\xb7\x82\x26\x1d\x24\x46\x95\x49\xd0\x55\xc6\x52\x8a\xb9\x5e\xf4\x7c\x9a\x32\xf5\x1c\xb0\x64\x44\xc5\x42\x67\x93\xc9\x51\x6b\x90\x29\xce\x05\x0b\xc9\xfc\x64\x0e\x28\x53\xc7\xc6\x43\xbc\xfc\xc0\xfb\x08\xa8\x4b\xce\x58\x0f\x21\x29\x54\x0e\x3a\x56\x83\x4f\xf9\xf0\x9d\xd1\x55\x9d\xb4\x40\x5d\xac\xa2\x49\xef\x7f\x9f\x39\x31\x7c\x55\x2d\x01\x03\xdd\xc4\x64\x8a\x8c\x67\x46\x59\xe1\xc6\x8d\x0a\x2f\x80\x10\x44\xf3\x2a\x57\x63\x61\x59\xaf\x56\x3c\x95\x21\xe5\x35\x58\xee\x4c\x2a\xf8\xe4\x75\xbb\x4c\xf5\xe4\xd3\xf9\x41\x01\x9a\xa8\x2b\x9b\xce\xac\x16\xa0\x16\x28\xda\xe4\x9c\x07\x1c\x7c\xfe\xac\x4e\xed\xa1\xc8\x81\x6d\x3f\x27\x37\x6a\x27\x27\x55\x9c\x85\xba\xfc\x20\xd1\x98\x61\x4c\xb1\xe3\x5a\x81\xcc\x8c\x07\x22\x5a\x41\xd9\x61\x4b\x04\x9a\x01\xb4\x44\x05\x12\x92\x47\xf6\x12\x75\x1d\x41\x8b\x94\x5b\x66\xa9\xd2\x67\x54\x07\xba\x6a\x04\x8f\xa9\x35\x5f\xd5\xa0\xab\x15\xfa\x1a\xc7\x67\x64\x55\x63\x32\x8f\x65\x45\xb8\x5b\xb1\xaa\x23\xd6\xf7\x69\x54\x13\x6e\x5a\x2d\x0d\xf0\xfc\x5c\x84\xc2\x01\xea\x7b\xef\xb9\xac\x0b\x5d\xf4\xa2\xde\x7b\xb9\x29\x7b\x91\xad\x8b\x83\xdc\x6a\x72\x79\x85\x68\x7a\x9a\xcf\x4e\xd6\xff\x7b\x30\xbf\xf7\x72\xd2\xa7\x3e\xf1\xf9\x57\xbf\x30\x79\xf9\x73\x97\x7d\xac\x7f\xfe\xc3\x97\xbe\xf8\xf2\xa7\xaf\xdd\x19\xfb\xdf\x01\x00\x00\xff\xff\x0f\x2c\x9d\x3f\xc7\xd4\x00\x00") 96 | 97 | func assetsHtmlClashConfigYamlBytes() ([]byte, error) { 98 | return bindataRead( 99 | _assetsHtmlClashConfigYaml, 100 | "assets/html/clash-config.yaml", 101 | ) 102 | } 103 | 104 | func assetsHtmlClashConfigYaml() (*asset, error) { 105 | bytes, err := assetsHtmlClashConfigYamlBytes() 106 | if err != nil { 107 | return nil, err 108 | } 109 | 110 | info := bindataFileInfo{name: "assets/html/clash-config.yaml", size: 54471, mode: os.FileMode(420), modTime: time.Unix(1603803569, 0)} 111 | a := &asset{bytes: bytes, info: info} 112 | return a, nil 113 | } 114 | 115 | var _assetsHtmlClashHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\x5b\x53\xdb\x46\x14\x7e\x67\x86\xff\xb0\xd1\x43\x27\x4d\x91\xc5\xe5\xa1\x1d\x8f\xa4\xb4\x43\x92\x49\xdb\x87\x32\x13\x32\x49\x1f\x85\xb4\xa0\x2d\xf2\x4a\xd9\x5d\x3b\x50\x86\x19\x3b\x85\x70\x09\xb7\x24\x84\xb4\xe0\x84\x40\x93\x94\xc9\x70\xeb\x90\x49\x0d\x98\xf0\x5f\x8a\x56\x92\x9f\xf8\x0b\x1d\x49\x36\xd8\xc1\x21\xa1\x3c\xd9\xe7\xec\xb7\xdf\xb7\xe7\xac\xce\x39\x2b\x5f\xb8\xf2\x53\x7b\xe7\xcf\x1d\x57\x81\xc9\x52\x96\xda\xd8\x20\x87\xbf\xc0\xd2\x70\x8f\x22\x40\x2c\xa8\x8d\x0d\xa1\x0f\x6a\x86\xda\xd8\x00\x00\x00\x72\x0a\x32\x0d\xe8\xa6\x46\x28\x64\x8a\x90\x66\xdd\xe2\x37\x42\xcd\x9a\xc9\x98\x23\xc2\x3b\x69\x94\x51\x84\xdb\xe2\xcd\xef\xc4\x76\x3b\xe5\x68\x0c\x75\x59\x50\x00\xba\x8d\x19\xc4\x4c\x11\xbe\xbf\xaa\x40\xa3\x07\xd6\x6e\xc5\x5a\x0a\x2a\xc2\x75\x0d\x1b\x26\xb4\x8c\x6b\x04\x41\x6c\x58\xfd\x55\xbb\x3a\x49\xba\xee\x96\x0c\x82\x77\x1d\x9b\xb0\x2a\xe8\x5d\x64\x30\x53\x31\x60\x06\xe9\x50\x8c\x8c\x26\x80\x30\x62\x48\xb3\x44\xaa\x6b\x16\x54\x5a\x12\xcd\x4d\x20\xa5\xf5\xa1\x54\x3a\x55\xed\x4a\x53\x48\x22\x5b\xeb\xb2\xa0\xd2\x2c\x00\xa9\xa2\x78\x41\x14\x41\xa7\x89\x28\xb0\x10\x86\x00\x51\xd0\x6d\x13\x60\xd9\xba\x66\x01\x06\x29\x13\xc5\x6a\xa0\x6c\x21\xdc\x0b\x08\xb4\x14\x81\xb2\x7e\x0b\x52\x13\x42\x26\x00\xd6\xef\x40\x45\x60\xb0\x8f\x49\x3a\xa5\x02\x30\x09\xec\x56\x84\x44\x22\xb4\x24\x84\x0d\xd8\x97\x08\xfd\x2a\x38\x66\x3b\x0b\xd1\x87\x34\x65\x0a\x86\x98\x05\x55\x3e\x3c\x19\xbc\xdd\x6e\xb7\x34\x6a\x06\xe3\xf7\xfc\x7b\xdb\xb2\x14\x2f\x34\x36\xc8\x52\xf9\x92\x1b\x1b\xe4\x2e\xdb\xe8\xaf\x6c\x34\x50\x06\xe8\x96\x46\xa9\x22\x30\xdb\xe9\xd2\x48\x85\x32\x5a\x35\x5b\x54\x99\x32\x62\xe3\x1e\xf5\x1a\x81\x10\x74\x10\xbb\x0f\x41\x2a\x4b\x65\xa7\x2c\x99\x2d\xd5\x78\xa7\xc2\x65\x40\xaa\x13\x24\xa8\xc1\xc8\x1b\x3e\xbe\xe2\x8d\x3f\xe6\xd3\x73\xac\xa7\xb4\xfc\xb0\x94\x7b\x7c\x90\xcd\x05\xeb\xcb\xa5\xdf\x87\x79\x7e\x93\x3f\xcb\x1e\x64\x73\x7c\x78\x95\x17\xb3\xee\xce\xa3\x20\x37\xeb\xef\x3d\x74\x0b\xe3\xfe\xfc\x10\xa5\x07\xd9\x1c\xa5\xe4\x20\x9b\xcb\xa4\x60\x64\x31\x62\xff\xa2\xe1\x38\x34\x77\x7f\xc9\xcb\x6d\x1c\x16\x27\x82\xdc\x3c\x9f\x19\xe5\x53\xbb\xa5\x91\x49\x3e\x33\xe5\x4d\xcf\xb8\xef\x17\x62\x0c\x1f\x7d\x1a\x2c\xad\xc8\x92\x53\x89\x56\x32\x50\xa6\x4e\xe4\x14\xea\x0c\xd9\xb8\x36\xf4\x56\x55\xd6\x2a\x80\x1e\x02\x21\x3e\xbe\x82\x30\xc1\x82\x1a\xe5\x59\x96\xb4\x30\x0b\xad\xd5\x5b\xd3\x56\x95\x15\x93\xb5\xa9\xa5\xe1\x49\x7f\x6f\xdd\x9b\x1b\x71\x77\xdf\xc9\x92\xd9\xf6\x21\xc4\x42\x31\x61\x35\x2e\x09\x06\x06\x40\x82\xc0\x3b\x69\x48\x19\x18\x1c\x4c\x4a\x52\xe8\x30\xec\x94\x86\x70\x68\x87\x56\x58\x17\x60\x70\x30\x3e\x95\xa4\xdb\xb8\x1b\xf5\x80\x8f\x1c\x3d\xc2\x24\x25\x09\x61\xca\x34\xcb\x12\x63\xf4\xe5\x34\xb1\x94\xff\xa9\x24\xa8\x6e\x21\x5b\x9a\x5d\xe7\x1b\x45\x3e\xfc\x2a\xce\x86\x85\xea\x04\xe7\xe5\x57\x79\x7e\x33\xd8\x9f\x09\x96\x26\xbc\xa7\xef\xea\xc4\x1a\x36\x96\xa4\x24\xb5\xb4\x7e\x9d\x68\x4e\x34\x27\x5a\xea\x68\x46\xb5\x78\x1c\xe2\x27\x83\x3a\x1b\xe5\xe7\xc5\x62\xb6\xa9\x1d\xc4\xce\x20\x03\x92\xd3\xee\x11\x38\xc4\xee\xeb\x17\x9d\x32\xf4\xb0\x38\x7f\xe6\x0c\x3b\x95\x6a\xab\x9b\x50\x7f\x6d\xa1\x94\x1d\x73\x77\xff\xf4\x67\xee\xfb\x7f\xef\xf2\xe7\x0f\xce\xa1\x71\x39\xea\x36\x94\x36\x51\x4a\x9a\xa2\x72\x3b\x55\xb5\x94\x5d\xe4\x3b\xaf\xcf\xa3\x47\x1d\x08\x0d\xa5\xf9\x54\x15\xbe\xb0\xc7\xd7\xdf\x9d\x47\x45\x57\xae\xff\xd8\xd4\x79\xab\xe9\xe6\x8d\x2f\xb0\xae\xfc\xd0\x01\x2e\xea\x6e\x61\xa7\x94\xcf\x06\xaf\x73\xfe\xfc\x50\x45\x60\x02\x87\x6e\xb7\x30\xf9\xc1\xca\x97\xa7\xa7\xbe\xb0\x16\xec\xad\x9e\xe7\x78\xdd\xc8\x62\x90\x28\x04\x5c\x24\x91\x7e\xcc\x37\xe1\xb8\x85\x1d\xc7\xb6\xad\xc3\xe2\x04\x71\x8e\x16\xbe\x2a\xbb\x70\x88\x2d\x3d\x7b\x7e\x04\xc7\x4e\xec\x38\x5a\x0f\x6d\x3e\xb5\xe8\xcf\x2e\x22\xe7\x63\x21\x78\x0b\x6f\xbd\xb9\x4d\x6f\x6e\xdb\xdb\x7a\x72\x58\x9c\xaf\x05\x94\xbb\x58\xa5\x85\x84\xe3\x06\x33\x41\x3d\x09\xaa\xfd\xe2\xc3\x69\x79\x0b\x61\xc3\xbe\x4b\x93\x20\x16\xa8\xae\x70\x3e\xb9\xc5\xa7\x37\xea\x9c\xe7\x04\xd3\xed\x24\xb8\xa2\x51\xb3\xcb\xd6\x88\xe1\x16\xd6\x0e\x8b\x13\x61\x33\x1f\xd9\xf5\x36\xa6\xdd\xc2\x1b\x7f\x6d\xce\x7f\xf2\xca\xdf\x1d\xe2\xd3\x5b\x6e\x61\x3c\xf8\xeb\x51\x78\x61\xa3\xff\x78\x73\x9b\x7c\xe1\xbd\xf7\x62\xe4\xb3\x24\x3a\x88\x9d\x04\xed\x71\x2b\xf9\xf7\xfe\x23\x70\xd3\x31\x34\x06\xc1\xd5\x3e\x06\x09\xd6\x2c\x70\xc3\x4e\x13\xbd\x6e\xf1\x45\x3c\xd2\xc9\x26\x5f\x8b\xac\x42\x9c\x61\xec\x0c\x0c\x88\x40\xba\x04\xbc\xb1\xac\x97\x1f\x73\xf7\xf6\xfd\xd9\x15\x2f\xbf\x1a\x16\xf9\x8b\x5c\x3c\xd9\xbc\xfc\x24\x1f\x5f\xf2\xe7\x87\xfc\xd7\x39\x6f\x6d\x99\x8f\xbe\x28\xfd\xf1\xf2\x20\x9b\x73\xf7\xd7\xbd\xd9\x6d\x7f\x6c\xd4\x7b\xf6\x5b\x3c\x1b\x2f\x49\x83\x83\xd5\xb3\x59\xf5\x56\x97\x83\xfd\x29\x3e\xbc\xe5\x6d\xad\xf0\xa9\x45\x77\x2f\x1f\x64\x87\x2b\x53\xf9\xb0\x38\x7f\xd4\x51\xc3\xb6\x49\x93\x92\xc4\x12\x29\x28\x39\x10\xf6\x76\xa7\xb1\xa0\x7e\x5b\xfe\x17\x37\x46\xa7\x66\xee\xab\x47\x7c\xf5\x78\x7a\x10\x33\xd3\x5d\x09\xdd\x4e\x49\xbf\xa6\x5b\x7a\xa3\xef\xbf\x3f\xfc\x5c\x45\x92\x12\xd4\xcf\x41\xd5\xd5\xf4\xd6\x5e\xfa\x2b\x0f\xf8\xce\x74\x18\x75\x7e\xf5\x13\xca\x54\xc3\x34\x8d\x5a\xdb\xda\x8e\x89\x75\x13\xea\xbd\x75\x0f\xf0\x31\x70\x78\x8e\x68\x28\x67\x20\xa1\xc8\x0e\xeb\xfb\xe4\xf3\x42\x96\xca\x2f\xac\xe8\xd9\x15\xbe\xbb\xff\x0b\x00\x00\xff\xff\x27\xa2\xd6\x1a\x87\x0b\x00\x00") 116 | 117 | func assetsHtmlClashHtmlBytes() ([]byte, error) { 118 | return bindataRead( 119 | _assetsHtmlClashHtml, 120 | "assets/html/clash.html", 121 | ) 122 | } 123 | 124 | func assetsHtmlClashHtml() (*asset, error) { 125 | bytes, err := assetsHtmlClashHtmlBytes() 126 | if err != nil { 127 | return nil, err 128 | } 129 | 130 | info := bindataFileInfo{name: "assets/html/clash.html", size: 2951, mode: os.FileMode(420), modTime: time.Unix(1618997397, 0)} 131 | a := &asset{bytes: bytes, info: info} 132 | return a, nil 133 | } 134 | 135 | var _assetsHtmlIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\xdd\x53\x1b\xc9\x11\x7f\xa7\x8a\xff\x61\x6e\x1f\x72\x97\x8b\xc4\x1e\xf6\x4b\x4a\xb5\xbb\x97\x14\xe7\xcb\xe5\xf2\x10\x2a\xe0\x3a\xe7\x89\x5a\xed\x0e\xda\x09\xab\xdd\xf5\xcc\x2c\xa0\x50\x54\x49\x36\x32\x1f\x06\x84\x6d\x8c\x13\x90\x8d\x21\xb6\xa3\x72\xf8\x72\xe1\x22\x02\x84\xf9\x5f\xc2\x7e\x48\x4f\xfc\x0b\xa9\xd9\x95\x8c\x3e\x10\x06\xe3\x27\x69\x7a\x7e\xfd\xeb\xe9\x9e\xee\xe9\x5e\xe1\xab\x1f\xfe\xdc\xd3\xff\xd7\xde\x5b\x40\xa3\x49\x5d\xea\xec\x10\xd8\x2f\xd0\x65\x23\x21\x72\xd0\xe0\xa4\xce\x0e\x26\x83\xb2\x2a\x75\x76\x00\x00\x80\x90\x84\x54\x06\x8a\x26\x63\x02\xa9\xc8\xd9\x74\x30\xfa\x5b\xae\x61\x4f\xa3\xd4\x8a\xc2\xbb\x36\x1a\x16\xb9\x3b\xd1\xdb\xbf\x8f\xf6\x98\x49\x4b\xa6\x28\xae\x43\x0e\x28\xa6\x41\xa1\x41\x45\xee\x8f\xb7\x44\xa8\x26\x60\xa3\xaa\x21\x27\xa1\xc8\xfd\x24\x1b\xaa\x06\x75\xf5\x47\x8c\xa0\xa1\xea\xa9\x3a\xad\x7e\x6c\x9f\xa9\x50\x44\x75\x28\xfd\x88\x21\x04\xbd\xd8\x1c\x45\x90\x08\x7c\x28\xab\xe7\xb4\xb0\x69\x41\x4c\x53\x22\x67\x26\x62\x04\x51\x38\xc0\xac\xd4\x71\xd6\x13\x70\xed\x55\x55\x48\x14\x8c\x2c\x8a\x4c\xa3\x4e\xd9\xcd\xce\x95\xdf\xef\xfb\xcb\x13\x84\x9c\xa4\x33\x84\xe0\x93\x74\x66\x38\x09\x83\x15\xc5\xe6\xdf\x64\xa3\x3c\x73\xcf\xbf\xb7\x7f\x9e\x9f\x43\x30\x35\x62\x62\x95\x5c\x96\xce\xc4\x17\xd2\x0d\x23\x38\x62\x99\x98\xd6\xd1\x8d\x20\x95\x6a\xa2\x0a\x87\x91\x02\xa3\xc1\x22\x02\x90\x81\x28\x92\xf5\x28\x51\x64\x1d\x8a\xdd\x5d\xdf\x45\x40\x52\x1e\x45\x49\x3b\x59\x2f\xb2\x09\xc4\xc1\x5a\x8e\xeb\x50\xfc\x8e\x03\x7c\xcd\xe2\x57\xd1\x28\xe8\xd7\x10\x01\x3a\x32\x20\x40\x04\x0c\x9a\x18\xe8\xa6\x22\xeb\x80\x42\x42\xa3\xd1\x7a\xa0\xa0\x23\x63\x08\x60\xa8\x8b\x1c\xa1\x29\x1d\x12\x0d\x42\xca\x01\x9a\xb2\xa0\xc8\x51\x38\x4a\x79\x85\x10\x0e\x68\x18\x0e\x8a\x5c\x57\x17\x5b\xf1\xc8\x50\xe1\x68\x17\x93\x4b\xe0\x8c\xed\x2a\x44\xcd\x34\x9d\x1d\x02\x5f\x4d\xe1\xce\x0e\x21\x6e\xaa\xa9\x1a\xab\x8a\x86\x81\xa2\xcb\x84\x88\x1c\x35\xad\xb8\x8c\x6b\x81\x0d\x76\xb5\x6e\x49\x20\x14\x9b\x46\xa2\x29\xcb\xaa\x42\x81\xd7\xba\xeb\xf1\x56\x8d\x2b\xcc\x15\x4e\x2a\x4f\xbe\x75\x67\x0a\xde\xcc\x13\x37\xb7\x44\x13\x95\xf5\x47\x95\xcc\x93\x93\x74\xa6\xbc\xb5\x5e\xf9\x47\xd6\xcd\xef\xb8\xcf\xd3\x27\xe9\x8c\x9b\xdd\x70\x4b\x69\xe7\xe0\x71\x39\xb3\xe8\x1f\x3d\x72\x8a\x33\x9f\xce\x27\xe7\x78\xcd\xcb\x6c\x9f\x96\x66\xcb\x99\x65\x77\x61\xca\x9d\x3f\xac\x4c\xce\xb9\x0b\xf3\x5e\x6e\xc1\xf9\xb0\x12\x62\xdc\xa9\x67\xe5\xb5\x82\xc0\x5b\x35\x6f\x79\x15\x0d\xb7\x7a\xfe\x35\x81\x0a\xcb\xea\xaf\x1b\x5c\xbf\x21\xf9\x87\xab\xe5\xad\x35\x81\xd7\x6e\x34\xf8\x28\x79\xf9\x39\x77\x66\xcd\xff\xcf\xb6\x9b\x7d\xe7\xe5\xa7\xdd\x6c\xa1\x72\xbf\x10\x5a\x14\xe2\x12\x18\x1b\x03\x5d\xb2\xae\x0f\x58\x61\xb0\x06\x14\xd3\x36\x28\x18\x1f\x07\x02\x1f\x97\x9c\xe2\xdb\x93\xf4\x3d\x37\xbb\xe7\x14\x37\xdd\xdc\xb6\xbf\x58\x20\xa4\x51\x95\x90\xb6\x9a\xa7\xa5\x59\x42\x70\x33\x1c\x5f\x84\x0f\x42\xd7\xa8\x11\x88\x2e\xd2\xa9\x0f\x73\x4d\x29\x94\xb5\xd5\x3a\x8b\x71\x35\x46\xa1\x6f\x21\x87\xf7\x74\xa7\x32\x99\x3b\x2d\x2d\x0b\x71\x89\x71\xd9\x04\x0e\xda\xad\xf1\x61\x54\x2d\x3c\x5e\x3e\xcd\x2e\x75\xe5\xbd\xb7\xb4\xe3\x3d\xdb\xab\x3c\x7b\x7f\xc6\xa3\xcb\x84\x0e\x28\x58\x1e\xd1\x07\x28\x4a\xc2\x16\x8a\x36\xd7\xcd\x55\xaf\x9b\x6b\xba\x6e\x41\xae\x01\x12\x18\x42\xe3\xac\x96\x74\x99\x68\x9c\xd4\xc3\x7e\x04\x5e\x96\x9a\x13\xc2\xd6\xeb\x56\xd5\x52\x0d\xd1\x95\xec\x9c\x7f\xb4\xe5\x2d\x4d\x3a\x87\x7b\xb1\x20\x8c\x18\xde\xb5\x21\x61\xde\xc6\x78\x9e\x09\x54\x33\x29\x23\x83\xad\xd9\x8a\xbd\x5e\x60\x7c\x3c\x34\xc9\x2b\xa6\x31\x88\x12\xa0\xcd\xb9\x02\x4c\x8c\xe7\x91\x41\xa8\xac\xeb\xd1\x10\xfd\xbd\x8d\x75\xf1\x33\x2d\x71\x92\x53\x4c\x57\x16\xb7\xdc\xed\x92\x9b\x7d\x1d\xba\xaa\xa3\x76\xce\xb1\xe6\x30\x9a\x8a\x5a\xd8\x1c\x46\x2a\xc4\xa7\xa5\xe5\x2b\x9b\xb5\x6a\xcf\xc9\xb9\x56\xfc\xcd\x95\x4a\x7a\xda\x39\xfc\x97\xbf\xf0\xc0\x7f\x77\xe8\xbe\x78\x78\x0d\x1b\xdf\x07\x0f\x25\x21\x11\x42\x70\x24\xa8\x80\x0b\xad\xba\x2b\x47\xee\xd6\xde\x75\xec\x29\xe2\x4f\x7f\x8a\xf4\xff\x12\xb9\xdd\xf7\x2b\x43\x11\x7f\xee\x05\xdf\x28\x4e\xf1\xa0\x92\x4f\x97\xdf\x64\xfc\xe5\x89\x9a\x81\x59\x83\x89\x9d\xe2\x5c\xd3\xce\xaf\x2f\x0e\x4a\x71\xb3\x7c\xb4\x71\x9d\xe3\x0d\x22\x9d\x42\x2c\x62\xf0\x0d\x0e\xec\x87\x7c\xb3\x96\x53\x3c\xb0\x4c\x53\x3f\x2d\xcd\x62\xeb\xe3\xc6\x6f\xaa\x22\x83\x61\x2b\xcf\x5f\x7c\x84\x1b\x56\x28\xf8\xb8\xcf\xd6\xee\xfc\xaa\xbf\xb8\x8a\xac\x76\x2e\x54\x8b\x79\x69\xdf\xdb\x7d\x7a\x5a\x5a\x6e\x04\x54\x2b\xaa\x96\xf1\xac\x87\x19\x94\x93\x5a\x41\x8d\xb9\xc8\x5a\xf0\x2f\xc8\x50\xcd\x11\x12\x03\xa1\x81\xfa\xe2\x73\xe7\x76\xdd\xdc\xf6\x39\xe7\x69\x61\xba\x13\x03\x3f\xc8\x44\x8b\x9b\x32\x56\x9d\xe2\xe6\x69\x69\x96\xf5\x91\xc9\x43\x6f\x3b\xe7\x14\xdf\xfa\x9b\x4b\xfe\xd3\xd7\xfe\xe1\x84\x9b\xdb\x75\x8a\x33\xe5\x7f\x3f\x66\x17\x36\xf5\x5f\x6f\x69\xc7\x5d\xf9\xe0\xbd\x9c\xbc\x94\x89\x5e\x6c\xc6\x40\x4f\x58\xdc\xff\x7b\xf0\x18\xdc\xb6\x54\x99\x42\x70\x6b\x94\x42\x6c\xc8\x3a\xe8\x33\x6d\xac\x9c\x5b\x16\x01\x0f\xdf\xfa\xe0\x34\x22\xeb\x10\x57\x7c\x02\xfb\x34\x59\x35\x47\xfe\x62\x2a\x43\x90\x5e\xf8\xcc\x31\x67\xaa\x7d\x2f\x68\xe5\x5f\xae\xfa\x03\xe6\x62\xd1\x5f\x2c\x7c\xc9\x1a\x8c\xfc\xdc\x1b\xe9\xfb\xc3\x17\x8b\x53\xbb\x56\x41\x6c\xcc\x26\xfa\x3e\xf6\x73\xe9\x56\x11\xa0\xeb\xb3\xf5\x6a\x2e\x07\x36\x3f\xd1\x2b\x02\xcc\xcd\x18\x7f\xdd\x6e\x51\x6f\xeb\xd2\xdd\x22\xf0\x2f\xec\x16\x40\x47\x84\x7e\x8e\x7b\x6d\x72\xa5\xf5\x02\x2f\x75\x85\x63\x63\x51\xc0\x7f\x0b\xbc\xe9\xb4\x97\x9f\x76\x8e\x8e\xfd\xc5\x82\x97\xdf\x60\x9d\xe6\x65\x26\x9c\x1f\xab\x23\xde\xf2\x84\xff\x26\xe3\x6d\xae\xbb\x53\x2f\x2b\xff\x7c\x75\x92\xce\x38\xc7\x5b\xde\xe2\xbe\x3f\x3d\xe5\x3d\xbf\x1f\x4e\xa0\xdf\xf2\xe3\xe3\x8d\x13\xcb\xc6\x7a\xf9\x78\xde\xcd\xee\x7a\xbb\x05\x77\x7e\xd5\x39\xca\x97\xd3\xd9\xda\xec\xcb\x86\x17\xb9\x7a\x29\xec\x33\x91\xc4\x78\x9e\x76\x25\x21\x6f\x41\x38\x34\x68\x1b\x9c\xf4\xbb\xea\xbf\x30\xa0\xcd\x53\x55\x8d\xef\x3c\x9e\x04\xa2\x9a\x1d\xef\x52\xcc\x24\xff\x77\xbb\x7b\x28\x88\x59\x8a\xbd\xcc\x51\x9c\xe4\xa4\xcb\xa0\xce\xb5\xe9\x6d\xbe\xf2\x0b\x0f\xdd\x83\x1c\xf3\x3a\xbf\xf1\x09\xcb\x44\x36\x88\x8d\x6e\xdc\xbc\x79\x46\xac\x68\x50\x19\x3a\xf7\x00\xed\xc0\xec\x1c\xe1\xa8\x0a\x31\x41\xa6\x11\x4c\x76\xcd\x53\x9d\xc0\x57\xbf\x63\x82\x8f\x1b\xf6\xed\xfe\xff\x00\x00\x00\xff\xff\x1f\x9e\xb3\xb3\xcb\x0f\x00\x00") 136 | 137 | func assetsHtmlIndexHtmlBytes() ([]byte, error) { 138 | return bindataRead( 139 | _assetsHtmlIndexHtml, 140 | "assets/html/index.html", 141 | ) 142 | } 143 | 144 | func assetsHtmlIndexHtml() (*asset, error) { 145 | bytes, err := assetsHtmlIndexHtmlBytes() 146 | if err != nil { 147 | return nil, err 148 | } 149 | 150 | info := bindataFileInfo{name: "assets/html/index.html", size: 4043, mode: os.FileMode(420), modTime: time.Unix(1618997420, 0)} 151 | a := &asset{bytes: bytes, info: info} 152 | return a, nil 153 | } 154 | 155 | var _assetsHtmlSurgeConf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x94\x5d\x6f\x1b\x45\x17\xc7\xef\x57\xda\xef\x30\x52\x6f\x77\x3d\x7e\x1e\xa0\x17\x95\x7c\x61\x25\x5b\xd7\x28\x0d\x56\xd6\x15\xaa\x50\x84\xc6\xbb\x27\xf6\xe0\xd9\x17\x66\x66\x9d\x44\x55\xa5\x44\xb4\xc5\x71\x69\x71\x40\x54\x0a\x0d\x2a\xf4\x45\x2d\x94\x20\x21\xd1\x02\x4a\xad\x7c\x19\xcf\xda\xbe\xea\x57\x40\xbb\x6b\xa7\x4b\x82\xb8\x72\x90\x7a\xb1\xf6\xcc\xee\x99\xf3\xfb\x9f\xb7\xf9\xa8\xc6\x83\x8d\xcd\x55\x5d\x5b\xa4\x1c\x1c\x89\x4a\xc8\x4d\x17\xba\xa6\x6b\xd9\x37\x54\xe1\x41\x14\xae\xea\x5a\xb6\x2b\x21\x01\x0c\x1c\x69\x20\x75\xf8\x72\x7c\xf4\x20\xde\xdf\x1a\x0e\xee\x1a\x48\x3d\xfe\x75\xfc\xdb\x13\xd5\xfd\x3c\xbe\xf3\xd0\x40\xf1\xce\x6d\xd5\x7b\x36\xd9\xda\x89\x6f\xff\xa8\x6b\x79\x4b\x54\x42\x11\x67\xa6\x04\x21\x0d\x14\x06\x8c\x3a\x9b\x66\x48\x64\xab\xd4\x92\x32\x14\x17\x30\xbe\x76\x0d\x15\xdc\xc0\x23\xd4\x47\xd7\xaf\x63\x11\xf1\x26\xe0\x90\x07\x1b\x14\x84\x91\x1c\x4d\x0d\x2f\x60\xbc\xbe\xbe\x5e\xf8\x34\x22\xcc\x09\x3c\xaf\xe0\xf8\xb8\x09\x3e\x70\x22\xe1\xe3\xff\x17\xdf\x35\x50\x14\xba\x44\x82\x49\x7d\x09\xbc\x43\x58\xe9\x9d\xf3\xc5\xa2\x81\x66\x5b\x54\x42\xe7\x8b\x45\x61\x20\x19\x30\xe0\xc4\x77\x00\x95\xd0\xff\x8a\x45\x2f\x79\x45\x3d\x08\xa2\x24\x13\xef\x09\x03\x41\x87\xb0\x28\xf1\xd4\x80\xb5\x80\x83\x19\x89\xc4\x54\xf2\x08\x74\x2d\x1f\x32\x2a\xa1\x35\xc2\x58\x83\x38\xed\xb7\x3d\xac\x7c\xed\x72\xe5\x7e\xbb\x83\x2a\x87\x21\x83\x5c\x34\x59\xbb\x1b\x28\x6d\x6a\x5d\x2b\xbb\x0d\x16\x38\xed\x7f\x30\x58\xb1\xde\xb7\x16\xea\xb3\x7f\xb3\x5e\x5d\xbe\x5a\xa9\x5e\x4c\xc7\x63\x25\x62\xb0\xaa\x6b\xe7\xd0\xca\x95\x25\xcb\xb6\xea\xba\x96\x2c\x4c\xdb\xaa\x1b\xf6\x55\xbb\x6e\x5d\x36\x16\xa7\xb3\x74\x0e\x25\xcf\x15\xbf\xc1\x81\xb4\x91\xea\xdf\x1d\x1d\x1e\x8c\x9f\xde\x50\xdd\xbd\xe1\xd1\x2f\xf1\xc1\xa3\xdc\xc9\x59\x6a\x9b\x54\xb6\xa2\x46\xc1\x09\x3c\xbc\x48\x3b\xd4\x07\xcb\x6f\x52\x1f\x70\x8d\x07\x6b\x94\x81\xc0\x9c\xac\x63\x8f\x08\x09\x1c\xdb\x69\xe2\x13\x39\x02\x24\x9e\x62\x0a\x8c\x0a\x69\x4c\x03\x4b\xf0\x65\xb7\x03\x5c\x52\x41\xfd\x26\x52\x7f\x1e\xa9\xdd\xde\x5c\xb1\x95\x88\x70\x17\xe7\x20\xa7\x04\xd4\x38\xed\x10\x67\x13\x4d\xbe\xed\x8f\x9e\x6e\xcf\x12\x37\x57\xfc\x14\x71\x0a\x7d\x89\x7e\x42\x9c\x76\x12\xf9\xf8\xa8\x3f\xee\x3f\x51\xdf\xdc\x52\xbd\xe7\xf1\x17\xdb\x71\xf7\x5e\xbc\xfd\x32\xbe\xf1\xe5\x68\xb0\x3b\x7a\xbe\x77\x06\x19\x39\x46\x9f\x12\x95\x16\x25\xe9\xcb\xb9\x52\xad\x0d\xc9\x09\x4e\xfd\x66\xbf\x53\x6e\x06\xca\xa8\xc3\xc3\x47\xa3\xfe\xad\x64\x65\x4b\x0e\xc4\x4b\x5b\xe2\xfe\x60\xb2\x77\x33\x7e\xb1\xad\x7e\xfa\x6a\x38\xf8\x3a\xde\xbf\xa3\x7a\x3f\xcc\x55\xd9\x31\xeb\x32\xb8\x94\xbc\xd9\x66\x02\xa7\x93\x98\x93\x64\x5b\x68\xf8\xc7\x81\xba\x3f\x38\x21\xea\xf5\xab\xee\xe4\xbb\x87\xaa\xbf\x1b\xbf\xf8\x5d\x3d\xbe\x37\xda\xe9\xc6\xfb\x3f\xbf\x7e\xb5\xf3\x9f\x88\xb5\xad\x13\x72\x2b\x2c\x68\x10\x86\xd4\xcd\x67\xa3\xfe\x67\xaa\xf7\xfd\x64\xeb\xc1\x7c\xbb\x28\xf5\x7f\x02\xfa\xef\x84\x4b\xc4\x69\xb3\x62\x24\xb0\x6d\x9b\x89\x1b\xd3\xf6\x69\x18\x82\xcc\x43\xa6\xee\x45\xd2\x23\x58\x04\x0e\x25\x0c\xd7\x81\x41\x93\x13\xef\x6f\xb0\xb3\x00\x7d\xd8\x22\x52\x94\xc3\xf0\xcc\x41\x4b\xd5\xe5\x93\xf5\x4a\x9e\xd9\xbd\x3c\xf7\xb1\x5b\x68\x51\x9f\x54\x6b\x19\x32\x7f\xfb\x1f\x93\x96\xca\xcb\xb9\x0f\x15\xeb\x83\x6a\xcd\x58\x78\xf3\xea\x62\x75\xb9\xbc\x94\x89\x35\x5c\x5f\x98\x6b\x84\x32\x70\x75\xed\xaf\x00\x00\x00\xff\xff\xbf\xfd\x52\x3c\xa8\x09\x00\x00") 156 | 157 | func assetsHtmlSurgeConfBytes() ([]byte, error) { 158 | return bindataRead( 159 | _assetsHtmlSurgeConf, 160 | "assets/html/surge.conf", 161 | ) 162 | } 163 | 164 | func assetsHtmlSurgeConf() (*asset, error) { 165 | bytes, err := assetsHtmlSurgeConfBytes() 166 | if err != nil { 167 | return nil, err 168 | } 169 | 170 | info := bindataFileInfo{name: "assets/html/surge.conf", size: 2472, mode: os.FileMode(420), modTime: time.Unix(1598765832, 0)} 171 | a := &asset{bytes: bytes, info: info} 172 | return a, nil 173 | } 174 | 175 | var _assetsHtmlSurgeHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\x5d\x6f\x1b\x45\x14\x7d\x8f\x94\xff\x30\x9d\xc7\xaa\xeb\x69\x9a\x17\x54\xed\x2e\xa0\xd2\x0a\x9e\xa8\x44\x90\xe0\x71\xb2\x7b\xe3\x1d\x32\x3b\xbb\x9d\x99\x75\x63\x22\x4b\xde\x52\x2b\x1f\x90\x8f\xd2\xa8\x40\x70\x45\x13\x0a\x8a\x50\x9a\x22\x15\xa1\xa6\x49\xc8\x8f\xc9\x7e\xd8\x4f\xf9\x0b\x68\xbd\x76\xea\x80\x23\x5a\x9e\x92\x7b\xe7\xdc\x73\xe7\xdc\x7b\x66\x6d\x5e\xfa\xe0\xe3\x1b\x53\x9f\xdf\xbe\x89\x3c\xed\x73\x7b\x7c\xcc\x2c\xfe\x22\x4e\x45\xd5\xc2\x20\xb0\x3d\x3e\x56\xe4\x80\xba\xf6\xf8\x18\x42\x08\x99\x3e\x68\x8a\x1c\x8f\x4a\x05\xda\xc2\x91\x9e\x31\xde\xc1\xe7\xce\x3c\xad\x43\x03\xee\x44\xac\x66\xe1\xcf\x8c\x4f\xdf\x37\x6e\x04\x7e\x48\x35\x9b\xe6\x80\x91\x13\x08\x0d\x42\x5b\xf8\xa3\x9b\x16\xb8\x55\x38\x5f\x2a\xa8\x0f\x16\xfe\x90\x0a\xd7\x03\xee\xde\x92\x0c\x84\xcb\xeb\x43\x55\x53\x32\x1a\x59\x52\x63\x70\x37\x0c\xa4\x1e\x82\xde\x65\xae\xf6\x2c\x17\x6a\xcc\x01\xa3\x17\x5c\x41\x4c\x30\xcd\x28\x37\x94\x43\x39\x58\x13\x95\xab\x57\x90\x4f\xe7\x98\x1f\xf9\xc3\xa9\x48\x81\xec\xc5\x74\x9a\x83\x75\x15\x23\x32\xe8\x78\xc9\x30\xd0\x94\xc7\x14\xe2\x4c\x00\x62\x0a\xcd\x04\x12\xf1\xc0\xa1\x1c\x69\x50\xda\x30\x86\x81\x26\x67\x62\x16\x49\xe0\x16\x56\xba\xce\x41\x79\x00\x1a\x23\x5d\x0f\xc1\xc2\x1a\xe6\x34\x71\x94\xc2\xc8\x93\x30\x63\xe1\x4a\xa5\x88\x08\x13\x2e\xcc\x55\x8a\xbc\x8d\x5e\xb3\xbd\x0d\xd1\x3f\x69\xfa\x14\x9a\x69\x0e\x76\xda\x5a\xe9\xfc\xb1\xff\x49\x24\xab\xd0\x59\xbe\x97\xdf\xdb\x37\x49\x79\x30\x3e\x66\x92\xfe\x92\xc7\xc7\xcc\xe9\xc0\xad\x0f\x0a\x5d\x56\x43\x0e\xa7\x4a\x59\x58\x07\xe1\x34\x95\x03\xca\xde\xa9\x37\x61\x9b\x4a\xcb\x40\x54\xed\x5b\x12\x00\xdd\x96\xc1\x1c\x03\x65\x92\x7e\xd2\x24\xde\xc4\x30\x3e\x1c\x70\xb9\xa0\x1c\xc9\xb0\xdd\x59\xf8\x2d\x5d\xde\xc9\x96\x1f\xa6\x6b\x8f\x74\xb5\xbb\xfd\xa0\x1b\x3f\x3c\x69\xc6\x9d\xbd\xed\xee\xf7\xad\xb4\xfd\x7b\xfa\xb8\x79\xd2\x8c\xd3\xd6\x6e\x7a\xd8\x4c\x5e\x7d\xdb\x89\x37\xf2\xa3\x07\xc9\xcb\xe5\x7c\xf3\xbe\x52\x27\xcd\x58\x29\x79\xd2\x8c\x6b\x3e\xf4\x22\x2d\x83\x2f\xa8\x28\xa5\x25\xc7\x5b\x59\xfc\xfc\xf4\xf0\x9b\x4e\xbc\x99\xae\x2f\xa6\xab\x07\xdd\x85\x95\x74\x7d\x35\x5b\x5b\x4f\xfe\xfa\xb1\xc4\xa4\x8b\xdf\x75\xb6\x76\x4c\x12\x0e\xd4\x12\x97\xd5\x46\x28\x57\xe0\x68\x16\x88\xf3\xd2\xaf\xd9\x26\x1d\x00\xaa\x12\x40\x9c\xad\x40\x15\x03\xc6\x76\x6f\xce\x26\xa1\xc5\x14\xae\x0d\x97\x46\x7c\x28\xea\x6f\xb8\x44\x77\x5b\x2b\xf9\xd1\x5e\xf6\x68\x21\x39\xf8\xf3\xf4\x70\x73\x7e\x1e\x55\x24\xdc\x89\x40\x69\xd4\x68\x5c\x27\xa4\x48\xb8\x81\x4f\x99\x28\xe2\x22\x2a\x5c\x8f\x1a\x8d\xb2\x27\x71\x02\x31\xc3\xaa\xe8\x82\x8b\xf5\x30\x93\xd7\x09\x21\x4c\x28\x4d\x39\x37\x4a\xfc\xbb\x91\xe4\x56\xf1\x6c\xd5\x1b\xb7\xc0\x76\xf2\xb2\xd9\xdd\xd8\x4b\x9f\x1f\xa6\xad\x5f\x4a\x91\x9c\x5d\x24\x0b\x85\x32\x98\xab\x23\xce\x94\xfe\x3f\xaa\xc2\x81\xab\xce\x75\x30\xc9\xd9\x1c\xdf\x62\x6f\xf3\xf3\x06\x22\x97\x51\xb6\xd4\xcc\xda\x4b\xc9\xd1\x71\xbe\xb1\x93\xb5\x77\x93\x83\x9f\xf3\x27\x71\x69\x8d\xac\xbd\x92\x2e\x6f\xe5\x9b\xf7\xf3\x5f\xe3\xec\xd9\x76\xba\xf8\xa4\xfb\xc3\xd3\x93\x66\x9c\x1c\xef\x65\x1b\xfb\xf9\xd2\x62\xf6\xf8\xab\xd2\x5c\x97\x49\xa3\x31\x6c\x6e\x3b\xdb\xdd\xee\x1c\xaf\xa6\xad\x17\xd9\x8b\x9d\x74\xf5\xa7\xe4\xa8\xdd\x69\xb6\x06\xb6\x3e\x3d\xdc\x34\x69\x7f\x13\x83\x61\xeb\x8a\x0f\x24\x04\x98\x9d\x89\x04\xb6\xdf\xeb\xff\x57\x8e\x33\x3c\xf7\x70\xec\x33\xbe\x51\x3c\x55\xa6\xbd\x68\xba\xe2\x04\x3e\xf9\x32\x9a\x98\xed\x4d\xac\x1e\x06\x01\x37\xa4\x8f\xed\x37\x41\x8d\xec\x99\x3d\x7b\x9a\xef\x7c\x9d\xbe\x5a\x2b\x54\xb7\x77\xff\xa3\xb3\xa2\x42\x45\xec\xda\xe4\xe4\x6b\x62\xc7\x03\x67\x76\xe4\x05\x2e\x02\x17\xf7\x40\x85\x05\x6a\x20\x15\x0b\x0a\x47\xfc\xfb\x7d\x9a\xa4\xff\x89\xea\x7d\xb7\x8a\x1f\xae\xbf\x03\x00\x00\xff\xff\x63\x2c\x09\xde\xc8\x06\x00\x00") 176 | 177 | func assetsHtmlSurgeHtmlBytes() ([]byte, error) { 178 | return bindataRead( 179 | _assetsHtmlSurgeHtml, 180 | "assets/html/surge.html", 181 | ) 182 | } 183 | 184 | func assetsHtmlSurgeHtml() (*asset, error) { 185 | bytes, err := assetsHtmlSurgeHtmlBytes() 186 | if err != nil { 187 | return nil, err 188 | } 189 | 190 | info := bindataFileInfo{name: "assets/html/surge.html", size: 1736, mode: os.FileMode(420), modTime: time.Unix(1618997387, 0)} 191 | a := &asset{bytes: bytes, info: info} 192 | return a, nil 193 | } 194 | 195 | var _assetsCssIndexCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x94\xdb\x8a\xdb\x30\x10\x86\xef\xfd\x14\x03\xa1\x64\x17\x6c\x63\xe7\xb8\x28\x37\x65\x0b\xa1\x8f\xd0\x5b\xd9\x1a\xc5\xa2\xb2\x64\x24\x65\xe3\x34\xe4\xdd\x8b\x2c\x65\xd7\x4e\xda\xdd\x04\x42\x98\xc3\xef\x7f\x3e\x8d\x5c\x69\x76\x4e\xbb\xb4\x29\xd3\xa6\x84\x4b\x02\xf1\xd3\x52\x73\x10\x8a\x40\xd1\xf5\xbb\xe4\x9a\x1c\x65\x0a\x52\xc0\x25\x84\x33\x89\xdc\x85\x1c\x74\x94\x31\xa1\x0e\xb7\xd0\xee\x9a\x24\x5e\x32\x4a\x71\xad\x5c\xc6\x69\x2b\xe4\x99\xc0\x4f\x94\x6f\xe8\x44\x4d\x53\x4b\x95\xcd\x2c\x1a\xc1\x77\x43\xd9\x49\x30\xd7\x10\x28\x8b\xe2\x5b\x08\x54\xb4\xfe\x7d\x30\xfa\xa8\x58\x56\x6b\xa9\x0d\x81\x59\xf9\xea\xbf\xbb\x0f\x59\x2b\xfe\x20\x81\x72\xe5\x1d\xfa\x60\x2c\x3c\x35\xc2\xa1\xf7\x9c\x34\x65\x0a\xcd\x22\x18\xb9\xcd\xb3\xee\x7a\x28\x62\x76\xec\x31\x88\x2d\x37\x77\x62\x33\xce\x57\xeb\xe5\x22\x34\x2c\x08\xa9\x90\x6b\x83\xe3\xc6\x13\x8a\x43\xe3\x08\x28\x6d\x5a\x2a\x6f\xcd\xca\xa1\x72\x04\xe6\xb3\x79\x88\x74\xda\x0a\x27\xb4\x22\x40\x2b\xab\xe5\xd1\x3b\xfc\xd7\x63\x86\xda\x48\xd4\xe9\x8e\x40\x91\x97\xd8\x86\xb8\x33\x54\x59\xae\x4d\x4b\xc2\x5f\x49\x1d\xfe\x7a\xca\x4a\x6c\x9f\x07\x7f\xf4\x32\x91\x64\xf5\x96\x6f\xb9\xcf\x50\xd2\xe8\x37\x34\x30\xcd\xef\xf7\xfb\x1f\x2f\xaf\x43\x67\x7e\x30\x88\x6a\x9a\x5e\x2d\x39\xc7\xf5\x28\x3d\x11\x99\x8c\x5e\x69\xc9\x86\xc2\xea\xee\x11\x23\x78\x47\x19\x73\x52\x58\x97\x59\x77\x96\xe8\x99\xa9\xc8\x41\x0a\x85\x59\x13\xf5\xca\x7c\xed\x67\xf6\x5b\x07\x52\xdc\x41\xff\x60\x9b\xcd\x3f\x61\xf8\x1f\xde\x5f\x30\x3c\x4a\xc8\x85\x62\xa8\x1c\x8c\xd7\x26\x2e\xf7\x22\xb8\x4a\x92\xdc\xe9\xae\xa2\x37\x16\xf1\xbc\x08\x2c\x8a\xae\x87\x4d\x71\x5b\xa1\x2f\x76\xb8\xd2\x86\xa1\xc9\x2a\xed\x9c\x6e\x09\x94\x5d\x0f\x56\x4b\x11\x48\xe6\x0c\x6d\x6d\x04\x4c\x97\xb7\x98\x0e\x8c\x88\x0f\xd7\xa1\xc8\x5f\xa2\xcb\xdc\x62\xed\x11\xdc\xbb\x2c\x37\xef\x2e\xaf\x49\xf2\xbd\x45\x26\x28\xd8\xda\x1f\x31\x50\xc5\xe0\xa9\xa5\x7d\x16\x2f\xe4\xb6\x28\xba\xfe\x39\x2a\x4c\xde\x0f\xe3\x4b\xf3\x3e\xf1\x75\xf8\x9d\xd2\x79\x24\xb4\xba\xaf\x9f\x1a\x7d\x34\x3b\x6e\xb8\xfe\x0d\x00\x00\xff\xff\xea\x70\x8a\x8c\xb0\x04\x00\x00") 196 | 197 | func assetsCssIndexCssBytes() ([]byte, error) { 198 | return bindataRead( 199 | _assetsCssIndexCss, 200 | "assets/css/index.css", 201 | ) 202 | } 203 | 204 | func assetsCssIndexCss() (*asset, error) { 205 | bytes, err := assetsCssIndexCssBytes() 206 | if err != nil { 207 | return nil, err 208 | } 209 | 210 | info := bindataFileInfo{name: "assets/css/index.css", size: 1200, mode: os.FileMode(420), modTime: time.Unix(1602612417, 0)} 211 | a := &asset{bytes: bytes, info: info} 212 | return a, nil 213 | } 214 | 215 | // Asset loads and returns the asset for the given name. 216 | // It returns an error if the asset could not be found or 217 | // could not be loaded. 218 | func Asset(name string) ([]byte, error) { 219 | cannonicalName := strings.Replace(name, "\\", "/", -1) 220 | if f, ok := _bindata[cannonicalName]; ok { 221 | a, err := f() 222 | if err != nil { 223 | return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) 224 | } 225 | return a.bytes, nil 226 | } 227 | return nil, fmt.Errorf("Asset %s not found", name) 228 | } 229 | 230 | // MustAsset is like Asset but panics when Asset would return an error. 231 | // It simplifies safe initialization of global variables. 232 | func MustAsset(name string) []byte { 233 | a, err := Asset(name) 234 | if err != nil { 235 | panic("asset: Asset(" + name + "): " + err.Error()) 236 | } 237 | 238 | return a 239 | } 240 | 241 | // AssetInfo loads and returns the asset info for the given name. 242 | // It returns an error if the asset could not be found or 243 | // could not be loaded. 244 | func AssetInfo(name string) (os.FileInfo, error) { 245 | cannonicalName := strings.Replace(name, "\\", "/", -1) 246 | if f, ok := _bindata[cannonicalName]; ok { 247 | a, err := f() 248 | if err != nil { 249 | return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) 250 | } 251 | return a.info, nil 252 | } 253 | return nil, fmt.Errorf("AssetInfo %s not found", name) 254 | } 255 | 256 | // AssetNames returns the names of the assets. 257 | func AssetNames() []string { 258 | names := make([]string, 0, len(_bindata)) 259 | for name := range _bindata { 260 | names = append(names, name) 261 | } 262 | return names 263 | } 264 | 265 | // _bindata is a table, holding each asset generator, mapped to its name. 266 | var _bindata = map[string]func() (*asset, error){ 267 | "assets/html/clash-config-local.yaml": assetsHtmlClashConfigLocalYaml, 268 | "assets/html/clash-config.yaml": assetsHtmlClashConfigYaml, 269 | "assets/html/clash.html": assetsHtmlClashHtml, 270 | "assets/html/index.html": assetsHtmlIndexHtml, 271 | "assets/html/surge.conf": assetsHtmlSurgeConf, 272 | "assets/html/surge.html": assetsHtmlSurgeHtml, 273 | "assets/css/index.css": assetsCssIndexCss, 274 | } 275 | 276 | // AssetDir returns the file names below a certain 277 | // directory embedded in the file by go-bindata. 278 | // For example if you run go-bindata on data/... and data contains the 279 | // following hierarchy: 280 | // data/ 281 | // foo.txt 282 | // img/ 283 | // a.png 284 | // b.png 285 | // then AssetDir("data") would return []string{"foo.txt", "img"} 286 | // AssetDir("data/img") would return []string{"a.png", "b.png"} 287 | // AssetDir("foo.txt") and AssetDir("notexist") would return an error 288 | // AssetDir("") will return []string{"data"}. 289 | func AssetDir(name string) ([]string, error) { 290 | node := _bintree 291 | if len(name) != 0 { 292 | cannonicalName := strings.Replace(name, "\\", "/", -1) 293 | pathList := strings.Split(cannonicalName, "/") 294 | for _, p := range pathList { 295 | node = node.Children[p] 296 | if node == nil { 297 | return nil, fmt.Errorf("Asset %s not found", name) 298 | } 299 | } 300 | } 301 | if node.Func != nil { 302 | return nil, fmt.Errorf("Asset %s not found", name) 303 | } 304 | rv := make([]string, 0, len(node.Children)) 305 | for childName := range node.Children { 306 | rv = append(rv, childName) 307 | } 308 | return rv, nil 309 | } 310 | 311 | type bintree struct { 312 | Func func() (*asset, error) 313 | Children map[string]*bintree 314 | } 315 | var _bintree = &bintree{nil, map[string]*bintree{ 316 | "assets": &bintree{nil, map[string]*bintree{ 317 | "css": &bintree{nil, map[string]*bintree{ 318 | "index.css": &bintree{assetsCssIndexCss, map[string]*bintree{}}, 319 | }}, 320 | "html": &bintree{nil, map[string]*bintree{ 321 | "clash-config-local.yaml": &bintree{assetsHtmlClashConfigLocalYaml, map[string]*bintree{}}, 322 | "clash-config.yaml": &bintree{assetsHtmlClashConfigYaml, map[string]*bintree{}}, 323 | "clash.html": &bintree{assetsHtmlClashHtml, map[string]*bintree{}}, 324 | "index.html": &bintree{assetsHtmlIndexHtml, map[string]*bintree{}}, 325 | "surge.conf": &bintree{assetsHtmlSurgeConf, map[string]*bintree{}}, 326 | "surge.html": &bintree{assetsHtmlSurgeHtml, map[string]*bintree{}}, 327 | }}, 328 | }}, 329 | }} 330 | 331 | // RestoreAsset restores an asset under the given directory 332 | func RestoreAsset(dir, name string) error { 333 | data, err := Asset(name) 334 | if err != nil { 335 | return err 336 | } 337 | info, err := AssetInfo(name) 338 | if err != nil { 339 | return err 340 | } 341 | err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) 342 | if err != nil { 343 | return err 344 | } 345 | err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) 346 | if err != nil { 347 | return err 348 | } 349 | err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) 350 | if err != nil { 351 | return err 352 | } 353 | return nil 354 | } 355 | 356 | // RestoreAssets restores an asset under the given directory recursively 357 | func RestoreAssets(dir, name string) error { 358 | children, err := AssetDir(name) 359 | // File 360 | if err != nil { 361 | return RestoreAsset(dir, name) 362 | } 363 | // Dir 364 | for _, child := range children { 365 | err = RestoreAssets(dir, filepath.Join(name, child)) 366 | if err != nil { 367 | return err 368 | } 369 | } 370 | return nil 371 | } 372 | 373 | func _filePath(dir, name string) string { 374 | cannonicalName := strings.Replace(name, "\\", "/", -1) 375 | return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) 376 | } 377 | 378 | -------------------------------------------------------------------------------- /api/router.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "html/template" 5 | "log" 6 | "net/http" 7 | "os" 8 | "strings" 9 | "time" 10 | 11 | "github.com/ssrlive/proxypool/pkg/provider" 12 | "github.com/ssrlive/proxypoolCheck/config" 13 | "github.com/ssrlive/proxypoolCheck/internal/app" 14 | appcache "github.com/ssrlive/proxypoolCheck/internal/cache" 15 | "github.com/gin-contrib/cache" 16 | "github.com/gin-contrib/cache/persistence" 17 | "github.com/gin-gonic/gin" 18 | ) 19 | 20 | const version = "v0.7.3" 21 | 22 | var router *gin.Engine 23 | 24 | func setupRouter() { 25 | gin.SetMode(gin.ReleaseMode) 26 | router = gin.New() // 没有任何中间件的路由 27 | store := persistence.NewInMemoryStore(time.Minute) 28 | router.Use(gin.Recovery(), cache.SiteCache(store, time.Minute)) 29 | 30 | _ = RestoreAssets("", "assets/html") 31 | _ = RestoreAssets("", "assets/css") 32 | 33 | temp, err := loadHTMLTemplate() 34 | if err != nil { 35 | panic(err) 36 | } 37 | router.SetHTMLTemplate(temp) 38 | router.StaticFile("/css/index.css", "assets/css/index.css") 39 | router.GET("/", func(c *gin.Context) { 40 | c.HTML(http.StatusOK, "assets/html/index.html", gin.H{ 41 | "domain": config.Config.Domain, 42 | "request": config.Config.Request, 43 | "port": config.Config.Port, 44 | "all_proxies_count": appcache.AllProxiesCount, 45 | "ss_proxies_count": appcache.SSProxiesCount, 46 | "ssr_proxies_count": appcache.SSRProxiesCount, 47 | "vmess_proxies_count": appcache.VmessProxiesCount, 48 | "trojan_proxies_count": appcache.TrojanProxiesCount, 49 | "useful_proxies_count": appcache.UsableProxiesCount, 50 | "last_crawl_time": appcache.LastCrawlTime, 51 | "version": version, 52 | }) 53 | }) 54 | router.GET("/clash", func(c *gin.Context) { 55 | c.HTML(http.StatusOK, "assets/html/clash.html", gin.H{ 56 | "domain": config.Config.Domain, 57 | "port": config.Config.Port, 58 | "request": config.Config.Request, 59 | }) 60 | }) 61 | 62 | router.GET("/surge", func(c *gin.Context) { 63 | c.HTML(http.StatusOK, "assets/html/surge.html", gin.H{ 64 | "domain": config.Config.Domain, 65 | "request": config.Config.Request, 66 | "port": config.Config.Port, 67 | }) 68 | }) 69 | 70 | router.GET("/clash/config", func(c *gin.Context) { 71 | c.HTML(http.StatusOK, "assets/html/clash-config.yaml", gin.H{ 72 | "domain": config.Config.Domain, 73 | "request": config.Config.Request, 74 | "port": config.Config.Port, 75 | }) 76 | }) 77 | router.GET("/clash/localconfig", func(c *gin.Context) { 78 | c.HTML(http.StatusOK, "assets/html/clash-config-local.yaml", gin.H{ 79 | "port": config.Config.Port, 80 | }) 81 | }) 82 | router.GET("/clash/proxies", func(c *gin.Context) { 83 | proxyTypes := c.DefaultQuery("type", "") 84 | proxyCountry := c.DefaultQuery("c", "") 85 | proxyNotCountry := c.DefaultQuery("nc", "") 86 | proxySpeed := c.DefaultQuery("speed", "") 87 | proxyFilter := c.DefaultQuery("filter", "") 88 | text := "" 89 | if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" && proxySpeed == "" && proxyFilter == "" { 90 | text = appcache.GetString("clashproxies") // A string. To show speed in this if condition, this must be updated after speedtest 91 | if text == "" { 92 | proxies := appcache.GetProxies("proxies") 93 | clash := provider.Clash{ 94 | Base: provider.Base{ 95 | Proxies: &proxies, 96 | }, 97 | } 98 | text = clash.Provide() // 根据Query筛选节点 99 | appcache.SetString("clashproxies", text) 100 | } 101 | } else if proxyTypes == "all" { 102 | proxies := appcache.GetProxies("allproxies") 103 | clash := provider.Clash{ 104 | provider.Base{ 105 | Proxies: &proxies, 106 | Types: proxyTypes, 107 | Country: proxyCountry, 108 | NotCountry: proxyNotCountry, 109 | Speed: proxySpeed, 110 | Filter: proxyFilter, 111 | }, 112 | } 113 | text = clash.Provide() // 根据Query筛选节点 114 | } else { 115 | proxies := appcache.GetProxies("proxies") 116 | clash := provider.Clash{ 117 | provider.Base{ 118 | Proxies: &proxies, 119 | Types: proxyTypes, 120 | Country: proxyCountry, 121 | NotCountry: proxyNotCountry, 122 | Speed: proxySpeed, 123 | Filter: proxyFilter, 124 | }, 125 | } 126 | text = clash.Provide() // 根据Query筛选节点 127 | } 128 | c.String(200, text) 129 | }) 130 | router.GET("/surge/proxies", func(c *gin.Context) { 131 | proxyTypes := c.DefaultQuery("type", "") 132 | proxyCountry := c.DefaultQuery("c", "") 133 | proxyNotCountry := c.DefaultQuery("nc", "") 134 | proxySpeed := c.DefaultQuery("speed", "") 135 | proxyFilter := c.DefaultQuery("filter", "") 136 | text := "" 137 | if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" && proxySpeed == "" { 138 | text = appcache.GetString("surgeproxies") // A string. To show speed in this if condition, this must be updated after speedtest 139 | if text == "" { 140 | proxies := appcache.GetProxies("proxies") 141 | surge := provider.Surge{ 142 | Base: provider.Base{ 143 | Proxies: &proxies, 144 | }, 145 | } 146 | text = surge.Provide() 147 | appcache.SetString("surgeproxies", text) 148 | } 149 | } else if proxyTypes == "all" { 150 | proxies := appcache.GetProxies("allproxies") 151 | surge := provider.Surge{ 152 | Base: provider.Base{ 153 | Proxies: &proxies, 154 | Types: proxyTypes, 155 | Country: proxyCountry, 156 | NotCountry: proxyNotCountry, 157 | Speed: proxySpeed, 158 | Filter: proxyFilter, 159 | }, 160 | } 161 | text = surge.Provide() 162 | } else { 163 | proxies := appcache.GetProxies("proxies") 164 | surge := provider.Surge{ 165 | Base: provider.Base{ 166 | Proxies: &proxies, 167 | Types: proxyTypes, 168 | Country: proxyCountry, 169 | NotCountry: proxyNotCountry, 170 | Filter: proxyFilter, 171 | }, 172 | } 173 | text = surge.Provide() 174 | } 175 | c.String(200, text) 176 | }) 177 | router.GET("/forceupdate", func(c *gin.Context) { 178 | err := app.InitApp() 179 | if err != nil { 180 | c.String(http.StatusOK, err.Error()) 181 | } 182 | c.String(http.StatusOK, "Updated") 183 | }) 184 | } 185 | 186 | func Run() { 187 | setupRouter() 188 | servePort := config.Config.Port 189 | envp := os.Getenv("PORT") // envp for heroku. DO NOT SET ENV PORT IN PERSONAL SERVER UNLESS YOU KNOW WHAT YOU ARE DOING 190 | if envp != "" { 191 | servePort = envp 192 | } 193 | // Run on this server 194 | err := router.Run(":" + servePort) 195 | if err != nil { 196 | log.Fatalf("[router.go] Web server starting failed. Make sure your port %s has not been used. \n%s", servePort, err.Error()) 197 | } 198 | } 199 | 200 | // 返回页面templates 201 | func loadHTMLTemplate() (t *template.Template, err error) { 202 | t = template.New("") 203 | for _, fileName := range AssetNames() { //fileName带有路径前缀 204 | if strings.Contains(fileName, "css") { 205 | continue 206 | } 207 | data := MustAsset(fileName) //读取页面数据 208 | t, err = t.New(fileName).Parse(string(data)) //生成带路径名称的模板 209 | if err != nil { 210 | return nil, err 211 | } 212 | } 213 | return t, nil 214 | } 215 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "errors" 5 | "github.com/ssrlive/proxypool/pkg/tool" 6 | "github.com/ghodss/yaml" 7 | "io/ioutil" 8 | "os" 9 | "strings" 10 | ) 11 | 12 | var configFilePath = "config.yaml" 13 | 14 | // ConfigOptions is a struct that represents config files 15 | type ConfigOptions struct { 16 | ServerUrl []string `json:"server_url" yaml:"server_url"` 17 | Domain string `json:"domain" yaml:"domain"` 18 | Port string `json:"port" yaml:"port"` 19 | Request string `json:"request" yaml:"request"` 20 | CronInterval uint64 `json:"cron_interval" yaml:"cron_interval"` 21 | ShowRemoteSpeed bool `json:"show_remote_speed" yaml:"show_remote_speed"` 22 | HealthCheckTimeout int `json:"healthcheck_timeout" yaml:"healthcheck_timeout"` 23 | HealthCheckConnection int `json:"healthcheck_connection" yaml:"healthcheck_connection"` 24 | SpeedTest bool `json:"speedtest" yaml:"speedtest"` 25 | SpeedConnection int `json:"speed_connection" yaml:"speed_connection"` 26 | SpeedTimeout int `json:"speed_timeout" yaml:"speed_timeout"` 27 | } 28 | 29 | var Config ConfigOptions 30 | 31 | // Parse Config file 32 | func Parse(path string) error { 33 | if path == "" { 34 | path = configFilePath 35 | } else { 36 | configFilePath = path 37 | } 38 | fileData, err := ReadFile(path) 39 | if err != nil { 40 | return err 41 | } 42 | Config = ConfigOptions{} 43 | err = yaml.Unmarshal(fileData, &Config) 44 | if err != nil { 45 | return err 46 | } 47 | // set default 48 | if Config.ServerUrl == nil{ 49 | return errors.New("config error: no server url") 50 | } 51 | if Config.Domain == ""{ 52 | Config.Domain = "127.0.0.1" 53 | } 54 | if Config.Port == ""{ 55 | Config.Port = "80" 56 | } 57 | if Config.CronInterval == 0{ 58 | Config.CronInterval = 15 59 | } 60 | if Config.Request == ""{ 61 | Config.Request = "http" 62 | } 63 | if Config.HealthCheckTimeout == 0{ 64 | Config.HealthCheckTimeout = 5 65 | } 66 | if Config.HealthCheckConnection == 0{ 67 | Config.HealthCheckConnection = 100 68 | } 69 | if Config.SpeedConnection == 0{ 70 | Config.SpeedConnection = 15 71 | } 72 | if Config.SpeedTimeout == 0 { 73 | Config.SpeedTimeout = 10 74 | } 75 | return nil 76 | } 77 | 78 | 79 | // 从本地文件或者http链接读取配置文件内容 80 | func ReadFile(path string) ([]byte, error) { 81 | if strings.HasPrefix(path, "http://") || strings.HasPrefix(path, "https://") { 82 | resp, err := tool.GetHttpClient().Get(path) 83 | if err != nil { 84 | return nil, errors.New("config file http get fail") 85 | } 86 | defer resp.Body.Close() 87 | return ioutil.ReadAll(resp.Body) 88 | } else { 89 | if _, err := os.Stat(path); os.IsNotExist(err) { 90 | return nil, err 91 | } 92 | return ioutil.ReadFile(path) 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /config/config.yaml: -------------------------------------------------------------------------------- 1 | # proxypool remote server url. Blank for http://127.0.0.1:8080 2 | server_url: 3 | - https://example.proxypoolserver.com 4 | # - https://example.proxypoolserver.com/clash/proxies?type=vmess 5 | 6 | # For your local server 7 | request: http # http / https 8 | domain: # default: 127.0.0.1 9 | port: # default: 80 10 | 11 | cron_interval: 15 # default: 15 minutes 12 | show_remote_speed: true # default false 13 | 14 | healthcheck_timeout: # default 5 15 | healthcheck_connection: # default 100 16 | 17 | speedtest: # default false 18 | speed_connection: # default 5 19 | speed_timeout: # default 10 20 | -------------------------------------------------------------------------------- /doc/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ssrlive/proxypoolCheck/cccb1ddc676c00753f893c016c342672f91eac2e/doc/1.png -------------------------------------------------------------------------------- /doc/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ssrlive/proxypoolCheck/cccb1ddc676c00753f893c016c342672f91eac2e/doc/2.png -------------------------------------------------------------------------------- /doc/WhatsNew.md: -------------------------------------------------------------------------------- 1 | 2021-06-19(v0.3.1) 2 | - 忽略source的TLS证书校验 #24 3 | - http请求添加timeout #24 4 | - fix: 一个url请求失败后后续全都失败 #24 5 | 6 | 2021-06-03 7 | - 添加健康检测并发数设置(v0.3.0) 8 | - 更新依赖,修复 send on closed channel 9 | 10 | 2021-04-20 11 | - 添加自定义timeout 12 | - 更严格的有效性检查标准 13 | 14 | 15 | 2020-11-14 16 | - 可以分离web界面显示的端口与实际serve端口 17 | - 增加测速和筛选 18 | - 改变代码结构 19 | - 重写测速,增加自定义timeout -------------------------------------------------------------------------------- /doc/gobindata.sh: -------------------------------------------------------------------------------- 1 | go-bindata -o api/html.go -pkg api assets/html/ assets/css 2 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/ssrlive/proxypoolCheck 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/PuerkitoBio/goquery v1.6.0 // indirect 7 | github.com/antchfx/xmlquery v1.3.3 // indirect 8 | github.com/antchfx/xpath v1.1.11 // indirect 9 | github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b // indirect 10 | github.com/ghodss/yaml v1.0.0 11 | github.com/gin-contrib/cache v1.1.0 12 | github.com/gin-gonic/gin v1.7.7 13 | github.com/go-playground/validator/v10 v10.4.1 // indirect 14 | github.com/jasonlvhit/gocron v0.0.1 15 | github.com/mattn/go-colorable v0.1.8 // indirect 16 | github.com/patrickmn/go-cache v2.1.0+incompatible 17 | github.com/ssrlive/proxypool v0.7.4 18 | github.com/ugorji/go v1.2.1 // indirect 19 | google.golang.org/appengine v1.6.7 // indirect 20 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect 21 | ) 22 | -------------------------------------------------------------------------------- /internal/app/get.go: -------------------------------------------------------------------------------- 1 | package app 2 | 3 | import ( 4 | "crypto/tls" 5 | "encoding/json" 6 | "errors" 7 | "github.com/ssrlive/proxypool/pkg/proxy" 8 | "github.com/ssrlive/proxypoolCheck/config" 9 | "io/ioutil" 10 | "log" 11 | "net/http" 12 | "strings" 13 | "time" 14 | ) 15 | 16 | func getAllProxies() (proxy.ProxyList, error) { 17 | var proxylist proxy.ProxyList 18 | var errs []error // collect errors 19 | 20 | for _, value := range config.Config.ServerUrl { 21 | url := formatURL(value) 22 | pjson, err := getProxies(url) 23 | if err != nil { 24 | log.Printf("Error when fetch %s: %s\n", url, err.Error()) 25 | errs = append(errs, err) 26 | continue 27 | } 28 | log.Printf("Get %s line count: %d\n", url, len(pjson)) 29 | 30 | for i, p := range pjson { 31 | if i == 0 || len(p) < 2 { 32 | continue 33 | } 34 | p = p[2:] // remove "- " 35 | 36 | if pp, ok := convert2Proxy(p); ok { 37 | if i == 1 && pp.BaseInfo().Name == "NULL" { 38 | log.Println("no proxy on " + url) 39 | errs = append(errs, errors.New("no proxy on "+url)) 40 | continue 41 | } 42 | if config.Config.ShowRemoteSpeed == true { 43 | name := strings.Replace(pp.BaseInfo().Name, " |", "_", 1) 44 | pp.SetName(name) 45 | } 46 | proxylist = append(proxylist, pp) 47 | } 48 | } 49 | } 50 | 51 | if proxylist == nil { 52 | if errs != nil { 53 | errInfo := "\n" 54 | for _, e := range errs { 55 | errInfo = errInfo + e.Error() + ";\n" 56 | } 57 | return nil, errors.New(errInfo) 58 | } 59 | return nil, errors.New("no proxy") 60 | } 61 | return proxylist, nil 62 | } 63 | 64 | func formatURL(value string) string { 65 | url := "http://127.0.0.1:8080" 66 | if value != "http://127.0.0.1:8080" { 67 | url = value 68 | if url[len(url)-1] == '/' { 69 | url = url[:len(url)-1] 70 | } 71 | } 72 | urls := strings.Split(url, "/") 73 | if urls[len(urls)-2] != "clash" { 74 | url = url + "/clash/proxies" 75 | } 76 | return url 77 | } 78 | 79 | // get proxy strings from url 80 | func getProxies(url string) ([]string, error) { 81 | //resp, err := http.Get(url) 82 | tr := &http.Transport{ 83 | TLSClientConfig: &tls.Config{ 84 | InsecureSkipVerify: true, 85 | }, 86 | } 87 | 88 | client := &http.Client{ 89 | Timeout: 5 * time.Second, 90 | Transport: tr, 91 | } 92 | resp, err := client.Get(url) 93 | if err != nil { 94 | return nil, err 95 | } 96 | defer resp.Body.Close() 97 | body, err := ioutil.ReadAll(resp.Body) 98 | proxyJson := strings.Split(string(body), "\n") 99 | if len(proxyJson) < 2 { 100 | return nil, errors.New("no proxy on " + url) 101 | } 102 | return proxyJson, nil 103 | } 104 | 105 | // Convert json string(clash format) to proxy 106 | func convert2Proxy(pjson string) (proxy.Proxy, bool) { 107 | var f interface{} 108 | err := json.Unmarshal([]byte(pjson), &f) 109 | if err != nil { 110 | return nil, false 111 | } 112 | jsnMap := f.(interface{}).(map[string]interface{}) 113 | 114 | switch jsnMap["type"].(string) { 115 | case "ss": 116 | var p proxy.Shadowsocks 117 | err := json.Unmarshal([]byte(pjson), &p) 118 | if err != nil { 119 | return nil, false 120 | } 121 | return &p, true 122 | case "ssr": 123 | var p proxy.ShadowsocksR 124 | err := json.Unmarshal([]byte(pjson), &p) 125 | if err != nil { 126 | return nil, false 127 | } 128 | return &p, true 129 | case "vmess": 130 | var p proxy.Vmess 131 | err := json.Unmarshal([]byte(pjson), &p) 132 | if err != nil { 133 | return nil, false 134 | } 135 | return &p, true 136 | case "trojan": 137 | var p proxy.Trojan 138 | err := json.Unmarshal([]byte(pjson), &p) 139 | if err != nil { 140 | return nil, false 141 | } 142 | return &p, true 143 | } 144 | return nil, false 145 | } 146 | -------------------------------------------------------------------------------- /internal/app/task.go: -------------------------------------------------------------------------------- 1 | package app 2 | 3 | import ( 4 | "fmt" 5 | "github.com/ssrlive/proxypool/pkg/healthcheck" 6 | "github.com/ssrlive/proxypool/pkg/provider" 7 | "github.com/ssrlive/proxypoolCheck/config" 8 | "github.com/ssrlive/proxypoolCheck/internal/cache" 9 | "log" 10 | "time" 11 | ) 12 | 13 | var location, _ = time.LoadLocation("PRC") 14 | 15 | // Get all usable proxies from proxypool server and set app vars 16 | func InitApp() error{ 17 | // Get proxies from server 18 | proxies, err := getAllProxies() 19 | if err != nil { 20 | log.Println("Get proxies error: ", err) 21 | cache.LastCrawlTime = fmt.Sprint(time.Now().In(location).Format("2006-01-02 15:04:05"), err) 22 | return err 23 | } 24 | proxies = proxies.Derive().Deduplication() 25 | cache.AllProxiesCount = len(proxies) 26 | 27 | // set cache variables 28 | cache.SSProxiesCount = proxies.TypeLen("ss") 29 | cache.SSRProxiesCount = proxies.TypeLen("ssr") 30 | cache.VmessProxiesCount = proxies.TypeLen("vmess") 31 | cache.TrojanProxiesCount = proxies.TypeLen("trojan") 32 | cache.LastCrawlTime = fmt.Sprint(time.Now().In(location).Format("2006-01-02 15:04:05")) 33 | log.Println("Number of proxies:", cache.AllProxiesCount) 34 | 35 | log.Println("Now proceeding health check...") 36 | 37 | // healthcheck settings 38 | healthcheck.DelayConn = config.Config.HealthCheckConnection 39 | healthcheck.DelayTimeout = time.Duration(config.Config.HealthCheckTimeout) * time.Second 40 | healthcheck.SpeedConn = config.Config.SpeedConnection 41 | healthcheck.SpeedTimeout = time.Duration(config.Config.SpeedTimeout) * time.Second 42 | 43 | proxies = healthcheck.CleanBadProxiesWithGrpool(proxies) 44 | log.Println("Usable proxy count: ", len(proxies)) 45 | 46 | // Save to cache 47 | cache.SetProxies("proxies", proxies) 48 | cache.UsableProxiesCount = len(proxies) 49 | 50 | if config.Config.SpeedTest == true { 51 | healthcheck.SpeedTestAll(proxies) 52 | } 53 | 54 | cache.SetString("clashproxies", provider.Clash{ 55 | provider.Base{ 56 | Proxies: &proxies, 57 | }, 58 | }.Provide()) 59 | cache.SetString("surgeproxies", provider.Surge{ 60 | provider.Base{ 61 | Proxies: &proxies, 62 | }, 63 | }.Provide()) 64 | 65 | fmt.Println("Open", config.Config.Domain+":"+config.Config.Port, "to check.") 66 | return nil 67 | } 68 | 69 | -------------------------------------------------------------------------------- /internal/cache/cache.go: -------------------------------------------------------------------------------- 1 | package cache 2 | 3 | import ( 4 | "github.com/ssrlive/proxypool/pkg/proxy" 5 | "github.com/patrickmn/go-cache" 6 | "time" 7 | ) 8 | 9 | var Cache = cache.New(cache.NoExpiration, 10*time.Minute) 10 | 11 | // Get proxies from Cache 12 | func GetProxies(key string) proxy.ProxyList { 13 | result, found := Cache.Get(key) 14 | if found { 15 | return result.(proxy.ProxyList) //Get返回的是interface 16 | } 17 | return nil 18 | } 19 | 20 | // Set proxies to cache 21 | func SetProxies(key string, proxies proxy.ProxyList) { 22 | Cache.Set(key, proxies, cache.NoExpiration) 23 | } 24 | 25 | // Set string to cache 26 | func SetString(key, value string) { 27 | Cache.Set(key, value, cache.NoExpiration) 28 | } 29 | 30 | // Get string from cache 31 | func GetString(key string) string { 32 | result, found := Cache.Get(key) 33 | if found { 34 | return result.(string) 35 | } 36 | return "" 37 | } 38 | -------------------------------------------------------------------------------- /internal/cache/vars.go: -------------------------------------------------------------------------------- 1 | package cache 2 | 3 | var ( 4 | AllProxiesCount = 0 5 | SSRProxiesCount = 0 6 | SSProxiesCount = 0 7 | VmessProxiesCount = 0 8 | TrojanProxiesCount = 0 9 | 10 | UsableProxiesCount = 0 11 | 12 | LastCrawlTime = "Loading……" 13 | ) -------------------------------------------------------------------------------- /internal/cron/cron.go: -------------------------------------------------------------------------------- 1 | package cron 2 | 3 | import ( 4 | "github.com/ssrlive/proxypoolCheck/config" 5 | "github.com/ssrlive/proxypoolCheck/internal/app" 6 | "github.com/jasonlvhit/gocron" 7 | "log" 8 | "runtime" 9 | "time" 10 | ) 11 | 12 | func Cron() { 13 | _ = gocron.Every(config.Config.CronInterval).Minutes().Do(appTask) 14 | <-gocron.Start() 15 | } 16 | 17 | func appTask() { 18 | err := config.Parse("") 19 | if err != nil{ 20 | log.Printf("config parse error: %s\n", err.Error()) 21 | } 22 | err = app.InitApp() 23 | if err != nil { // for wake up heroku 24 | log.Printf("init app err: %s\n Try in 2 minute\n", err.Error()) 25 | time.Sleep(time.Minute*2) 26 | err = app.InitApp() 27 | if err != nil { 28 | log.Printf("crawl error: %s\n", err.Error()) 29 | } 30 | } 31 | runtime.GC() 32 | } 33 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "github.com/ssrlive/proxypoolCheck/api" 6 | "github.com/ssrlive/proxypoolCheck/config" 7 | "github.com/ssrlive/proxypoolCheck/internal/app" 8 | "github.com/ssrlive/proxypoolCheck/internal/cron" 9 | "log" 10 | "net/http" 11 | ) 12 | 13 | var configFilePath = "" 14 | 15 | func main() { 16 | go func() { 17 | http.ListenAndServe("0.0.0.0:6061", nil) 18 | }() 19 | 20 | //Slog.SetLevel(Slog.DEBUG) // Print original pack log 21 | 22 | // fetch configuration 23 | flag.StringVar(&configFilePath, "c", "", "path to config file: config.yaml") 24 | flag.Parse() 25 | if configFilePath == "" { 26 | configFilePath = "config.yaml" 27 | } 28 | err := config.Parse(configFilePath) 29 | if err != nil { 30 | log.Fatal(err, "\n\"Config file err. Exit\"") 31 | return 32 | } 33 | 34 | go app.InitApp() 35 | log.Printf("The program will run every %v minutes\n", config.Config.CronInterval) 36 | go cron.Cron() 37 | // Run 38 | api.Run() 39 | 40 | 41 | } 42 | --------------------------------------------------------------------------------