decimal: Add code to generate constants

A single 10000-digit constant takes about 4K in QSPI space.
Constants are generated in a cache and rebuilt when precision changes.

For now, store pi, which we will need to implement sin/cos/tan

Signed-off-by: Christophe de Dinechin <christophe@dinechin.org>
This commit is contained in:
Christophe de Dinechin 2023-12-12 08:47:03 +01:00
parent 131b801b1e
commit 14b48eb21c
6 changed files with 484 additions and 18 deletions

View file

@ -387,7 +387,13 @@ $(TARGET).$(PGM): $(BUILD)/$(TARGET).elf Makefile $(CRCFIX)
$(SIZE) $<
wc -c $@
DECIMAL_CONSTANTS=pi
DECIMAL_SOURCES=$(DECIMAL_CONSTANTS:%=src/decimal-%.h)
src/decimal-%.h: src/decimal-%.txt $(DECIMIZE)
$(DECIMIZE) < $< > $@ decimal_$*
$(OBJECTS): $(DECIMAL_SOURCES) $(VERSION_H)
sim: $(DECIMAL_SOURCES)
$(BUILD)/%.hex: $(BUILD)/%.elf | $(BUILD)

435
src/decimal-pi.h Normal file
View file

@ -0,0 +1,435 @@
// Decimal table for:
// 314 159 265 358 979 323 846 264 338 327 950 288 419 716 939 937 510 582 097 494
// 459 230 781 640 628 620 899 862 803 482 534 211 706 798 214 808 651 328 230 664
// 709 384 460 955 058 223 172 535 940 812 848 111 745 028 410 270 193 852 110 555
// 964 462 294 895 493 038 196 442 881 097 566 593 344 612 847 564 823 378 678 316
// 527 120 190 914 564 856 692 346 034 861 045 432 664 821 339 360 726 024 914 127
// 372 458 700 660 631 558 817 488 152 092 096 282 925 409 171 536 436 789 259 036
// 001 133 053 054 882 046 652 138 414 695 194 151 160 943 305 727 036 575 959 195
// 309 218 611 738 193 261 179 310 511 854 807 446 237 996 274 956 735 188 575 272
// 489 122 793 818 301 194 912 983 367 336 244 065 664 308 602 139 494 639 522 473
// 719 070 217 986 094 370 277 053 921 717 629 317 675 238 467 481 846 766 940 513
// 200 056 812 714 526 356 082 778 577 134 275 778 960 917 363 717 872 146 844 090
// 122 495 343 014 654 958 537 105 079 227 968 925 892 354 201 995 611 212 902 196
// 086 403 441 815 981 362 977 477 130 996 051 870 721 134 999 999 837 297 804 995
// 105 973 173 281 609 631 859 502 445 945 534 690 830 264 252 230 825 334 468 503
// 526 193 118 817 101 000 313 783 875 288 658 753 320 838 142 061 717 766 914 730
// 359 825 349 042 875 546 873 115 956 286 388 235 378 759 375 195 778 185 778 053
// 217 122 680 661 300 192 787 661 119 590 921 642 019 893 809 525 720 106 548 586
// 327 886 593 615 338 182 796 823 030 195 203 530 185 296 899 577 362 259 941 389
// 124 972 177 528 347 913 151 557 485 724 245 415 069 595 082 953 311 686 172 785
// 588 907 509 838 175 463 746 493 931 925 506 040 092 770 167 113 900 984 882 401
// 285 836 160 356 370 766 010 471 018 194 295 559 619 894 676 783 744 944 825 537
// 977 472 684 710 404 753 464 620 804 668 425 906 949 129 331 367 702 898 915 210
// 475 216 205 696 602 405 803 815 019 351 125 338 243 003 558 764 024 749 647 326
// 391 419 927 260 426 992 279 678 235 478 163 600 934 172 164 121 992 458 631 503
// 028 618 297 455 570 674 983 850 549 458 858 692 699 569 092 721 079 750 930 295
// 532 116 534 498 720 275 596 023 648 066 549 911 988 183 479 775 356 636 980 742
// 654 252 786 255 181 841 757 467 289 097 777 279 380 008 164 706 001 614 524 919
// 217 321 721 477 235 014 144 197 356 854 816 136 115 735 255 213 347 574 184 946
// 843 852 332 390 739 414 333 454 776 241 686 251 898 356 948 556 209 921 922 218
// 427 255 025 425 688 767 179 049 460 165 346 680 498 862 723 279 178 608 578 438
// 382 796 797 668 145 410 095 388 378 636 095 068 006 422 512 520 511 739 298 489
// 608 412 848 862 694 560 424 196 528 502 221 066 118 630 674 427 862 203 919 494
// 504 712 371 378 696 095 636 437 191 728 746 776 465 757 396 241 389 086 583 264
// 599 581 339 047 802 759 009 946 576 407 895 126 946 839 835 259 570 982 582 262
// 052 248 940 772 671 947 826 848 260 147 699 090 264 013 639 443 745 530 506 820
// 349 625 245 174 939 965 143 142 980 919 065 925 093 722 169 646 151 570 985 838
// 741 059 788 595 977 297 549 893 016 175 392 846 813 826 868 386 894 277 415 599
// 185 592 524 595 395 943 104 997 252 468 084 598 727 364 469 584 865 383 673 622
// 262 609 912 460 805 124 388 439 045 124 413 654 976 278 079 771 569 143 599 770
// 012 961 608 944 169 486 855 584 840 635 342 207 222 582 848 864 815 845 602 850
// 601 684 273 945 226 746 767 889 525 213 852 254 995 466 672 782 398 645 659 611
// 635 488 623 057 745 649 803 559 363 456 817 432 411 251 507 606 947 945 109 659
// 609 402 522 887 971 089 314 566 913 686 722 874 894 056 010 150 330 861 792 868
// 092 087 476 091 782 493 858 900 971 490 967 598 526 136 554 978 189 312 978 482
// 168 299 894 872 265 880 485 756 401 427 047 755 513 237 964 145 152 374 623 436
// 454 285 844 479 526 586 782 105 114 135 473 573 952 311 342 716 610 213 596 953
// 623 144 295 248 493 718 711 014 576 540 359 027 993 440 374 200 731 057 853 906
// 219 838 744 780 847 848 968 332 144 571 386 875 194 350 643 021 845 319 104 848
// 100 537 061 468 067 491 927 819 119 793 995 206 141 966 342 875 444 064 374 512
// 371 819 217 999 839 101 591 956 181 467 514 269 123 974 894 090 718 649 423 196
// 156 794 520 809 514 655 022 523 160 388 193 014 209 376 213 785 595 663 893 778
// 708 303 906 979 207 734 672 218 256 259 966 150 142 150 306 803 844 773 454 920
// 260 541 466 592 520 149 744 285 073 251 866 600 213 243 408 819 071 048 633 173
// 464 965 145 390 579 626 856 100 550 810 665 879 699 816 357 473 638 405 257 145
// 910 289 706 414 011 097 120 628 043 903 975 951 567 715 770 042 033 786 993 600
// 723 055 876 317 635 942 187 312 514 712 053 292 819 182 618 612 586 732 157 919
// 841 484 882 916 447 060 957 527 069 572 209 175 671 167 229 109 816 909 152 801
// 735 067 127 485 832 228 718 352 093 539 657 251 210 835 791 513 698 820 914 442
// 100 675 103 346 711 031 412 671 113 699 086 585 163 983 150 197 016 515 116 851
// 714 376 576 183 515 565 088 490 998 985 998 238 734 552 833 163 550 764 791 853
// 589 322 618 548 963 213 293 308 985 706 420 467 525 907 091 548 141 654 985 946
// 163 718 027 098 199 430 992 448 895 757 128 289 059 232 332 609 729 971 208 443
// 357 326 548 938 239 119 325 974 636 673 058 360 414 281 388 303 203 824 903 758
// 985 243 744 170 291 327 656 180 937 734 440 307 074 692 112 019 130 203 303 801
// 976 211 011 004 492 932 151 608 424 448 596 376 698 389 522 868 478 312 355 265
// 821 314 495 768 572 624 334 418 930 396 864 262 434 107 732 269 780 280 731 891
// 544 110 104 468 232 527 162 010 526 522 721 116 603 966 655 730 925 471 105 578
// 537 634 668 206 531 098 965 269 186 205 647 693 125 705 863 566 201 855 810 072
// 936 065 987 648 611 791 045 334 885 034 611 365 768 675 324 944 166 803 962 657
// 978 771 855 608 455 296 541 266 540 853 061 434 443 185 867 697 514 566 140 680
// 070 023 787 765 913 440 171 274 947 042 056 223 053 899 456 131 407 112 700 040
// 785 473 326 993 908 145 466 464 588 079 727 082 668 306 343 285 878 569 830 523
// 580 893 306 575 740 679 545 716 377 525 420 211 495 576 158 140 025 012 622 859
// 413 021 647 155 097 925 923 099 079 654 737 612 551 765 675 135 751 782 966 645
// 477 917 450 112 996 148 903 046 399 471 329 621 073 404 375 189 573 596 145 890
// 193 897 131 117 904 297 828 564 750 320 319 869 151 402 870 808 599 048 010 941
// 214 722 131 794 764 777 262 241 425 485 454 033 215 718 530 614 228 813 758 504
// 306 332 175 182 979 866 223 717 215 916 077 166 925 474 873 898 665 494 945 011
// 465 406 284 336 639 379 003 976 926 567 214 638 530 673 609 657 120 918 076 383
// 271 664 162 748 888 007 869 256 029 022 847 210 403 172 118 608 204 190 004 229
// 661 711 963 779 213 375 751 149 595 015 660 496 318 629 472 654 736 425 230 817
// 703 675 159 067 350 235 072 835 405 670 403 867 435 136 222 247 715 891 504 953
// 098 444 893 330 963 408 780 769 325 993 978 054 193 414 473 774 418 426 312 986
// 080 998 886 874 132 604 721 569 516 239 658 645 730 216 315 981 931 951 673 538
// 129 741 677 294 786 724 229 246 543 668 009 806 769 282 382 806 899 640 048 243
// 540 370 141 631 496 589 794 092 432 378 969 070 697 794 223 625 082 216 889 573
// 837 986 230 015 937 764 716 512 289 357 860 158 816 175 578 297 352 334 460 428
// 151 262 720 373 431 465 319 777 741 603 199 066 554 187 639 792 933 441 952 154
// 134 189 948 544 473 456 738 316 249 934 191 318 148 092 777 710 386 387 734 317
// 720 754 565 453 220 777 092 120 190 516 609 628 049 092 636 019 759 882 816 133
// 231 666 365 286 193 266 863 360 627 356 763 035 447 762 803 504 507 772 355 471
// 058 595 487 027 908 143 562 401 451 718 062 464 362 679 456 127 531 813 407 833
// 033 625 423 278 394 497 538 243 720 583 531 147 711 992 606 381 334 677 687 969
// 597 030 983 391 307 710 987 040 859 133 746 414 428 227 726 346 594 704 745 878
// 477 872 019 277 152 807 317 679 077 071 572 134 447 306 057 007 334 924 369 311
// 383 504 931 631 284 042 512 192 565 179 806 941 135 280 131 470 130 478 164 378
// 851 852 909 285 452 011 658 393 419 656 213 491 434 159 562 586 586 557 055 269
// 049 652 098 580 338 507 224 264 829 397 285 847 831 630 577 775 606 888 764 462
// 482 468 579 260 395 352 773 480 304 802 900 587 607 582 510 474 709 164 396 136
// 267 604 492 562 742 042 083 208 566 119 062 545 433 721 315 359 584 506 877 246
// 029 016 187 667 952 406 163 425 225 771 954 291 629 919 306 455 377 991 403 734
// 043 287 526 288 896 399 587 947 572 917 464 263 574 552 540 790 914 513 571 113
// 694 109 119 393 251 910 760 208 252 026 187 985 318 877 058 429 725 916 778 131
// 496 990 090 192 116 971 737 278 476 847 268 608 490 033 770 242 429 165 130 050
// 051 683 233 643 503 895 170 298 939 223 345 172 201 381 280 696 501 178 440 874
// 519 601 212 285 993 716 231 301 711 444 846 409 038 906 449 544 400 619 869 075
// 485 160 263 275 052 983 491 874 078 668 088 183 385 102 283 345 085 048 608 250
// 393 021 332 197 155 184 306 354 550 076 682 829 493 041 377 655 279 397 517 546
// 139 539 846 833 936 383 047 461 199 665 385 815 384 205 685 338 621 867 252 334
// 028 308 711 232 827 892 125 077 126 294 632 295 639 898 989 358 211 674 562 701
// 021 835 646 220 134 967 151 881 909 730 381 198 004 973 407 239 610 368 540 664
// 319 395 097 901 906 996 395 524 530 054 505 806 855 019 567 302 292 191 393 391
// 856 803 449 039 820 595 510 022 635 353 619 204 199 474 553 859 381 023 439 554
// 495 977 837 790 237 421 617 271 117 236 434 354 394 782 218 185 286 240 851 400
// 666 044 332 588 856 986 705 431 547 069 657 474 585 503 323 233 421 073 015 459
// 405 165 537 906 866 273 337 995 851 156 257 843 229 882 737 231 989 875 714 159
// 578 111 963 583 300 594 087 306 812 160 287 649 628 674 460 477 464 915 995 054
// 973 742 562 690 104 903 778 198 683 593 814 657 412 680 492 564 879 855 614 537
// 234 786 733 039 046 883 834 363 465 537 949 864 192 705 638 729 317 487 233 208
// 376 011 230 299 113 679 386 270 894 387 993 620 162 951 541 337 142 489 283 072
// 201 269 014 754 668 476 535 761 647 737 946 752 004 907 571 555 278 196 536 213
// 239 264 061 601 363 581 559 074 220 202 031 872 776 052 772 190 055 614 842 555
// 187 925 303 435 139 844 253 223 415 762 336 106 425 063 904 975 008 656 271 095
// 359 194 658 975 141 310 348 227 693 062 474 353 632 569 160 781 547 818 115 284
// 366 795 706 110 861 533 150 445 212 747 392 454 494 542 368 288 606 134 084 148
// 637 767 009 612 071 512 491 404 302 725 386 076 482 363 414 334 623 518 975 766
// 452 164 137 679 690 314 950 191 085 759 844 239 198 629 164 219 399 490 723 623
// 464 684 411 739 403 265 918 404 437 805 133 389 452 574 239 950 829 659 122 850
// 855 582 157 250 310 712 570 126 683 024 029 295 252 201 187 267 675 622 041 542
// 051 618 416 348 475 651 699 981 161 410 100 299 607 838 690 929 160 302 884 002
// 691 041 407 928 862 150 784 245 167 090 870 006 992 821 206 604 183 718 065 355
// 672 525 325 675 328 612 910 424 877 618 258 297 651 579 598 470 356 222 629 348
// 600 341 587 229 805 349 896 502 262 917 487 882 027 342 092 222 453 398 562 647
// 669 149 055 628 425 039 127 577 102 840 279 980 663 658 254 889 264 880 254 566
// 101 729 670 266 407 655 904 290 994 568 150 652 653 053 718 294 127 033 693 137
// 851 786 090 407 086 671 149 655 834 343 476 933 857 817 113 864 558 736 781 230
// 145 876 871 266 034 891 390 956 200 993 936 103 102 916 161 528 813 843 790 990
// 423 174 733 639 480 457 593 149 314 052 976 347 574 811 935 670 911 013 775 172
// 100 803 155 902 485 309 066 920 376 719 220 332 290 943 346 768 514 221 447 737
// 939 375 170 344 366 199 104 033 751 117 354 719 185 504 644 902 636 551 281 622
// 882 446 257 591 633 303 910 722 538 374 218 214 088 350 865 739 177 150 968 288
// 747 826 569 959 957 449 066 175 834 413 752 239 709 683 408 005 355 984 917 541
// 738 188 399 944 697 486 762 655 165 827 658 483 588 453 142 775 687 900 290 951
// 702 835 297 163 445 621 296 404 352 311 760 066 510 124 120 065 975 585 127 617
// 858 382 920 419 748 442 360 800 719 304 576 189 323 492 292 796 501 987 518 721
// 272 675 079 812 554 709 589 045 563 579 212 210 333 466 974 992 356 302 549 478
// 024 901 141 952 123 828 153 091 140 790 738 602 515 227 429 958 180 724 716 259
// 166 854 513 331 239 480 494 707 911 915 326 734 302 824 418 604 142 636 395 480
// 004 480 026 704 962 482 017 928 964 766 975 831 832 713 142 517 029 692 348 896
// 276 684 403 232 609 275 249 603 579 964 692 565 049 368 183 609 003 238 092 934
// 595 889 706 953 653 494 060 340 216 654 437 558 900 456 328 822 505 452 556 405
// 644 824 651 518 754 711 962 184 439 658 253 375 438 856 909 411 303 150 952 617
// 937 800 297 412 076 651 479 394 259 029 896 959 469 955 657 612 186 561 967 337
// 862 362 561 252 163 208 628 692 221 032 748 892 186 543 648 022 967 807 057 656
// 151 446 320 469 279 068 212 073 883 778 142 335 628 236 089 632 080 682 224 680
// 122 482 611 771 858 963 814 091 839 036 736 722 208 883 215 137 556 003 727 983
// 940 041 529 700 287 830 766 709 444 745 601 345 564 172 543 709 069 793 961 225
// 714 298 946 715 435 784 687 886 144 458 123 145 935 719 849 225 284 716 050 492
// 212 424 701 412 147 805 734 551 050 080 190 869 960 330 276 347 870 810 817 545
// 011 930 714 122 339 086 639 383 395 294 257 869 050 764 310 063 835 198 343 893
// 415 961 318 543 475 464 955 697 810 382 930 971 646 514 384 070 070 736 041 123
// 735 998 434 522 516 105 070 270 562 352 660 127 648 483 084 076 118 301 305 279
// 320 542 746 286 540 360 367 453 286 510 570 658 748 822 569 815 793 678 976 697
// 422 057 505 968 344 086 973 502 014 102 067 235 850 200 724 522 563 265 134 105
// 592 401 902 742 162 484 391 403 599 895 353 945 909 440 704 691 209 140 938 700
// 126 456 001 623 742 880 210 927 645 793 106 579 229 552 498 872 758 461 012 648
// 369 998 922 569 596 881 592 056 001 016 552 563 756 78
// 10001 digits, 3334 kigits, 4168 bytes
static const byte decimal_pi[4168] =
{
0x4E, 0x89, 0xF4, 0x25, 0x66, 0xF4, 0xD4, 0x3D, 0x39, 0x08, 0x54, 0x94, 0x7E, 0xD9, 0x20, 0x68,
0xEC, 0xCE, 0xAF, 0xA9, 0x7F, 0xA4, 0x61, 0x85, 0xEE, 0x72, 0xCE, 0x6C, 0x36, 0x80, 0x9D, 0x26,
0xCE, 0x0F, 0x5E, 0xC8, 0xDE, 0x28, 0x58, 0xD3, 0xB0, 0xB1, 0xE3, 0x5B, 0x28, 0xA2, 0xD4, 0x83,
0x9A, 0x98, 0xB1, 0x58, 0x07, 0x33, 0xBB, 0x0E, 0x8D, 0xF2, 0xB2, 0x17, 0xEB, 0x32, 0xCD, 0x40,
0x6F, 0xBA, 0x41, 0xC6, 0x69, 0x0E, 0x30, 0x75, 0x41, 0xBA, 0x2B, 0xF1, 0x1C, 0xE4, 0x9B, 0x7F,
0x7B, 0x42, 0x63, 0x11, 0xBA, 0xDC, 0x46, 0x18, 0xDA, 0x51, 0x56, 0x26, 0x4D, 0x3E, 0x34, 0xCD,
0xD7, 0xAA, 0x99, 0x3C, 0x83, 0xC7, 0x82, 0xFB, 0x92, 0x8D, 0x35, 0x8A, 0xD1, 0x5A, 0x08, 0xB5,
0xD0, 0xB5, 0xB0, 0xA6, 0x33, 0x55, 0x4D, 0x68, 0xB5, 0x81, 0x8E, 0x48, 0x7F, 0x5D, 0x1C, 0xAA,
0xF2, 0x94, 0x9D, 0xE2, 0xEC, 0xC5, 0xE8, 0x26, 0x05, 0xC1, 0x81, 0x1A, 0xE7, 0x59, 0x92, 0xAE,
0x18, 0x6D, 0x31, 0x54, 0x0C, 0x24, 0x00, 0x48, 0x50, 0xD4, 0x36, 0xDC, 0x82, 0xEA, 0x30, 0x8A,
0x67, 0xAB, 0x73, 0x08, 0x97, 0x28, 0x3A, 0xF4, 0xC6, 0xD7, 0x09, 0x23, 0xFE, 0xFC, 0xC3, 0x4D,
0x4D, 0xA9, 0x8E, 0xE2, 0x30, 0x50, 0x52, 0xCD, 0x36, 0x7F, 0xF5, 0x6C, 0x9D, 0xBE, 0x3B, 0x7E,
0x44, 0x4B, 0xBC, 0xB7, 0xCB, 0xC8, 0xFD, 0x10, 0x7A, 0x47, 0xAC, 0x67, 0x32, 0x4B, 0x4C, 0x2E,
0x43, 0xD7, 0x5B, 0xD5, 0x03, 0xD0, 0x41, 0xA6, 0x13, 0x49, 0x68, 0x8B, 0x7B, 0xA7, 0xF8, 0x29,
0xD9, 0xB3, 0xC4, 0x63, 0x67, 0xDA, 0x17, 0x97, 0x24, 0x54, 0x35, 0xE6, 0x6C, 0xD9, 0xD5, 0x3D,
0xA8, 0xCE, 0xE7, 0x4D, 0xE1, 0xD3, 0xAF, 0xEE, 0xB2, 0x01, 0x32, 0x03, 0x8C, 0xB2, 0xCA, 0x83,
0x96, 0x41, 0x4B, 0x0A, 0x90, 0x48, 0x64, 0x4F, 0x0A, 0xF0, 0x39, 0x55, 0xAE, 0xCD, 0xDA, 0x09,
0x2D, 0x30, 0x5A, 0x1E, 0x9E, 0xF5, 0x5C, 0x0E, 0xA3, 0xBB, 0xE8, 0x64, 0x69, 0x13, 0xCE, 0x3F,
0x23, 0x9D, 0xDF, 0x16, 0x23, 0x27, 0xE3, 0x98, 0xCD, 0x4E, 0x18, 0xC4, 0x15, 0x99, 0x36, 0xE7,
0x2F, 0xF5, 0x56, 0xAF, 0x45, 0xDD, 0x20, 0xBE, 0x40, 0xCF, 0x66, 0xB4, 0x48, 0x6F, 0x9F, 0xE7,
0xD1, 0x52, 0x9C, 0x93, 0xE3, 0x1A, 0x7C, 0xD2, 0xB5, 0x19, 0x98, 0x67, 0x7D, 0x6D, 0xF6, 0x6F,
0x7B, 0x18, 0x5A, 0xB2, 0xCF, 0x90, 0x83, 0xF0, 0xE6, 0xCE, 0x54, 0xE7, 0x51, 0xF7, 0x83, 0x8C,
0x11, 0xDB, 0x31, 0x19, 0x40, 0x04, 0xE7, 0x0F, 0xDA, 0xD2, 0x0A, 0x4A, 0xF1, 0x50, 0x34, 0x62,
0x38, 0x3D, 0xB3, 0x6F, 0xEE, 0x4A, 0xDA, 0x59, 0xF3, 0x95, 0x74, 0x2A, 0xDA, 0xE2, 0x2D, 0xA4,
0x73, 0xEF, 0x11, 0xE6, 0x10, 0xEB, 0x5E, 0xAF, 0x75, 0xDC, 0xC3, 0xC2, 0x8B, 0x9C, 0x28, 0x35,
0x36, 0x47, 0xAA, 0xA2, 0x95, 0x4B, 0x0C, 0x0C, 0x4E, 0x95, 0x1D, 0xE4, 0xEE, 0x66, 0x82, 0x04,
0xF7, 0xDC, 0xA6, 0x0D, 0xB4, 0x06, 0xA8, 0x92, 0x4A, 0x51, 0xF7, 0x69, 0x46, 0x67, 0x54, 0x8B,
0x6C, 0x73, 0x37, 0x07, 0x8C, 0x33, 0x2E, 0x12, 0x2E, 0x52, 0x8E, 0x0E, 0x41, 0x5A, 0x90, 0x3E,
0xB5, 0x85, 0x1F, 0x3C, 0xC2, 0xC6, 0x10, 0x56, 0xF9, 0x12, 0x5E, 0x2D, 0x79, 0x6D, 0x43, 0xD5,
0x9F, 0x11, 0x65, 0x31, 0x4B, 0xB9, 0x4D, 0xEA, 0xE2, 0xB3, 0x11, 0x93, 0x38, 0xB7, 0xF7, 0x46,
0x2B, 0xDC, 0xFB, 0xA9, 0xED, 0xE8, 0xF9, 0xD7, 0xE8, 0x28, 0x17, 0x30, 0x22, 0x9C, 0x71, 0xE1,
0x3D, 0x8D, 0xC9, 0x91, 0x47, 0x74, 0x42, 0x81, 0x64, 0x5C, 0xAF, 0xE0, 0x29, 0xD7, 0x04, 0x8C,
0x24, 0x9E, 0x2F, 0x9A, 0xF7, 0xEA, 0x93, 0x0F, 0xBA, 0x3B, 0x0C, 0xE6, 0x19, 0xF4, 0x5D, 0x8A,
0xB2, 0xC6, 0x65, 0x2F, 0x17, 0x42, 0x6C, 0xC9, 0x29, 0xC6, 0xA7, 0x8A, 0xED, 0x48, 0x15, 0x2D,
0x6F, 0xAF, 0xB8, 0x2E, 0x4C, 0xD2, 0x76, 0xCD, 0x83, 0x36, 0xB8, 0x96, 0x99, 0x5C, 0x8F, 0x2F,
0x04, 0xD5, 0xF1, 0xF5, 0x52, 0x3C, 0xC0, 0x38, 0xBA, 0xFC, 0x06, 0x2E, 0xDA, 0x1D, 0x46, 0x61,
0xDA, 0x3E, 0x7D, 0x04, 0x6A, 0xBE, 0x04, 0x5E, 0xA6, 0x3A, 0xDD, 0xE2, 0x8E, 0x58, 0xE9, 0x8A,
0xC2, 0x90, 0x79, 0xF8, 0x1C, 0xA9, 0xDD, 0xF7, 0x07, 0x26, 0xA4, 0xA5, 0xC7, 0x8E, 0xAA, 0x2F,
0x5F, 0x52, 0x89, 0x5C, 0xAD, 0x6A, 0xB4, 0xAE, 0xE3, 0x91, 0x72, 0xD1, 0x13, 0xEE, 0xEE, 0x89,
0x27, 0x85, 0x07, 0x48, 0x59, 0xF2, 0xB4, 0x11, 0x39, 0x50, 0x17, 0xA2, 0x04, 0x28, 0x97, 0x8F,
0xF7, 0x0B, 0x77, 0x7F, 0x07, 0x59, 0x27, 0xCF, 0x52, 0xE6, 0xA3, 0x8F, 0xCC, 0x48, 0xFF, 0x2D,
0x74, 0x9B, 0xD5, 0xD3, 0x48, 0x46, 0x1C, 0x25, 0x17, 0x5F, 0x00, 0x82, 0x92, 0xC2, 0x00, 0x66,
0x68, 0x33, 0x97, 0x36, 0x54, 0x1B, 0x45, 0xDD, 0x3A, 0xC0, 0xE2, 0x40, 0xC5, 0x59, 0x35, 0x6C,
0xC0, 0x88, 0x1C, 0xED, 0xF3, 0xFC, 0xD5, 0x56, 0xE3, 0xE2, 0xE3, 0xB2, 0xD2, 0xF5, 0x45, 0x31,
0x86, 0xB8, 0xD9, 0xE5, 0x35, 0xC6, 0xC2, 0x0F, 0x1A, 0xB8, 0xFB, 0xE0, 0x96, 0x4E, 0xD2, 0x2C,
0x34, 0x79, 0x9E, 0x68, 0xDA, 0x6A, 0xCF, 0xF0, 0x65, 0xA9, 0xAC, 0x2F, 0xF2, 0xCC, 0x31, 0x73,
0x0A, 0x55, 0x6A, 0xA8, 0x7C, 0xB5, 0xEB, 0x4D, 0x17, 0x2C, 0xA6, 0x09, 0x09, 0xB6, 0x5F, 0xB1,
0xCC, 0x76, 0x9C, 0x24, 0x59, 0xA1, 0x7D, 0x84, 0x5E, 0xA7, 0xC1, 0x7C, 0x44, 0x01, 0x9A, 0x68,
0x02, 0x08, 0x7F, 0xEE, 0x34, 0xA9, 0xE9, 0x98, 0x19, 0xCD, 0x43, 0x5E, 0xAD, 0xA3, 0x06, 0xA0,
0xC4, 0x84, 0x1F, 0x63, 0x74, 0x42, 0x1D, 0xA7, 0x6A, 0x89, 0xAB, 0xD7, 0x8C, 0xBE, 0x5D, 0xEE,
0x7E, 0x2C, 0x85, 0xCD, 0x7A, 0xAE, 0x05, 0xF9, 0xF1, 0xB5, 0x2F, 0xED, 0x8B, 0xAB, 0x08, 0x74,
0x6F, 0x56, 0x30, 0xF1, 0x61, 0x45, 0x69, 0x1D, 0x08, 0x95, 0xE4, 0x55, 0x4C, 0x2F, 0xC8, 0xAF,
0x70, 0x27, 0xB2, 0x90, 0x19, 0x7D, 0xFC, 0x7E, 0xEC, 0xB4, 0x7D, 0x0D, 0x03, 0x8E, 0xBD, 0x69,
0x19, 0x06, 0x0D, 0x0F, 0x8E, 0xB3, 0x04, 0xA7, 0xFB, 0x3C, 0xEB, 0x50, 0x41, 0x09, 0x3A, 0xEC,
0x5A, 0x42, 0x00, 0xD9, 0xFD, 0xBB, 0xBA, 0x61, 0x27, 0xEB, 0x34, 0x57, 0x67, 0x13, 0xD4, 0xAE,
0xEA, 0xFC, 0x52, 0x3C, 0x8E, 0xF5, 0x39, 0x71, 0x07, 0x9D, 0x17, 0x6D, 0x22, 0xA6, 0x86, 0x25,
0xE3, 0xAF, 0x67, 0x46, 0xB9, 0x43, 0xBC, 0x52, 0x53, 0xF4, 0x52, 0x98, 0x97, 0x7D, 0x04, 0x0A,
0xF6, 0x23, 0x4E, 0xCB, 0x73, 0xAD, 0x91, 0x82, 0xDF, 0x91, 0x56, 0x7E, 0x57, 0x2E, 0x65, 0x08,
0x32, 0x53, 0x62, 0xFA, 0xF1, 0xA3, 0xE5, 0x3F, 0x1D, 0x41, 0x52, 0x56, 0xB5, 0xD6, 0xC7, 0x56,
0x48, 0xD8, 0x57, 0xFA, 0x86, 0x6E, 0x41, 0xA6, 0x1E, 0x41, 0xCC, 0xC9, 0x47, 0xC6, 0x11, 0xB7,
0x0B, 0x47, 0xC6, 0x76, 0x8E, 0xF4, 0x11, 0x61, 0x3F, 0x03, 0x8E, 0x48, 0xF9, 0x5F, 0x02, 0x03,
0x3C, 0x19, 0x83, 0xB0, 0x2A, 0x5E, 0x6D, 0x5E, 0x48, 0xD2, 0x27, 0xB5, 0x58, 0xCF, 0x37, 0xA4,
0x6D, 0x43, 0x60, 0xCB, 0xF4, 0xD9, 0x6B, 0x52, 0x96, 0x6A, 0xC4, 0x47, 0xB1, 0x38, 0xAE, 0xAB,
0xFF, 0x79, 0x83, 0x4D, 0x5D, 0x50, 0xFE, 0xF8, 0xDD, 0x2A, 0x83, 0x0E, 0x63, 0xA8, 0x5A, 0x4E,
0x63, 0x9E, 0xDE, 0x89, 0xBC, 0x39, 0xBA, 0x68, 0x9C, 0x8E, 0x2F, 0x5A, 0xDC, 0x8C, 0xC5, 0xB0,
0x66, 0xCF, 0xB7, 0xEE, 0x5E, 0xEC, 0xFB, 0x11, 0xB6, 0x93, 0x98, 0x59, 0x28, 0x2B, 0x77, 0xF2,
0xC5, 0x94, 0xEA, 0x36, 0xE4, 0x6A, 0xEB, 0x4B, 0x6A, 0xDF, 0x83, 0x80, 0x28, 0x96, 0x52, 0xB5,
0xDC, 0x63, 0x64, 0x17, 0x05, 0x77, 0x70, 0x5B, 0xC3, 0x9E, 0xDD, 0x6B, 0x84, 0xF2, 0xDE, 0xAF,
0x1E, 0x56, 0x83, 0x88, 0x88, 0xAB, 0xD2, 0x2F, 0x53, 0x8F, 0x49, 0xE2, 0x2A, 0x12, 0xBD, 0xFB,
0x68, 0x42, 0x77, 0x07, 0x96, 0xF4, 0x64, 0x5A, 0xB0, 0xBE, 0xF3, 0x80, 0x4E, 0xDF, 0x10, 0x91,
0x26, 0x17, 0x69, 0xBD, 0xB4, 0x71, 0x91, 0xDD, 0x31, 0xDF, 0x83, 0xA4, 0xAC, 0x38, 0x69, 0x1C,
0x88, 0x77, 0x66, 0x3D, 0xEE, 0x13, 0x75, 0x5A, 0xCC, 0x98, 0x8D, 0x59, 0x53, 0xB9, 0x9B, 0xC9,
0x04, 0x9C, 0xF8, 0x7B, 0x6C, 0xEB, 0x1C, 0x0E, 0x90, 0x21, 0xC5, 0x9C, 0x1B, 0xF8, 0x5B, 0x85,
0xD8, 0xC8, 0xB6, 0xC3, 0x9D, 0x57, 0x8A, 0x36, 0xF4, 0x6B, 0xA3, 0x0C, 0xD3, 0xF5, 0x0F, 0x21,
0x4C, 0x24, 0x23, 0xB6, 0x0B, 0x6B, 0x30, 0x95, 0xEA, 0x0C, 0x15, 0xD3, 0x53, 0xF1, 0xA3, 0x50,
0x19, 0x21, 0x90, 0xF5, 0xD4, 0x10, 0xDE, 0xBE, 0x7F, 0x33, 0x1D, 0xF1, 0x9F, 0x8C, 0xCE, 0x23,
0x7C, 0x65, 0x5B, 0x6B, 0x6F, 0x04, 0x05, 0xDA, 0x00, 0x5C, 0xF3, 0x33, 0x67, 0xE7, 0xD1, 0xC6,
0x59, 0x3F, 0xBC, 0x2D, 0x5D, 0x38, 0x09, 0x0D, 0x1E, 0xFC, 0xED, 0xF8, 0x5A, 0xB3, 0xA8, 0x96,
0x9C, 0xC4, 0x27, 0x31, 0xA8, 0x23, 0x29, 0x80, 0xA8, 0xF0, 0x5A, 0x0B, 0x28, 0x18, 0x43, 0x04,
0x0E, 0x34, 0x57, 0x83, 0x57, 0x11, 0x94, 0xE9, 0x7D, 0xF7, 0x0A, 0xB1, 0x12, 0xFE, 0x2B, 0xD3,
0x33, 0xED, 0xEA, 0x80, 0xDA, 0x40, 0x10, 0x3F, 0x18, 0x96, 0x23, 0x89, 0x64, 0xCB, 0x23, 0xD3,
0x30, 0x57, 0x1B, 0x98, 0x41, 0x21, 0xD7, 0x4A, 0x50, 0x82, 0x09, 0x5B, 0xA1, 0x1D, 0x12, 0x4F,
0xBD, 0x8A, 0x58, 0x35, 0x4F, 0x36, 0x63, 0x33, 0x11, 0xC3, 0x09, 0xE4, 0xAD, 0x74, 0x3C, 0x52,
0x45, 0x86, 0x90, 0xE7, 0x2D, 0x60, 0x64, 0x89, 0xB2, 0xAA, 0x67, 0x6F, 0xAE, 0xF3, 0x05, 0x95,
0xD9, 0x9F, 0x99, 0x54, 0x04, 0x91, 0xE3, 0x92, 0x1B, 0x09, 0x9E, 0x02, 0xC6, 0x11, 0xE2, 0x74,
0x0A, 0xF8, 0x7F, 0x3F, 0xB7, 0x8D, 0xEC, 0xBC, 0x08, 0x2A, 0x08, 0x71, 0x2F, 0x86, 0x58, 0xB4,
0xC3, 0x7D, 0xB1, 0x3D, 0x9E, 0xFA, 0xE2, 0xED, 0x38, 0x80, 0xAC, 0x80, 0xD5, 0x24, 0xCC, 0xCB,
0x69, 0xAA, 0x64, 0x92, 0xAD, 0xC2, 0x77, 0x97, 0xD2, 0x5E, 0x4D, 0xCB, 0x94, 0x6F, 0xC3, 0xCE,
0xF6, 0x0F, 0x11, 0x63, 0xC3, 0x44, 0xAF, 0xA7, 0xCA, 0x73, 0x94, 0x6D, 0xCC, 0x38, 0xD2, 0x63,
0x21, 0xB7, 0xC4, 0x31, 0xFD, 0xE5, 0xD0, 0x0E, 0x4B, 0x39, 0x60, 0x17, 0x61, 0xBA, 0x44, 0xFB,
0x34, 0xB4, 0x3C, 0x5E, 0x01, 0xAE, 0xB3, 0x4E, 0x49, 0xBA, 0x19, 0x2A, 0x31, 0x9D, 0x5A, 0xB1,
0xC1, 0xF6, 0x72, 0x9F, 0x1C, 0x6B, 0xB1, 0x5A, 0x49, 0x28, 0xFD, 0x72, 0x58, 0xC5, 0x04, 0x20,
0x31, 0xD3, 0x53, 0xB2, 0x97, 0x89, 0x00, 0xB7, 0x80, 0xE3, 0x51, 0x61, 0xEA, 0xF9, 0xBD, 0x9F,
0x98, 0xEE, 0xB7, 0xA2, 0x8D, 0x04, 0xA3, 0x89, 0xAF, 0xCC, 0x5F, 0x55, 0x93, 0x54, 0x29, 0xAA,
0x24, 0xF0, 0xCD, 0x54, 0x95, 0x34, 0xF6, 0x6C, 0x26, 0x91, 0xD3, 0x83, 0x78, 0xB1, 0x6E, 0x24,
0x23, 0x68, 0xEF, 0x67, 0xB2, 0x28, 0xEC, 0xE0, 0x6C, 0x62, 0x31, 0xDA, 0xEF, 0x81, 0xC0, 0xDF,
0xEF, 0x52, 0x01, 0x21, 0x0E, 0xCE, 0x85, 0x32, 0x61, 0xB6, 0x7C, 0xB3, 0x41, 0xBB, 0x59, 0x54,
0x68, 0x93, 0xAA, 0x3B, 0xC7, 0x75, 0x17, 0xCE, 0x9F, 0x2A, 0x10, 0xE9, 0x68, 0x67, 0x91, 0x96,
0x11, 0x2F, 0x32, 0xF3, 0x8E, 0x1E, 0xF6, 0xF6, 0x4F, 0x3B, 0xA0, 0xAA, 0x48, 0xD4, 0x7A, 0x40,
0xB4, 0xEA, 0x6D, 0xE6, 0xE1, 0x33, 0x12, 0xAB, 0x41, 0xC0, 0x13, 0x20, 0x8C, 0xB4, 0xBF, 0x21,
0xF4, 0x0D, 0x30, 0x2C, 0x04, 0x7B, 0x3A, 0x42, 0x5E, 0x60, 0x6A, 0x1C, 0x09, 0x51, 0x78, 0xAE,
0x98, 0x58, 0x2B, 0x64, 0x77, 0x93, 0x85, 0x8D, 0x09, 0xCD, 0x53, 0xA7, 0xBF, 0x00, 0x8F, 0x27,
0x05, 0x39, 0xA2, 0xE8, 0x98, 0xCD, 0x81, 0x06, 0x6C, 0x86, 0xBB, 0x71, 0x0D, 0xC3, 0x11, 0x8B,
0x6F, 0x7B, 0x88, 0x06, 0xE1, 0xA1, 0xD4, 0x3A, 0x20, 0xF2, 0x88, 0x0A, 0x83, 0xA0, 0xAB, 0x44,
0x74, 0x96, 0xFC, 0x6A, 0x3E, 0xDA, 0xE7, 0x5D, 0x71, 0xA6, 0x42, 0x86, 0x67, 0xAA, 0x70, 0xCE,
0x84, 0xC6, 0x2F, 0x15, 0x0D, 0x2E, 0x8C, 0xDA, 0x1E, 0xB5, 0x1F, 0x6C, 0x1D, 0x7E, 0x36, 0x32,
0x75, 0x7C, 0xA8, 0x48, 0xEA, 0x04, 0x1F, 0x6E, 0x88, 0x98, 0xF1, 0x70, 0xB5, 0x4E, 0xDD, 0x42,
0x29, 0x8D, 0x6D, 0xC0, 0x2A, 0x35, 0x13, 0xB0, 0x29, 0xB2, 0x3F, 0x0A, 0x91, 0xF4, 0xB0, 0x3D,
0x5E, 0x60, 0x71, 0xD2, 0x88, 0x75, 0x0A, 0x87, 0x35, 0x50, 0xF5, 0xB2, 0x6E, 0xCB, 0x9D, 0x8E,
0xB9, 0x80, 0xA3, 0x62, 0x32, 0xA8, 0x11, 0x81, 0x7C, 0x4E, 0xFD, 0xE4, 0x5B, 0x82, 0xAD, 0x12,
0xEC, 0xC2, 0xA0, 0xE0, 0xDF, 0x0D, 0x78, 0x37, 0x20, 0x83, 0x65, 0xC7, 0x0A, 0xF0, 0x28, 0xC4,
0x5D, 0x95, 0x1B, 0xE1, 0xE3, 0x09, 0x17, 0x49, 0xD0, 0x93, 0x04, 0xFB, 0x5C, 0x52, 0xA7, 0x13,
0x25, 0x5D, 0x1D, 0xDB, 0xA3, 0x9C, 0xFA, 0x0B, 0x91, 0x37, 0xD4, 0xCA, 0x3F, 0xB9, 0x2A, 0x78,
0x86, 0xCC, 0x5E, 0x60, 0xD6, 0x90, 0xD3, 0x7B, 0xE4, 0x02, 0x78, 0x8C, 0x06, 0x40, 0xC9, 0xBB,
0x5B, 0x67, 0x41, 0x5A, 0x1C, 0x9B, 0x18, 0x79, 0xDE, 0x6C, 0x63, 0x13, 0xE8, 0xEB, 0x86, 0x64,
0x89, 0xEF, 0xDA, 0x8C, 0x87, 0xBB, 0xF0, 0xEF, 0x1A, 0x85, 0x77, 0x79, 0x57, 0x08, 0x70, 0xF9,
0x09, 0x4E, 0x1C, 0x2E, 0x63, 0xDD, 0x75, 0x26, 0x6D, 0x12, 0x59, 0x45, 0xDC, 0xBD, 0x8F, 0x65,
0x42, 0x47, 0x7A, 0x30, 0x78, 0x12, 0x0C, 0x75, 0xE2, 0x12, 0x9C, 0xF2, 0x34, 0xBB, 0x94, 0x04,
0xFF, 0x65, 0x25, 0xD9, 0x2D, 0x9B, 0x28, 0x95, 0xC3, 0x00, 0x2B, 0xAD, 0x35, 0xAD, 0x22, 0x0F,
0x1A, 0xBF, 0x30, 0x94, 0x18, 0xF1, 0x6A, 0x5E, 0x57, 0x18, 0x21, 0x35, 0xEC, 0xE8, 0x4A, 0x66,
0x39, 0x32, 0xDB, 0xD9, 0xF8, 0x4C, 0x94, 0xC2, 0xBC, 0xB6, 0xF4, 0xF6, 0x23, 0x7E, 0xCD, 0x35,
0xF9, 0x41, 0x34, 0xA6, 0xE7, 0x5D, 0xAD, 0xA7, 0x82, 0xA6, 0x5E, 0xEE, 0xC4, 0x0B, 0x74, 0x59,
0x64, 0x71, 0x50, 0x9F, 0xD7, 0xB0, 0x0F, 0xD0, 0xE7, 0xA3, 0x73, 0x5A, 0x7E, 0x84, 0xAA, 0x19,
0x86, 0x91, 0x1E, 0x39, 0x61, 0x31, 0x7F, 0x43, 0xE9, 0x82, 0x8A, 0xEC, 0xDE, 0x00, 0x7D, 0x95,
0x00, 0x07, 0x41, 0x6D, 0x3C, 0xD2, 0x64, 0xCA, 0xC1, 0xDA, 0x60, 0x33, 0x0B, 0xE0, 0x10, 0xE5,
0xA5, 0x6C, 0x7F, 0x0F, 0x0B, 0x35, 0x57, 0x7B, 0xBC, 0x95, 0x94, 0xC0, 0xFA, 0x51, 0xF0, 0x4F,
0xA7, 0x57, 0x62, 0x8E, 0xB8, 0x1A, 0x93, 0x9B, 0x31, 0xAF, 0xEA, 0x32, 0x7C, 0x43, 0x57, 0x8E,
0xB1, 0x23, 0x43, 0x65, 0x69, 0xE6, 0x4F, 0x63, 0x6C, 0xC8, 0x83, 0x78, 0xF7, 0xB2, 0xF7, 0xB7,
0xE3, 0xB9, 0x18, 0x9B, 0xCD, 0xF5, 0x4A, 0xF0, 0xD9, 0x8C, 0x33, 0x01, 0x51, 0x7E, 0x1F, 0x48,
0x36, 0x30, 0x59, 0xE7, 0x67, 0x06, 0x68, 0x9A, 0xA4, 0xE3, 0xDA, 0x14, 0x3E, 0x6D, 0xDB, 0x6A,
0x21, 0x25, 0xCB, 0x46, 0x39, 0x81, 0x0E, 0xFA, 0x4A, 0x85, 0xB6, 0x8D, 0x84, 0xEF, 0xD5, 0xE8,
0xFB, 0x7A, 0x86, 0x1A, 0x20, 0x6E, 0x5A, 0x95, 0x26, 0xC4, 0xAD, 0x43, 0x94, 0xF6, 0x87, 0xE9,
0xC0, 0x27, 0x26, 0xC0, 0x51, 0xA5, 0xFB, 0x26, 0xE0, 0xE8, 0x00, 0xC0, 0xF3, 0x87, 0x17, 0x22,
0x36, 0x77, 0x7C, 0x24, 0xDC, 0x68, 0x5C, 0x6C, 0x17, 0xAF, 0x24, 0x46, 0xAE, 0x71, 0xA3, 0x7E,
0x71, 0x14, 0x8D, 0x8D, 0xE6, 0x3D, 0xD1, 0x7D, 0xA3, 0x98, 0x0F, 0xEA, 0x6F, 0xCB, 0x32, 0x00,
0x48, 0x56, 0x5D, 0x70, 0x9E, 0xCC, 0x0A, 0xF9, 0x09, 0x29, 0x58, 0x14, 0xE7, 0x31, 0xAC, 0x25,
0xD0, 0x6B, 0x41, 0x75, 0x6B, 0xDD, 0x14, 0xFF, 0x09, 0xB9, 0x65, 0xB3, 0x1C, 0x42, 0x8A, 0x8B,
0xB9, 0xFF, 0x18, 0xE9, 0x5B, 0x9E, 0xE0, 0x9A, 0x21, 0x8B, 0xDE, 0xD2, 0x20, 0x76, 0x5C, 0x8B,
0x89, 0x3C, 0x3E, 0x7A, 0x62, 0xFD, 0x3E, 0x25, 0x05, 0xCC, 0x26, 0xC6, 0x60, 0x98, 0x3B, 0x79,
0x3D, 0xB4, 0x2F, 0x28, 0xD5, 0xC5, 0x37, 0x30, 0x91, 0x70, 0x78, 0x2F, 0xA0, 0x49, 0x86, 0x74,
0x0C, 0x45, 0xC9, 0xF0, 0x13, 0xBD, 0xF7, 0x2C, 0xC0, 0x85, 0x39, 0xE9, 0xA5, 0xB5, 0x1E, 0x30,
0x50, 0xAD, 0x7D, 0x68, 0x9C, 0xD6, 0x4B, 0xEC, 0x23, 0x6F, 0xEF, 0xAC, 0x8D, 0xF8, 0x7E, 0xF0,
0x45, 0x8D, 0xD7, 0x0E, 0xA5, 0x37, 0x9C, 0x1B, 0xE3, 0x08, 0xF8, 0xC9, 0x91, 0x70, 0xEC, 0xE0,
0xF9, 0xD0, 0x5A, 0xAA, 0x77, 0x20, 0x7F, 0x84, 0xF2, 0xD6, 0x5F, 0x41, 0x08, 0x67, 0x16, 0x9D,
0x16, 0x62, 0x9F, 0x18, 0x68, 0xF3, 0xB4, 0x24, 0x78, 0x4C, 0x93, 0xB1, 0xFE, 0x09, 0x79, 0x7D,
0x53, 0xAA, 0x5A, 0xBF, 0xC9, 0x95, 0x41, 0xEF, 0x5D, 0x87, 0x4C, 0xEC, 0x6F, 0x6C, 0x28, 0xD6,
0xC8, 0x5B, 0xA9, 0x9E, 0x6B, 0x0E, 0x3B, 0x59, 0x5A, 0x94, 0xAC, 0x0B, 0xA7, 0x6E, 0x77, 0x76,
0x80, 0x4D, 0x15, 0x26, 0x32, 0x74, 0xF6, 0xA7, 0x13, 0x44, 0x78, 0xF0, 0x86, 0x6F, 0xD3, 0x20,
0xE4, 0x07, 0x53, 0xB9, 0xC5, 0xC5, 0x37, 0x5F, 0xDF, 0x8E, 0x8E, 0x77, 0x47, 0x02, 0xA8, 0x00,
0xC0, 0x8D, 0x4B, 0x3C, 0x9B, 0xAD, 0x21, 0xD1, 0x82, 0x0D, 0xD6, 0x20, 0x9D, 0xE2, 0x91, 0x7A,
0xD4, 0xF5, 0x4E, 0x35, 0x1D, 0x71, 0x00, 0xBA, 0x49, 0x89, 0x68, 0xE9, 0x03, 0x55, 0xEB, 0x6C,
0x89, 0xF8, 0xCA, 0x4A, 0x92, 0xA2, 0xD0, 0xDD, 0x0D, 0x0C, 0x68, 0xC1, 0x8A, 0x44, 0x54, 0x9F,
0xB3, 0x81, 0x08, 0xCF, 0x58, 0xD4, 0x77, 0x4F, 0xCF, 0xE7, 0x69, 0x07, 0x07, 0x97, 0xB7, 0x8B,
0xF1, 0xCE, 0x78, 0x9D, 0x49, 0x0D, 0x04, 0x62, 0xD6, 0x0C, 0x15, 0xE0, 0x4C, 0x32, 0x2E, 0x12,
0x4B, 0x97, 0xE4, 0x67, 0xF9, 0xDA, 0xB1, 0x4A, 0x46, 0x30, 0x88, 0x42, 0xE5, 0xC7, 0xB2, 0x32,
0xB9, 0x82, 0xA1, 0x4C, 0xD0, 0x8D, 0x87, 0x70, 0xFA, 0x21, 0x6C, 0x6D, 0x14, 0xED, 0x67, 0x92,
0x1F, 0xAD, 0xB4, 0xF6, 0x07, 0x41, 0x02, 0xEE, 0x9B, 0xEE, 0x19, 0x62, 0x8D, 0xA9, 0x38, 0x70,
0x3E, 0xE9, 0x23, 0x9D, 0x79, 0x74, 0xC9, 0xC7, 0x5E, 0x7D, 0xF6, 0x4E, 0xDE, 0x0A, 0xD1, 0xF8,
0x39, 0x20, 0xE0, 0x18, 0xF9, 0x2F, 0xB3, 0x8F, 0x39, 0x57, 0x41, 0x07, 0x8F, 0xA2, 0x88, 0x73,
0x16, 0xE4, 0xA0, 0x18, 0xEC, 0x71, 0xAD, 0x86, 0xD1, 0xDD, 0x89, 0x3E, 0xF8, 0xEB, 0xE0, 0xD0,
0x3F, 0x01, 0xA2, 0xEF, 0xD9, 0x4F, 0xB6, 0xD0, 0xE9, 0xAD, 0xB5, 0x79, 0x4C, 0x28, 0x83, 0x7C,
0x3D, 0xE1, 0x68, 0xC0, 0x1D, 0x3C, 0xBB, 0x85, 0x16, 0x77, 0x34, 0xF4, 0x32, 0x60, 0x7A, 0x82,
0x1C, 0x08, 0xF2, 0x6B, 0x4A, 0x52, 0x08, 0x32, 0x0C, 0xEA, 0xB3, 0xA6, 0x83, 0x7D, 0xF7, 0xF2,
0xA9, 0x2A, 0xEA, 0xCD, 0xF5, 0x64, 0xAC, 0x32, 0x57, 0xD4, 0x62, 0xB8, 0x7D, 0x4B, 0x26, 0xE3,
0x6A, 0x81, 0xE5, 0x93, 0x51, 0x1D, 0xF8, 0x6C, 0xC3, 0x9D, 0x2D, 0xB1, 0xDB, 0xCD, 0x39, 0x99,
0x09, 0xB8, 0xA7, 0x06, 0x20, 0x64, 0x26, 0xBD, 0x94, 0x4B, 0x79, 0x4A, 0x04, 0x1D, 0x13, 0x0D,
0x3D, 0x77, 0xAF, 0x6A, 0x13, 0xA9, 0xC1, 0x60, 0xB7, 0x60, 0x46, 0x64, 0x6D, 0x59, 0x15, 0x43,
0x09, 0x80, 0xFA, 0x62, 0x41, 0x55, 0x30, 0xC5, 0x26, 0xCB, 0x84, 0xC9, 0x62, 0x89, 0x84, 0xCA,
0xAB, 0x3D, 0x7B, 0x42, 0x95, 0xE6, 0x8F, 0x45, 0xD8, 0xD8, 0x16, 0x22, 0x22, 0xE1, 0xBD, 0x3B,
0x41, 0xEA, 0x17, 0xF0, 0xBD, 0xCD, 0x31, 0xE9, 0x96, 0x07, 0x2F, 0x60, 0x0C, 0xDA, 0xB5, 0x52,
0x9B, 0x76, 0x33, 0xF1, 0x4E, 0x07, 0x13, 0x4B, 0x1C, 0xE8, 0xCE, 0xF7, 0xC1, 0xF4, 0x4D, 0x1F,
0x92, 0x69, 0xE1, 0x27, 0x9F, 0xF8, 0x2F, 0x75, 0x66, 0x34, 0xEA, 0x28, 0xCA, 0xBD, 0x05, 0x74,
0x3A, 0x18, 0xDC, 0x21, 0xBC, 0x72, 0x5F, 0x71, 0xE3, 0x6D, 0xA5, 0xF4, 0xC6, 0x01, 0x3C, 0xD6,
0x5C, 0xEF, 0x98, 0x97, 0x08, 0x72, 0x98, 0x4F, 0xD8, 0xB1, 0x87, 0x85, 0xE2, 0xBE, 0x46, 0x2E,
0x0C, 0x84, 0x83, 0x67, 0xE7, 0x26, 0xD5, 0xC1, 0x38, 0xDD, 0x2E, 0x49, 0x0B, 0xF6, 0x25, 0x87,
0xD6, 0x32, 0x37, 0x04, 0x27, 0xCD, 0x25, 0x37, 0xF8, 0x16, 0x9E, 0xD6, 0x19, 0xAC, 0xCC, 0x31,
0xDD, 0xA8, 0xA7, 0x5B, 0x5F, 0x41, 0x76, 0xDE, 0x2A, 0x7B, 0xFD, 0x1D, 0x17, 0x16, 0x3B, 0x5A,
0x59, 0xA5, 0x0F, 0x1D, 0x4E, 0xC6, 0xC9, 0x62, 0x62, 0xB0, 0xE3, 0x68, 0xB9, 0x47, 0x8F, 0x0D,
0x4D, 0x90, 0xA6, 0x82, 0xC5, 0x32, 0x4C, 0xD6, 0x3D, 0xAB, 0x05, 0xAF, 0x88, 0xC4, 0x5A, 0x45,
0xDA, 0x92, 0x5F, 0x75, 0x0C, 0xE9, 0x69, 0x44, 0x90, 0x3D, 0xCB, 0x65, 0x4A, 0x58, 0x67, 0x8A,
0xD8, 0x91, 0x15, 0x47, 0xE3, 0xD4, 0xC9, 0xC4, 0x07, 0x4B, 0x39, 0x77, 0x2B, 0x84, 0xE7, 0xF7,
0x76, 0xBB, 0x28, 0x9F, 0x90, 0x86, 0xFF, 0x0E, 0x47, 0x4B, 0x25, 0x21, 0x5D, 0x32, 0xCB, 0x0A,
0x04, 0x7E, 0x89, 0x9D, 0x2A, 0x27, 0x31, 0xDD, 0x74, 0x39, 0x3F, 0x8C, 0x36, 0xF3, 0x6E, 0x68,
0xCA, 0xB2, 0x1A, 0x38, 0x7C, 0x28, 0xC6, 0xAA, 0xE5, 0x1C, 0xBA, 0x91, 0x67, 0x2A, 0x87, 0xB2,
0x34, 0xDB, 0xF5, 0x79, 0x9A, 0x19, 0x3A, 0xB1, 0x2B, 0x74, 0x27, 0x0B, 0xB7, 0x3D, 0x09, 0x6B,
0x74, 0x61, 0x9E, 0xD7, 0x60, 0x30, 0x2C, 0x19, 0xFA, 0xD9, 0x4F, 0x5E, 0x73, 0xA4, 0xD0, 0x5E,
0x00, 0xB3, 0x99, 0x2B, 0x1C, 0x6A, 0x76, 0x09, 0x0E, 0xDF, 0x98, 0x3F, 0x86, 0x6C, 0x28, 0xBB,
0x78, 0x75, 0x51, 0x23, 0x9E, 0x94, 0x6C, 0x48, 0x32, 0x50, 0xD0, 0x3A, 0xF2, 0xA7, 0x1D, 0xC8,
0x5E, 0xF9, 0xA1, 0xEE, 0x1E, 0xCA, 0xF0, 0x01, 0x38, 0xB8, 0xEE, 0x2B, 0x45, 0x8C, 0x48, 0x60,
0xD5, 0x3B, 0xD0, 0x80, 0xF6, 0x59, 0x5A, 0xE4, 0x58, 0xBC, 0x4A, 0x37, 0x0C, 0xA0, 0x7F, 0x68,
0xC2, 0x03, 0x4C, 0x10, 0xBE, 0x0D, 0xE6, 0x6D, 0x2A, 0x2B, 0x2E, 0xF9, 0xD4, 0xBD, 0xB3, 0x22,
0xF4, 0xC3, 0xF4, 0xDF, 0x67, 0xEF, 0xA5, 0x40, 0x6A, 0x6A, 0x43, 0xFE, 0x23, 0xCF, 0x02, 0x29,
0x04, 0x3C, 0x5F, 0x59, 0xCC, 0x2A, 0x4B, 0xCF, 0x23, 0x53, 0x65, 0x70, 0xE3, 0xAD, 0x43, 0xE7,
0x69, 0x61, 0x9E, 0x23, 0x92, 0x83, 0x0D, 0x88, 0xF3, 0x21, 0xCD, 0x1C, 0x5B, 0xB1, 0xBB, 0x08,
0x6E, 0xD7, 0x61, 0x52, 0x59, 0xBD, 0x35, 0x2E, 0xB6, 0x21, 0xC6, 0x7B, 0xA1, 0xE5, 0xC1, 0x20,
0x97, 0x88, 0x61, 0x50, 0x94, 0x9F, 0x6F, 0xF0, 0x26, 0x64, 0x11, 0xE0, 0x07, 0xAD, 0x94, 0x4B,
0xAD, 0x56, 0x08, 0x4C, 0x78, 0x96, 0xB6, 0x79, 0x4E, 0x9B, 0xE0, 0x6F, 0x3E, 0xFE, 0x71, 0x0A,
0x42, 0x26, 0xA7, 0xAC, 0x93, 0xAE, 0xD8, 0xBF, 0x15, 0x6F, 0x7D, 0x30, 0xEF, 0x31, 0xA7, 0x52,
0x90, 0xDB, 0x63, 0xDE, 0xAB, 0x4E, 0x6F, 0x74, 0x2A, 0xC6, 0x6E, 0xE3, 0x64, 0xD0, 0x9E, 0x59,
0x94, 0x6D, 0x72, 0x52, 0x15, 0x85, 0x71, 0x23, 0xE3, 0xBF, 0xB6, 0xCF, 0x69, 0x31, 0xEB, 0x52,
0xD5, 0xE4, 0x62, 0x74, 0xFA, 0x4D, 0xAC, 0x88, 0xE8, 0x7E, 0xAA, 0xC1, 0x80, 0x75, 0x27, 0x3F,
0x0C, 0x92, 0xED, 0x0B, 0xA8, 0xE6, 0xE0, 0xA6, 0x1E, 0x0C, 0xE6, 0xA6, 0x81, 0x5C, 0x76, 0xE8,
0xBA, 0xEF, 0xD5, 0x28, 0x59, 0xA1, 0x91, 0x2B, 0x97, 0xF4, 0x6A, 0xCB, 0xA1, 0x28, 0x12, 0xED,
0xD0, 0x02, 0xAC, 0xC2, 0x96, 0x5F, 0xA0, 0xD7, 0x89, 0x6C, 0x40, 0xF5, 0x29, 0xC5, 0xAD, 0x98,
0x06, 0xF8, 0x33, 0x53, 0x3A, 0x5C, 0x2D, 0xEC, 0xE1, 0x05, 0x63, 0xA8, 0x20, 0xD5, 0x16, 0xA3,
0x52, 0x26, 0x4E, 0x39, 0xA8, 0xDB, 0x66, 0xA4, 0x09, 0x29, 0xA2, 0xE4, 0x39, 0x59, 0xD6, 0x59,
0x0D, 0xE9, 0xD5, 0x5C, 0x96, 0x15, 0x59, 0x2C, 0xE5, 0xC9, 0x55, 0xDE, 0x01, 0xF6, 0x41, 0xB9,
0x57, 0x9F, 0x72, 0x06, 0xD5, 0x61, 0x70, 0xDE, 0x71, 0x58, 0xE8, 0xCA, 0x87, 0xA7, 0x49, 0x50,
0xDE, 0x74, 0x6A, 0x42, 0x71, 0xFE, 0x41, 0x19, 0xB4, 0x84, 0x5F, 0xD4, 0xA5, 0xE9, 0x23, 0xFB,
0x79, 0x42, 0x37, 0x03, 0xFA, 0x36, 0x19, 0x6D, 0x9A, 0x79, 0x0A, 0x65, 0xE8, 0xFE, 0x21, 0x22,
0xF8, 0xA3, 0x82, 0x5A, 0x8C, 0xA3, 0x43, 0x5B, 0x39, 0x26, 0x1F, 0xC2, 0x1A, 0xD4, 0x89, 0xD4,
0xF1, 0x21, 0x69, 0x97, 0x15, 0xA9, 0xF2, 0x56, 0x8F, 0xD0, 0x95, 0x77, 0x73, 0xA5, 0xD6, 0x73,
0x11, 0xC7, 0x60, 0x8B, 0xAE, 0x0C, 0x34, 0xE6, 0x24, 0x76, 0xCD, 0x9D, 0x0A, 0x08, 0xB7, 0xB6,
0x1B, 0xBC, 0x32, 0x3E, 0x1E, 0xA0, 0x67, 0x19, 0xB9, 0x42, 0x86, 0x10, 0xCB, 0x74, 0xBC, 0x5B,
0xDE, 0x69, 0xCA, 0xEB, 0x76, 0x7F, 0x78, 0x1C, 0x99, 0x44, 0x95, 0x4E, 0x83, 0x4F, 0x41, 0x5B,
0x8F, 0xB2, 0xBE, 0x9E, 0x9E, 0xE3, 0xC0, 0xDC, 0x1C, 0xAC, 0x19, 0x32, 0x32, 0x6F, 0x86, 0x79,
0x53, 0x51, 0x0B, 0x98, 0x5E, 0x2C, 0xF3, 0x71, 0x4C, 0x48, 0xBA, 0xF5, 0x6B, 0x00, 0x80, 0x8D,
0xD6, 0xFE, 0xE1, 0xEA, 0xD7, 0x72, 0xA9, 0x58, 0x5B, 0x8C, 0x71, 0xA0, 0x21, 0xBB, 0xC7, 0x55,
0x8A, 0xCF, 0x2E, 0x5F, 0x8A, 0x13, 0x86, 0x9F, 0x22, 0x74, 0x66, 0x6E, 0xDC, 0x9B, 0xE4, 0x06,
0x4F, 0x9E, 0x52, 0xFE, 0x3A, 0xD2, 0x86, 0x97, 0x63, 0x68, 0xD6, 0x16, 0x15, 0xED, 0x86, 0xE3,
0x2C, 0x49, 0x6F, 0x21, 0x20, 0xBA, 0xF3, 0xA8, 0xE7, 0xBF, 0xEF, 0x5C, 0x11, 0x08, 0xAF, 0xD0,
0x99, 0xDB, 0xC0, 0xEF, 0xB1, 0x6A, 0xB6, 0x60, 0x05, 0x58, 0xFD, 0x8E, 0x56, 0x1D, 0xB8, 0x8B,
0xC6, 0x3F, 0xB0, 0xAE, 0x5E, 0x6B, 0xEA, 0x8F, 0x29, 0x73, 0xBA, 0x49, 0xE3, 0x93, 0x1C, 0x52,
0x3B, 0x07, 0xAB, 0xF8, 0x44, 0x8B, 0xB7, 0xAF, 0xB4, 0x34, 0xA4, 0xA3, 0x6F, 0x66, 0xD4, 0xA1,
0x94, 0x58, 0x13, 0x7B, 0xE0, 0x42, 0x7F, 0x87, 0xC1, 0xE0, 0x41, 0xF3, 0xE4, 0x91, 0xFE, 0x69,
0xD6, 0x97, 0xEE, 0x61, 0xA3, 0xBB, 0x1B, 0xA5, 0xA3, 0x20, 0xB3, 0xD3, 0x09, 0x00, 0xBD, 0x50,
0xDE, 0xC4, 0x93, 0x1C, 0x7D, 0x7D, 0xB8, 0x1A, 0xD1, 0x44, 0x2A, 0x31, 0x3F, 0x2C, 0x8A, 0xAC,
0x59, 0x34, 0x2D, 0x8C, 0xE4, 0x33, 0x50, 0xD2, 0x53, 0x5D, 0x2F, 0x3B, 0xE0, 0x59, 0x12, 0xE8,
0x95, 0xDE, 0x06, 0x38, 0x52, 0x37, 0xB8, 0x1E, 0xF3, 0xC2, 0x64, 0x5B, 0x23, 0x31, 0x6B, 0x8A,
0x5A, 0x80, 0xCE, 0x36, 0xB7, 0xBE, 0x2D, 0x2D, 0x4B, 0x31, 0x03, 0x29, 0xB5, 0x68, 0x05, 0x4B,
0x3B, 0xDE, 0x07, 0xBA, 0xC3, 0xE3, 0xF9, 0x35, 0x1A, 0xDE, 0x4B, 0xB3, 0x86, 0x8A, 0x5C, 0x23,
0xA7, 0xC6, 0x2D, 0xE0, 0x01, 0x1E, 0x00, 0x6A, 0xC0, 0xF0, 0x9E, 0x20, 0x47, 0xA0, 0xF1, 0x2F,
0xEF, 0x3F, 0x3F, 0xD0, 0x2C, 0x92, 0x3A, 0x05, 0x07, 0x6B, 0x45, 0x73, 0x80, 0x45, 0x2A, 0xC6,
0x4C, 0xE8, 0x98, 0x51, 0x33, 0xE6, 0x5B, 0x90, 0xFC, 0x4A, 0xD2, 0x35, 0x0C, 0x57, 0x02, 0xDE,
0x61, 0x00, 0xCE, 0xE1, 0x73, 0xA6, 0x94, 0xF7, 0x9B, 0x0B, 0xB9, 0xA3, 0x5E, 0xE0, 0xF1, 0x54,
0x36, 0x28, 0xE6, 0xD6, 0x2E, 0xE1, 0x1C, 0x85, 0x23, 0x36, 0x7E, 0x5C, 0x48, 0xB1, 0x95, 0xA1,
0x33, 0x8A, 0x2E, 0x06, 0xBC, 0xAC, 0x7F, 0x08, 0xB8, 0x6D, 0xE9, 0x23, 0xF5, 0x77, 0x6D, 0xB5,
0x8E, 0x35, 0x9B, 0x4B, 0xC9, 0x6E, 0xE2, 0x69, 0xEA, 0x72, 0x04, 0xA5, 0x9C, 0x13, 0x28, 0xB7,
0x7D, 0x8A, 0x40, 0xC1, 0xDE, 0x03, 0xBF, 0x75, 0x7B, 0xBA, 0x46, 0x64, 0x2E, 0xA3, 0x1F, 0x1D,
0x51, 0xD7, 0x96, 0xA8, 0xC4, 0xFC, 0x28, 0xCD, 0x09, 0xD2, 0xB4, 0x37, 0x42, 0x0B, 0xB3, 0x7C,
0x2E, 0xA1, 0xFA, 0x20, 0x16, 0xF1, 0xF2, 0x70, 0xE6, 0x90, 0x25, 0xDB, 0xE5, 0x01, 0xD5, 0x45,
0xC4, 0x43, 0x50, 0x49, 0xDC, 0xF0, 0xA2, 0x39, 0x4F, 0x9D, 0x0E, 0xC1, 0x66, 0x78, 0x14, 0x2A,
0xA3, 0x82, 0xA8, 0x1E, 0x9E, 0x29, 0x8F, 0x03, 0xD6, 0xBC, 0x3C, 0xB8, 0x5B, 0xD1, 0xC2, 0x4B,
0x82, 0xD2, 0x34, 0x37, 0x33, 0x5C, 0x89, 0x8B, 0x00, 0x3B, 0x5F, 0xD7, 0xEB, 0x02, 0x98, 0x46,
0xBC, 0x47, 0xF3, 0xEB, 0xFA, 0xC5, 0x6F, 0x2E, 0x99, 0x65, 0x59, 0x8D, 0x0A, 0xC8, 0x7E, 0xC5,
0x11, 0x71, 0x9F, 0x04, 0xE1, 0xB2, 0x92, 0xAE, 0xCA, 0xCB, 0x6C, 0xF1, 0x0A, 0xBF, 0x76, 0x24,
0x1C, 0xA1, 0xEC, 0x91, 0xE9, 0xEC, 0xFD, 0x44, 0xE1, 0x47, 0x2C, 0xC0, 0xC9, 0xEC, 0x35, 0x1A,
0x8A, 0xF5, 0x9C, 0x24, 0xF2, 0x5B, 0x7A, 0x27, 0x0C, 0x85, 0x02, 0xFB, 0x65, 0xF0, 0x14, 0xA4,
0x51, 0x5B, 0xD9, 0xB2, 0xAC, 0xC6, 0x21, 0x02, 0xFA, 0x2B, 0x28, 0x7A, 0x54, 0xC5, 0x69, 0xFD,
0x7F, 0x62, 0xD2, 0x64, 0x07, 0x65, 0x0C, 0xAF, 0xC4, 0xD8, 0x3F, 0xD0, 0xCC, 0x65, 0x5F, 0x7D,
0x67, 0xFC, 0x14, 0xFA, 0x1F, 0x76, 0xDD, 0x0E, 0xEE, 0xB9, 0xCA, 0x97, 0xEE, 0x8B, 0xCB, 0xA1,
0xA0, 0x26, 0x00, 0x46, 0x11, 0xAE, 0x00, 0xA4, 0x7B, 0xB7, 0xFE, 0x66, 0xCA, 0x0A, 0x81, 0x06,
0x91, 0x19, 0x0E, 0x8C, 0x96, 0x0A, 0x50, 0x7F, 0xA2, 0x1E, 0x31, 0x50, 0x4C, 0x1D, 0x92, 0xD4,
0xC5, 0x17, 0x50, 0x21, 0xEB, 0xA9, 0x1E, 0x87, 0x16, 0x85, 0xBD, 0xC5, 0x47, 0x9F, 0xE8, 0xEA,
0x92, 0xBB, 0x33, 0x68, 0xE7, 0x2F, 0xC6, 0x6A, 0x6F, 0x42, 0xB9, 0x69, 0x83, 0x97, 0xE7, 0xC8,
0x56, 0x05, 0x6F, 0x35, 0xF6, 0x03, 0x86, 0x61, 0x0C, 0xEB, 0xD4, 0x8C, 0x8B, 0x52, 0x0A, 0x8C,
0xD0, 0x92, 0x18, 0x69, 0x94, 0x19, 0x1E, 0x1A, 0xE6, 0x28, 0x9E, 0x46, 0x1D, 0x93, 0x95, 0xF7,
0xF5, 0x87, 0xB1, 0xE3, 0x5B, 0x8B, 0x02, 0xB3, 0x34, 0x48, 0xCE, 0xAA, 0xBC, 0x1F, 0x9C, 0x80,
0x06, 0x6F, 0xB9, 0xB7, 0x03, 0x4B, 0x9F, 0xA1, 0x71, 0x91, 0xAA, 0x43, 0x39, 0x62, 0x87, 0xCB,
0x68, 0xBD, 0x9C, 0xD0, 0x32, 0x88, 0x5C, 0x7E, 0x6E, 0x6A, 0x39, 0x95, 0x37, 0x19, 0x40, 0x38,
0x00, 0x41, 0x08, 0xA2, 0x33, 0xBD, 0x30, 0xC0
};

