diff --git a/bench/resources/README.md b/bench/resources/README.md
index 7f2dbb62..9a69caad 100644
--- a/bench/resources/README.md
+++ b/bench/resources/README.md
@@ -12,3 +12,6 @@ Licensed under Apache 2.0, see https://github.com/google/jsonnet/blob/7d1cbf8e69
## go_suite
These are benchmarks copied from the Go Jsonnet implementation's test suite.
Licensed under Apache 2.0, see https://github.com/google/go-jsonnet/blob/10aef6a96ca825c97c87df137a837e39f5df174c/LICENSE
+
+## sjsonnet_suite
+Benchmarks created by this project.
diff --git a/bench/resources/sjsonnet_suite/setDiff.jsonnet b/bench/resources/sjsonnet_suite/setDiff.jsonnet
new file mode 100644
index 00000000..7af93fe5
--- /dev/null
+++ b/bench/resources/sjsonnet_suite/setDiff.jsonnet
@@ -0,0 +1,22 @@
+{
+ local sets = [
+ [2,3,21,23,26,31,49,51,56,68,78,81,84,91,98,100,111,114,116,133,141,149,159,166,167,169,178,184,185,186,188,190,205,208,209,215,226,227,232,236,239,240,243,246,252,255,259,260,261,265,269,287,290,304,309,328,340,344,351,352,373,391,396,397,399,407,409,411,413,415,418,419,431,434,435,436,441,443,446,462,465,476,478,480,488,491,494,499,518,520,522,539,549,553,554,557,564,577,584,586,588,611,612,615,622,627,629,630,634,639,645,663,673,674,680,684,690,692,706,707,709,715,721,727,735,737,740,746,749,754,756,764,767,769,779,780,785,787,794,800,802,808,811,818,821,843,855,859,863,867,868,882,886,891,896,901,906,907,911,917,918,924,933,936,943,945,947,950,953,955,958,959,963,969,970,978,982,984,985,986,996],
+ [2,5,8,15,16,19,22,23,32,43,58,61,72,73,80,91,94,96,102,107,108,110,113,119,128,130,132,141,143,156,157,166,168,171,177,178,185,194,198,210,215,221,222,228,233,250,251,259,267,273,274,284,293,297,300,306,307,328,333,337,339,344,346,347,348,366,374,376,379,381,383,396,397,412,415,417,419,421,423,424,427,433,446,453,458,459,462,472,473,474,498,501,512,514,535,548,557,572,576,584,601,603,618,623,629,630,634,639,650,654,658,660,667,678,692,696,698,703,705,706,712,716,718,722,730,734,736,745,754,755,756,769,772,782,784,791,792,794,798,799,802,812,815,824,826,831,840,843,858,860,864,868,873,881,882,883,884,887,888,890,895,896,900,924,931,934,938,940,950,953,955,959,963,972,974,985,998],
+ [1,3,6,15,31,32,42,44,55,63,64,67,69,70,81,87,88,89,93,100,104,111,119,123,130,132,141,143,151,154,159,161,167,168,170,174,179,180,181,188,192,197,198,203,222,229,237,244,245,248,253,262,272,289,290,300,307,308,309,311,315,320,331,332,337,340,343,350,352,357,359,361,367,369,381,396,397,402,411,415,420,426,432,433,439,447,452,455,459,461,472,477,483,486,504,505,526,535,538,542,548,553,556,560,562,563,567,578,580,585,586,587,593,599,610,621,631,639,650,651,653,670,672,675,677,679,680,686,691,698,705,708,713,721,726,727,739,742,743,747,755,758,760,778,790,795,796,800,802,803,808,818,823,827,828,838,844,848,849,862,866,870,885,888,908,919,921,927,950,953,959,963,964,968,976,992,1000],
+ [1,13,16,27,35,50,53,58,65,66,67,70,71,72,73,74,88,95,96,98,99,106,112,116,119,133,134,136,139,143,155,166,170,179,183,186,187,190,193,195,203,204,211,212,225,234,235,237,238,243,248,254,261,265,267,268,277,279,293,314,334,350,351,352,354,358,364,368,371,372,376,394,405,409,410,422,433,437,439,461,463,470,473,484,492,493,511,516,528,545,550,552,554,558,561,565,588,605,613,625,626,630,631,644,653,660,664,671,686,690,692,694,696,706,714,715,717,720,721,722,723,727,738,744,745,753,755,763,771,772,776,779,784,786,788,793,794,795,798,799,801,811,816,817,838,841,844,845,857,858,865,869,872,878,888,892,894,895,896,911,915,916,921,922,934,937,940,947,951,952,955,957,958,978,982,987,997,998],
+ [2,7,9,21,22,24,30,37,42,52,65,67,88,89,90,132,136,140,141,142,144,152,153,156,167,171,179,181,190,193,195,196,200,209,212,231,242,246,249,253,261,277,286,295,301,304,312,319,323,328,334,341,342,346,349,351,354,364,368,369,380,382,383,384,397,413,414,415,419,421,433,434,437,448,454,465,485,486,490,499,504,506,510,517,525,526,527,539,540,543,545,553,554,561,573,574,581,588,591,594,596,605,606,608,631,639,640,645,649,650,663,694,696,697,707,709,714,715,716,721,724,730,731,732,737,739,740,742,749,755,761,767,773,774,777,782,787,792,801,802,804,806,810,811,830,837,841,843,846,848,850,853,856,869,875,878,879,880,881,885,889,897,900,905,907,920,921,930,934,953,956,966,977,986,988,991,996],
+ [3,11,15,20,31,33,38,48,50,56,59,60,72,75,78,88,95,96,97,103,113,125,127,130,131,132,134,142,149,153,178,185,187,195,219,222,223,247,251,252,258,261,273,277,281,292,295,304,306,308,309,319,322,326,327,357,368,376,387,390,394,414,433,435,438,447,455,473,477,488,489,490,501,509,511,517,534,537,539,545,546,557,558,566,579,585,589,600,603,606,609,616,620,621,636,638,639,645,652,670,671,679,687,703,706,707,720,722,723,724,728,733,739,744,746,747,751,752,754,757,758,764,776,781,783,785,787,789,795,797,803,805,810,811,812,815,816,829,837,847,856,858,860,862,870,881,886,890,894,895,896,900,914,924,927,932,933,935,938,939,948,970,971,973,974,975,976,982,990,1000],
+ [2,7,9,12,13,15,17,18,19,27,29,33,41,42,45,50,60,62,64,74,81,84,85,90,92,94,99,104,106,111,112,115,121,125,126,143,152,153,160,163,172,174,177,181,189,199,203,211,212,224,227,231,235,238,239,259,262,266,272,279,280,284,288,290,293,302,320,337,340,342,351,361,364,365,366,373,374,377,389,392,399,408,410,415,423,439,452,454,463,464,475,488,491,498,500,503,518,519,520,526,529,536,537,538,539,547,550,555,557,560,561,564,567,571,573,581,597,610,615,618,619,625,629,640,650,652,657,662,669,676,682,683,689,699,700,728,732,735,737,742,743,748,757,769,772,789,798,799,801,809,813,815,816,824,825,826,842,848,852,856,859,861,867,869,872,875,877,884,886,895,914,925,937,947,948,959,961,965,966,971,974,981,997,999],
+ [10,15,37,39,40,69,71,72,73,74,75,78,79,86,87,90,98,104,106,116,124,131,132,133,138,151,157,159,160,164,168,178,180,182,204,211,213,217,218,228,233,240,244,246,247,250,257,259,262,270,272,276,289,293,300,332,335,341,344,349,363,376,390,397,406,410,414,427,431,433,437,446,447,453,459,460,461,465,468,472,476,496,501,512,516,520,523,529,530,531,534,545,551,555,562,566,569,579,584,585,589,593,595,596,600,614,615,616,629,634,647,650,651,653,654,656,659,675,679,692,713,718,720,722,727,741,744,746,750,753,754,762,763,764,765,766,767,775,777,779,780,782,785,787,789,794,800,801,810,812,817,824,828,830,833,836,838,842,845,847,851,883,884,887,891,892,896,904,907,916,917,927,939,943,961,963,964,983,984,989,998,999],
+ [6,10,11,14,17,24,27,28,55,56,64,70,88,93,94,95,97,98,110,116,117,118,120,124,125,129,132,137,138,141,150,153,156,158,159,161,166,167,175,180,183,184,185,188,189,191,198,211,220,221,222,232,237,243,251,260,270,278,290,298,303,307,310,315,322,323,328,343,357,364,365,369,387,392,414,433,448,455,456,462,478,479,482,483,496,500,509,511,512,521,523,525,530,536,540,544,545,553,561,564,571,572,577,578,581,601,602,606,620,625,633,637,642,643,644,650,657,662,665,674,675,683,689,690,693,698,704,708,744,753,757,764,767,773,777,780,781,794,799,801,803,827,830,832,836,845,846,855,859,863,864,870,876,885,887,891,894,897,901,902,910,915,916,920,923,930,939,948,956,957,967,970,972,977,981,983,985,994],
+ [1,7,9,12,25,26,32,33,38,52,55,64,74,75,80,84,94,100,103,117,121,132,133,134,135,137,145,157,174,175,178,182,189,194,197,217,218,222,230,240,242,249,257,259,270,271,275,276,277,282,285,298,301,302,305,306,310,315,316,318,328,329,330,336,350,365,367,377,381,384,402,406,416,424,425,428,440,443,448,449,452,457,469,473,480,482,488,495,506,511,512,517,527,531,535,537,543,545,557,567,579,585,596,599,615,618,622,624,627,628,633,636,639,641,645,647,653,655,659,660,692,700,705,712,715,716,717,718,720,722,726,732,735,736,745,758,785,795,796,798,805,806,808,815,817,819,823,826,839,845,849,850,854,872,878,880,884,885,887,888,893,898,901,906,914,924,928,932,941,942,967,969,971,975,976,982,988,994,999],
+ ],
+
+ foo: [
+ std.foldl(
+ function(a, b) std.setDiff(a, b),
+ sets[first+1:],
+ sets[first]
+ ) for first in std.range(0, std.length(sets) - 2)
+ ],
+}
diff --git a/bench/resources/sjsonnet_suite/setDiff.jsonnet.golden b/bench/resources/sjsonnet_suite/setDiff.jsonnet.golden
new file mode 100644
index 00000000..3a0a533d
--- /dev/null
+++ b/bench/resources/sjsonnet_suite/setDiff.jsonnet.golden
@@ -0,0 +1,701 @@
+{
+ "foo": [
+ [
+ 49,
+ 51,
+ 68,
+ 114,
+ 169,
+ 205,
+ 208,
+ 226,
+ 236,
+ 255,
+ 269,
+ 287,
+ 391,
+ 407,
+ 418,
+ 436,
+ 441,
+ 494,
+ 522,
+ 549,
+ 611,
+ 612,
+ 673,
+ 684,
+ 821,
+ 918,
+ 936,
+ 945
+ ],
+ [
+ 5,
+ 8,
+ 23,
+ 43,
+ 61,
+ 91,
+ 102,
+ 107,
+ 108,
+ 128,
+ 210,
+ 215,
+ 274,
+ 297,
+ 333,
+ 339,
+ 347,
+ 348,
+ 379,
+ 412,
+ 417,
+ 458,
+ 474,
+ 514,
+ 576,
+ 623,
+ 658,
+ 667,
+ 678,
+ 734,
+ 756,
+ 791,
+ 831,
+ 840,
+ 868,
+ 873,
+ 882,
+ 931
+ ],
+ [
+ 44,
+ 63,
+ 123,
+ 154,
+ 192,
+ 229,
+ 245,
+ 311,
+ 331,
+ 359,
+ 396,
+ 411,
+ 420,
+ 426,
+ 432,
+ 505,
+ 542,
+ 548,
+ 556,
+ 563,
+ 580,
+ 586,
+ 587,
+ 672,
+ 677,
+ 680,
+ 691,
+ 760,
+ 778,
+ 790,
+ 818,
+ 866,
+ 908,
+ 919,
+ 950,
+ 968,
+ 992
+ ],
+ [
+ 16,
+ 35,
+ 53,
+ 58,
+ 66,
+ 119,
+ 139,
+ 155,
+ 170,
+ 186,
+ 225,
+ 234,
+ 248,
+ 254,
+ 265,
+ 267,
+ 268,
+ 314,
+ 352,
+ 358,
+ 371,
+ 372,
+ 405,
+ 409,
+ 422,
+ 470,
+ 484,
+ 492,
+ 493,
+ 528,
+ 552,
+ 565,
+ 613,
+ 626,
+ 630,
+ 664,
+ 686,
+ 738,
+ 771,
+ 784,
+ 786,
+ 788,
+ 793,
+ 844,
+ 857,
+ 865,
+ 911,
+ 922,
+ 940,
+ 951,
+ 952,
+ 955,
+ 958,
+ 978,
+ 987
+ ],
+ [
+ 21,
+ 22,
+ 30,
+ 65,
+ 67,
+ 89,
+ 136,
+ 140,
+ 144,
+ 171,
+ 179,
+ 190,
+ 193,
+ 196,
+ 200,
+ 209,
+ 253,
+ 286,
+ 312,
+ 334,
+ 346,
+ 354,
+ 380,
+ 382,
+ 383,
+ 413,
+ 419,
+ 421,
+ 434,
+ 485,
+ 486,
+ 499,
+ 504,
+ 510,
+ 554,
+ 574,
+ 588,
+ 591,
+ 594,
+ 605,
+ 608,
+ 631,
+ 649,
+ 663,
+ 694,
+ 696,
+ 697,
+ 709,
+ 714,
+ 721,
+ 730,
+ 731,
+ 740,
+ 749,
+ 755,
+ 761,
+ 774,
+ 792,
+ 802,
+ 804,
+ 841,
+ 843,
+ 853,
+ 879,
+ 889,
+ 905,
+ 921,
+ 934,
+ 953,
+ 986,
+ 991,
+ 996
+ ],
+ [
+ 3,
+ 20,
+ 31,
+ 48,
+ 59,
+ 96,
+ 113,
+ 127,
+ 130,
+ 142,
+ 149,
+ 187,
+ 195,
+ 219,
+ 223,
+ 252,
+ 258,
+ 261,
+ 273,
+ 281,
+ 292,
+ 295,
+ 304,
+ 308,
+ 309,
+ 319,
+ 326,
+ 327,
+ 368,
+ 394,
+ 435,
+ 438,
+ 477,
+ 489,
+ 490,
+ 546,
+ 558,
+ 603,
+ 609,
+ 621,
+ 638,
+ 670,
+ 671,
+ 687,
+ 703,
+ 706,
+ 707,
+ 723,
+ 724,
+ 733,
+ 739,
+ 747,
+ 751,
+ 752,
+ 776,
+ 783,
+ 797,
+ 811,
+ 829,
+ 837,
+ 858,
+ 860,
+ 862,
+ 881,
+ 890,
+ 900,
+ 933,
+ 935,
+ 938,
+ 973,
+ 990,
+ 1000
+ ],
+ [
+ 2,
+ 13,
+ 18,
+ 19,
+ 29,
+ 41,
+ 42,
+ 45,
+ 50,
+ 60,
+ 62,
+ 81,
+ 85,
+ 92,
+ 99,
+ 111,
+ 112,
+ 115,
+ 126,
+ 143,
+ 152,
+ 163,
+ 172,
+ 177,
+ 181,
+ 199,
+ 203,
+ 212,
+ 224,
+ 227,
+ 231,
+ 235,
+ 238,
+ 239,
+ 266,
+ 279,
+ 280,
+ 284,
+ 288,
+ 320,
+ 337,
+ 340,
+ 342,
+ 351,
+ 361,
+ 366,
+ 373,
+ 374,
+ 389,
+ 399,
+ 408,
+ 415,
+ 423,
+ 439,
+ 454,
+ 463,
+ 464,
+ 475,
+ 491,
+ 498,
+ 503,
+ 518,
+ 519,
+ 526,
+ 538,
+ 539,
+ 547,
+ 550,
+ 560,
+ 573,
+ 597,
+ 610,
+ 619,
+ 640,
+ 652,
+ 669,
+ 676,
+ 682,
+ 699,
+ 728,
+ 737,
+ 742,
+ 743,
+ 748,
+ 769,
+ 772,
+ 809,
+ 813,
+ 816,
+ 825,
+ 848,
+ 852,
+ 856,
+ 861,
+ 867,
+ 869,
+ 875,
+ 877,
+ 886,
+ 895,
+ 925,
+ 937,
+ 947,
+ 959,
+ 965,
+ 966,
+ 974,
+ 997
+ ],
+ [
+ 15,
+ 37,
+ 39,
+ 40,
+ 69,
+ 71,
+ 72,
+ 73,
+ 78,
+ 79,
+ 86,
+ 87,
+ 90,
+ 104,
+ 106,
+ 131,
+ 151,
+ 160,
+ 164,
+ 168,
+ 204,
+ 213,
+ 228,
+ 233,
+ 244,
+ 246,
+ 247,
+ 250,
+ 262,
+ 272,
+ 289,
+ 293,
+ 300,
+ 332,
+ 335,
+ 341,
+ 344,
+ 349,
+ 363,
+ 376,
+ 390,
+ 397,
+ 410,
+ 427,
+ 431,
+ 437,
+ 446,
+ 447,
+ 453,
+ 459,
+ 460,
+ 461,
+ 465,
+ 468,
+ 472,
+ 476,
+ 501,
+ 516,
+ 520,
+ 529,
+ 534,
+ 551,
+ 555,
+ 562,
+ 566,
+ 569,
+ 584,
+ 589,
+ 593,
+ 595,
+ 600,
+ 614,
+ 616,
+ 629,
+ 634,
+ 651,
+ 654,
+ 656,
+ 679,
+ 713,
+ 727,
+ 741,
+ 746,
+ 750,
+ 754,
+ 762,
+ 763,
+ 765,
+ 766,
+ 775,
+ 779,
+ 782,
+ 787,
+ 789,
+ 800,
+ 810,
+ 812,
+ 824,
+ 828,
+ 833,
+ 838,
+ 842,
+ 847,
+ 851,
+ 883,
+ 892,
+ 896,
+ 904,
+ 907,
+ 917,
+ 927,
+ 943,
+ 961,
+ 963,
+ 964,
+ 984,
+ 989,
+ 998
+ ],
+ [
+ 6,
+ 10,
+ 11,
+ 14,
+ 17,
+ 24,
+ 27,
+ 28,
+ 56,
+ 70,
+ 88,
+ 93,
+ 95,
+ 97,
+ 98,
+ 110,
+ 116,
+ 118,
+ 120,
+ 124,
+ 125,
+ 129,
+ 138,
+ 141,
+ 150,
+ 153,
+ 156,
+ 158,
+ 159,
+ 161,
+ 166,
+ 167,
+ 180,
+ 183,
+ 184,
+ 185,
+ 188,
+ 191,
+ 198,
+ 211,
+ 220,
+ 221,
+ 232,
+ 237,
+ 243,
+ 251,
+ 260,
+ 278,
+ 290,
+ 303,
+ 307,
+ 322,
+ 323,
+ 343,
+ 357,
+ 364,
+ 369,
+ 387,
+ 392,
+ 414,
+ 433,
+ 455,
+ 456,
+ 462,
+ 478,
+ 479,
+ 483,
+ 496,
+ 500,
+ 509,
+ 521,
+ 523,
+ 525,
+ 530,
+ 536,
+ 540,
+ 544,
+ 553,
+ 561,
+ 564,
+ 571,
+ 572,
+ 577,
+ 578,
+ 581,
+ 601,
+ 602,
+ 606,
+ 620,
+ 625,
+ 637,
+ 642,
+ 643,
+ 644,
+ 650,
+ 657,
+ 662,
+ 665,
+ 674,
+ 675,
+ 683,
+ 689,
+ 690,
+ 693,
+ 698,
+ 704,
+ 708,
+ 744,
+ 753,
+ 757,
+ 764,
+ 767,
+ 773,
+ 777,
+ 780,
+ 781,
+ 794,
+ 799,
+ 801,
+ 803,
+ 827,
+ 830,
+ 832,
+ 836,
+ 846,
+ 855,
+ 859,
+ 863,
+ 864,
+ 870,
+ 876,
+ 891,
+ 894,
+ 897,
+ 902,
+ 910,
+ 915,
+ 916,
+ 920,
+ 923,
+ 930,
+ 939,
+ 948,
+ 956,
+ 957,
+ 970,
+ 972,
+ 977,
+ 981,
+ 983,
+ 985
+ ]
+ ]
+}
diff --git a/bench/resources/sjsonnet_suite/setInter.jsonnet b/bench/resources/sjsonnet_suite/setInter.jsonnet
new file mode 100644
index 00000000..d81d910f
--- /dev/null
+++ b/bench/resources/sjsonnet_suite/setInter.jsonnet
@@ -0,0 +1,22 @@
+{
+ local sets = [
+ [2,3,21,23,26,31,49,51,56,68,78,81,84,91,98,100,111,114,116,133,141,149,159,166,167,169,178,184,185,186,188,190,205,208,209,215,226,227,232,236,239,240,243,246,252,255,259,260,261,265,269,287,290,304,309,328,340,344,351,352,373,391,396,397,399,407,409,411,413,415,418,419,431,434,435,436,441,443,446,462,465,476,478,480,488,491,494,499,518,520,522,539,549,553,554,557,564,577,584,586,588,611,612,615,622,627,629,630,634,639,645,663,673,674,680,684,690,692,706,707,709,715,721,727,735,737,740,746,749,754,756,764,767,769,779,780,785,787,794,800,802,808,811,818,821,843,855,859,863,867,868,882,886,891,896,901,906,907,911,917,918,924,933,936,943,945,947,950,953,955,958,959,963,969,970,978,982,984,985,986,996],
+ [2,5,8,15,16,19,22,23,32,43,58,61,72,73,80,91,94,96,102,107,108,110,113,119,128,130,132,141,143,156,157,166,168,171,177,178,185,194,198,210,215,221,222,228,233,250,251,259,267,273,274,284,293,297,300,306,307,328,333,337,339,344,346,347,348,366,374,376,379,381,383,396,397,412,415,417,419,421,423,424,427,433,446,453,458,459,462,472,473,474,498,501,512,514,535,548,557,572,576,584,601,603,618,623,629,630,634,639,650,654,658,660,667,678,692,696,698,703,705,706,712,716,718,722,730,734,736,745,754,755,756,769,772,782,784,791,792,794,798,799,802,812,815,824,826,831,840,843,858,860,864,868,873,881,882,883,884,887,888,890,895,896,900,924,931,934,938,940,950,953,955,959,963,972,974,985,998],
+ [1,3,6,15,31,32,42,44,55,63,64,67,69,70,81,87,88,89,93,100,104,111,119,123,130,132,141,143,151,154,159,161,167,168,170,174,179,180,181,188,192,197,198,203,222,229,237,244,245,248,253,262,272,289,290,300,307,308,309,311,315,320,331,332,337,340,343,350,352,357,359,361,367,369,381,396,397,402,411,415,420,426,432,433,439,447,452,455,459,461,472,477,483,486,504,505,526,535,538,542,548,553,556,560,562,563,567,578,580,585,586,587,593,599,610,621,631,639,650,651,653,670,672,675,677,679,680,686,691,698,705,708,713,721,726,727,739,742,743,747,755,758,760,778,790,795,796,800,802,803,808,818,823,827,828,838,844,848,849,862,866,870,885,888,908,919,921,927,950,953,959,963,964,968,976,992,1000],
+ [1,13,16,27,35,50,53,58,65,66,67,70,71,72,73,74,88,95,96,98,99,106,112,116,119,133,134,136,139,143,155,166,170,179,183,186,187,190,193,195,203,204,211,212,225,234,235,237,238,243,248,254,261,265,267,268,277,279,293,314,334,350,351,352,354,358,364,368,371,372,376,394,405,409,410,422,433,437,439,461,463,470,473,484,492,493,511,516,528,545,550,552,554,558,561,565,588,605,613,625,626,630,631,644,653,660,664,671,686,690,692,694,696,706,714,715,717,720,721,722,723,727,738,744,745,753,755,763,771,772,776,779,784,786,788,793,794,795,798,799,801,811,816,817,838,841,844,845,857,858,865,869,872,878,888,892,894,895,896,911,915,916,921,922,934,937,940,947,951,952,955,957,958,978,982,987,997,998],
+ [2,7,9,21,22,24,30,37,42,52,65,67,88,89,90,132,136,140,141,142,144,152,153,156,167,171,179,181,190,193,195,196,200,209,212,231,242,246,249,253,261,277,286,295,301,304,312,319,323,328,334,341,342,346,349,351,354,364,368,369,380,382,383,384,397,413,414,415,419,421,433,434,437,448,454,465,485,486,490,499,504,506,510,517,525,526,527,539,540,543,545,553,554,561,573,574,581,588,591,594,596,605,606,608,631,639,640,645,649,650,663,694,696,697,707,709,714,715,716,721,724,730,731,732,737,739,740,742,749,755,761,767,773,774,777,782,787,792,801,802,804,806,810,811,830,837,841,843,846,848,850,853,856,869,875,878,879,880,881,885,889,897,900,905,907,920,921,930,934,953,956,966,977,986,988,991,996],
+ [3,11,15,20,31,33,38,48,50,56,59,60,72,75,78,88,95,96,97,103,113,125,127,130,131,132,134,142,149,153,178,185,187,195,219,222,223,247,251,252,258,261,273,277,281,292,295,304,306,308,309,319,322,326,327,357,368,376,387,390,394,414,433,435,438,447,455,473,477,488,489,490,501,509,511,517,534,537,539,545,546,557,558,566,579,585,589,600,603,606,609,616,620,621,636,638,639,645,652,670,671,679,687,703,706,707,720,722,723,724,728,733,739,744,746,747,751,752,754,757,758,764,776,781,783,785,787,789,795,797,803,805,810,811,812,815,816,829,837,847,856,858,860,862,870,881,886,890,894,895,896,900,914,924,927,932,933,935,938,939,948,970,971,973,974,975,976,982,990,1000],
+ [2,7,9,12,13,15,17,18,19,27,29,33,41,42,45,50,60,62,64,74,81,84,85,90,92,94,99,104,106,111,112,115,121,125,126,143,152,153,160,163,172,174,177,181,189,199,203,211,212,224,227,231,235,238,239,259,262,266,272,279,280,284,288,290,293,302,320,337,340,342,351,361,364,365,366,373,374,377,389,392,399,408,410,415,423,439,452,454,463,464,475,488,491,498,500,503,518,519,520,526,529,536,537,538,539,547,550,555,557,560,561,564,567,571,573,581,597,610,615,618,619,625,629,640,650,652,657,662,669,676,682,683,689,699,700,728,732,735,737,742,743,748,757,769,772,789,798,799,801,809,813,815,816,824,825,826,842,848,852,856,859,861,867,869,872,875,877,884,886,895,914,925,937,947,948,959,961,965,966,971,974,981,997,999],
+ [10,15,37,39,40,69,71,72,73,74,75,78,79,86,87,90,98,104,106,116,124,131,132,133,138,151,157,159,160,164,168,178,180,182,204,211,213,217,218,228,233,240,244,246,247,250,257,259,262,270,272,276,289,293,300,332,335,341,344,349,363,376,390,397,406,410,414,427,431,433,437,446,447,453,459,460,461,465,468,472,476,496,501,512,516,520,523,529,530,531,534,545,551,555,562,566,569,579,584,585,589,593,595,596,600,614,615,616,629,634,647,650,651,653,654,656,659,675,679,692,713,718,720,722,727,741,744,746,750,753,754,762,763,764,765,766,767,775,777,779,780,782,785,787,789,794,800,801,810,812,817,824,828,830,833,836,838,842,845,847,851,883,884,887,891,892,896,904,907,916,917,927,939,943,961,963,964,983,984,989,998,999],
+ [6,10,11,14,17,24,27,28,55,56,64,70,88,93,94,95,97,98,110,116,117,118,120,124,125,129,132,137,138,141,150,153,156,158,159,161,166,167,175,180,183,184,185,188,189,191,198,211,220,221,222,232,237,243,251,260,270,278,290,298,303,307,310,315,322,323,328,343,357,364,365,369,387,392,414,433,448,455,456,462,478,479,482,483,496,500,509,511,512,521,523,525,530,536,540,544,545,553,561,564,571,572,577,578,581,601,602,606,620,625,633,637,642,643,644,650,657,662,665,674,675,683,689,690,693,698,704,708,744,753,757,764,767,773,777,780,781,794,799,801,803,827,830,832,836,845,846,855,859,863,864,870,876,885,887,891,894,897,901,902,910,915,916,920,923,930,939,948,956,957,967,970,972,977,981,983,985,994],
+ [1,7,9,12,25,26,32,33,38,52,55,64,74,75,80,84,94,100,103,117,121,132,133,134,135,137,145,157,174,175,178,182,189,194,197,217,218,222,230,240,242,249,257,259,270,271,275,276,277,282,285,298,301,302,305,306,310,315,316,318,328,329,330,336,350,365,367,377,381,384,402,406,416,424,425,428,440,443,448,449,452,457,469,473,480,482,488,495,506,511,512,517,527,531,535,537,543,545,557,567,579,585,596,599,615,618,622,624,627,628,633,636,639,641,645,647,653,655,659,660,692,700,705,712,715,716,717,718,720,722,726,732,735,736,745,758,785,795,796,798,805,806,808,815,817,819,823,826,839,845,849,850,854,872,878,880,884,885,887,888,893,898,901,906,914,924,928,932,941,942,967,969,971,975,976,982,988,994,999],
+ ],
+
+ foo: [
+ std.foldl(
+ function(a, b) std.setInter(a, b),
+ sets[first+1:],
+ sets[first]
+ ) for first in std.range(0, std.length(sets) - 2)
+ ],
+}
diff --git a/bench/resources/sjsonnet_suite/setInter.jsonnet.golden b/bench/resources/sjsonnet_suite/setInter.jsonnet.golden
new file mode 100644
index 00000000..247c799f
--- /dev/null
+++ b/bench/resources/sjsonnet_suite/setInter.jsonnet.golden
@@ -0,0 +1,48 @@
+{
+ "foo": [
+ [ ],
+ [ ],
+ [ ],
+ [ ],
+ [ ],
+ [ ],
+ [ ],
+ [
+ 132,
+ 270,
+ 512,
+ 545,
+ 845,
+ 887
+ ],
+ [
+ 55,
+ 64,
+ 94,
+ 117,
+ 132,
+ 137,
+ 175,
+ 189,
+ 222,
+ 270,
+ 298,
+ 310,
+ 315,
+ 328,
+ 365,
+ 448,
+ 482,
+ 511,
+ 512,
+ 545,
+ 633,
+ 845,
+ 885,
+ 887,
+ 901,
+ 967,
+ 994
+ ]
+ ]
+}
diff --git a/bench/resources/sjsonnet_suite/setUnion.jsonnet b/bench/resources/sjsonnet_suite/setUnion.jsonnet
new file mode 100644
index 00000000..be473d4d
--- /dev/null
+++ b/bench/resources/sjsonnet_suite/setUnion.jsonnet
@@ -0,0 +1,22 @@
+{
+ local sets = [
+ [2,3,21,23,26,31,49,51,56,68,78,81,84,91,98,100,111,114,116,133,141,149,159,166,167,169,178,184,185,186,188,190,205,208,209,215,226,227,232,236,239,240,243,246,252,255,259,260,261,265,269,287,290,304,309,328,340,344,351,352,373,391,396,397,399,407,409,411,413,415,418,419,431,434,435,436,441,443,446,462,465,476,478,480,488,491,494,499,518,520,522,539,549,553,554,557,564,577,584,586,588,611,612,615,622,627,629,630,634,639,645,663,673,674,680,684,690,692,706,707,709,715,721,727,735,737,740,746,749,754,756,764,767,769,779,780,785,787,794,800,802,808,811,818,821,843,855,859,863,867,868,882,886,891,896,901,906,907,911,917,918,924,933,936,943,945,947,950,953,955,958,959,963,969,970,978,982,984,985,986,996],
+ [2,5,8,15,16,19,22,23,32,43,58,61,72,73,80,91,94,96,102,107,108,110,113,119,128,130,132,141,143,156,157,166,168,171,177,178,185,194,198,210,215,221,222,228,233,250,251,259,267,273,274,284,293,297,300,306,307,328,333,337,339,344,346,347,348,366,374,376,379,381,383,396,397,412,415,417,419,421,423,424,427,433,446,453,458,459,462,472,473,474,498,501,512,514,535,548,557,572,576,584,601,603,618,623,629,630,634,639,650,654,658,660,667,678,692,696,698,703,705,706,712,716,718,722,730,734,736,745,754,755,756,769,772,782,784,791,792,794,798,799,802,812,815,824,826,831,840,843,858,860,864,868,873,881,882,883,884,887,888,890,895,896,900,924,931,934,938,940,950,953,955,959,963,972,974,985,998],
+ [1,3,6,15,31,32,42,44,55,63,64,67,69,70,81,87,88,89,93,100,104,111,119,123,130,132,141,143,151,154,159,161,167,168,170,174,179,180,181,188,192,197,198,203,222,229,237,244,245,248,253,262,272,289,290,300,307,308,309,311,315,320,331,332,337,340,343,350,352,357,359,361,367,369,381,396,397,402,411,415,420,426,432,433,439,447,452,455,459,461,472,477,483,486,504,505,526,535,538,542,548,553,556,560,562,563,567,578,580,585,586,587,593,599,610,621,631,639,650,651,653,670,672,675,677,679,680,686,691,698,705,708,713,721,726,727,739,742,743,747,755,758,760,778,790,795,796,800,802,803,808,818,823,827,828,838,844,848,849,862,866,870,885,888,908,919,921,927,950,953,959,963,964,968,976,992,1000],
+ [1,13,16,27,35,50,53,58,65,66,67,70,71,72,73,74,88,95,96,98,99,106,112,116,119,133,134,136,139,143,155,166,170,179,183,186,187,190,193,195,203,204,211,212,225,234,235,237,238,243,248,254,261,265,267,268,277,279,293,314,334,350,351,352,354,358,364,368,371,372,376,394,405,409,410,422,433,437,439,461,463,470,473,484,492,493,511,516,528,545,550,552,554,558,561,565,588,605,613,625,626,630,631,644,653,660,664,671,686,690,692,694,696,706,714,715,717,720,721,722,723,727,738,744,745,753,755,763,771,772,776,779,784,786,788,793,794,795,798,799,801,811,816,817,838,841,844,845,857,858,865,869,872,878,888,892,894,895,896,911,915,916,921,922,934,937,940,947,951,952,955,957,958,978,982,987,997,998],
+ [2,7,9,21,22,24,30,37,42,52,65,67,88,89,90,132,136,140,141,142,144,152,153,156,167,171,179,181,190,193,195,196,200,209,212,231,242,246,249,253,261,277,286,295,301,304,312,319,323,328,334,341,342,346,349,351,354,364,368,369,380,382,383,384,397,413,414,415,419,421,433,434,437,448,454,465,485,486,490,499,504,506,510,517,525,526,527,539,540,543,545,553,554,561,573,574,581,588,591,594,596,605,606,608,631,639,640,645,649,650,663,694,696,697,707,709,714,715,716,721,724,730,731,732,737,739,740,742,749,755,761,767,773,774,777,782,787,792,801,802,804,806,810,811,830,837,841,843,846,848,850,853,856,869,875,878,879,880,881,885,889,897,900,905,907,920,921,930,934,953,956,966,977,986,988,991,996],
+ [3,11,15,20,31,33,38,48,50,56,59,60,72,75,78,88,95,96,97,103,113,125,127,130,131,132,134,142,149,153,178,185,187,195,219,222,223,247,251,252,258,261,273,277,281,292,295,304,306,308,309,319,322,326,327,357,368,376,387,390,394,414,433,435,438,447,455,473,477,488,489,490,501,509,511,517,534,537,539,545,546,557,558,566,579,585,589,600,603,606,609,616,620,621,636,638,639,645,652,670,671,679,687,703,706,707,720,722,723,724,728,733,739,744,746,747,751,752,754,757,758,764,776,781,783,785,787,789,795,797,803,805,810,811,812,815,816,829,837,847,856,858,860,862,870,881,886,890,894,895,896,900,914,924,927,932,933,935,938,939,948,970,971,973,974,975,976,982,990,1000],
+ [2,7,9,12,13,15,17,18,19,27,29,33,41,42,45,50,60,62,64,74,81,84,85,90,92,94,99,104,106,111,112,115,121,125,126,143,152,153,160,163,172,174,177,181,189,199,203,211,212,224,227,231,235,238,239,259,262,266,272,279,280,284,288,290,293,302,320,337,340,342,351,361,364,365,366,373,374,377,389,392,399,408,410,415,423,439,452,454,463,464,475,488,491,498,500,503,518,519,520,526,529,536,537,538,539,547,550,555,557,560,561,564,567,571,573,581,597,610,615,618,619,625,629,640,650,652,657,662,669,676,682,683,689,699,700,728,732,735,737,742,743,748,757,769,772,789,798,799,801,809,813,815,816,824,825,826,842,848,852,856,859,861,867,869,872,875,877,884,886,895,914,925,937,947,948,959,961,965,966,971,974,981,997,999],
+ [10,15,37,39,40,69,71,72,73,74,75,78,79,86,87,90,98,104,106,116,124,131,132,133,138,151,157,159,160,164,168,178,180,182,204,211,213,217,218,228,233,240,244,246,247,250,257,259,262,270,272,276,289,293,300,332,335,341,344,349,363,376,390,397,406,410,414,427,431,433,437,446,447,453,459,460,461,465,468,472,476,496,501,512,516,520,523,529,530,531,534,545,551,555,562,566,569,579,584,585,589,593,595,596,600,614,615,616,629,634,647,650,651,653,654,656,659,675,679,692,713,718,720,722,727,741,744,746,750,753,754,762,763,764,765,766,767,775,777,779,780,782,785,787,789,794,800,801,810,812,817,824,828,830,833,836,838,842,845,847,851,883,884,887,891,892,896,904,907,916,917,927,939,943,961,963,964,983,984,989,998,999],
+ [6,10,11,14,17,24,27,28,55,56,64,70,88,93,94,95,97,98,110,116,117,118,120,124,125,129,132,137,138,141,150,153,156,158,159,161,166,167,175,180,183,184,185,188,189,191,198,211,220,221,222,232,237,243,251,260,270,278,290,298,303,307,310,315,322,323,328,343,357,364,365,369,387,392,414,433,448,455,456,462,478,479,482,483,496,500,509,511,512,521,523,525,530,536,540,544,545,553,561,564,571,572,577,578,581,601,602,606,620,625,633,637,642,643,644,650,657,662,665,674,675,683,689,690,693,698,704,708,744,753,757,764,767,773,777,780,781,794,799,801,803,827,830,832,836,845,846,855,859,863,864,870,876,885,887,891,894,897,901,902,910,915,916,920,923,930,939,948,956,957,967,970,972,977,981,983,985,994],
+ [1,7,9,12,25,26,32,33,38,52,55,64,74,75,80,84,94,100,103,117,121,132,133,134,135,137,145,157,174,175,178,182,189,194,197,217,218,222,230,240,242,249,257,259,270,271,275,276,277,282,285,298,301,302,305,306,310,315,316,318,328,329,330,336,350,365,367,377,381,384,402,406,416,424,425,428,440,443,448,449,452,457,469,473,480,482,488,495,506,511,512,517,527,531,535,537,543,545,557,567,579,585,596,599,615,618,622,624,627,628,633,636,639,641,645,647,653,655,659,660,692,700,705,712,715,716,717,718,720,722,726,732,735,736,745,758,785,795,796,798,805,806,808,815,817,819,823,826,839,845,849,850,854,872,878,880,884,885,887,888,893,898,901,906,914,924,928,932,941,942,967,969,971,975,976,982,988,994,999],
+ ],
+
+ foo: [
+ std.foldl(
+ function(a, b) std.setUnion(a, b),
+ sets[first+1:],
+ sets[first]
+ ) for first in std.range(0, std.length(sets) - 2)
+ ],
+}
diff --git a/bench/resources/sjsonnet_suite/setUnion.jsonnet.golden b/bench/resources/sjsonnet_suite/setUnion.jsonnet.golden
new file mode 100644
index 00000000..0d16a498
--- /dev/null
+++ b/bench/resources/sjsonnet_suite/setUnion.jsonnet.golden
@@ -0,0 +1,5919 @@
+{
+ "foo": [
+ [
+ 1,
+ 2,
+ 3,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 35,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 55,
+ 56,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 81,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 102,
+ 103,
+ 104,
+ 106,
+ 107,
+ 108,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 163,
+ 164,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 203,
+ 204,
+ 205,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 215,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 255,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 265,
+ 266,
+ 267,
+ 268,
+ 269,
+ 270,
+ 271,
+ 272,
+ 273,
+ 274,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 284,
+ 285,
+ 286,
+ 287,
+ 288,
+ 289,
+ 290,
+ 292,
+ 293,
+ 295,
+ 297,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 309,
+ 310,
+ 311,
+ 312,
+ 314,
+ 315,
+ 316,
+ 318,
+ 319,
+ 320,
+ 322,
+ 323,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336,
+ 337,
+ 339,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 346,
+ 347,
+ 348,
+ 349,
+ 350,
+ 351,
+ 352,
+ 354,
+ 357,
+ 358,
+ 359,
+ 361,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 371,
+ 372,
+ 373,
+ 374,
+ 376,
+ 377,
+ 379,
+ 380,
+ 381,
+ 382,
+ 383,
+ 384,
+ 387,
+ 389,
+ 390,
+ 391,
+ 392,
+ 394,
+ 396,
+ 397,
+ 399,
+ 402,
+ 405,
+ 406,
+ 407,
+ 408,
+ 409,
+ 410,
+ 411,
+ 412,
+ 413,
+ 414,
+ 415,
+ 416,
+ 417,
+ 418,
+ 419,
+ 420,
+ 421,
+ 422,
+ 423,
+ 424,
+ 425,
+ 426,
+ 427,
+ 428,
+ 431,
+ 432,
+ 433,
+ 434,
+ 435,
+ 436,
+ 437,
+ 438,
+ 439,
+ 440,
+ 441,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 458,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 468,
+ 469,
+ 470,
+ 472,
+ 473,
+ 474,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 484,
+ 485,
+ 486,
+ 488,
+ 489,
+ 490,
+ 491,
+ 492,
+ 493,
+ 494,
+ 495,
+ 496,
+ 498,
+ 499,
+ 500,
+ 501,
+ 503,
+ 504,
+ 505,
+ 506,
+ 509,
+ 510,
+ 511,
+ 512,
+ 514,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 522,
+ 523,
+ 525,
+ 526,
+ 527,
+ 528,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 542,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 548,
+ 549,
+ 550,
+ 551,
+ 552,
+ 553,
+ 554,
+ 555,
+ 556,
+ 557,
+ 558,
+ 560,
+ 561,
+ 562,
+ 563,
+ 564,
+ 565,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 573,
+ 574,
+ 576,
+ 577,
+ 578,
+ 579,
+ 580,
+ 581,
+ 584,
+ 585,
+ 586,
+ 587,
+ 588,
+ 589,
+ 591,
+ 593,
+ 594,
+ 595,
+ 596,
+ 597,
+ 599,
+ 600,
+ 601,
+ 602,
+ 603,
+ 605,
+ 606,
+ 608,
+ 609,
+ 610,
+ 611,
+ 612,
+ 613,
+ 614,
+ 615,
+ 616,
+ 618,
+ 619,
+ 620,
+ 621,
+ 622,
+ 623,
+ 624,
+ 625,
+ 626,
+ 627,
+ 628,
+ 629,
+ 630,
+ 631,
+ 633,
+ 634,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 649,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 658,
+ 659,
+ 660,
+ 662,
+ 663,
+ 664,
+ 665,
+ 667,
+ 669,
+ 670,
+ 671,
+ 672,
+ 673,
+ 674,
+ 675,
+ 676,
+ 677,
+ 678,
+ 679,
+ 680,
+ 682,
+ 683,
+ 684,
+ 686,
+ 687,
+ 689,
+ 690,
+ 691,
+ 692,
+ 693,
+ 694,
+ 696,
+ 697,
+ 698,
+ 699,
+ 700,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707,
+ 708,
+ 709,
+ 712,
+ 713,
+ 714,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 721,
+ 722,
+ 723,
+ 724,
+ 726,
+ 727,
+ 728,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 750,
+ 751,
+ 752,
+ 753,
+ 754,
+ 755,
+ 756,
+ 757,
+ 758,
+ 760,
+ 761,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 769,
+ 771,
+ 772,
+ 773,
+ 774,
+ 775,
+ 776,
+ 777,
+ 778,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 784,
+ 785,
+ 786,
+ 787,
+ 788,
+ 789,
+ 790,
+ 791,
+ 792,
+ 793,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 799,
+ 800,
+ 801,
+ 802,
+ 803,
+ 804,
+ 805,
+ 806,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 815,
+ 816,
+ 817,
+ 818,
+ 819,
+ 821,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 829,
+ 830,
+ 831,
+ 832,
+ 833,
+ 836,
+ 837,
+ 838,
+ 839,
+ 840,
+ 841,
+ 842,
+ 843,
+ 844,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 853,
+ 854,
+ 855,
+ 856,
+ 857,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 865,
+ 866,
+ 867,
+ 868,
+ 869,
+ 870,
+ 872,
+ 873,
+ 875,
+ 876,
+ 877,
+ 878,
+ 879,
+ 880,
+ 881,
+ 882,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ 900,
+ 901,
+ 902,
+ 904,
+ 905,
+ 906,
+ 907,
+ 908,
+ 910,
+ 911,
+ 914,
+ 915,
+ 916,
+ 917,
+ 918,
+ 919,
+ 920,
+ 921,
+ 922,
+ 923,
+ 924,
+ 925,
+ 927,
+ 928,
+ 930,
+ 931,
+ 932,
+ 933,
+ 934,
+ 935,
+ 936,
+ 937,
+ 938,
+ 939,
+ 940,
+ 941,
+ 942,
+ 943,
+ 945,
+ 947,
+ 948,
+ 950,
+ 951,
+ 952,
+ 953,
+ 955,
+ 956,
+ 957,
+ 958,
+ 959,
+ 961,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 968,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 978,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 986,
+ 987,
+ 988,
+ 989,
+ 990,
+ 991,
+ 992,
+ 994,
+ 996,
+ 997,
+ 998,
+ 999,
+ 1000
+ ],
+ [
+ 1,
+ 2,
+ 3,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 35,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 48,
+ 50,
+ 52,
+ 53,
+ 55,
+ 56,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 81,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 102,
+ 103,
+ 104,
+ 106,
+ 107,
+ 108,
+ 110,
+ 111,
+ 112,
+ 113,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 163,
+ 164,
+ 166,
+ 167,
+ 168,
+ 170,
+ 171,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 203,
+ 204,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 215,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 237,
+ 238,
+ 239,
+ 240,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 265,
+ 266,
+ 267,
+ 268,
+ 270,
+ 271,
+ 272,
+ 273,
+ 274,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 284,
+ 285,
+ 286,
+ 288,
+ 289,
+ 290,
+ 292,
+ 293,
+ 295,
+ 297,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 309,
+ 310,
+ 311,
+ 312,
+ 314,
+ 315,
+ 316,
+ 318,
+ 319,
+ 320,
+ 322,
+ 323,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336,
+ 337,
+ 339,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 346,
+ 347,
+ 348,
+ 349,
+ 350,
+ 351,
+ 352,
+ 354,
+ 357,
+ 358,
+ 359,
+ 361,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 371,
+ 372,
+ 373,
+ 374,
+ 376,
+ 377,
+ 379,
+ 380,
+ 381,
+ 382,
+ 383,
+ 384,
+ 387,
+ 389,
+ 390,
+ 392,
+ 394,
+ 396,
+ 397,
+ 399,
+ 402,
+ 405,
+ 406,
+ 408,
+ 409,
+ 410,
+ 411,
+ 412,
+ 413,
+ 414,
+ 415,
+ 416,
+ 417,
+ 419,
+ 420,
+ 421,
+ 422,
+ 423,
+ 424,
+ 425,
+ 426,
+ 427,
+ 428,
+ 431,
+ 432,
+ 433,
+ 434,
+ 435,
+ 437,
+ 438,
+ 439,
+ 440,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 458,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 468,
+ 469,
+ 470,
+ 472,
+ 473,
+ 474,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 484,
+ 485,
+ 486,
+ 488,
+ 489,
+ 490,
+ 491,
+ 492,
+ 493,
+ 495,
+ 496,
+ 498,
+ 499,
+ 500,
+ 501,
+ 503,
+ 504,
+ 505,
+ 506,
+ 509,
+ 510,
+ 511,
+ 512,
+ 514,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 523,
+ 525,
+ 526,
+ 527,
+ 528,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 542,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 548,
+ 550,
+ 551,
+ 552,
+ 553,
+ 554,
+ 555,
+ 556,
+ 557,
+ 558,
+ 560,
+ 561,
+ 562,
+ 563,
+ 564,
+ 565,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 573,
+ 574,
+ 576,
+ 577,
+ 578,
+ 579,
+ 580,
+ 581,
+ 584,
+ 585,
+ 586,
+ 587,
+ 588,
+ 589,
+ 591,
+ 593,
+ 594,
+ 595,
+ 596,
+ 597,
+ 599,
+ 600,
+ 601,
+ 602,
+ 603,
+ 605,
+ 606,
+ 608,
+ 609,
+ 610,
+ 613,
+ 614,
+ 615,
+ 616,
+ 618,
+ 619,
+ 620,
+ 621,
+ 622,
+ 623,
+ 624,
+ 625,
+ 626,
+ 627,
+ 628,
+ 629,
+ 630,
+ 631,
+ 633,
+ 634,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 649,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 658,
+ 659,
+ 660,
+ 662,
+ 663,
+ 664,
+ 665,
+ 667,
+ 669,
+ 670,
+ 671,
+ 672,
+ 674,
+ 675,
+ 676,
+ 677,
+ 678,
+ 679,
+ 680,
+ 682,
+ 683,
+ 686,
+ 687,
+ 689,
+ 690,
+ 691,
+ 692,
+ 693,
+ 694,
+ 696,
+ 697,
+ 698,
+ 699,
+ 700,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707,
+ 708,
+ 709,
+ 712,
+ 713,
+ 714,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 721,
+ 722,
+ 723,
+ 724,
+ 726,
+ 727,
+ 728,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 750,
+ 751,
+ 752,
+ 753,
+ 754,
+ 755,
+ 756,
+ 757,
+ 758,
+ 760,
+ 761,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 769,
+ 771,
+ 772,
+ 773,
+ 774,
+ 775,
+ 776,
+ 777,
+ 778,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 784,
+ 785,
+ 786,
+ 787,
+ 788,
+ 789,
+ 790,
+ 791,
+ 792,
+ 793,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 799,
+ 800,
+ 801,
+ 802,
+ 803,
+ 804,
+ 805,
+ 806,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 815,
+ 816,
+ 817,
+ 818,
+ 819,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 829,
+ 830,
+ 831,
+ 832,
+ 833,
+ 836,
+ 837,
+ 838,
+ 839,
+ 840,
+ 841,
+ 842,
+ 843,
+ 844,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 853,
+ 854,
+ 855,
+ 856,
+ 857,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 865,
+ 866,
+ 867,
+ 868,
+ 869,
+ 870,
+ 872,
+ 873,
+ 875,
+ 876,
+ 877,
+ 878,
+ 879,
+ 880,
+ 881,
+ 882,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ 900,
+ 901,
+ 902,
+ 904,
+ 905,
+ 906,
+ 907,
+ 908,
+ 910,
+ 911,
+ 914,
+ 915,
+ 916,
+ 917,
+ 919,
+ 920,
+ 921,
+ 922,
+ 923,
+ 924,
+ 925,
+ 927,
+ 928,
+ 930,
+ 931,
+ 932,
+ 933,
+ 934,
+ 935,
+ 937,
+ 938,
+ 939,
+ 940,
+ 941,
+ 942,
+ 943,
+ 947,
+ 948,
+ 950,
+ 951,
+ 952,
+ 953,
+ 955,
+ 956,
+ 957,
+ 958,
+ 959,
+ 961,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 968,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 978,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 986,
+ 987,
+ 988,
+ 989,
+ 990,
+ 991,
+ 992,
+ 994,
+ 996,
+ 997,
+ 998,
+ 999,
+ 1000
+ ],
+ [
+ 1,
+ 2,
+ 3,
+ 6,
+ 7,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 35,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 44,
+ 45,
+ 48,
+ 50,
+ 52,
+ 53,
+ 55,
+ 56,
+ 58,
+ 59,
+ 60,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 81,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 103,
+ 104,
+ 106,
+ 110,
+ 111,
+ 112,
+ 113,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 163,
+ 164,
+ 166,
+ 167,
+ 168,
+ 170,
+ 171,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 203,
+ 204,
+ 209,
+ 211,
+ 212,
+ 213,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 237,
+ 238,
+ 239,
+ 240,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 265,
+ 266,
+ 267,
+ 268,
+ 270,
+ 271,
+ 272,
+ 273,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 284,
+ 285,
+ 286,
+ 288,
+ 289,
+ 290,
+ 292,
+ 293,
+ 295,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 309,
+ 310,
+ 311,
+ 312,
+ 314,
+ 315,
+ 316,
+ 318,
+ 319,
+ 320,
+ 322,
+ 323,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 334,
+ 335,
+ 336,
+ 337,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 346,
+ 349,
+ 350,
+ 351,
+ 352,
+ 354,
+ 357,
+ 358,
+ 359,
+ 361,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 371,
+ 372,
+ 373,
+ 374,
+ 376,
+ 377,
+ 380,
+ 381,
+ 382,
+ 383,
+ 384,
+ 387,
+ 389,
+ 390,
+ 392,
+ 394,
+ 396,
+ 397,
+ 399,
+ 402,
+ 405,
+ 406,
+ 408,
+ 409,
+ 410,
+ 411,
+ 413,
+ 414,
+ 415,
+ 416,
+ 419,
+ 420,
+ 421,
+ 422,
+ 423,
+ 424,
+ 425,
+ 426,
+ 427,
+ 428,
+ 431,
+ 432,
+ 433,
+ 434,
+ 435,
+ 437,
+ 438,
+ 439,
+ 440,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 468,
+ 469,
+ 470,
+ 472,
+ 473,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 484,
+ 485,
+ 486,
+ 488,
+ 489,
+ 490,
+ 491,
+ 492,
+ 493,
+ 495,
+ 496,
+ 498,
+ 499,
+ 500,
+ 501,
+ 503,
+ 504,
+ 505,
+ 506,
+ 509,
+ 510,
+ 511,
+ 512,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 523,
+ 525,
+ 526,
+ 527,
+ 528,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 542,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 548,
+ 550,
+ 551,
+ 552,
+ 553,
+ 554,
+ 555,
+ 556,
+ 557,
+ 558,
+ 560,
+ 561,
+ 562,
+ 563,
+ 564,
+ 565,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 573,
+ 574,
+ 577,
+ 578,
+ 579,
+ 580,
+ 581,
+ 584,
+ 585,
+ 586,
+ 587,
+ 588,
+ 589,
+ 591,
+ 593,
+ 594,
+ 595,
+ 596,
+ 597,
+ 599,
+ 600,
+ 601,
+ 602,
+ 603,
+ 605,
+ 606,
+ 608,
+ 609,
+ 610,
+ 613,
+ 614,
+ 615,
+ 616,
+ 618,
+ 619,
+ 620,
+ 621,
+ 622,
+ 624,
+ 625,
+ 626,
+ 627,
+ 628,
+ 629,
+ 630,
+ 631,
+ 633,
+ 634,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 649,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 659,
+ 660,
+ 662,
+ 663,
+ 664,
+ 665,
+ 669,
+ 670,
+ 671,
+ 672,
+ 674,
+ 675,
+ 676,
+ 677,
+ 679,
+ 680,
+ 682,
+ 683,
+ 686,
+ 687,
+ 689,
+ 690,
+ 691,
+ 692,
+ 693,
+ 694,
+ 696,
+ 697,
+ 698,
+ 699,
+ 700,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707,
+ 708,
+ 709,
+ 712,
+ 713,
+ 714,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 721,
+ 722,
+ 723,
+ 724,
+ 726,
+ 727,
+ 728,
+ 730,
+ 731,
+ 732,
+ 733,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 750,
+ 751,
+ 752,
+ 753,
+ 754,
+ 755,
+ 757,
+ 758,
+ 760,
+ 761,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 769,
+ 771,
+ 772,
+ 773,
+ 774,
+ 775,
+ 776,
+ 777,
+ 778,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 784,
+ 785,
+ 786,
+ 787,
+ 788,
+ 789,
+ 790,
+ 792,
+ 793,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 799,
+ 800,
+ 801,
+ 802,
+ 803,
+ 804,
+ 805,
+ 806,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 815,
+ 816,
+ 817,
+ 818,
+ 819,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 829,
+ 830,
+ 832,
+ 833,
+ 836,
+ 837,
+ 838,
+ 839,
+ 841,
+ 842,
+ 843,
+ 844,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 853,
+ 854,
+ 855,
+ 856,
+ 857,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 865,
+ 866,
+ 867,
+ 869,
+ 870,
+ 872,
+ 875,
+ 876,
+ 877,
+ 878,
+ 879,
+ 880,
+ 881,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ 900,
+ 901,
+ 902,
+ 904,
+ 905,
+ 906,
+ 907,
+ 908,
+ 910,
+ 911,
+ 914,
+ 915,
+ 916,
+ 917,
+ 919,
+ 920,
+ 921,
+ 922,
+ 923,
+ 924,
+ 925,
+ 927,
+ 928,
+ 930,
+ 932,
+ 933,
+ 934,
+ 935,
+ 937,
+ 938,
+ 939,
+ 940,
+ 941,
+ 942,
+ 943,
+ 947,
+ 948,
+ 950,
+ 951,
+ 952,
+ 953,
+ 955,
+ 956,
+ 957,
+ 958,
+ 959,
+ 961,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 968,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 978,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 986,
+ 987,
+ 988,
+ 989,
+ 990,
+ 991,
+ 992,
+ 994,
+ 996,
+ 997,
+ 998,
+ 999,
+ 1000
+ ],
+ [
+ 1,
+ 2,
+ 3,
+ 6,
+ 7,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 35,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 45,
+ 48,
+ 50,
+ 52,
+ 53,
+ 55,
+ 56,
+ 58,
+ 59,
+ 60,
+ 62,
+ 64,
+ 65,
+ 66,
+ 67,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 81,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 103,
+ 104,
+ 106,
+ 110,
+ 111,
+ 112,
+ 113,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 124,
+ 125,
+ 126,
+ 127,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 163,
+ 164,
+ 166,
+ 167,
+ 168,
+ 170,
+ 171,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 203,
+ 204,
+ 209,
+ 211,
+ 212,
+ 213,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 227,
+ 228,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 237,
+ 238,
+ 239,
+ 240,
+ 242,
+ 243,
+ 244,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 265,
+ 266,
+ 267,
+ 268,
+ 270,
+ 271,
+ 272,
+ 273,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 284,
+ 285,
+ 286,
+ 288,
+ 289,
+ 290,
+ 292,
+ 293,
+ 295,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 309,
+ 310,
+ 312,
+ 314,
+ 315,
+ 316,
+ 318,
+ 319,
+ 320,
+ 322,
+ 323,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 332,
+ 334,
+ 335,
+ 336,
+ 337,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 346,
+ 349,
+ 350,
+ 351,
+ 352,
+ 354,
+ 357,
+ 358,
+ 361,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 371,
+ 372,
+ 373,
+ 374,
+ 376,
+ 377,
+ 380,
+ 381,
+ 382,
+ 383,
+ 384,
+ 387,
+ 389,
+ 390,
+ 392,
+ 394,
+ 397,
+ 399,
+ 402,
+ 405,
+ 406,
+ 408,
+ 409,
+ 410,
+ 413,
+ 414,
+ 415,
+ 416,
+ 419,
+ 421,
+ 422,
+ 423,
+ 424,
+ 425,
+ 427,
+ 428,
+ 431,
+ 433,
+ 434,
+ 435,
+ 437,
+ 438,
+ 439,
+ 440,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 468,
+ 469,
+ 470,
+ 472,
+ 473,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 484,
+ 485,
+ 486,
+ 488,
+ 489,
+ 490,
+ 491,
+ 492,
+ 493,
+ 495,
+ 496,
+ 498,
+ 499,
+ 500,
+ 501,
+ 503,
+ 504,
+ 506,
+ 509,
+ 510,
+ 511,
+ 512,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 523,
+ 525,
+ 526,
+ 527,
+ 528,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 550,
+ 551,
+ 552,
+ 553,
+ 554,
+ 555,
+ 557,
+ 558,
+ 560,
+ 561,
+ 562,
+ 564,
+ 565,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 573,
+ 574,
+ 577,
+ 578,
+ 579,
+ 581,
+ 584,
+ 585,
+ 588,
+ 589,
+ 591,
+ 593,
+ 594,
+ 595,
+ 596,
+ 597,
+ 599,
+ 600,
+ 601,
+ 602,
+ 603,
+ 605,
+ 606,
+ 608,
+ 609,
+ 610,
+ 613,
+ 614,
+ 615,
+ 616,
+ 618,
+ 619,
+ 620,
+ 621,
+ 622,
+ 624,
+ 625,
+ 626,
+ 627,
+ 628,
+ 629,
+ 630,
+ 631,
+ 633,
+ 634,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 649,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 659,
+ 660,
+ 662,
+ 663,
+ 664,
+ 665,
+ 669,
+ 670,
+ 671,
+ 674,
+ 675,
+ 676,
+ 679,
+ 682,
+ 683,
+ 686,
+ 687,
+ 689,
+ 690,
+ 692,
+ 693,
+ 694,
+ 696,
+ 697,
+ 698,
+ 699,
+ 700,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707,
+ 708,
+ 709,
+ 712,
+ 713,
+ 714,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 721,
+ 722,
+ 723,
+ 724,
+ 726,
+ 727,
+ 728,
+ 730,
+ 731,
+ 732,
+ 733,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 750,
+ 751,
+ 752,
+ 753,
+ 754,
+ 755,
+ 757,
+ 758,
+ 761,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 769,
+ 771,
+ 772,
+ 773,
+ 774,
+ 775,
+ 776,
+ 777,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 784,
+ 785,
+ 786,
+ 787,
+ 788,
+ 789,
+ 792,
+ 793,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 799,
+ 800,
+ 801,
+ 802,
+ 803,
+ 804,
+ 805,
+ 806,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 815,
+ 816,
+ 817,
+ 819,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 829,
+ 830,
+ 832,
+ 833,
+ 836,
+ 837,
+ 838,
+ 839,
+ 841,
+ 842,
+ 843,
+ 844,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 853,
+ 854,
+ 855,
+ 856,
+ 857,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 865,
+ 867,
+ 869,
+ 870,
+ 872,
+ 875,
+ 876,
+ 877,
+ 878,
+ 879,
+ 880,
+ 881,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ 900,
+ 901,
+ 902,
+ 904,
+ 905,
+ 906,
+ 907,
+ 910,
+ 911,
+ 914,
+ 915,
+ 916,
+ 917,
+ 920,
+ 921,
+ 922,
+ 923,
+ 924,
+ 925,
+ 927,
+ 928,
+ 930,
+ 932,
+ 933,
+ 934,
+ 935,
+ 937,
+ 938,
+ 939,
+ 940,
+ 941,
+ 942,
+ 943,
+ 947,
+ 948,
+ 951,
+ 952,
+ 953,
+ 955,
+ 956,
+ 957,
+ 958,
+ 959,
+ 961,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 978,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 986,
+ 987,
+ 988,
+ 989,
+ 990,
+ 991,
+ 994,
+ 996,
+ 997,
+ 998,
+ 999,
+ 1000
+ ],
+ [
+ 1,
+ 2,
+ 3,
+ 6,
+ 7,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 45,
+ 48,
+ 50,
+ 52,
+ 55,
+ 56,
+ 59,
+ 60,
+ 62,
+ 64,
+ 65,
+ 67,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 81,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 103,
+ 104,
+ 106,
+ 110,
+ 111,
+ 112,
+ 113,
+ 115,
+ 116,
+ 117,
+ 118,
+ 120,
+ 121,
+ 124,
+ 125,
+ 126,
+ 127,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 163,
+ 164,
+ 166,
+ 167,
+ 168,
+ 171,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 203,
+ 204,
+ 209,
+ 211,
+ 212,
+ 213,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 227,
+ 228,
+ 230,
+ 231,
+ 232,
+ 233,
+ 235,
+ 237,
+ 238,
+ 239,
+ 240,
+ 242,
+ 243,
+ 244,
+ 246,
+ 247,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 266,
+ 270,
+ 271,
+ 272,
+ 273,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 284,
+ 285,
+ 286,
+ 288,
+ 289,
+ 290,
+ 292,
+ 293,
+ 295,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 309,
+ 310,
+ 312,
+ 315,
+ 316,
+ 318,
+ 319,
+ 320,
+ 322,
+ 323,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 332,
+ 334,
+ 335,
+ 336,
+ 337,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 346,
+ 349,
+ 350,
+ 351,
+ 354,
+ 357,
+ 361,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 373,
+ 374,
+ 376,
+ 377,
+ 380,
+ 381,
+ 382,
+ 383,
+ 384,
+ 387,
+ 389,
+ 390,
+ 392,
+ 394,
+ 397,
+ 399,
+ 402,
+ 406,
+ 408,
+ 410,
+ 413,
+ 414,
+ 415,
+ 416,
+ 419,
+ 421,
+ 423,
+ 424,
+ 425,
+ 427,
+ 428,
+ 431,
+ 433,
+ 434,
+ 435,
+ 437,
+ 438,
+ 439,
+ 440,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 468,
+ 469,
+ 472,
+ 473,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 485,
+ 486,
+ 488,
+ 489,
+ 490,
+ 491,
+ 495,
+ 496,
+ 498,
+ 499,
+ 500,
+ 501,
+ 503,
+ 504,
+ 506,
+ 509,
+ 510,
+ 511,
+ 512,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 523,
+ 525,
+ 526,
+ 527,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 550,
+ 551,
+ 553,
+ 554,
+ 555,
+ 557,
+ 558,
+ 560,
+ 561,
+ 562,
+ 564,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 573,
+ 574,
+ 577,
+ 578,
+ 579,
+ 581,
+ 584,
+ 585,
+ 588,
+ 589,
+ 591,
+ 593,
+ 594,
+ 595,
+ 596,
+ 597,
+ 599,
+ 600,
+ 601,
+ 602,
+ 603,
+ 605,
+ 606,
+ 608,
+ 609,
+ 610,
+ 614,
+ 615,
+ 616,
+ 618,
+ 619,
+ 620,
+ 621,
+ 622,
+ 624,
+ 625,
+ 627,
+ 628,
+ 629,
+ 631,
+ 633,
+ 634,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 649,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 659,
+ 660,
+ 662,
+ 663,
+ 665,
+ 669,
+ 670,
+ 671,
+ 674,
+ 675,
+ 676,
+ 679,
+ 682,
+ 683,
+ 687,
+ 689,
+ 690,
+ 692,
+ 693,
+ 694,
+ 696,
+ 697,
+ 698,
+ 699,
+ 700,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707,
+ 708,
+ 709,
+ 712,
+ 713,
+ 714,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 721,
+ 722,
+ 723,
+ 724,
+ 726,
+ 727,
+ 728,
+ 730,
+ 731,
+ 732,
+ 733,
+ 735,
+ 736,
+ 737,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 750,
+ 751,
+ 752,
+ 753,
+ 754,
+ 755,
+ 757,
+ 758,
+ 761,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 769,
+ 772,
+ 773,
+ 774,
+ 775,
+ 776,
+ 777,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 785,
+ 787,
+ 789,
+ 792,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 799,
+ 800,
+ 801,
+ 802,
+ 803,
+ 804,
+ 805,
+ 806,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 815,
+ 816,
+ 817,
+ 819,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 829,
+ 830,
+ 832,
+ 833,
+ 836,
+ 837,
+ 838,
+ 839,
+ 841,
+ 842,
+ 843,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 853,
+ 854,
+ 855,
+ 856,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 867,
+ 869,
+ 870,
+ 872,
+ 875,
+ 876,
+ 877,
+ 878,
+ 879,
+ 880,
+ 881,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ 900,
+ 901,
+ 902,
+ 904,
+ 905,
+ 906,
+ 907,
+ 910,
+ 914,
+ 915,
+ 916,
+ 917,
+ 920,
+ 921,
+ 923,
+ 924,
+ 925,
+ 927,
+ 928,
+ 930,
+ 932,
+ 933,
+ 934,
+ 935,
+ 937,
+ 938,
+ 939,
+ 941,
+ 942,
+ 943,
+ 947,
+ 948,
+ 953,
+ 956,
+ 957,
+ 959,
+ 961,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 986,
+ 988,
+ 989,
+ 990,
+ 991,
+ 994,
+ 996,
+ 997,
+ 998,
+ 999,
+ 1000
+ ],
+ [
+ 1,
+ 2,
+ 3,
+ 6,
+ 7,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 17,
+ 18,
+ 19,
+ 20,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 31,
+ 32,
+ 33,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 45,
+ 48,
+ 50,
+ 52,
+ 55,
+ 56,
+ 59,
+ 60,
+ 62,
+ 64,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 81,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 90,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 103,
+ 104,
+ 106,
+ 110,
+ 111,
+ 112,
+ 113,
+ 115,
+ 116,
+ 117,
+ 118,
+ 120,
+ 121,
+ 124,
+ 125,
+ 126,
+ 127,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 137,
+ 138,
+ 141,
+ 142,
+ 143,
+ 145,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 163,
+ 164,
+ 166,
+ 167,
+ 168,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 187,
+ 188,
+ 189,
+ 191,
+ 194,
+ 195,
+ 197,
+ 198,
+ 199,
+ 203,
+ 204,
+ 211,
+ 212,
+ 213,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 227,
+ 228,
+ 230,
+ 231,
+ 232,
+ 233,
+ 235,
+ 237,
+ 238,
+ 239,
+ 240,
+ 242,
+ 243,
+ 244,
+ 246,
+ 247,
+ 249,
+ 250,
+ 251,
+ 252,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 266,
+ 270,
+ 271,
+ 272,
+ 273,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 284,
+ 285,
+ 288,
+ 289,
+ 290,
+ 292,
+ 293,
+ 295,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 309,
+ 310,
+ 315,
+ 316,
+ 318,
+ 319,
+ 320,
+ 322,
+ 323,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 332,
+ 335,
+ 336,
+ 337,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 349,
+ 350,
+ 351,
+ 357,
+ 361,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 373,
+ 374,
+ 376,
+ 377,
+ 381,
+ 384,
+ 387,
+ 389,
+ 390,
+ 392,
+ 394,
+ 397,
+ 399,
+ 402,
+ 406,
+ 408,
+ 410,
+ 414,
+ 415,
+ 416,
+ 423,
+ 424,
+ 425,
+ 427,
+ 428,
+ 431,
+ 433,
+ 435,
+ 437,
+ 438,
+ 439,
+ 440,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 468,
+ 469,
+ 472,
+ 473,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 488,
+ 489,
+ 490,
+ 491,
+ 495,
+ 496,
+ 498,
+ 500,
+ 501,
+ 503,
+ 506,
+ 509,
+ 511,
+ 512,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 523,
+ 525,
+ 526,
+ 527,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 550,
+ 551,
+ 553,
+ 555,
+ 557,
+ 558,
+ 560,
+ 561,
+ 562,
+ 564,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 573,
+ 577,
+ 578,
+ 579,
+ 581,
+ 584,
+ 585,
+ 589,
+ 593,
+ 595,
+ 596,
+ 597,
+ 599,
+ 600,
+ 601,
+ 602,
+ 603,
+ 606,
+ 609,
+ 610,
+ 614,
+ 615,
+ 616,
+ 618,
+ 619,
+ 620,
+ 621,
+ 622,
+ 624,
+ 625,
+ 627,
+ 628,
+ 629,
+ 633,
+ 634,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 659,
+ 660,
+ 662,
+ 665,
+ 669,
+ 670,
+ 671,
+ 674,
+ 675,
+ 676,
+ 679,
+ 682,
+ 683,
+ 687,
+ 689,
+ 690,
+ 692,
+ 693,
+ 698,
+ 699,
+ 700,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707,
+ 708,
+ 712,
+ 713,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 722,
+ 723,
+ 724,
+ 726,
+ 727,
+ 728,
+ 732,
+ 733,
+ 735,
+ 736,
+ 737,
+ 739,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 750,
+ 751,
+ 752,
+ 753,
+ 754,
+ 757,
+ 758,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 769,
+ 772,
+ 773,
+ 775,
+ 776,
+ 777,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 785,
+ 787,
+ 789,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 799,
+ 800,
+ 801,
+ 803,
+ 805,
+ 806,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 815,
+ 816,
+ 817,
+ 819,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 829,
+ 830,
+ 832,
+ 833,
+ 836,
+ 837,
+ 838,
+ 839,
+ 842,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 854,
+ 855,
+ 856,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 867,
+ 869,
+ 870,
+ 872,
+ 875,
+ 876,
+ 877,
+ 878,
+ 880,
+ 881,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ 900,
+ 901,
+ 902,
+ 904,
+ 906,
+ 907,
+ 910,
+ 914,
+ 915,
+ 916,
+ 917,
+ 920,
+ 923,
+ 924,
+ 925,
+ 927,
+ 928,
+ 930,
+ 932,
+ 933,
+ 935,
+ 937,
+ 938,
+ 939,
+ 941,
+ 942,
+ 943,
+ 947,
+ 948,
+ 956,
+ 957,
+ 959,
+ 961,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 988,
+ 989,
+ 990,
+ 994,
+ 997,
+ 998,
+ 999,
+ 1000
+ ],
+ [
+ 1,
+ 2,
+ 6,
+ 7,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 17,
+ 18,
+ 19,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 32,
+ 33,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 45,
+ 50,
+ 52,
+ 55,
+ 56,
+ 60,
+ 62,
+ 64,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 81,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 90,
+ 92,
+ 93,
+ 94,
+ 95,
+ 97,
+ 98,
+ 99,
+ 100,
+ 103,
+ 104,
+ 106,
+ 110,
+ 111,
+ 112,
+ 115,
+ 116,
+ 117,
+ 118,
+ 120,
+ 121,
+ 124,
+ 125,
+ 126,
+ 129,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 137,
+ 138,
+ 141,
+ 143,
+ 145,
+ 150,
+ 151,
+ 152,
+ 153,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 163,
+ 164,
+ 166,
+ 167,
+ 168,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 188,
+ 189,
+ 191,
+ 194,
+ 197,
+ 198,
+ 199,
+ 203,
+ 204,
+ 211,
+ 212,
+ 213,
+ 217,
+ 218,
+ 220,
+ 221,
+ 222,
+ 224,
+ 227,
+ 228,
+ 230,
+ 231,
+ 232,
+ 233,
+ 235,
+ 237,
+ 238,
+ 239,
+ 240,
+ 242,
+ 243,
+ 244,
+ 246,
+ 247,
+ 249,
+ 250,
+ 251,
+ 257,
+ 259,
+ 260,
+ 262,
+ 266,
+ 270,
+ 271,
+ 272,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 282,
+ 284,
+ 285,
+ 288,
+ 289,
+ 290,
+ 293,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 305,
+ 306,
+ 307,
+ 310,
+ 315,
+ 316,
+ 318,
+ 320,
+ 322,
+ 323,
+ 328,
+ 329,
+ 330,
+ 332,
+ 335,
+ 336,
+ 337,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 349,
+ 350,
+ 351,
+ 357,
+ 361,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 369,
+ 373,
+ 374,
+ 376,
+ 377,
+ 381,
+ 384,
+ 387,
+ 389,
+ 390,
+ 392,
+ 397,
+ 399,
+ 402,
+ 406,
+ 408,
+ 410,
+ 414,
+ 415,
+ 416,
+ 423,
+ 424,
+ 425,
+ 427,
+ 428,
+ 431,
+ 433,
+ 437,
+ 439,
+ 440,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 468,
+ 469,
+ 472,
+ 473,
+ 475,
+ 476,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 488,
+ 491,
+ 495,
+ 496,
+ 498,
+ 500,
+ 501,
+ 503,
+ 506,
+ 509,
+ 511,
+ 512,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 523,
+ 525,
+ 526,
+ 527,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 543,
+ 544,
+ 545,
+ 547,
+ 550,
+ 551,
+ 553,
+ 555,
+ 557,
+ 560,
+ 561,
+ 562,
+ 564,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 573,
+ 577,
+ 578,
+ 579,
+ 581,
+ 584,
+ 585,
+ 589,
+ 593,
+ 595,
+ 596,
+ 597,
+ 599,
+ 600,
+ 601,
+ 602,
+ 606,
+ 610,
+ 614,
+ 615,
+ 616,
+ 618,
+ 619,
+ 620,
+ 622,
+ 624,
+ 625,
+ 627,
+ 628,
+ 629,
+ 633,
+ 634,
+ 636,
+ 637,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 659,
+ 660,
+ 662,
+ 665,
+ 669,
+ 674,
+ 675,
+ 676,
+ 679,
+ 682,
+ 683,
+ 689,
+ 690,
+ 692,
+ 693,
+ 698,
+ 699,
+ 700,
+ 704,
+ 705,
+ 708,
+ 712,
+ 713,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 722,
+ 726,
+ 727,
+ 728,
+ 732,
+ 735,
+ 736,
+ 737,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 748,
+ 750,
+ 753,
+ 754,
+ 757,
+ 758,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 769,
+ 772,
+ 773,
+ 775,
+ 777,
+ 779,
+ 780,
+ 781,
+ 782,
+ 785,
+ 787,
+ 789,
+ 794,
+ 795,
+ 796,
+ 798,
+ 799,
+ 800,
+ 801,
+ 803,
+ 805,
+ 806,
+ 808,
+ 809,
+ 810,
+ 812,
+ 813,
+ 815,
+ 816,
+ 817,
+ 819,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 830,
+ 832,
+ 833,
+ 836,
+ 838,
+ 839,
+ 842,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 854,
+ 855,
+ 856,
+ 859,
+ 861,
+ 863,
+ 864,
+ 867,
+ 869,
+ 870,
+ 872,
+ 875,
+ 876,
+ 877,
+ 878,
+ 880,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ 901,
+ 902,
+ 904,
+ 906,
+ 907,
+ 910,
+ 914,
+ 915,
+ 916,
+ 917,
+ 920,
+ 923,
+ 924,
+ 925,
+ 927,
+ 928,
+ 930,
+ 932,
+ 937,
+ 939,
+ 941,
+ 942,
+ 943,
+ 947,
+ 948,
+ 956,
+ 957,
+ 959,
+ 961,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 969,
+ 970,
+ 971,
+ 972,
+ 974,
+ 975,
+ 976,
+ 977,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 988,
+ 989,
+ 994,
+ 997,
+ 998,
+ 999
+ ],
+ [
+ 1,
+ 6,
+ 7,
+ 9,
+ 10,
+ 11,
+ 12,
+ 14,
+ 15,
+ 17,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 32,
+ 33,
+ 37,
+ 38,
+ 39,
+ 40,
+ 52,
+ 55,
+ 56,
+ 64,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 78,
+ 79,
+ 80,
+ 84,
+ 86,
+ 87,
+ 88,
+ 90,
+ 93,
+ 94,
+ 95,
+ 97,
+ 98,
+ 100,
+ 103,
+ 104,
+ 106,
+ 110,
+ 116,
+ 117,
+ 118,
+ 120,
+ 121,
+ 124,
+ 125,
+ 129,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 137,
+ 138,
+ 141,
+ 145,
+ 150,
+ 151,
+ 153,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 164,
+ 166,
+ 167,
+ 168,
+ 174,
+ 175,
+ 178,
+ 180,
+ 182,
+ 183,
+ 184,
+ 185,
+ 188,
+ 189,
+ 191,
+ 194,
+ 197,
+ 198,
+ 204,
+ 211,
+ 213,
+ 217,
+ 218,
+ 220,
+ 221,
+ 222,
+ 228,
+ 230,
+ 232,
+ 233,
+ 237,
+ 240,
+ 242,
+ 243,
+ 244,
+ 246,
+ 247,
+ 249,
+ 250,
+ 251,
+ 257,
+ 259,
+ 260,
+ 262,
+ 270,
+ 271,
+ 272,
+ 275,
+ 276,
+ 277,
+ 278,
+ 282,
+ 285,
+ 289,
+ 290,
+ 293,
+ 298,
+ 300,
+ 301,
+ 302,
+ 303,
+ 305,
+ 306,
+ 307,
+ 310,
+ 315,
+ 316,
+ 318,
+ 322,
+ 323,
+ 328,
+ 329,
+ 330,
+ 332,
+ 335,
+ 336,
+ 341,
+ 343,
+ 344,
+ 349,
+ 350,
+ 357,
+ 363,
+ 364,
+ 365,
+ 367,
+ 369,
+ 376,
+ 377,
+ 381,
+ 384,
+ 387,
+ 390,
+ 392,
+ 397,
+ 402,
+ 406,
+ 410,
+ 414,
+ 416,
+ 424,
+ 425,
+ 427,
+ 428,
+ 431,
+ 433,
+ 437,
+ 440,
+ 443,
+ 446,
+ 447,
+ 448,
+ 449,
+ 452,
+ 453,
+ 455,
+ 456,
+ 457,
+ 459,
+ 460,
+ 461,
+ 462,
+ 465,
+ 468,
+ 469,
+ 472,
+ 473,
+ 476,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 488,
+ 495,
+ 496,
+ 500,
+ 501,
+ 506,
+ 509,
+ 511,
+ 512,
+ 516,
+ 517,
+ 520,
+ 521,
+ 523,
+ 525,
+ 527,
+ 529,
+ 530,
+ 531,
+ 534,
+ 535,
+ 536,
+ 537,
+ 540,
+ 543,
+ 544,
+ 545,
+ 551,
+ 553,
+ 555,
+ 557,
+ 561,
+ 562,
+ 564,
+ 566,
+ 567,
+ 569,
+ 571,
+ 572,
+ 577,
+ 578,
+ 579,
+ 581,
+ 584,
+ 585,
+ 589,
+ 593,
+ 595,
+ 596,
+ 599,
+ 600,
+ 601,
+ 602,
+ 606,
+ 614,
+ 615,
+ 616,
+ 618,
+ 620,
+ 622,
+ 624,
+ 625,
+ 627,
+ 628,
+ 629,
+ 633,
+ 634,
+ 636,
+ 637,
+ 639,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 650,
+ 651,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 659,
+ 660,
+ 662,
+ 665,
+ 674,
+ 675,
+ 679,
+ 683,
+ 689,
+ 690,
+ 692,
+ 693,
+ 698,
+ 700,
+ 704,
+ 705,
+ 708,
+ 712,
+ 713,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 722,
+ 726,
+ 727,
+ 732,
+ 735,
+ 736,
+ 741,
+ 744,
+ 745,
+ 746,
+ 750,
+ 753,
+ 754,
+ 757,
+ 758,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 773,
+ 775,
+ 777,
+ 779,
+ 780,
+ 781,
+ 782,
+ 785,
+ 787,
+ 789,
+ 794,
+ 795,
+ 796,
+ 798,
+ 799,
+ 800,
+ 801,
+ 803,
+ 805,
+ 806,
+ 808,
+ 810,
+ 812,
+ 815,
+ 817,
+ 819,
+ 823,
+ 824,
+ 826,
+ 827,
+ 828,
+ 830,
+ 832,
+ 833,
+ 836,
+ 838,
+ 839,
+ 842,
+ 845,
+ 846,
+ 847,
+ 849,
+ 850,
+ 851,
+ 854,
+ 855,
+ 859,
+ 863,
+ 864,
+ 870,
+ 872,
+ 876,
+ 878,
+ 880,
+ 883,
+ 884,
+ 885,
+ 887,
+ 888,
+ 891,
+ 892,
+ 893,
+ 894,
+ 896,
+ 897,
+ 898,
+ 901,
+ 902,
+ 904,
+ 906,
+ 907,
+ 910,
+ 914,
+ 915,
+ 916,
+ 917,
+ 920,
+ 923,
+ 924,
+ 927,
+ 928,
+ 930,
+ 932,
+ 939,
+ 941,
+ 942,
+ 943,
+ 948,
+ 956,
+ 957,
+ 961,
+ 963,
+ 964,
+ 967,
+ 969,
+ 970,
+ 971,
+ 972,
+ 975,
+ 976,
+ 977,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 988,
+ 989,
+ 994,
+ 998,
+ 999
+ ],
+ [
+ 1,
+ 6,
+ 7,
+ 9,
+ 10,
+ 11,
+ 12,
+ 14,
+ 17,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 32,
+ 33,
+ 38,
+ 52,
+ 55,
+ 56,
+ 64,
+ 70,
+ 74,
+ 75,
+ 80,
+ 84,
+ 88,
+ 93,
+ 94,
+ 95,
+ 97,
+ 98,
+ 100,
+ 103,
+ 110,
+ 116,
+ 117,
+ 118,
+ 120,
+ 121,
+ 124,
+ 125,
+ 129,
+ 132,
+ 133,
+ 134,
+ 135,
+ 137,
+ 138,
+ 141,
+ 145,
+ 150,
+ 153,
+ 156,
+ 157,
+ 158,
+ 159,
+ 161,
+ 166,
+ 167,
+ 174,
+ 175,
+ 178,
+ 180,
+ 182,
+ 183,
+ 184,
+ 185,
+ 188,
+ 189,
+ 191,
+ 194,
+ 197,
+ 198,
+ 211,
+ 217,
+ 218,
+ 220,
+ 221,
+ 222,
+ 230,
+ 232,
+ 237,
+ 240,
+ 242,
+ 243,
+ 249,
+ 251,
+ 257,
+ 259,
+ 260,
+ 270,
+ 271,
+ 275,
+ 276,
+ 277,
+ 278,
+ 282,
+ 285,
+ 290,
+ 298,
+ 301,
+ 302,
+ 303,
+ 305,
+ 306,
+ 307,
+ 310,
+ 315,
+ 316,
+ 318,
+ 322,
+ 323,
+ 328,
+ 329,
+ 330,
+ 336,
+ 343,
+ 350,
+ 357,
+ 364,
+ 365,
+ 367,
+ 369,
+ 377,
+ 381,
+ 384,
+ 387,
+ 392,
+ 402,
+ 406,
+ 414,
+ 416,
+ 424,
+ 425,
+ 428,
+ 433,
+ 440,
+ 443,
+ 448,
+ 449,
+ 452,
+ 455,
+ 456,
+ 457,
+ 462,
+ 469,
+ 473,
+ 478,
+ 479,
+ 480,
+ 482,
+ 483,
+ 488,
+ 495,
+ 496,
+ 500,
+ 506,
+ 509,
+ 511,
+ 512,
+ 517,
+ 521,
+ 523,
+ 525,
+ 527,
+ 530,
+ 531,
+ 535,
+ 536,
+ 537,
+ 540,
+ 543,
+ 544,
+ 545,
+ 553,
+ 557,
+ 561,
+ 564,
+ 567,
+ 571,
+ 572,
+ 577,
+ 578,
+ 579,
+ 581,
+ 585,
+ 596,
+ 599,
+ 601,
+ 602,
+ 606,
+ 615,
+ 618,
+ 620,
+ 622,
+ 624,
+ 625,
+ 627,
+ 628,
+ 633,
+ 636,
+ 637,
+ 639,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 647,
+ 650,
+ 653,
+ 655,
+ 657,
+ 659,
+ 660,
+ 662,
+ 665,
+ 674,
+ 675,
+ 683,
+ 689,
+ 690,
+ 692,
+ 693,
+ 698,
+ 700,
+ 704,
+ 705,
+ 708,
+ 712,
+ 715,
+ 716,
+ 717,
+ 718,
+ 720,
+ 722,
+ 726,
+ 732,
+ 735,
+ 736,
+ 744,
+ 745,
+ 753,
+ 757,
+ 758,
+ 764,
+ 767,
+ 773,
+ 777,
+ 780,
+ 781,
+ 785,
+ 794,
+ 795,
+ 796,
+ 798,
+ 799,
+ 801,
+ 803,
+ 805,
+ 806,
+ 808,
+ 815,
+ 817,
+ 819,
+ 823,
+ 826,
+ 827,
+ 830,
+ 832,
+ 836,
+ 839,
+ 845,
+ 846,
+ 849,
+ 850,
+ 854,
+ 855,
+ 859,
+ 863,
+ 864,
+ 870,
+ 872,
+ 876,
+ 878,
+ 880,
+ 884,
+ 885,
+ 887,
+ 888,
+ 891,
+ 893,
+ 894,
+ 897,
+ 898,
+ 901,
+ 902,
+ 906,
+ 910,
+ 914,
+ 915,
+ 916,
+ 920,
+ 923,
+ 924,
+ 928,
+ 930,
+ 932,
+ 939,
+ 941,
+ 942,
+ 948,
+ 956,
+ 957,
+ 967,
+ 969,
+ 970,
+ 971,
+ 972,
+ 975,
+ 976,
+ 977,
+ 981,
+ 982,
+ 983,
+ 985,
+ 988,
+ 994,
+ 999
+ ]
+ ]
+}
diff --git a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala
index 65f4a364..518f1725 100644
--- a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala
+++ b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala
@@ -17,6 +17,14 @@ object SetModule extends AbstractFunctionModule {
}
}
+ private def applyKeyFunc(elem: Val, keyF: Val, pos: Position, ev: EvalScope): Val = {
+ keyF match {
+ case keyFFunc: Val.Func =>
+ keyFFunc.apply1(elem, pos.noOffset)(ev, TailstrictModeDisabled).force
+ case _ => elem
+ }
+ }
+
private def toArrOrString(arg: Val, pos: Position, ev: EvalScope) = {
arg match {
case arr: Val.Arr => arr.asLazyArray
@@ -40,18 +48,11 @@ object SetModule extends AbstractFunctionModule {
keyF: Val,
arr: mutable.IndexedSeq[? <: Lazy],
toFind: Val): Boolean = {
- val appliedX = keyF match {
- case keyFFunc: Val.Func => keyFFunc.apply1(toFind, pos.noOffset)(ev, TailstrictModeDisabled)
- case _ => toFind
- }
+ val appliedX = applyKeyFunc(toFind, keyF, pos, ev)
arr
- .search(appliedX.force)((toFind: Lazy, value: Lazy) => {
- val appliedValue = keyF match {
- case keyFFunc: Val.Func =>
- keyFFunc.apply1(value, pos.noOffset)(ev, TailstrictModeDisabled)
- case _ => value
- }
- ev.compare(toFind.force, appliedValue.force)
+ .search(appliedX)((toFind: Lazy, value: Lazy) => {
+ val appliedValue = applyKeyFunc(value.force, keyF, pos, ev)
+ ev.compare(toFind.force, appliedValue)
})
.isInstanceOf[Found]
}
@@ -171,15 +172,59 @@ object SetModule extends AbstractFunctionModule {
},
builtinWithDefaults("setUnion", "a" -> null, "b" -> null, "keyF" -> Val.False(dummyPos)) {
(args, pos, ev) =>
+ val keyF = args(2)
+ validateSet(ev, pos, keyF, args(0))
+ validateSet(ev, pos, keyF, args(1))
+
val a = toArrOrString(args(0), pos, ev)
val b = toArrOrString(args(1), pos, ev)
+
if (a.isEmpty) {
- uniqArr(pos, ev, sortArr(pos, ev, args(1), args(2)), args(2))
+ args(1)
} else if (b.isEmpty) {
- uniqArr(pos, ev, sortArr(pos, ev, args(0), args(2)), args(2))
+ args(0)
} else {
- val concat = Val.Arr(pos, a ++ b)
- uniqArr(pos, ev, sortArr(pos, ev, concat, args(2)), args(2))
+ val out = new mutable.ArrayBuilder.ofRef[Lazy]
+ out.sizeHint(a.length + b.length)
+
+ var idxA = 0
+ var idxB = 0
+
+ while (idxA < a.length && idxB < b.length) {
+ val elemA = a(idxA).force
+ val elemB = b(idxB).force
+
+ val keyA = applyKeyFunc(elemA, keyF, pos, ev)
+ val keyB = applyKeyFunc(elemB, keyF, pos, ev)
+
+ val cmp = ev.compare(keyA, keyB)
+ if (cmp < 0) {
+ // keyA < keyB, take from a
+ out.+=(a(idxA))
+ idxA += 1
+ } else if (cmp > 0) {
+ // keyA > keyB, take from b
+ out.+=(b(idxB))
+ idxB += 1
+ } else {
+ // keyA == keyB, take one and skip duplicate
+ out.+=(a(idxA))
+ idxA += 1
+ idxB += 1
+ }
+ }
+
+ // Add remaining elements from a or b
+ while (idxA < a.length) {
+ out.+=(a(idxA))
+ idxA += 1
+ }
+ while (idxB < b.length) {
+ out.+=(b(idxB))
+ idxB += 1
+ }
+
+ Val.Arr(pos, out.result())
}
},
builtinWithDefaults("setInter", "a" -> null, "b" -> null, "keyF" -> Val.False(dummyPos)) {
@@ -195,13 +240,31 @@ object SetModule extends AbstractFunctionModule {
// Set a reasonable size hint - intersection will be at most the size of the smaller set
out.sizeHint(math.min(a.length, b.length))
- // The intersection will always be, at most, the size of the smallest set.
- val sets = if (b.length < a.length) (b, a) else (a, b)
- for (v <- sets._1) {
- if (existsInSet(ev, pos, keyF, sets._2, v.force)) {
- out.+=(v)
+ var idxA = 0
+ var idxB = 0
+
+ while (idxA < a.length && idxB < b.length) {
+ val elemA = a(idxA).force
+ val elemB = b(idxB).force
+
+ val keyA = applyKeyFunc(elemA, keyF, pos, ev)
+ val keyB = applyKeyFunc(elemB, keyF, pos, ev)
+
+ val cmp = ev.compare(keyA, keyB)
+ if (cmp < 0) {
+ // keyA < keyB, elemA not in intersection
+ idxA += 1
+ } else if (cmp > 0) {
+ // keyA > keyB, elemB not in intersection
+ idxB += 1
+ } else {
+ // keyA == keyB, found intersection element
+ out.+=(a(idxA))
+ idxA += 1
+ idxB += 1
}
}
+
Val.Arr(pos, out.result())
},
builtinWithDefaults("setDiff", "a" -> null, "b" -> null, "keyF" -> Val.False(dummyPos)) {
@@ -216,11 +279,40 @@ object SetModule extends AbstractFunctionModule {
// Set a reasonable size hint - difference will be at most the size of the first set
out.sizeHint(a.length)
- for (v <- a) {
- if (!existsInSet(ev, pos, keyF, b, v.force)) {
- out.+=(v)
+ var idxA = 0
+ var idxB = 0
+
+ while (idxA < a.length) {
+ val elemA = a(idxA).force
+ val keyA = applyKeyFunc(elemA, keyF, pos, ev)
+
+ // Advance idxB to find first element >= keyA
+ var foundEqual = false
+ var continue = true
+ while (idxB < b.length && continue) {
+ val elemB = b(idxB).force
+ val keyB = applyKeyFunc(elemB, keyF, pos, ev)
+
+ val cmp = ev.compare(keyA, keyB)
+ if (cmp <= 0) {
+ // keyA <= keyB, found position
+ foundEqual = (cmp == 0)
+ if (foundEqual) idxB += 1 // Move past the match
+ continue = false
+ } else {
+ // keyA > keyB, keep advancing in b
+ idxB += 1
+ }
}
+
+ // Add elemA if we didn't find it in b
+ if (!foundEqual) {
+ out.+=(a(idxA))
+ }
+
+ idxA += 1
}
+
Val.Arr(pos, out.result())
},
builtinWithDefaults("setMember", "x" -> null, "arr" -> null, "keyF" -> Val.False(dummyPos)) {
diff --git a/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet b/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet
index 222c7e54..5f4e2078 100644
--- a/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet
+++ b/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet
@@ -158,7 +158,7 @@ local assertClose(a, b) =
],
setInter: [
std.setInter([1,2,3], [3,4,5]),
-// std.setInter(a=[1,2,3], b=[3,4,5], keyF=function(x) std.floor(x / 2)),
+ std.setInter(a=[1,2,3], b=[3,4,5], keyF=function(x) std.floor(x / 2)),
],
setUnion: [
std.setUnion([1,2,3], [3,4,5]),
@@ -166,7 +166,7 @@ local assertClose(a, b) =
],
setDiff: [
std.setDiff([1,2,3], [3,4,5]),
-// std.setDiff(a=[1,2,3], b=[3,4,5], keyF=function(x) std.floor(x / 2)),
+ std.setDiff(a=[1,2,3], b=[3,4,5], keyF=function(x) std.floor(x / 2)),
],
setMember: [
std.setMember(3, [2]),
diff --git a/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet.golden
index 59311fbb..15fb4384 100644
--- a/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet.golden
+++ b/sjsonnet/test/resources/go_test_suite/stdlib_smoke_test.jsonnet.golden
@@ -1,120 +1,279 @@
{
- "abs": 42,
- "acos": true,
- "asciiLower": "blah",
- "asciiUpper": "BLAH",
- "asin": true,
- "assertEqual": true,
- "atan": true,
- "base64": ["YmxhaA==", "YmxhaA=="],
- "base64Decode": "blah\n",
- "base64DecodeBytes": [98, 108, 97, 104, 10],
- "ceil": 5,
- "char": "A",
- "codepoint": 65,
- "cos": true,
- "count": 1,
- "decodeUTF8": "AAA",
- "encodeUTF8": [98, 108, 97, 104],
- "endsWith": true,
- "escapeStringBash": "'test '\"'\"'test'\"'\"'test'",
- "escapeStringDollars": "test 'test'test",
- "escapeStringJson": "\"test 'test'test\"",
- "escapeStringPython": "\"test 'test'test\"",
- "exp": 148.4131591025766,
- "exponent": 3,
- "filter": [2, 4],
- "filterMap": [4, 8],
- "find": [2, 4],
- "findSubstr": [0, 5],
- "flatMap": [2, 3, 4, 6, 6, 9],
- "flattenArrays": [1, 2, 3, 4, 5, [6, 7]],
- "floor": 5,
- "foldl": [0, 1, 2, 3],
- "foldr": [1, 2, 3, 4],
- "format": "test blah 42",
- "get": [17, 42, 18, 42],
- "isArray": true,
- "isBoolean": true,
- "isFunction": true,
- "isNumber": true,
- "isObject": true,
- "isString": true,
- "join": "a,b,c",
- "length": 0,
- "lines": "a\nb\nc\n",
- "log": true,
- "lstripChars": "bbbbcccc",
- "makeArray": [0, 1, 2, 3, 4],
- "manifestIni": "a = 1\nb = 2\n[s1]\nx = 1\ny = 2\n",
- "manifestJsonEx": "{\n \"a\": {\n \"b\": \"c\"\n }\n}",
- "manifestJsonMinified": "{\"a\":{\"b\":\"c\"}}",
- "manifestPython": "{\"a\": {\"b\": \"c\"}}",
- "manifestPythonVars": "a = {\"b\": \"c\"}\n",
- "manifestTomlEx": "[a]\n b = \"c\"",
- "manifestXmlJsonml": "",
- "manifestYamlDoc": "\"a\":\n \"b\": \"c\"",
- "manifestYamlStream": "---\n42\n---\n\"a\":\n \"b\": \"c\"\n...\n",
- "mantissa": 0.625,
- "map": [-1, -2, -3],
- "mapWithIndex": [3, 3, 3],
- "mapWithKey": { "a": 42 },
- "max": 3,
- "md5": "1bc29b36f623ba82aaf6724fd3b16718",
- "member": true,
- "mergePatch": {},
- "min": 2,
- "objectFields": [],
- "objectFieldsAll": [],
- "objectHas": false,
- "objectHasAll": false,
- "objectKeysValues": [],
- "objectKeysValuesAll": [],
- "objectValues": [],
- "objectValuesAll": [],
- "parseHex": 3735928559,
- "parseInt": 42,
- "parseJson": { "a": "b" },
- "parseOctal": 83,
- "pow": 8,
- "prune": { "y": ["42"] },
- "range": [1, 2, 3, 4, 5],
- "repeat": "foofoofoo",
- "reverse": ["a", "b"],
- "rstripChars": "aaabbbb",
- "set": [
- [1, 2, 3],
- [3, 2, 1]
- ],
- "setDiff": [[1, 2]],
- "setInter": [[3]],
- "setMember": [false, true],
- "setUnion": [
- [1, 2, 3, 4, 5],
- [1, 2, 4]
- ],
- "sign": 1,
- "sin": true,
- "slice": "o",
- "sort": [
- [1, 2, 3],
- [3, 2, 1]
- ],
- "split": ["a", "b", "c"],
- "splitLimit": ["a", "b,c"],
- "splitLimitR": ["a,b", "c"],
- "sqrt": 2.23606797749979,
- "startsWith": true,
- "strReplace": "bba",
- "stringChars": ["b", "l", "a", "h"],
- "stripChars": "bbbb",
- "substr": "s",
- "tan": true,
- "thisFile": "stdlib_smoke_test.jsonnet",
- "toString": "42",
- "type": "object",
- "uniq": [
- [1, 2, 3],
- ["a", "B", "a"]
- ]
+ "abs": 42,
+ "acos": true,
+ "asciiLower": "blah",
+ "asciiUpper": "BLAH",
+ "asin": true,
+ "assertEqual": true,
+ "atan": true,
+ "base64": [
+ "YmxhaA==",
+ "YmxhaA=="
+ ],
+ "base64Decode": "blah\n",
+ "base64DecodeBytes": [
+ 98,
+ 108,
+ 97,
+ 104,
+ 10
+ ],
+ "ceil": 5,
+ "char": "A",
+ "codepoint": 65,
+ "cos": true,
+ "count": 1,
+ "decodeUTF8": "AAA",
+ "encodeUTF8": [
+ 98,
+ 108,
+ 97,
+ 104
+ ],
+ "endsWith": true,
+ "escapeStringBash": "'test '\"'\"'test'\"'\"'test'",
+ "escapeStringDollars": "test 'test'test",
+ "escapeStringJson": "\"test 'test'test\"",
+ "escapeStringPython": "\"test 'test'test\"",
+ "exp": 148.4131591025766,
+ "exponent": 3,
+ "filter": [
+ 2,
+ 4
+ ],
+ "filterMap": [
+ 4,
+ 8
+ ],
+ "find": [
+ 2,
+ 4
+ ],
+ "findSubstr": [
+ 0,
+ 5
+ ],
+ "flatMap": [
+ 2,
+ 3,
+ 4,
+ 6,
+ 6,
+ 9
+ ],
+ "flattenArrays": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ [
+ 6,
+ 7
+ ]
+ ],
+ "floor": 5,
+ "foldl": [
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "foldr": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "format": "test blah 42",
+ "get": [
+ 17,
+ 42,
+ 18,
+ 42
+ ],
+ "isArray": true,
+ "isBoolean": true,
+ "isFunction": true,
+ "isNumber": true,
+ "isObject": true,
+ "isString": true,
+ "join": "a,b,c",
+ "length": 0,
+ "lines": "a\nb\nc\n",
+ "log": true,
+ "lstripChars": "bbbbcccc",
+ "makeArray": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "manifestIni": "a = 1\nb = 2\n[s1]\nx = 1\ny = 2\n",
+ "manifestJsonEx": "{\n \"a\": {\n \"b\": \"c\"\n }\n}",
+ "manifestJsonMinified": "{\"a\":{\"b\":\"c\"}}",
+ "manifestPython": "{\"a\": {\"b\": \"c\"}}",
+ "manifestPythonVars": "a = {\"b\": \"c\"}\n",
+ "manifestTomlEx": "[a]\n b = \"c\"",
+ "manifestXmlJsonml": "",
+ "manifestYamlDoc": "\"a\":\n \"b\": \"c\"",
+ "manifestYamlStream": "---\n42\n---\n\"a\":\n \"b\": \"c\"\n...\n",
+ "mantissa": 0.625,
+ "map": [
+ -1,
+ -2,
+ -3
+ ],
+ "mapWithIndex": [
+ 3,
+ 3,
+ 3
+ ],
+ "mapWithKey": {
+ "a": 42
+ },
+ "max": 3,
+ "md5": "1bc29b36f623ba82aaf6724fd3b16718",
+ "member": true,
+ "mergePatch": { },
+ "min": 2,
+ "objectFields": [ ],
+ "objectFieldsAll": [ ],
+ "objectHas": false,
+ "objectHasAll": false,
+ "objectKeysValues": [ ],
+ "objectKeysValuesAll": [ ],
+ "objectValues": [ ],
+ "objectValuesAll": [ ],
+ "parseHex": 3735928559,
+ "parseInt": 42,
+ "parseJson": {
+ "a": "b"
+ },
+ "parseOctal": 83,
+ "pow": 8,
+ "prune": {
+ "y": [
+ "42"
+ ]
+ },
+ "range": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "repeat": "foofoofoo",
+ "reverse": [
+ "a",
+ "b"
+ ],
+ "rstripChars": "aaabbbb",
+ "set": [
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2,
+ 1
+ ]
+ ],
+ "setDiff": [
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ "setInter": [
+ [
+ 3
+ ],
+ [
+ 2
+ ]
+ ],
+ "setMember": [
+ false,
+ true
+ ],
+ "setUnion": [
+ [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ]
+ ],
+ "sign": 1,
+ "sin": true,
+ "slice": "o",
+ "sort": [
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2,
+ 1
+ ]
+ ],
+ "split": [
+ "a",
+ "b",
+ "c"
+ ],
+ "splitLimit": [
+ "a",
+ "b,c"
+ ],
+ "splitLimitR": [
+ "a,b",
+ "c"
+ ],
+ "sqrt": 2.23606797749979,
+ "startsWith": true,
+ "strReplace": "bba",
+ "stringChars": [
+ "b",
+ "l",
+ "a",
+ "h"
+ ],
+ "stripChars": "bbbb",
+ "substr": "s",
+ "tan": true,
+ "thisFile": "stdlib_smoke_test.jsonnet",
+ "toString": "42",
+ "type": "object",
+ "uniq": [
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ "a",
+ "B",
+ "a"
+ ]
+ ]
}