BitArray.php
8 months ago
BitMatrix.php
8 months ago
BitUtils.php
8 months ago
CharacterSetEci.php
8 months ago
EcBlock.php
8 months ago
EcBlocks.php
8 months ago
ErrorCorrectionLevel.php
8 months ago
FormatInformation.php
8 months ago
Mode.php
8 months ago
ReedSolomonCodec.php
8 months ago
Version.php
8 months ago
Version.php
597 lines
| 1 | <?php |
| 2 | declare(strict_types = 1); |
| 3 | |
| 4 | namespace BaconQrCode\Common; |
| 5 | |
| 6 | use BaconQrCode\Exception\InvalidArgumentException; |
| 7 | use SplFixedArray; |
| 8 | |
| 9 | /** |
| 10 | * Version representation. |
| 11 | */ |
| 12 | final class Version |
| 13 | { |
| 14 | private const VERSION_DECODE_INFO = [ |
| 15 | 0x07c94, |
| 16 | 0x085bc, |
| 17 | 0x09a99, |
| 18 | 0x0a4d3, |
| 19 | 0x0bbf6, |
| 20 | 0x0c762, |
| 21 | 0x0d847, |
| 22 | 0x0e60d, |
| 23 | 0x0f928, |
| 24 | 0x10b78, |
| 25 | 0x1145d, |
| 26 | 0x12a17, |
| 27 | 0x13532, |
| 28 | 0x149a6, |
| 29 | 0x15683, |
| 30 | 0x168c9, |
| 31 | 0x177ec, |
| 32 | 0x18ec4, |
| 33 | 0x191e1, |
| 34 | 0x1afab, |
| 35 | 0x1b08e, |
| 36 | 0x1cc1a, |
| 37 | 0x1d33f, |
| 38 | 0x1ed75, |
| 39 | 0x1f250, |
| 40 | 0x209d5, |
| 41 | 0x216f0, |
| 42 | 0x228ba, |
| 43 | 0x2379f, |
| 44 | 0x24b0b, |
| 45 | 0x2542e, |
| 46 | 0x26a64, |
| 47 | 0x27541, |
| 48 | 0x28c69, |
| 49 | ]; |
| 50 | |
| 51 | /** |
| 52 | * Version number of this version. |
| 53 | * |
| 54 | * @var int |
| 55 | */ |
| 56 | private $versionNumber; |
| 57 | |
| 58 | /** |
| 59 | * Alignment pattern centers. |
| 60 | * |
| 61 | * @var SplFixedArray |
| 62 | */ |
| 63 | private $alignmentPatternCenters; |
| 64 | |
| 65 | /** |
| 66 | * Error correction blocks. |
| 67 | * |
| 68 | * @var EcBlocks[] |
| 69 | */ |
| 70 | private $ecBlocks; |
| 71 | |
| 72 | /** |
| 73 | * Total number of codewords. |
| 74 | * |
| 75 | * @var int |
| 76 | */ |
| 77 | private $totalCodewords; |
| 78 | |
| 79 | /** |
| 80 | * Cached version instances. |
| 81 | * |
| 82 | * @var array<int, self>|null |
| 83 | */ |
| 84 | private static $versions; |
| 85 | |
| 86 | /** |
| 87 | * @param int[] $alignmentPatternCenters |
| 88 | */ |
| 89 | private function __construct( |
| 90 | int $versionNumber, |
| 91 | array $alignmentPatternCenters, |
| 92 | EcBlocks ...$ecBlocks |
| 93 | ) { |
| 94 | $this->versionNumber = $versionNumber; |
| 95 | $this->alignmentPatternCenters = $alignmentPatternCenters; |
| 96 | $this->ecBlocks = $ecBlocks; |
| 97 | |
| 98 | $totalCodewords = 0; |
| 99 | $ecCodewords = $ecBlocks[0]->getEcCodewordsPerBlock(); |
| 100 | |
| 101 | foreach ($ecBlocks[0]->getEcBlocks() as $ecBlock) { |
| 102 | $totalCodewords += $ecBlock->getCount() * ($ecBlock->getDataCodewords() + $ecCodewords); |
| 103 | } |
| 104 | |
| 105 | $this->totalCodewords = $totalCodewords; |
| 106 | } |
| 107 | |
| 108 | /** |
| 109 | * Returns the version number. |
| 110 | */ |
| 111 | public function getVersionNumber() : int |
| 112 | { |
| 113 | return $this->versionNumber; |
| 114 | } |
| 115 | |
| 116 | /** |
| 117 | * Returns the alignment pattern centers. |
| 118 | * |
| 119 | * @return int[] |
| 120 | */ |
| 121 | public function getAlignmentPatternCenters() : array |
| 122 | { |
| 123 | return $this->alignmentPatternCenters; |
| 124 | } |
| 125 | |
| 126 | /** |
| 127 | * Returns the total number of codewords. |
| 128 | */ |
| 129 | public function getTotalCodewords() : int |
| 130 | { |
| 131 | return $this->totalCodewords; |
| 132 | } |
| 133 | |
| 134 | /** |
| 135 | * Calculates the dimension for the current version. |
| 136 | */ |
| 137 | public function getDimensionForVersion() : int |
| 138 | { |
| 139 | return 17 + 4 * $this->versionNumber; |
| 140 | } |
| 141 | |
| 142 | /** |
| 143 | * Returns the number of EC blocks for a specific EC level. |
| 144 | */ |
| 145 | public function getEcBlocksForLevel(ErrorCorrectionLevel $ecLevel) : EcBlocks |
| 146 | { |
| 147 | return $this->ecBlocks[$ecLevel->ordinal()]; |
| 148 | } |
| 149 | |
| 150 | /** |
| 151 | * Gets a provisional version number for a specific dimension. |
| 152 | * |
| 153 | * @throws InvalidArgumentException if dimension is not 1 mod 4 |
| 154 | */ |
| 155 | public static function getProvisionalVersionForDimension(int $dimension) : self |
| 156 | { |
| 157 | if (1 !== $dimension % 4) { |
| 158 | throw new InvalidArgumentException('Dimension is not 1 mod 4'); |
| 159 | } |
| 160 | |
| 161 | return self::getVersionForNumber(intdiv($dimension - 17, 4)); |
| 162 | } |
| 163 | |
| 164 | /** |
| 165 | * Gets a version instance for a specific version number. |
| 166 | * |
| 167 | * @throws InvalidArgumentException if version number is out of range |
| 168 | */ |
| 169 | public static function getVersionForNumber(int $versionNumber) : self |
| 170 | { |
| 171 | if ($versionNumber < 1 || $versionNumber > 40) { |
| 172 | throw new InvalidArgumentException('Version number must be between 1 and 40'); |
| 173 | } |
| 174 | |
| 175 | return self::versions()[$versionNumber - 1]; |
| 176 | } |
| 177 | |
| 178 | /** |
| 179 | * Decodes version information from an integer and returns the version. |
| 180 | */ |
| 181 | public static function decodeVersionInformation(int $versionBits) : ?self |
| 182 | { |
| 183 | $bestDifference = PHP_INT_MAX; |
| 184 | $bestVersion = 0; |
| 185 | |
| 186 | foreach (self::VERSION_DECODE_INFO as $i => $targetVersion) { |
| 187 | if ($targetVersion === $versionBits) { |
| 188 | return self::getVersionForNumber($i + 7); |
| 189 | } |
| 190 | |
| 191 | $bitsDifference = FormatInformation::numBitsDiffering($versionBits, $targetVersion); |
| 192 | |
| 193 | if ($bitsDifference < $bestDifference) { |
| 194 | $bestVersion = $i + 7; |
| 195 | $bestDifference = $bitsDifference; |
| 196 | } |
| 197 | } |
| 198 | |
| 199 | if ($bestDifference <= 3) { |
| 200 | return self::getVersionForNumber($bestVersion); |
| 201 | } |
| 202 | |
| 203 | return null; |
| 204 | } |
| 205 | |
| 206 | /** |
| 207 | * Builds the function pattern for the current version. |
| 208 | */ |
| 209 | public function buildFunctionPattern() : BitMatrix |
| 210 | { |
| 211 | $dimension = $this->getDimensionForVersion(); |
| 212 | $bitMatrix = new BitMatrix($dimension); |
| 213 | |
| 214 | // Top left finder pattern + separator + format |
| 215 | $bitMatrix->setRegion(0, 0, 9, 9); |
| 216 | // Top right finder pattern + separator + format |
| 217 | $bitMatrix->setRegion($dimension - 8, 0, 8, 9); |
| 218 | // Bottom left finder pattern + separator + format |
| 219 | $bitMatrix->setRegion(0, $dimension - 8, 9, 8); |
| 220 | |
| 221 | // Alignment patterns |
| 222 | $max = count($this->alignmentPatternCenters); |
| 223 | |
| 224 | for ($x = 0; $x < $max; ++$x) { |
| 225 | $i = $this->alignmentPatternCenters[$x] - 2; |
| 226 | |
| 227 | for ($y = 0; $y < $max; ++$y) { |
| 228 | if (($x === 0 && ($y === 0 || $y === $max - 1)) || ($x === $max - 1 && $y === 0)) { |
| 229 | // No alignment patterns near the three finder paterns |
| 230 | continue; |
| 231 | } |
| 232 | |
| 233 | $bitMatrix->setRegion($this->alignmentPatternCenters[$y] - 2, $i, 5, 5); |
| 234 | } |
| 235 | } |
| 236 | |
| 237 | // Vertical timing pattern |
| 238 | $bitMatrix->setRegion(6, 9, 1, $dimension - 17); |
| 239 | // Horizontal timing pattern |
| 240 | $bitMatrix->setRegion(9, 6, $dimension - 17, 1); |
| 241 | |
| 242 | if ($this->versionNumber > 6) { |
| 243 | // Version info, top right |
| 244 | $bitMatrix->setRegion($dimension - 11, 0, 3, 6); |
| 245 | // Version info, bottom left |
| 246 | $bitMatrix->setRegion(0, $dimension - 11, 6, 3); |
| 247 | } |
| 248 | |
| 249 | return $bitMatrix; |
| 250 | } |
| 251 | |
| 252 | /** |
| 253 | * Returns a string representation for the version. |
| 254 | */ |
| 255 | public function __toString() : string |
| 256 | { |
| 257 | return (string) $this->versionNumber; |
| 258 | } |
| 259 | |
| 260 | /** |
| 261 | * Build and cache a specific version. |
| 262 | * |
| 263 | * See ISO 18004:2006 6.5.1 Table 9. |
| 264 | * |
| 265 | * @return array<int, self> |
| 266 | */ |
| 267 | private static function versions() : array |
| 268 | { |
| 269 | if (null !== self::$versions) { |
| 270 | return self::$versions; |
| 271 | } |
| 272 | |
| 273 | return self::$versions = [ |
| 274 | new self( |
| 275 | 1, |
| 276 | [], |
| 277 | new EcBlocks(7, new EcBlock(1, 19)), |
| 278 | new EcBlocks(10, new EcBlock(1, 16)), |
| 279 | new EcBlocks(13, new EcBlock(1, 13)), |
| 280 | new EcBlocks(17, new EcBlock(1, 9)) |
| 281 | ), |
| 282 | new self( |
| 283 | 2, |
| 284 | [6, 18], |
| 285 | new EcBlocks(10, new EcBlock(1, 34)), |
| 286 | new EcBlocks(16, new EcBlock(1, 28)), |
| 287 | new EcBlocks(22, new EcBlock(1, 22)), |
| 288 | new EcBlocks(28, new EcBlock(1, 16)) |
| 289 | ), |
| 290 | new self( |
| 291 | 3, |
| 292 | [6, 22], |
| 293 | new EcBlocks(15, new EcBlock(1, 55)), |
| 294 | new EcBlocks(26, new EcBlock(1, 44)), |
| 295 | new EcBlocks(18, new EcBlock(2, 17)), |
| 296 | new EcBlocks(22, new EcBlock(2, 13)) |
| 297 | ), |
| 298 | new self( |
| 299 | 4, |
| 300 | [6, 26], |
| 301 | new EcBlocks(20, new EcBlock(1, 80)), |
| 302 | new EcBlocks(18, new EcBlock(2, 32)), |
| 303 | new EcBlocks(26, new EcBlock(3, 24)), |
| 304 | new EcBlocks(16, new EcBlock(4, 9)) |
| 305 | ), |
| 306 | new self( |
| 307 | 5, |
| 308 | [6, 30], |
| 309 | new EcBlocks(26, new EcBlock(1, 108)), |
| 310 | new EcBlocks(24, new EcBlock(2, 43)), |
| 311 | new EcBlocks(18, new EcBlock(2, 15), new EcBlock(2, 16)), |
| 312 | new EcBlocks(22, new EcBlock(2, 11), new EcBlock(2, 12)) |
| 313 | ), |
| 314 | new self( |
| 315 | 6, |
| 316 | [6, 34], |
| 317 | new EcBlocks(18, new EcBlock(2, 68)), |
| 318 | new EcBlocks(16, new EcBlock(4, 27)), |
| 319 | new EcBlocks(24, new EcBlock(4, 19)), |
| 320 | new EcBlocks(28, new EcBlock(4, 15)) |
| 321 | ), |
| 322 | new self( |
| 323 | 7, |
| 324 | [6, 22, 38], |
| 325 | new EcBlocks(20, new EcBlock(2, 78)), |
| 326 | new EcBlocks(18, new EcBlock(4, 31)), |
| 327 | new EcBlocks(18, new EcBlock(2, 14), new EcBlock(4, 15)), |
| 328 | new EcBlocks(26, new EcBlock(4, 13), new EcBlock(1, 14)) |
| 329 | ), |
| 330 | new self( |
| 331 | 8, |
| 332 | [6, 24, 42], |
| 333 | new EcBlocks(24, new EcBlock(2, 97)), |
| 334 | new EcBlocks(22, new EcBlock(2, 38), new EcBlock(2, 39)), |
| 335 | new EcBlocks(22, new EcBlock(4, 18), new EcBlock(2, 19)), |
| 336 | new EcBlocks(26, new EcBlock(4, 14), new EcBlock(2, 15)) |
| 337 | ), |
| 338 | new self( |
| 339 | 9, |
| 340 | [6, 26, 46], |
| 341 | new EcBlocks(30, new EcBlock(2, 116)), |
| 342 | new EcBlocks(22, new EcBlock(3, 36), new EcBlock(2, 37)), |
| 343 | new EcBlocks(20, new EcBlock(4, 16), new EcBlock(4, 17)), |
| 344 | new EcBlocks(24, new EcBlock(4, 12), new EcBlock(4, 13)) |
| 345 | ), |
| 346 | new self( |
| 347 | 10, |
| 348 | [6, 28, 50], |
| 349 | new EcBlocks(18, new EcBlock(2, 68), new EcBlock(2, 69)), |
| 350 | new EcBlocks(26, new EcBlock(4, 43), new EcBlock(1, 44)), |
| 351 | new EcBlocks(24, new EcBlock(6, 19), new EcBlock(2, 20)), |
| 352 | new EcBlocks(28, new EcBlock(6, 15), new EcBlock(2, 16)) |
| 353 | ), |
| 354 | new self( |
| 355 | 11, |
| 356 | [6, 30, 54], |
| 357 | new EcBlocks(20, new EcBlock(4, 81)), |
| 358 | new EcBlocks(30, new EcBlock(1, 50), new EcBlock(4, 51)), |
| 359 | new EcBlocks(28, new EcBlock(4, 22), new EcBlock(4, 23)), |
| 360 | new EcBlocks(24, new EcBlock(3, 12), new EcBlock(8, 13)) |
| 361 | ), |
| 362 | new self( |
| 363 | 12, |
| 364 | [6, 32, 58], |
| 365 | new EcBlocks(24, new EcBlock(2, 92), new EcBlock(2, 93)), |
| 366 | new EcBlocks(22, new EcBlock(6, 36), new EcBlock(2, 37)), |
| 367 | new EcBlocks(26, new EcBlock(4, 20), new EcBlock(6, 21)), |
| 368 | new EcBlocks(28, new EcBlock(7, 14), new EcBlock(4, 15)) |
| 369 | ), |
| 370 | new self( |
| 371 | 13, |
| 372 | [6, 34, 62], |
| 373 | new EcBlocks(26, new EcBlock(4, 107)), |
| 374 | new EcBlocks(22, new EcBlock(8, 37), new EcBlock(1, 38)), |
| 375 | new EcBlocks(24, new EcBlock(8, 20), new EcBlock(4, 21)), |
| 376 | new EcBlocks(22, new EcBlock(12, 11), new EcBlock(4, 12)) |
| 377 | ), |
| 378 | new self( |
| 379 | 14, |
| 380 | [6, 26, 46, 66], |
| 381 | new EcBlocks(30, new EcBlock(3, 115), new EcBlock(1, 116)), |
| 382 | new EcBlocks(24, new EcBlock(4, 40), new EcBlock(5, 41)), |
| 383 | new EcBlocks(20, new EcBlock(11, 16), new EcBlock(5, 17)), |
| 384 | new EcBlocks(24, new EcBlock(11, 12), new EcBlock(5, 13)) |
| 385 | ), |
| 386 | new self( |
| 387 | 15, |
| 388 | [6, 26, 48, 70], |
| 389 | new EcBlocks(22, new EcBlock(5, 87), new EcBlock(1, 88)), |
| 390 | new EcBlocks(24, new EcBlock(5, 41), new EcBlock(5, 42)), |
| 391 | new EcBlocks(30, new EcBlock(5, 24), new EcBlock(7, 25)), |
| 392 | new EcBlocks(24, new EcBlock(11, 12), new EcBlock(7, 13)) |
| 393 | ), |
| 394 | new self( |
| 395 | 16, |
| 396 | [6, 26, 50, 74], |
| 397 | new EcBlocks(24, new EcBlock(5, 98), new EcBlock(1, 99)), |
| 398 | new EcBlocks(28, new EcBlock(7, 45), new EcBlock(3, 46)), |
| 399 | new EcBlocks(24, new EcBlock(15, 19), new EcBlock(2, 20)), |
| 400 | new EcBlocks(30, new EcBlock(3, 15), new EcBlock(13, 16)) |
| 401 | ), |
| 402 | new self( |
| 403 | 17, |
| 404 | [6, 30, 54, 78], |
| 405 | new EcBlocks(28, new EcBlock(1, 107), new EcBlock(5, 108)), |
| 406 | new EcBlocks(28, new EcBlock(10, 46), new EcBlock(1, 47)), |
| 407 | new EcBlocks(28, new EcBlock(1, 22), new EcBlock(15, 23)), |
| 408 | new EcBlocks(28, new EcBlock(2, 14), new EcBlock(17, 15)) |
| 409 | ), |
| 410 | new self( |
| 411 | 18, |
| 412 | [6, 30, 56, 82], |
| 413 | new EcBlocks(30, new EcBlock(5, 120), new EcBlock(1, 121)), |
| 414 | new EcBlocks(26, new EcBlock(9, 43), new EcBlock(4, 44)), |
| 415 | new EcBlocks(28, new EcBlock(17, 22), new EcBlock(1, 23)), |
| 416 | new EcBlocks(28, new EcBlock(2, 14), new EcBlock(19, 15)) |
| 417 | ), |
| 418 | new self( |
| 419 | 19, |
| 420 | [6, 30, 58, 86], |
| 421 | new EcBlocks(28, new EcBlock(3, 113), new EcBlock(4, 114)), |
| 422 | new EcBlocks(26, new EcBlock(3, 44), new EcBlock(11, 45)), |
| 423 | new EcBlocks(26, new EcBlock(17, 21), new EcBlock(4, 22)), |
| 424 | new EcBlocks(26, new EcBlock(9, 13), new EcBlock(16, 14)) |
| 425 | ), |
| 426 | new self( |
| 427 | 20, |
| 428 | [6, 34, 62, 90], |
| 429 | new EcBlocks(28, new EcBlock(3, 107), new EcBlock(5, 108)), |
| 430 | new EcBlocks(26, new EcBlock(3, 41), new EcBlock(13, 42)), |
| 431 | new EcBlocks(30, new EcBlock(15, 24), new EcBlock(5, 25)), |
| 432 | new EcBlocks(28, new EcBlock(15, 15), new EcBlock(10, 16)) |
| 433 | ), |
| 434 | new self( |
| 435 | 21, |
| 436 | [6, 28, 50, 72, 94], |
| 437 | new EcBlocks(28, new EcBlock(4, 116), new EcBlock(4, 117)), |
| 438 | new EcBlocks(26, new EcBlock(17, 42)), |
| 439 | new EcBlocks(28, new EcBlock(17, 22), new EcBlock(6, 23)), |
| 440 | new EcBlocks(30, new EcBlock(19, 16), new EcBlock(6, 17)) |
| 441 | ), |
| 442 | new self( |
| 443 | 22, |
| 444 | [6, 26, 50, 74, 98], |
| 445 | new EcBlocks(28, new EcBlock(2, 111), new EcBlock(7, 112)), |
| 446 | new EcBlocks(28, new EcBlock(17, 46)), |
| 447 | new EcBlocks(30, new EcBlock(7, 24), new EcBlock(16, 25)), |
| 448 | new EcBlocks(24, new EcBlock(34, 13)) |
| 449 | ), |
| 450 | new self( |
| 451 | 23, |
| 452 | [6, 30, 54, 78, 102], |
| 453 | new EcBlocks(30, new EcBlock(4, 121), new EcBlock(5, 122)), |
| 454 | new EcBlocks(28, new EcBlock(4, 47), new EcBlock(14, 48)), |
| 455 | new EcBlocks(30, new EcBlock(11, 24), new EcBlock(14, 25)), |
| 456 | new EcBlocks(30, new EcBlock(16, 15), new EcBlock(14, 16)) |
| 457 | ), |
| 458 | new self( |
| 459 | 24, |
| 460 | [6, 28, 54, 80, 106], |
| 461 | new EcBlocks(30, new EcBlock(6, 117), new EcBlock(4, 118)), |
| 462 | new EcBlocks(28, new EcBlock(6, 45), new EcBlock(14, 46)), |
| 463 | new EcBlocks(30, new EcBlock(11, 24), new EcBlock(16, 25)), |
| 464 | new EcBlocks(30, new EcBlock(30, 16), new EcBlock(2, 17)) |
| 465 | ), |
| 466 | new self( |
| 467 | 25, |
| 468 | [6, 32, 58, 84, 110], |
| 469 | new EcBlocks(26, new EcBlock(8, 106), new EcBlock(4, 107)), |
| 470 | new EcBlocks(28, new EcBlock(8, 47), new EcBlock(13, 48)), |
| 471 | new EcBlocks(30, new EcBlock(7, 24), new EcBlock(22, 25)), |
| 472 | new EcBlocks(30, new EcBlock(22, 15), new EcBlock(13, 16)) |
| 473 | ), |
| 474 | new self( |
| 475 | 26, |
| 476 | [6, 30, 58, 86, 114], |
| 477 | new EcBlocks(28, new EcBlock(10, 114), new EcBlock(2, 115)), |
| 478 | new EcBlocks(28, new EcBlock(19, 46), new EcBlock(4, 47)), |
| 479 | new EcBlocks(28, new EcBlock(28, 22), new EcBlock(6, 23)), |
| 480 | new EcBlocks(30, new EcBlock(33, 16), new EcBlock(4, 17)) |
| 481 | ), |
| 482 | new self( |
| 483 | 27, |
| 484 | [6, 34, 62, 90, 118], |
| 485 | new EcBlocks(30, new EcBlock(8, 122), new EcBlock(4, 123)), |
| 486 | new EcBlocks(28, new EcBlock(22, 45), new EcBlock(3, 46)), |
| 487 | new EcBlocks(30, new EcBlock(8, 23), new EcBlock(26, 24)), |
| 488 | new EcBlocks(30, new EcBlock(12, 15), new EcBlock(28, 16)) |
| 489 | ), |
| 490 | new self( |
| 491 | 28, |
| 492 | [6, 26, 50, 74, 98, 122], |
| 493 | new EcBlocks(30, new EcBlock(3, 117), new EcBlock(10, 118)), |
| 494 | new EcBlocks(28, new EcBlock(3, 45), new EcBlock(23, 46)), |
| 495 | new EcBlocks(30, new EcBlock(4, 24), new EcBlock(31, 25)), |
| 496 | new EcBlocks(30, new EcBlock(11, 15), new EcBlock(31, 16)) |
| 497 | ), |
| 498 | new self( |
| 499 | 29, |
| 500 | [6, 30, 54, 78, 102, 126], |
| 501 | new EcBlocks(30, new EcBlock(7, 116), new EcBlock(7, 117)), |
| 502 | new EcBlocks(28, new EcBlock(21, 45), new EcBlock(7, 46)), |
| 503 | new EcBlocks(30, new EcBlock(1, 23), new EcBlock(37, 24)), |
| 504 | new EcBlocks(30, new EcBlock(19, 15), new EcBlock(26, 16)) |
| 505 | ), |
| 506 | new self( |
| 507 | 30, |
| 508 | [6, 26, 52, 78, 104, 130], |
| 509 | new EcBlocks(30, new EcBlock(5, 115), new EcBlock(10, 116)), |
| 510 | new EcBlocks(28, new EcBlock(19, 47), new EcBlock(10, 48)), |
| 511 | new EcBlocks(30, new EcBlock(15, 24), new EcBlock(25, 25)), |
| 512 | new EcBlocks(30, new EcBlock(23, 15), new EcBlock(25, 16)) |
| 513 | ), |
| 514 | new self( |
| 515 | 31, |
| 516 | [6, 30, 56, 82, 108, 134], |
| 517 | new EcBlocks(30, new EcBlock(13, 115), new EcBlock(3, 116)), |
| 518 | new EcBlocks(28, new EcBlock(2, 46), new EcBlock(29, 47)), |
| 519 | new EcBlocks(30, new EcBlock(42, 24), new EcBlock(1, 25)), |
| 520 | new EcBlocks(30, new EcBlock(23, 15), new EcBlock(28, 16)) |
| 521 | ), |
| 522 | new self( |
| 523 | 32, |
| 524 | [6, 34, 60, 86, 112, 138], |
| 525 | new EcBlocks(30, new EcBlock(17, 115)), |
| 526 | new EcBlocks(28, new EcBlock(10, 46), new EcBlock(23, 47)), |
| 527 | new EcBlocks(30, new EcBlock(10, 24), new EcBlock(35, 25)), |
| 528 | new EcBlocks(30, new EcBlock(19, 15), new EcBlock(35, 16)) |
| 529 | ), |
| 530 | new self( |
| 531 | 33, |
| 532 | [6, 30, 58, 86, 114, 142], |
| 533 | new EcBlocks(30, new EcBlock(17, 115), new EcBlock(1, 116)), |
| 534 | new EcBlocks(28, new EcBlock(14, 46), new EcBlock(21, 47)), |
| 535 | new EcBlocks(30, new EcBlock(29, 24), new EcBlock(19, 25)), |
| 536 | new EcBlocks(30, new EcBlock(11, 15), new EcBlock(46, 16)) |
| 537 | ), |
| 538 | new self( |
| 539 | 34, |
| 540 | [6, 34, 62, 90, 118, 146], |
| 541 | new EcBlocks(30, new EcBlock(13, 115), new EcBlock(6, 116)), |
| 542 | new EcBlocks(28, new EcBlock(14, 46), new EcBlock(23, 47)), |
| 543 | new EcBlocks(30, new EcBlock(44, 24), new EcBlock(7, 25)), |
| 544 | new EcBlocks(30, new EcBlock(59, 16), new EcBlock(1, 17)) |
| 545 | ), |
| 546 | new self( |
| 547 | 35, |
| 548 | [6, 30, 54, 78, 102, 126, 150], |
| 549 | new EcBlocks(30, new EcBlock(12, 121), new EcBlock(7, 122)), |
| 550 | new EcBlocks(28, new EcBlock(12, 47), new EcBlock(26, 48)), |
| 551 | new EcBlocks(30, new EcBlock(39, 24), new EcBlock(14, 25)), |
| 552 | new EcBlocks(30, new EcBlock(22, 15), new EcBlock(41, 16)) |
| 553 | ), |
| 554 | new self( |
| 555 | 36, |
| 556 | [6, 24, 50, 76, 102, 128, 154], |
| 557 | new EcBlocks(30, new EcBlock(6, 121), new EcBlock(14, 122)), |
| 558 | new EcBlocks(28, new EcBlock(6, 47), new EcBlock(34, 48)), |
| 559 | new EcBlocks(30, new EcBlock(46, 24), new EcBlock(10, 25)), |
| 560 | new EcBlocks(30, new EcBlock(2, 15), new EcBlock(64, 16)) |
| 561 | ), |
| 562 | new self( |
| 563 | 37, |
| 564 | [6, 28, 54, 80, 106, 132, 158], |
| 565 | new EcBlocks(30, new EcBlock(17, 122), new EcBlock(4, 123)), |
| 566 | new EcBlocks(28, new EcBlock(29, 46), new EcBlock(14, 47)), |
| 567 | new EcBlocks(30, new EcBlock(49, 24), new EcBlock(10, 25)), |
| 568 | new EcBlocks(30, new EcBlock(24, 15), new EcBlock(46, 16)) |
| 569 | ), |
| 570 | new self( |
| 571 | 38, |
| 572 | [6, 32, 58, 84, 110, 136, 162], |
| 573 | new EcBlocks(30, new EcBlock(4, 122), new EcBlock(18, 123)), |
| 574 | new EcBlocks(28, new EcBlock(13, 46), new EcBlock(32, 47)), |
| 575 | new EcBlocks(30, new EcBlock(48, 24), new EcBlock(14, 25)), |
| 576 | new EcBlocks(30, new EcBlock(42, 15), new EcBlock(32, 16)) |
| 577 | ), |
| 578 | new self( |
| 579 | 39, |
| 580 | [6, 26, 54, 82, 110, 138, 166], |
| 581 | new EcBlocks(30, new EcBlock(20, 117), new EcBlock(4, 118)), |
| 582 | new EcBlocks(28, new EcBlock(40, 47), new EcBlock(7, 48)), |
| 583 | new EcBlocks(30, new EcBlock(43, 24), new EcBlock(22, 25)), |
| 584 | new EcBlocks(30, new EcBlock(10, 15), new EcBlock(67, 16)) |
| 585 | ), |
| 586 | new self( |
| 587 | 40, |
| 588 | [6, 30, 58, 86, 114, 142, 170], |
| 589 | new EcBlocks(30, new EcBlock(19, 118), new EcBlock(6, 119)), |
| 590 | new EcBlocks(28, new EcBlock(18, 47), new EcBlock(31, 48)), |
| 591 | new EcBlocks(30, new EcBlock(34, 24), new EcBlock(34, 25)), |
| 592 | new EcBlocks(30, new EcBlock(20, 15), new EcBlock(61, 16)) |
| 593 | ), |
| 594 | ]; |
| 595 | } |
| 596 | } |
| 597 |