1
src/decimal-pi.txt Normal file

File diff suppressed because one or more lines are too long

View file

@ -2013,21 +2013,28 @@ decimal_p decimal::fact(decimal_r x)
//
// ============================================================================
void decimal::init_constants()
#include "decimal-pi.h"
decimal::ccache &decimal::constants()
// ----------------------------------------------------------------------------
// Initialize the constants used for adjustments
// ----------------------------------------------------------------------------
{
}
decimal_p decimal::pi()
// ----------------------------------------------------------------------------
// Return a representation of pi as a decimal
// ----------------------------------------------------------------------------
{
return nullptr;
static ccache *cst = nullptr;
if (!cst)
{
// operator new support purposefully not linked in embedded versions
cst = (ccache *) malloc(sizeof(ccache));
new(cst) ccache;
}
size_t precision = Settings.Precision();
if (cst->precision != precision)
{
size_t nkigs = (precision + 2) / 3;
cst->pi = rt.make<decimal>(1, nkigs, gcbytes(decimal_pi));
cst->precision = precision;
}
return *cst;
}
@ -2048,8 +2055,9 @@ decimal_p decimal::adjust_from_angle() const
decimal_g x = this;
decimal_g ratio = rt.make<decimal>(half_circle);
ratio = ratio / decimal_g(pi());
return x * ratio;
x = x * ratio;
x = x / pi();
return x;
}
@ -2070,8 +2078,9 @@ decimal_p decimal::adjust_to_angle() const
decimal_g x = this;
decimal_g ratio = rt.make<decimal>(half_circle);
ratio = ratio / decimal_g(pi());
return x / ratio;
x = x / ratio;
x = x * pi();
return x;
}

View file

@ -90,6 +90,7 @@ struct decimal : algebraic
{
byte *p = (byte *) payload(this);
p = leb128(p, exp);
p = leb128(p, nkig);
memcpy(p, kig.Safe(), (nkig * 10 + 7) / 8);
}
static size_t required_memory(id type, int exp, size_t n, gcbytes UNUSED)
@ -459,17 +460,31 @@ struct decimal : algebraic
static decimal_p fact(decimal_r x);
// ========================================================================
//
// Support for math functions
//
// ========================================================================
static decimal_p pi();
struct ccache
// ------------------------------------------------------------------------
// Constants are re-created whenever precision changes
// ------------------------------------------------------------------------
{
ccache(): precision() {}
size_t precision;
decimal_g pi;
};
static ccache &constants();
static decimal_p pi() { return constants().pi; }
decimal_p adjust_from_angle() const;
decimal_p adjust_to_angle() const;
static bool adjust_to_angle(algebraic_g &x);
static void init_constants();
public:
OBJECT_DECL(decimal);

View file

@ -144,7 +144,7 @@ int main(int argc, char **argv)
printf("%zu digits, %zu kigits, %zu bytes\n", digits, kigits, bytes);
printf("\n");
printf("unsigned char %s[%zu] =\n{", name, bytes);
printf("static const byte %s[%zu] =\n{", name, bytes);
for (size_t b = 0; b < bytes; b++)
printf("%s0x%02X%s",
b % 16 ? " " : "\n ",