diff --git a/README.md b/README.md index abef0f6..84993f0 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ formats. - Upgrade an ISBN-10 to its equivalent ISBN-13. - Compare ISBNs across formats: an ISBN-10 is equal to its 13-digit equivalent. +- Format ISBNs with proper hyphenation, using the International ISBN + Agency's registration group and registrant range data. ## Requirements @@ -55,6 +57,12 @@ const upgraded = ten.upgrade(); // Comparison works across formats. std.debug.assert(ten.eql(&thirteen)); + +// Hyphenate explicitly, or format with {f}. +var buf: [ISBN.max_hyphenated_len]u8 = undefined; +const hyphenated = try upgraded.hyphenate(&buf); +std.debug.print("{s}\n", .{hyphenated}); // 978-0-306-40615-7 +std.debug.print("{f}\n", .{ten}); // 0-306-40615-2 ``` `parse` returns `error.ParseError` for malformed input and @@ -65,6 +73,16 @@ std.debug.assert(ten.eql(&thirteen)); - `-Dsimd=[bool]` — use SIMD vector operations for computing check digits (default: `true`). +## Range data + +Hyphenation uses the registration group and registrant ranges published +by the [International ISBN Agency](https://www.isbn-international.org/), +embedded at build time as `src/ranges.zig`. To update them: + +```sh +zig build update-ranges +``` + ## Testing ```sh diff --git a/build.zig b/build.zig index f137a22..897284f 100644 --- a/build.zig +++ b/build.zig @@ -58,4 +58,27 @@ pub fn build(b: *std.Build) void { const bench_step = b.step("bench", "Run benchmarks comparing SIMD and scalar check digit computation"); bench_step.dependOn(&run_bench.step); + + // The generator runs on the build host and writes into the source + // tree, so it ignores -Dtarget and -Doptimize. + const generate_exe = b.addExecutable(.{ + .name = "generate_ranges", + .root_module = b.createModule(.{ + .root_source_file = b.path("tools/generate_ranges.zig"), + .target = b.graph.host, + .optimize = .Debug, + }), + }); + + const run_generate = b.addRunArtifact(generate_exe); + const generated = run_generate.addOutputFileArg("ranges.zig"); + // Declaring an output makes the run step cacheable, but the fetch + // must happen every time the step is requested. + run_generate.has_side_effects = true; + + const update_source = b.addUpdateSourceFiles(); + update_source.addCopyFileToSource(generated, "src/ranges.zig"); + + const update_ranges_step = b.step("update-ranges", "Fetch the ISBN range data and regenerate src/ranges.zig"); + update_ranges_step.dependOn(&update_source.step); } diff --git a/src/isbn.zig b/src/isbn.zig index 4b4c384..402c0e2 100644 --- a/src/isbn.zig +++ b/src/isbn.zig @@ -6,6 +6,7 @@ const std = @import("std"); const options = @import("options"); +const ranges = @import("ranges.zig"); /// An International Standard Book Number in either the legacy 10-digit /// format or the current 13-digit (EAN-13) format. @@ -195,6 +196,106 @@ pub const ISBN = union(enum) { } } + /// The maximum length of a hyphenated ISBN: 13 digits plus 4 hyphens. + pub const max_hyphenated_len = 17; + + pub const HyphenateError = error{ + /// The ISBN does not fall in a range assigned by the + /// International ISBN Agency, so the element boundaries are + /// unknown. + UnknownRange, + }; + + /// Writes the canonically hyphenated form into `out` and returns the + /// written slice: prefix, registration group, registrant, and + /// publication elements separated by `-` (the prefix element only for + /// an ISBN-13), followed by the check digit. + /// + /// The element boundaries come from the International ISBN Agency's + /// range data embedded at build time (see `tools/generate_ranges.py`); + /// returns `error.UnknownRange` for an ISBN outside the assigned + /// ranges. + pub fn hyphenate(self: *const ISBN, out: *[max_hyphenated_len]u8) HyphenateError![]const u8 { + switch (self.*) { + .@"10" => |buf| return writeHyphenated(out, null, buf[0..9], buf[9]), + .@"13" => |buf| return writeHyphenated(out, buf[0..3], buf[3..12], buf[12]), + } + } + + /// Splits `digits` (registration group + registrant + publication) + /// per the range data and writes `prefix-group-registrant-publication-check` + /// (without the prefix element when `prefix` is null, for ISBN-10s, + /// which all live in the 978 prefix). + fn writeHyphenated( + out: *[max_hyphenated_len]u8, + prefix: ?*const [3]u8, + digits: *const [9]u8, + check: u8, + ) HyphenateError![]const u8 { + const ean: u16 = if (prefix) |p| ean: { + var v: u16 = 0; + for (p) |c| v = v * 10 + (c - '0'); + break :ean v; + } else 978; + + const group = for (ranges.groups) |*g| { + if (g.ean == ean and std.mem.startsWith(u8, digits, g.digits)) break g; + } else return error.UnknownRange; + const group_len = group.digits.len; + + // The registrant length is determined by the value of the seven + // digits that follow the group, padded with zeros on the right. + var v: u32 = 0; + for (0..7) |i| { + const idx = group_len + i; + const d: u32 = if (idx < 9) digits[idx] - '0' else 0; + v = v * 10 + d; + } + const registrant_len = for (group.rules) |r| { + if (v >= r.min and v <= r.max) break r.len; + } else 0; + if (registrant_len == 0 or group_len + registrant_len >= 9) return error.UnknownRange; + + var n: usize = 0; + if (prefix) |p| { + @memcpy(out[n..][0..3], p); + n += 3; + out[n] = '-'; + n += 1; + } + @memcpy(out[n..][0..group_len], group.digits); + n += group_len; + out[n] = '-'; + n += 1; + @memcpy(out[n..][0..registrant_len], digits[group_len..][0..registrant_len]); + n += registrant_len; + out[n] = '-'; + n += 1; + const publication_len = 9 - group_len - registrant_len; + @memcpy(out[n..][0..publication_len], digits[group_len + registrant_len ..][0..publication_len]); + n += publication_len; + out[n] = '-'; + n += 1; + out[n] = check; + n += 1; + return out[0..n]; + } + + /// Formats the ISBN for `{f}`: hyphenated when it falls in a range + /// assigned by the International ISBN Agency, as bare digits + /// otherwise. + pub fn format(self: *const ISBN, writer: *std.Io.Writer) std.Io.Writer.Error!void { + var buf: [max_hyphenated_len]u8 = undefined; + if (self.hyphenate(&buf)) |s| { + try writer.writeAll(s); + } else |_| { + try writer.writeAll(switch (self.*) { + .@"10" => |*b| b[0..], + .@"13" => |*b| b[0..], + }); + } + } + /// Returns true if the two ISBNs identify the same book. ISBNs of /// different formats are compared by upgrading both to ISBN-13, so an /// ISBN-10 is equal to its 13-digit equivalent. @@ -317,6 +418,38 @@ test "upgrade and eql" { try std.testing.expect(!thirteen.eql(&other)); } +test "hyphenate" { + var buf: [ISBN.max_hyphenated_len]u8 = undefined; + + const ten: ISBN = try .parse("0306406152"); + try std.testing.expectEqualStrings("0-306-40615-2", try ten.hyphenate(&buf)); + + const ten_x: ISBN = try .parse("080442957X"); + try std.testing.expectEqualStrings("0-8044-2957-X", try ten_x.hyphenate(&buf)); + + const thirteen: ISBN = try .parse("9780306406157"); + try std.testing.expectEqualStrings("978-0-306-40615-7", try thirteen.hyphenate(&buf)); + + const nine_seven_nine: ISBN = try .parse("9791090636071"); + try std.testing.expectEqualStrings("979-10-90636-07-1", try nine_seven_nine.hyphenate(&buf)); + + // 978-99999 is not an assigned registration group. + const unknown: ISBN = try .parse("9999999999"); + try std.testing.expectError(error.UnknownRange, unknown.hyphenate(&buf)); +} + +test "format" { + const thirteen: ISBN = try .parse("978-0-306-40615-7"); + try std.testing.expectFmt("978-0-306-40615-7", "{f}", .{thirteen}); + + const ten: ISBN = try .parse("0-306-40615-2"); + try std.testing.expectFmt("0-306-40615-2", "{f}", .{ten}); + + // An ISBN outside the assigned ranges falls back to bare digits. + const unknown: ISBN = try .parse("9999999999"); + try std.testing.expectFmt("9999999999", "{f}", .{unknown}); +} + fn fuzz(_: void, smith: *std.testing.Smith) !void { { const len_weights: []const std.testing.Smith.Weight = &.{ diff --git a/src/ranges.zig b/src/ranges.zig new file mode 100644 index 0000000..87c83f4 --- /dev/null +++ b/src/ranges.zig @@ -0,0 +1,3619 @@ +// SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie +// SPDX-License-Identifier: MIT + +//! ISBN registration group and registrant ranges, generated by +//! tools/generate_ranges.zig from the International ISBN Agency's +//! range data (https://www.isbn-international.org/export_rangemessage.xml). +//! Do not edit by hand. +//! +//! Message date: Sat, 29 Aug 2026 03:51:33 BST +//! Serial number: ef91a48c-8ce8-476a-b73b-250a936f23a9 + +/// Determines the length of the registrant element from the value of +/// the seven digits that follow the registration group. +pub const Rule = struct { + /// Inclusive lower bound on the seven-digit value. + min: u32, + /// Inclusive upper bound on the seven-digit value. + max: u32, + /// Number of digits in the registrant element; 0 means the range + /// has not been assigned and cannot be hyphenated. + len: u8, +}; + +/// A registration group (a country, region, or language area). +pub const Group = struct { + /// The EAN prefix, 978 or 979. + ean: u16, + /// The registration group digits that follow the EAN prefix. + digits: []const u8, + /// Registrant length rules for this group. + rules: []const Rule, +}; + +pub const groups: []const Group = &.{ + .{ + .ean = 978, + .digits = "0", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 2279999, .len = 3 }, + .{ .min = 2280000, .max = 2289999, .len = 4 }, + .{ .min = 2290000, .max = 3689999, .len = 3 }, + .{ .min = 3690000, .max = 3699999, .len = 4 }, + .{ .min = 3700000, .max = 6389999, .len = 3 }, + .{ .min = 6390000, .max = 6397999, .len = 4 }, + .{ .min = 6398000, .max = 6399999, .len = 7 }, + .{ .min = 6400000, .max = 6449999, .len = 3 }, + .{ .min = 6450000, .max = 6459999, .len = 7 }, + .{ .min = 6460000, .max = 6479999, .len = 3 }, + .{ .min = 6480000, .max = 6489999, .len = 7 }, + .{ .min = 6490000, .max = 6549999, .len = 3 }, + .{ .min = 6550000, .max = 6559999, .len = 4 }, + .{ .min = 6560000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9003709, .len = 6 }, + .{ .min = 9003710, .max = 9003719, .len = 7 }, + .{ .min = 9003720, .max = 9499999, .len = 6 }, + .{ .min = 9500000, .max = 9999999, .len = 7 }, + }, + }, + .{ + .ean = 978, + .digits = "1", + .rules = &.{ + .{ .min = 0, .max = 99999, .len = 3 }, + .{ .min = 100000, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 349999, .len = 3 }, + .{ .min = 350000, .max = 399999, .len = 4 }, + .{ .min = 400000, .max = 459999, .len = 3 }, + .{ .min = 460000, .max = 469999, .len = 4 }, + .{ .min = 470000, .max = 479999, .len = 3 }, + .{ .min = 480000, .max = 499999, .len = 4 }, + .{ .min = 500000, .max = 599999, .len = 2 }, + .{ .min = 600000, .max = 664999, .len = 0 }, + .{ .min = 665000, .max = 665749, .len = 7 }, + .{ .min = 665750, .max = 665999, .len = 7 }, + .{ .min = 666000, .max = 669999, .len = 7 }, + .{ .min = 670000, .max = 699999, .len = 7 }, + .{ .min = 700000, .max = 999999, .len = 4 }, + .{ .min = 1000000, .max = 3979999, .len = 3 }, + .{ .min = 3980000, .max = 5499999, .len = 4 }, + .{ .min = 5500000, .max = 6499999, .len = 5 }, + .{ .min = 6500000, .max = 6799999, .len = 4 }, + .{ .min = 6800000, .max = 6859999, .len = 5 }, + .{ .min = 6860000, .max = 7139999, .len = 4 }, + .{ .min = 7140000, .max = 7169999, .len = 3 }, + .{ .min = 7170000, .max = 7319999, .len = 4 }, + .{ .min = 7320000, .max = 7399999, .len = 7 }, + .{ .min = 7400000, .max = 7619999, .len = 5 }, + .{ .min = 7620000, .max = 7634999, .len = 4 }, + .{ .min = 7635000, .max = 7649999, .len = 7 }, + .{ .min = 7650000, .max = 7749999, .len = 5 }, + .{ .min = 7750000, .max = 7753999, .len = 7 }, + .{ .min = 7754000, .max = 7763999, .len = 5 }, + .{ .min = 7764000, .max = 7764999, .len = 7 }, + .{ .min = 7765000, .max = 7769999, .len = 5 }, + .{ .min = 7770000, .max = 7782999, .len = 7 }, + .{ .min = 7783000, .max = 7899999, .len = 5 }, + .{ .min = 7900000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8004999, .len = 5 }, + .{ .min = 8005000, .max = 8049999, .len = 5 }, + .{ .min = 8050000, .max = 8379999, .len = 5 }, + .{ .min = 8380000, .max = 8384999, .len = 7 }, + .{ .min = 8385000, .max = 8671999, .len = 5 }, + .{ .min = 8672000, .max = 8675999, .len = 4 }, + .{ .min = 8676000, .max = 8697999, .len = 5 }, + .{ .min = 8698000, .max = 9159999, .len = 6 }, + .{ .min = 9160000, .max = 9165059, .len = 7 }, + .{ .min = 9165060, .max = 9168699, .len = 6 }, + .{ .min = 9168700, .max = 9169079, .len = 7 }, + .{ .min = 9169080, .max = 9191639, .len = 6 }, + .{ .min = 9191640, .max = 9195649, .len = 7 }, + .{ .min = 9195650, .max = 9195999, .len = 6 }, + .{ .min = 9196000, .max = 9196549, .len = 7 }, + .{ .min = 9196550, .max = 9729999, .len = 6 }, + .{ .min = 9730000, .max = 9877999, .len = 4 }, + .{ .min = 9878000, .max = 9911499, .len = 6 }, + .{ .min = 9911500, .max = 9911999, .len = 7 }, + .{ .min = 9912000, .max = 9989899, .len = 6 }, + .{ .min = 9989900, .max = 9999999, .len = 7 }, + }, + }, + .{ + .ean = 978, + .digits = "2", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 3499999, .len = 3 }, + .{ .min = 3500000, .max = 3999999, .len = 5 }, + .{ .min = 4000000, .max = 4869999, .len = 3 }, + .{ .min = 4870000, .max = 4949999, .len = 6 }, + .{ .min = 4950000, .max = 4959999, .len = 3 }, + .{ .min = 4960000, .max = 4966999, .len = 4 }, + .{ .min = 4967000, .max = 4969999, .len = 5 }, + .{ .min = 4970000, .max = 5279999, .len = 3 }, + .{ .min = 5280000, .max = 5299999, .len = 4 }, + .{ .min = 5300000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8399999, .len = 4 }, + .{ .min = 8400000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9197999, .len = 6 }, + .{ .min = 9198000, .max = 9198099, .len = 5 }, + .{ .min = 9198100, .max = 9199429, .len = 6 }, + .{ .min = 9199430, .max = 9199689, .len = 7 }, + .{ .min = 9199690, .max = 9499999, .len = 6 }, + .{ .min = 9500000, .max = 9999999, .len = 7 }, + }, + }, + .{ + .ean = 978, + .digits = "3", + .rules = &.{ + .{ .min = 0, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 339999, .len = 3 }, + .{ .min = 340000, .max = 369999, .len = 4 }, + .{ .min = 370000, .max = 399999, .len = 5 }, + .{ .min = 400000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 3129999, .len = 3 }, + .{ .min = 3130000, .max = 3139999, .len = 4 }, + .{ .min = 3140000, .max = 3899999, .len = 3 }, + .{ .min = 3900000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 6759999, .len = 3 }, + .{ .min = 6760000, .max = 6879999, .len = 5 }, + .{ .min = 6880000, .max = 6889999, .len = 3 }, + .{ .min = 6890000, .max = 6949999, .len = 5 }, + .{ .min = 6950000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9499999, .len = 6 }, + .{ .min = 9500000, .max = 9539999, .len = 7 }, + .{ .min = 9540000, .max = 9699999, .len = 5 }, + .{ .min = 9700000, .max = 9849999, .len = 7 }, + .{ .min = 9850000, .max = 9995999, .len = 5 }, + .{ .min = 9996000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "4", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9499999, .len = 6 }, + .{ .min = 9500000, .max = 9999999, .len = 7 }, + }, + }, + .{ + .ean = 978, + .digits = "5", + .rules = &.{ + .{ .min = 0, .max = 49999, .len = 5 }, + .{ .min = 50000, .max = 99999, .len = 4 }, + .{ .min = 100000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 3619999, .len = 3 }, + .{ .min = 3620000, .max = 3623999, .len = 4 }, + .{ .min = 3624000, .max = 3629999, .len = 5 }, + .{ .min = 3630000, .max = 4209999, .len = 3 }, + .{ .min = 4210000, .max = 4299999, .len = 4 }, + .{ .min = 4300000, .max = 4309999, .len = 3 }, + .{ .min = 4310000, .max = 4399999, .len = 4 }, + .{ .min = 4400000, .max = 4409999, .len = 3 }, + .{ .min = 4410000, .max = 4499999, .len = 4 }, + .{ .min = 4500000, .max = 6029999, .len = 3 }, + .{ .min = 6030000, .max = 6049999, .len = 7 }, + .{ .min = 6050000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9099999, .len = 6 }, + .{ .min = 9100000, .max = 9199999, .len = 5 }, + .{ .min = 9200000, .max = 9299999, .len = 4 }, + .{ .min = 9300000, .max = 9499999, .len = 5 }, + .{ .min = 9500000, .max = 9500999, .len = 7 }, + .{ .min = 9501000, .max = 9799999, .len = 4 }, + .{ .min = 9800000, .max = 9899999, .len = 5 }, + .{ .min = 9900000, .max = 9909999, .len = 7 }, + .{ .min = 9910000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "600", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9867999, .len = 5 }, + .{ .min = 9868000, .max = 9929999, .len = 4 }, + .{ .min = 9930000, .max = 9959999, .len = 3 }, + .{ .min = 9960000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "601", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8499999, .len = 5 }, + .{ .min = 8500000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "602", + .rules = &.{ + .{ .min = 0, .max = 699999, .len = 2 }, + .{ .min = 700000, .max = 1399999, .len = 4 }, + .{ .min = 1400000, .max = 1499999, .len = 5 }, + .{ .min = 1500000, .max = 1699999, .len = 4 }, + .{ .min = 1700000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 5399999, .len = 5 }, + .{ .min = 5400000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 6199999, .len = 5 }, + .{ .min = 6200000, .max = 6999999, .len = 4 }, + .{ .min = 7000000, .max = 7499999, .len = 5 }, + .{ .min = 7500000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "603", + .rules = &.{ + .{ .min = 0, .max = 499999, .len = 2 }, + .{ .min = 500000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "604", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 4699999, .len = 2 }, + .{ .min = 4700000, .max = 4979999, .len = 3 }, + .{ .min = 4980000, .max = 4999999, .len = 4 }, + .{ .min = 5000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9799999, .len = 3 }, + .{ .min = 9800000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "605", + .rules = &.{ + .{ .min = 0, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 399999, .len = 3 }, + .{ .min = 400000, .max = 599999, .len = 2 }, + .{ .min = 600000, .max = 699999, .len = 5 }, + .{ .min = 700000, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 1999999, .len = 3 }, + .{ .min = 2000000, .max = 2399999, .len = 4 }, + .{ .min = 2400000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 7499999, .len = 5 }, + .{ .min = 7500000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "606", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 3 }, + .{ .min = 1000000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9099999, .len = 4 }, + .{ .min = 9100000, .max = 9199999, .len = 3 }, + .{ .min = 9200000, .max = 9599999, .len = 5 }, + .{ .min = 9600000, .max = 9749999, .len = 4 }, + .{ .min = 9750000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "607", + .rules = &.{ + .{ .min = 0, .max = 2599999, .len = 2 }, + .{ .min = 2600000, .max = 2649999, .len = 4 }, + .{ .min = 2650000, .max = 2699999, .len = 5 }, + .{ .min = 2700000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 5889999, .len = 3 }, + .{ .min = 5890000, .max = 5929999, .len = 4 }, + .{ .min = 5930000, .max = 5999999, .len = 5 }, + .{ .min = 6000000, .max = 6919999, .len = 3 }, + .{ .min = 6920000, .max = 6999999, .len = 5 }, + .{ .min = 7000000, .max = 7499999, .len = 3 }, + .{ .min = 7500000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "608", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 4499999, .len = 3 }, + .{ .min = 4500000, .max = 6499999, .len = 4 }, + .{ .min = 6500000, .max = 6999999, .len = 5 }, + .{ .min = 7000000, .max = 9999999, .len = 1 }, + }, + }, + .{ + .ean = 978, + .digits = "609", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "611", + .rules = &.{ + .{ .min = 0, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "612", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 4499999, .len = 4 }, + .{ .min = 4500000, .max = 4999999, .len = 5 }, + .{ .min = 5000000, .max = 5299999, .len = 4 }, + .{ .min = 5300000, .max = 9899999, .len = 0 }, + .{ .min = 9900000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "613", + .rules = &.{ + .{ .min = 0, .max = 9999999, .len = 1 }, + }, + }, + .{ + .ean = 978, + .digits = "614", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "615", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "616", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "617", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9049999, .len = 4 }, + .{ .min = 9050000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "618", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "619", + .rules = &.{ + .{ .min = 0, .max = 1499999, .len = 2 }, + .{ .min = 1500000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "620", + .rules = &.{ + .{ .min = 0, .max = 9999999, .len = 1 }, + }, + }, + .{ + .ean = 978, + .digits = "621", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "622", + .rules = &.{ + .{ .min = 0, .max = 1099999, .len = 2 }, + .{ .min = 1100000, .max = 1299999, .len = 3 }, + .{ .min = 1300000, .max = 1799999, .len = 4 }, + .{ .min = 1800000, .max = 1829999, .len = 3 }, + .{ .min = 1830000, .max = 1899999, .len = 4 }, + .{ .min = 1900000, .max = 1949999, .len = 3 }, + .{ .min = 1950000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 4599999, .len = 3 }, + .{ .min = 4600000, .max = 8749999, .len = 4 }, + .{ .min = 8750000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "623", + .rules = &.{ + .{ .min = 0, .max = 1099999, .len = 2 }, + .{ .min = 1100000, .max = 5249999, .len = 3 }, + .{ .min = 5250000, .max = 8799999, .len = 4 }, + .{ .min = 8800000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "624", + .rules = &.{ + .{ .min = 0, .max = 499999, .len = 2 }, + .{ .min = 500000, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 2499999, .len = 3 }, + .{ .min = 2500000, .max = 4849999, .len = 0 }, + .{ .min = 4850000, .max = 6899999, .len = 4 }, + .{ .min = 6900000, .max = 9099999, .len = 0 }, + .{ .min = 9100000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "625", + .rules = &.{ + .{ .min = 0, .max = 199999, .len = 2 }, + .{ .min = 200000, .max = 3199999, .len = 0 }, + .{ .min = 3200000, .max = 4429999, .len = 3 }, + .{ .min = 4430000, .max = 4449999, .len = 5 }, + .{ .min = 4450000, .max = 4499999, .len = 3 }, + .{ .min = 4500000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 7793999, .len = 4 }, + .{ .min = 7794000, .max = 7794999, .len = 5 }, + .{ .min = 7795000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "626", + .rules = &.{ + .{ .min = 0, .max = 499999, .len = 2 }, + .{ .min = 500000, .max = 2999999, .len = 0 }, + .{ .min = 3000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 6499999, .len = 0 }, + .{ .min = 6500000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9249999, .len = 0 }, + .{ .min = 9250000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "627", + .rules = &.{ + .{ .min = 0, .max = 2799999, .len = 0 }, + .{ .min = 2800000, .max = 3199999, .len = 2 }, + .{ .min = 3200000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5349999, .len = 3 }, + .{ .min = 5350000, .max = 7399999, .len = 0 }, + .{ .min = 7400000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9449999, .len = 0 }, + .{ .min = 9450000, .max = 9514999, .len = 5 }, + .{ .min = 9515000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "628", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5499999, .len = 3 }, + .{ .min = 5500000, .max = 7499999, .len = 0 }, + .{ .min = 7500000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "629", + .rules = &.{ + .{ .min = 0, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 4549999, .len = 0 }, + .{ .min = 4550000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 7099999, .len = 0 }, + .{ .min = 7100000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9199999, .len = 0 }, + .{ .min = 9200000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "630", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 0 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 6499999, .len = 0 }, + .{ .min = 6500000, .max = 6849999, .len = 4 }, + .{ .min = 6850000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "631", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 2999999, .len = 0 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 6499999, .len = 0 }, + .{ .min = 6500000, .max = 7499999, .len = 4 }, + .{ .min = 7500000, .max = 8999999, .len = 0 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "632", + .rules = &.{ + .{ .min = 0, .max = 1199999, .len = 2 }, + .{ .min = 1200000, .max = 5999999, .len = 0 }, + .{ .min = 6000000, .max = 6799999, .len = 3 }, + .{ .min = 6800000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "633", + .rules = &.{ + .{ .min = 0, .max = 199999, .len = 2 }, + .{ .min = 200000, .max = 2999999, .len = 0 }, + .{ .min = 3000000, .max = 3499999, .len = 3 }, + .{ .min = 3500000, .max = 8249999, .len = 0 }, + .{ .min = 8250000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9949999, .len = 0 }, + .{ .min = 9950000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "634", + .rules = &.{ + .{ .min = 0, .max = 599999, .len = 2 }, + .{ .min = 600000, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 3499999, .len = 3 }, + .{ .min = 3500000, .max = 6999999, .len = 0 }, + .{ .min = 7000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9599999, .len = 0 }, + .{ .min = 9600000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "635", + .rules = &.{ + .{ .min = 0, .max = 499999, .len = 2 }, + .{ .min = 500000, .max = 2499999, .len = 0 }, + .{ .min = 2500000, .max = 3249999, .len = 3 }, + .{ .min = 3250000, .max = 5799999, .len = 0 }, + .{ .min = 5800000, .max = 6999999, .len = 4 }, + .{ .min = 7000000, .max = 9599999, .len = 0 }, + .{ .min = 9600000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "65", + .rules = &.{ + .{ .min = 0, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 2499999, .len = 0 }, + .{ .min = 2500000, .max = 2999999, .len = 3 }, + .{ .min = 3000000, .max = 3029999, .len = 3 }, + .{ .min = 3030000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 6349999, .len = 4 }, + .{ .min = 6350000, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 8182499, .len = 5 }, + .{ .min = 8182500, .max = 8199999, .len = 0 }, + .{ .min = 8200000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9024499, .len = 6 }, + .{ .min = 9024500, .max = 9754999, .len = 0 }, + .{ .min = 9755000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "66", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 0 }, + .{ .min = 3000000, .max = 3099999, .len = 2 }, + .{ .min = 3100000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "69990", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5199999, .len = 2 }, + .{ .min = 5200000, .max = 9899999, .len = 0 }, + .{ .min = 9900000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "7", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "80", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 5299999, .len = 3 }, + .{ .min = 5300000, .max = 5499999, .len = 5 }, + .{ .min = 5500000, .max = 6899999, .len = 3 }, + .{ .min = 6900000, .max = 6999999, .len = 5 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9989999, .len = 6 }, + .{ .min = 9990000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "81", + .rules = &.{ + .{ .min = 0, .max = 1899999, .len = 2 }, + .{ .min = 1900000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 6479999, .len = 3 }, + .{ .min = 6480000, .max = 6699999, .len = 4 }, + .{ .min = 6700000, .max = 6799999, .len = 4 }, + .{ .min = 6800000, .max = 6849999, .len = 5 }, + .{ .min = 6850000, .max = 6899999, .len = 6 }, + .{ .min = 6900000, .max = 6999999, .len = 5 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "82", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6899999, .len = 3 }, + .{ .min = 6900000, .max = 6999999, .len = 6 }, + .{ .min = 7000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9899999, .len = 5 }, + .{ .min = 9900000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "83", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 6999999, .len = 5 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "84", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 1049999, .len = 5 }, + .{ .min = 1050000, .max = 1199999, .len = 4 }, + .{ .min = 1200000, .max = 1299999, .len = 6 }, + .{ .min = 1300000, .max = 1399999, .len = 4 }, + .{ .min = 1400000, .max = 1499999, .len = 3 }, + .{ .min = 1500000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9199999, .len = 4 }, + .{ .min = 9200000, .max = 9239999, .len = 6 }, + .{ .min = 9240000, .max = 9299999, .len = 5 }, + .{ .min = 9300000, .max = 9499999, .len = 6 }, + .{ .min = 9500000, .max = 9699999, .len = 5 }, + .{ .min = 9700000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "85", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 4549999, .len = 3 }, + .{ .min = 4550000, .max = 4552999, .len = 6 }, + .{ .min = 4553000, .max = 4559999, .len = 5 }, + .{ .min = 4560000, .max = 5289999, .len = 3 }, + .{ .min = 5290000, .max = 5319999, .len = 5 }, + .{ .min = 5320000, .max = 5339999, .len = 4 }, + .{ .min = 5340000, .max = 5399999, .len = 3 }, + .{ .min = 5400000, .max = 5402999, .len = 5 }, + .{ .min = 5403000, .max = 5403999, .len = 5 }, + .{ .min = 5404000, .max = 5404999, .len = 6 }, + .{ .min = 5405000, .max = 5408999, .len = 5 }, + .{ .min = 5409000, .max = 5409999, .len = 6 }, + .{ .min = 5410000, .max = 5439999, .len = 5 }, + .{ .min = 5440000, .max = 5479999, .len = 4 }, + .{ .min = 5480000, .max = 5499999, .len = 5 }, + .{ .min = 5500000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 6999999, .len = 5 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9249999, .len = 6 }, + .{ .min = 9250000, .max = 9449999, .len = 5 }, + .{ .min = 9450000, .max = 9599999, .len = 4 }, + .{ .min = 9600000, .max = 9799999, .len = 2 }, + .{ .min = 9800000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "86", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "87", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 6499999, .len = 3 }, + .{ .min = 6500000, .max = 6999999, .len = 0 }, + .{ .min = 7000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8499999, .len = 0 }, + .{ .min = 8500000, .max = 9499999, .len = 5 }, + .{ .min = 9500000, .max = 9699999, .len = 0 }, + .{ .min = 9700000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "88", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 3119999, .len = 3 }, + .{ .min = 3120000, .max = 3149999, .len = 5 }, + .{ .min = 3150000, .max = 3189999, .len = 3 }, + .{ .min = 3190000, .max = 3229999, .len = 5 }, + .{ .min = 3230000, .max = 3269999, .len = 3 }, + .{ .min = 3270000, .max = 3389999, .len = 4 }, + .{ .min = 3390000, .max = 3609999, .len = 3 }, + .{ .min = 3610000, .max = 3629999, .len = 4 }, + .{ .min = 3630000, .max = 5489999, .len = 3 }, + .{ .min = 5490000, .max = 5549999, .len = 4 }, + .{ .min = 5550000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9099999, .len = 6 }, + .{ .min = 9100000, .max = 9269999, .len = 3 }, + .{ .min = 9270000, .max = 9399999, .len = 4 }, + .{ .min = 9400000, .max = 9479999, .len = 6 }, + .{ .min = 9480000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "89", + .rules = &.{ + .{ .min = 0, .max = 2499999, .len = 2 }, + .{ .min = 2500000, .max = 5499999, .len = 3 }, + .{ .min = 5500000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 9499999, .len = 5 }, + .{ .min = 9500000, .max = 9699999, .len = 6 }, + .{ .min = 9700000, .max = 9899999, .len = 5 }, + .{ .min = 9900000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "90", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 6999999, .len = 4 }, + .{ .min = 7000000, .max = 7999999, .len = 5 }, + .{ .min = 8000000, .max = 8499999, .len = 6 }, + .{ .min = 8500000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9099999, .len = 2 }, + .{ .min = 9100000, .max = 9399999, .len = 0 }, + .{ .min = 9400000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "91", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 6499999, .len = 3 }, + .{ .min = 6500000, .max = 6849999, .len = 0 }, + .{ .min = 6850000, .max = 8199999, .len = 4 }, + .{ .min = 8200000, .max = 8499999, .len = 0 }, + .{ .min = 8500000, .max = 9499999, .len = 5 }, + .{ .min = 9500000, .max = 9699999, .len = 0 }, + .{ .min = 9700000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "92", + .rules = &.{ + .{ .min = 0, .max = 5999999, .len = 1 }, + .{ .min = 6000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9899999, .len = 5 }, + .{ .min = 9900000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "93", + .rules = &.{ + .{ .min = 0, .max = 899999, .len = 2 }, + .{ .min = 900000, .max = 999999, .len = 4 }, + .{ .min = 1000000, .max = 4699999, .len = 3 }, + .{ .min = 4700000, .max = 4799999, .len = 5 }, + .{ .min = 4800000, .max = 4999999, .len = 5 }, + .{ .min = 5000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9599999, .len = 5 }, + .{ .min = 9600000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 978, + .digits = "94", + .rules = &.{ + .{ .min = 0, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 6387999, .len = 4 }, + .{ .min = 6388000, .max = 6388099, .len = 6 }, + .{ .min = 6388100, .max = 6388199, .len = 5 }, + .{ .min = 6388200, .max = 6388399, .len = 6 }, + .{ .min = 6388400, .max = 6388599, .len = 5 }, + .{ .min = 6388600, .max = 6388699, .len = 6 }, + .{ .min = 6388700, .max = 6388999, .len = 5 }, + .{ .min = 6389000, .max = 6395999, .len = 4 }, + .{ .min = 6396000, .max = 6396099, .len = 6 }, + .{ .min = 6396100, .max = 6396299, .len = 5 }, + .{ .min = 6396300, .max = 6396399, .len = 6 }, + .{ .min = 6396400, .max = 6396499, .len = 5 }, + .{ .min = 6396500, .max = 6396599, .len = 6 }, + .{ .min = 6396600, .max = 6396999, .len = 5 }, + .{ .min = 6397000, .max = 6399999, .len = 4 }, + .{ .min = 6400000, .max = 6400099, .len = 6 }, + .{ .min = 6400100, .max = 6400499, .len = 5 }, + .{ .min = 6400500, .max = 6400599, .len = 6 }, + .{ .min = 6400600, .max = 6400699, .len = 5 }, + .{ .min = 6400700, .max = 6400899, .len = 6 }, + .{ .min = 6400900, .max = 6400999, .len = 5 }, + .{ .min = 6401000, .max = 6406999, .len = 4 }, + .{ .min = 6407000, .max = 6407399, .len = 6 }, + .{ .min = 6407400, .max = 6407499, .len = 5 }, + .{ .min = 6407500, .max = 6407599, .len = 6 }, + .{ .min = 6407600, .max = 6407799, .len = 5 }, + .{ .min = 6407800, .max = 6407999, .len = 6 }, + .{ .min = 6408000, .max = 6419999, .len = 4 }, + .{ .min = 6420000, .max = 6420199, .len = 5 }, + .{ .min = 6420200, .max = 6420299, .len = 6 }, + .{ .min = 6420300, .max = 6420399, .len = 5 }, + .{ .min = 6420400, .max = 6420499, .len = 6 }, + .{ .min = 6420500, .max = 6420699, .len = 5 }, + .{ .min = 6420700, .max = 6420799, .len = 6 }, + .{ .min = 6420800, .max = 6420899, .len = 5 }, + .{ .min = 6420900, .max = 6420999, .len = 6 }, + .{ .min = 6421000, .max = 6432999, .len = 4 }, + .{ .min = 6433000, .max = 6433199, .len = 5 }, + .{ .min = 6433200, .max = 6433299, .len = 6 }, + .{ .min = 6433300, .max = 6433399, .len = 5 }, + .{ .min = 6433400, .max = 6433599, .len = 6 }, + .{ .min = 6433600, .max = 6433699, .len = 5 }, + .{ .min = 6433700, .max = 6433799, .len = 6 }, + .{ .min = 6433800, .max = 6433999, .len = 5 }, + .{ .min = 6434000, .max = 6435999, .len = 4 }, + .{ .min = 6436000, .max = 6436099, .len = 6 }, + .{ .min = 6436100, .max = 6436399, .len = 5 }, + .{ .min = 6436400, .max = 6436599, .len = 6 }, + .{ .min = 6436600, .max = 6436699, .len = 5 }, + .{ .min = 6436700, .max = 6436799, .len = 6 }, + .{ .min = 6436800, .max = 6436999, .len = 5 }, + .{ .min = 6437000, .max = 6443999, .len = 4 }, + .{ .min = 6444000, .max = 6444099, .len = 6 }, + .{ .min = 6444100, .max = 6444199, .len = 5 }, + .{ .min = 6444200, .max = 6444299, .len = 6 }, + .{ .min = 6444300, .max = 6444399, .len = 5 }, + .{ .min = 6444400, .max = 6444499, .len = 6 }, + .{ .min = 6444500, .max = 6444699, .len = 5 }, + .{ .min = 6444700, .max = 6444899, .len = 6 }, + .{ .min = 6444900, .max = 6444999, .len = 5 }, + .{ .min = 6445000, .max = 6450999, .len = 4 }, + .{ .min = 6451000, .max = 6451299, .len = 5 }, + .{ .min = 6451300, .max = 6451399, .len = 6 }, + .{ .min = 6451400, .max = 6451599, .len = 5 }, + .{ .min = 6451600, .max = 6451999, .len = 6 }, + .{ .min = 6452000, .max = 6458999, .len = 4 }, + .{ .min = 6459000, .max = 6459099, .len = 6 }, + .{ .min = 6459100, .max = 6459299, .len = 5 }, + .{ .min = 6459300, .max = 6459499, .len = 6 }, + .{ .min = 6459500, .max = 6459699, .len = 5 }, + .{ .min = 6459700, .max = 6459899, .len = 6 }, + .{ .min = 6459900, .max = 6459999, .len = 5 }, + .{ .min = 6460000, .max = 6465999, .len = 4 }, + .{ .min = 6466000, .max = 6466099, .len = 6 }, + .{ .min = 6466100, .max = 6466299, .len = 5 }, + .{ .min = 6466300, .max = 6466599, .len = 6 }, + .{ .min = 6466600, .max = 6466699, .len = 5 }, + .{ .min = 6466700, .max = 6466899, .len = 6 }, + .{ .min = 6466900, .max = 6466999, .len = 5 }, + .{ .min = 6467000, .max = 6474999, .len = 4 }, + .{ .min = 6475000, .max = 6475199, .len = 5 }, + .{ .min = 6475200, .max = 6475399, .len = 6 }, + .{ .min = 6475400, .max = 6475499, .len = 5 }, + .{ .min = 6475500, .max = 6475599, .len = 6 }, + .{ .min = 6475600, .max = 6475799, .len = 5 }, + .{ .min = 6475800, .max = 6475899, .len = 6 }, + .{ .min = 6475900, .max = 6475999, .len = 5 }, + .{ .min = 6476000, .max = 6476999, .len = 4 }, + .{ .min = 6477000, .max = 6477089, .len = 6 }, + .{ .min = 6477090, .max = 6477099, .len = 0 }, + .{ .min = 6477100, .max = 6477199, .len = 5 }, + .{ .min = 6477200, .max = 6477229, .len = 0 }, + .{ .min = 6477230, .max = 6477299, .len = 6 }, + .{ .min = 6477300, .max = 6477399, .len = 5 }, + .{ .min = 6477400, .max = 6477699, .len = 6 }, + .{ .min = 6477700, .max = 6477999, .len = 5 }, + .{ .min = 6478000, .max = 6478099, .len = 6 }, + .{ .min = 6478100, .max = 6478199, .len = 5 }, + .{ .min = 6478200, .max = 6478299, .len = 6 }, + .{ .min = 6478300, .max = 6478699, .len = 5 }, + .{ .min = 6478700, .max = 6478799, .len = 6 }, + .{ .min = 6478800, .max = 6478999, .len = 5 }, + .{ .min = 6479000, .max = 6493999, .len = 4 }, + .{ .min = 6494000, .max = 6494099, .len = 6 }, + .{ .min = 6494100, .max = 6494299, .len = 5 }, + .{ .min = 6494300, .max = 6494499, .len = 6 }, + .{ .min = 6494500, .max = 6494699, .len = 5 }, + .{ .min = 6494700, .max = 6494799, .len = 6 }, + .{ .min = 6494800, .max = 6494899, .len = 5 }, + .{ .min = 6494900, .max = 6494999, .len = 6 }, + .{ .min = 6495000, .max = 6497999, .len = 4 }, + .{ .min = 6498000, .max = 6498099, .len = 5 }, + .{ .min = 6498100, .max = 6498299, .len = 6 }, + .{ .min = 6498300, .max = 6498499, .len = 5 }, + .{ .min = 6498500, .max = 6498699, .len = 6 }, + .{ .min = 6498700, .max = 6498799, .len = 5 }, + .{ .min = 6498800, .max = 6498999, .len = 6 }, + .{ .min = 6499000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "950", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9899999, .len = 4 }, + .{ .min = 9900000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "951", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 8899999, .len = 3 }, + .{ .min = 8900000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "952", + .rules = &.{ + .{ .min = 0, .max = 1799999, .len = 2 }, + .{ .min = 1800000, .max = 1899999, .len = 3 }, + .{ .min = 1900000, .max = 1949999, .len = 0 }, + .{ .min = 1950000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 6499999, .len = 2 }, + .{ .min = 6500000, .max = 6599999, .len = 5 }, + .{ .min = 6600000, .max = 6699999, .len = 4 }, + .{ .min = 6700000, .max = 6999999, .len = 5 }, + .{ .min = 7000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9899999, .len = 4 }, + .{ .min = 9900000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "953", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1499999, .len = 2 }, + .{ .min = 1500000, .max = 4599999, .len = 3 }, + .{ .min = 4600000, .max = 4999999, .len = 5 }, + .{ .min = 5000000, .max = 5009999, .len = 3 }, + .{ .min = 5010000, .max = 5099999, .len = 5 }, + .{ .min = 5100000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 5999999, .len = 5 }, + .{ .min = 6000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "954", + .rules = &.{ + .{ .min = 0, .max = 2899999, .len = 2 }, + .{ .min = 2900000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9299999, .len = 5 }, + .{ .min = 9300000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "955", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 4 }, + .{ .min = 2000000, .max = 3399999, .len = 2 }, + .{ .min = 3400000, .max = 3549999, .len = 4 }, + .{ .min = 3550000, .max = 3599999, .len = 5 }, + .{ .min = 3600000, .max = 3799999, .len = 4 }, + .{ .min = 3800000, .max = 3899999, .len = 5 }, + .{ .min = 3900000, .max = 4099999, .len = 4 }, + .{ .min = 4100000, .max = 4499999, .len = 5 }, + .{ .min = 4500000, .max = 4999999, .len = 4 }, + .{ .min = 5000000, .max = 5499999, .len = 5 }, + .{ .min = 5500000, .max = 7109999, .len = 3 }, + .{ .min = 7110000, .max = 7149999, .len = 5 }, + .{ .min = 7150000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "956", + .rules = &.{ + .{ .min = 0, .max = 799999, .len = 2 }, + .{ .min = 800000, .max = 999999, .len = 5 }, + .{ .min = 1000000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 6999999, .len = 4 }, + .{ .min = 7000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "957", + .rules = &.{ + .{ .min = 0, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 499999, .len = 4 }, + .{ .min = 500000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 2099999, .len = 4 }, + .{ .min = 2100000, .max = 2799999, .len = 2 }, + .{ .min = 2800000, .max = 3099999, .len = 5 }, + .{ .min = 3100000, .max = 4399999, .len = 2 }, + .{ .min = 4400000, .max = 8199999, .len = 3 }, + .{ .min = 8200000, .max = 9699999, .len = 4 }, + .{ .min = 9700000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "958", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 5099999, .len = 3 }, + .{ .min = 5100000, .max = 5199999, .len = 4 }, + .{ .min = 5200000, .max = 5399999, .len = 5 }, + .{ .min = 5400000, .max = 5599999, .len = 4 }, + .{ .min = 5600000, .max = 5999999, .len = 5 }, + .{ .min = 6000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "959", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "960", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6599999, .len = 3 }, + .{ .min = 6600000, .max = 6899999, .len = 4 }, + .{ .min = 6900000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 9299999, .len = 5 }, + .{ .min = 9300000, .max = 9399999, .len = 2 }, + .{ .min = 9400000, .max = 9799999, .len = 4 }, + .{ .min = 9800000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "961", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9799999, .len = 5 }, + .{ .min = 9800000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "962", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8699999, .len = 5 }, + .{ .min = 8700000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "963", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "964", + .rules = &.{ + .{ .min = 0, .max = 1499999, .len = 2 }, + .{ .min = 1500000, .max = 2499999, .len = 3 }, + .{ .min = 2500000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 5499999, .len = 3 }, + .{ .min = 5500000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9699999, .len = 5 }, + .{ .min = 9700000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "965", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 6999999, .len = 0 }, + .{ .min = 7000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8999999, .len = 0 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "966", + .rules = &.{ + .{ .min = 0, .max = 1299999, .len = 2 }, + .{ .min = 1300000, .max = 1399999, .len = 3 }, + .{ .min = 1400000, .max = 1499999, .len = 2 }, + .{ .min = 1500000, .max = 1699999, .len = 4 }, + .{ .min = 1700000, .max = 1999999, .len = 3 }, + .{ .min = 2000000, .max = 2789999, .len = 4 }, + .{ .min = 2790000, .max = 2899999, .len = 3 }, + .{ .min = 2900000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9099999, .len = 5 }, + .{ .min = 9100000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9799999, .len = 5 }, + .{ .min = 9800000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "967", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 4 }, + .{ .min = 1000000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 2499999, .len = 4 }, + .{ .min = 2500000, .max = 2549999, .len = 3 }, + .{ .min = 2550000, .max = 2699999, .len = 5 }, + .{ .min = 2700000, .max = 2799999, .len = 4 }, + .{ .min = 2800000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9989999, .len = 4 }, + .{ .min = 9990000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "968", + .rules = &.{ + .{ .min = 100000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "969", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 2099999, .len = 2 }, + .{ .min = 2100000, .max = 2199999, .len = 3 }, + .{ .min = 2200000, .max = 2299999, .len = 4 }, + .{ .min = 2300000, .max = 2399999, .len = 5 }, + .{ .min = 2400000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7499999, .len = 3 }, + .{ .min = 7500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "970", + .rules = &.{ + .{ .min = 100000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9099999, .len = 4 }, + .{ .min = 9100000, .max = 9699999, .len = 5 }, + .{ .min = 9700000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "971", + .rules = &.{ + .{ .min = 0, .max = 159999, .len = 3 }, + .{ .min = 160000, .max = 199999, .len = 4 }, + .{ .min = 200000, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 599999, .len = 4 }, + .{ .min = 600000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9099999, .len = 4 }, + .{ .min = 9100000, .max = 9599999, .len = 5 }, + .{ .min = 9600000, .max = 9699999, .len = 4 }, + .{ .min = 9700000, .max = 9899999, .len = 2 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "972", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "973", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1699999, .len = 3 }, + .{ .min = 1700000, .max = 1999999, .len = 4 }, + .{ .min = 2000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7599999, .len = 3 }, + .{ .min = 7600000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8899999, .len = 5 }, + .{ .min = 8900000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "974", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9499999, .len = 5 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "975", + .rules = &.{ + .{ .min = 0, .max = 199999, .len = 5 }, + .{ .min = 200000, .max = 2399999, .len = 2 }, + .{ .min = 2400000, .max = 2499999, .len = 4 }, + .{ .min = 2500000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 9199999, .len = 4 }, + .{ .min = 9200000, .max = 9899999, .len = 5 }, + .{ .min = 9900000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "976", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "977", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 6999999, .len = 4 }, + .{ .min = 7000000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 8739999, .len = 5 }, + .{ .min = 8740000, .max = 8899999, .len = 4 }, + .{ .min = 8900000, .max = 8949999, .len = 3 }, + .{ .min = 8950000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9599999, .len = 2 }, + .{ .min = 9600000, .max = 9699999, .len = 4 }, + .{ .min = 9700000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "978", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 3 }, + .{ .min = 2000000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 6699999, .len = 5 }, + .{ .min = 6700000, .max = 6899999, .len = 2 }, + .{ .min = 6900000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 7649999, .len = 0 }, + .{ .min = 7650000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "979", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 3 }, + .{ .min = 1000000, .max = 1499999, .len = 4 }, + .{ .min = 1500000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 3999999, .len = 4 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "980", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "981", + .rules = &.{ + .{ .min = 0, .max = 1699999, .len = 2 }, + .{ .min = 1700000, .max = 1799999, .len = 5 }, + .{ .min = 1800000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 2999999, .len = 3 }, + .{ .min = 3000000, .max = 3099999, .len = 4 }, + .{ .min = 3100000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 9199999, .len = 0 }, + .{ .min = 9200000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "982", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9799999, .len = 4 }, + .{ .min = 9800000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "983", + .rules = &.{ + .{ .min = 0, .max = 199999, .len = 2 }, + .{ .min = 200000, .max = 1999999, .len = 3 }, + .{ .min = 2000000, .max = 3999999, .len = 4 }, + .{ .min = 4000000, .max = 4499999, .len = 5 }, + .{ .min = 4500000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9899999, .len = 4 }, + .{ .min = 9900000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "984", + .rules = &.{ + .{ .min = 0, .max = 2199999, .len = 2 }, + .{ .min = 2200000, .max = 2249999, .len = 3 }, + .{ .min = 2250000, .max = 2599999, .len = 4 }, + .{ .min = 2600000, .max = 2899999, .len = 2 }, + .{ .min = 2900000, .max = 2999999, .len = 5 }, + .{ .min = 3000000, .max = 3899999, .len = 2 }, + .{ .min = 3900000, .max = 3999999, .len = 4 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "985", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 8799999, .len = 4 }, + .{ .min = 8800000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "986", + .rules = &.{ + .{ .min = 0, .max = 599999, .len = 2 }, + .{ .min = 600000, .max = 699999, .len = 5 }, + .{ .min = 700000, .max = 799999, .len = 4 }, + .{ .min = 800000, .max = 1199999, .len = 2 }, + .{ .min = 1200000, .max = 5399999, .len = 3 }, + .{ .min = 5400000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "987", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 1999999, .len = 4 }, + .{ .min = 2000000, .max = 2999999, .len = 5 }, + .{ .min = 3000000, .max = 3599999, .len = 2 }, + .{ .min = 3600000, .max = 4199999, .len = 4 }, + .{ .min = 4200000, .max = 4399999, .len = 2 }, + .{ .min = 4400000, .max = 4499999, .len = 4 }, + .{ .min = 4500000, .max = 4899999, .len = 5 }, + .{ .min = 4900000, .max = 4999999, .len = 4 }, + .{ .min = 5000000, .max = 8249999, .len = 3 }, + .{ .min = 8250000, .max = 8279999, .len = 4 }, + .{ .min = 8280000, .max = 8299999, .len = 5 }, + .{ .min = 8300000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 8899999, .len = 2 }, + .{ .min = 8900000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "988", + .rules = &.{ + .{ .min = 0, .max = 1199999, .len = 2 }, + .{ .min = 1200000, .max = 1999999, .len = 5 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 7999999, .len = 5 }, + .{ .min = 8000000, .max = 9699999, .len = 4 }, + .{ .min = 9700000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "989", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 3499999, .len = 2 }, + .{ .min = 3500000, .max = 3699999, .len = 5 }, + .{ .min = 3700000, .max = 4899999, .len = 2 }, + .{ .min = 4900000, .max = 4999999, .len = 5 }, + .{ .min = 5000000, .max = 5299999, .len = 2 }, + .{ .min = 5300000, .max = 5499999, .len = 5 }, + .{ .min = 5500000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 4 }, + .{ .min = 9500000, .max = 9999999, .len = 5 }, + }, + }, + .{ + .ean = 978, + .digits = "9905", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 2399999, .len = 2 }, + .{ .min = 2400000, .max = 5999999, .len = 0 }, + .{ .min = 6000000, .max = 6249999, .len = 3 }, + .{ .min = 6250000, .max = 9899999, .len = 0 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9906", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 2299999, .len = 2 }, + .{ .min = 2300000, .max = 6999999, .len = 0 }, + .{ .min = 7000000, .max = 7249999, .len = 3 }, + .{ .min = 7250000, .max = 9899999, .len = 0 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9907", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 6499999, .len = 2 }, + .{ .min = 6500000, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 8749999, .len = 3 }, + .{ .min = 8750000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9908", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 8249999, .len = 0 }, + .{ .min = 8250000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9699999, .len = 0 }, + .{ .min = 9700000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9909", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 7499999, .len = 0 }, + .{ .min = 7500000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9799999, .len = 0 }, + .{ .min = 9800000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9910", + .rules = &.{ + .{ .min = 0, .max = 99999, .len = 0 }, + .{ .min = 100000, .max = 1899999, .len = 2 }, + .{ .min = 1900000, .max = 2249999, .len = 0 }, + .{ .min = 2250000, .max = 3749999, .len = 3 }, + .{ .min = 3750000, .max = 4499999, .len = 0 }, + .{ .min = 4500000, .max = 5499999, .len = 4 }, + .{ .min = 5500000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9911", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 2499999, .len = 2 }, + .{ .min = 2500000, .max = 5499999, .len = 0 }, + .{ .min = 5500000, .max = 7499999, .len = 3 }, + .{ .min = 7500000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9912", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 4499999, .len = 2 }, + .{ .min = 4500000, .max = 7499999, .len = 0 }, + .{ .min = 7500000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9799999, .len = 0 }, + .{ .min = 9800000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9913", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 5999999, .len = 0 }, + .{ .min = 6000000, .max = 7099999, .len = 3 }, + .{ .min = 7100000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9914", + .rules = &.{ + .{ .min = 0, .max = 2699999, .len = 0 }, + .{ .min = 2700000, .max = 5599999, .len = 2 }, + .{ .min = 5600000, .max = 6999999, .len = 0 }, + .{ .min = 7000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9199999, .len = 0 }, + .{ .min = 9200000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9915", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 6499999, .len = 0 }, + .{ .min = 6500000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9299999, .len = 0 }, + .{ .min = 9300000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9916", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 5999999, .len = 1 }, + .{ .min = 6000000, .max = 7899999, .len = 3 }, + .{ .min = 7900000, .max = 9199999, .len = 2 }, + .{ .min = 9200000, .max = 9399999, .len = 4 }, + .{ .min = 9400000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9917", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 2999999, .len = 0 }, + .{ .min = 3000000, .max = 3499999, .len = 2 }, + .{ .min = 3500000, .max = 5999999, .len = 0 }, + .{ .min = 6000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 9624999, .len = 0 }, + .{ .min = 9625000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9918", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 5999999, .len = 0 }, + .{ .min = 6000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9919", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 8999999, .len = 0 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9920", + .rules = &.{ + .{ .min = 0, .max = 299999, .len = 2 }, + .{ .min = 300000, .max = 1299999, .len = 0 }, + .{ .min = 1300000, .max = 1999999, .len = 3 }, + .{ .min = 2000000, .max = 2299999, .len = 3 }, + .{ .min = 2300000, .max = 4299999, .len = 2 }, + .{ .min = 4300000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8299999, .len = 0 }, + .{ .min = 8300000, .max = 8549999, .len = 4 }, + .{ .min = 8550000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9921", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 2999999, .len = 0 }, + .{ .min = 3000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 6999999, .len = 0 }, + .{ .min = 7000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9699999, .len = 0 }, + .{ .min = 9700000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9922", + .rules = &.{ + .{ .min = 0, .max = 1499999, .len = 0 }, + .{ .min = 1500000, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5499999, .len = 3 }, + .{ .min = 5500000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9923", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9399999, .len = 0 }, + .{ .min = 9400000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9924", + .rules = &.{ + .{ .min = 0, .max = 2799999, .len = 0 }, + .{ .min = 2800000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 6599999, .len = 3 }, + .{ .min = 6600000, .max = 8949999, .len = 0 }, + .{ .min = 8950000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9925", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7349999, .len = 3 }, + .{ .min = 7350000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9926", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9927", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 4999999, .len = 4 }, + .{ .min = 5000000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "9928", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 4999999, .len = 4 }, + .{ .min = 5000000, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "9929", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9799999, .len = 4 }, + .{ .min = 9800000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "9930", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 9399999, .len = 3 }, + .{ .min = 9400000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9931", + .rules = &.{ + .{ .min = 0, .max = 2399999, .len = 2 }, + .{ .min = 2400000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9932", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9933", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8699999, .len = 3 }, + .{ .min = 8700000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9934", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9935", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9936", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9937", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9938", + .rules = &.{ + .{ .min = 0, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9749999, .len = 4 }, + .{ .min = 9750000, .max = 9909999, .len = 3 }, + .{ .min = 9910000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9939", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 4799999, .len = 2 }, + .{ .min = 4800000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9599999, .len = 4 }, + .{ .min = 9600000, .max = 9799999, .len = 3 }, + .{ .min = 9800000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "9940", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 8399999, .len = 3 }, + .{ .min = 8400000, .max = 8699999, .len = 2 }, + .{ .min = 8700000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9941", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7899999, .len = 3 }, + .{ .min = 7900000, .max = 7999999, .len = 4 }, + .{ .min = 8000000, .max = 8999999, .len = 1 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9942", + .rules = &.{ + .{ .min = 0, .max = 5599999, .len = 2 }, + .{ .min = 5600000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 7499999, .len = 4 }, + .{ .min = 7500000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9849999, .len = 3 }, + .{ .min = 9850000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9943", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 9749999, .len = 4 }, + .{ .min = 9750000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "9944", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 4 }, + .{ .min = 1000000, .max = 4999999, .len = 3 }, + .{ .min = 5000000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "9945", + .rules = &.{ + .{ .min = 0, .max = 99999, .len = 2 }, + .{ .min = 100000, .max = 799999, .len = 3 }, + .{ .min = 800000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 5699999, .len = 3 }, + .{ .min = 5700000, .max = 5799999, .len = 2 }, + .{ .min = 5800000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8099999, .len = 2 }, + .{ .min = 8100000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9946", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9947", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "9948", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 5199999, .len = 3 }, + .{ .min = 5200000, .max = 5399999, .len = 2 }, + .{ .min = 5400000, .max = 6099999, .len = 3 }, + .{ .min = 6100000, .max = 6199999, .len = 3 }, + .{ .min = 6200000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9949999, .len = 4 }, + .{ .min = 9950000, .max = 9974999, .len = 4 }, + .{ .min = 9975000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9949", + .rules = &.{ + .{ .min = 0, .max = 899999, .len = 2 }, + .{ .min = 900000, .max = 999999, .len = 3 }, + .{ .min = 1000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 7199999, .len = 2 }, + .{ .min = 7200000, .max = 7499999, .len = 4 }, + .{ .min = 7500000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9950", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9951", + .rules = &.{ + .{ .min = 0, .max = 3899999, .len = 2 }, + .{ .min = 3900000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9799999, .len = 4 }, + .{ .min = 9800000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "9952", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1499999, .len = 0 }, + .{ .min = 1500000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9953", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9299999, .len = 4 }, + .{ .min = 9300000, .max = 9699999, .len = 2 }, + .{ .min = 9700000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "9954", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9899999, .len = 4 }, + .{ .min = 9900000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "9955", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 9299999, .len = 3 }, + .{ .min = 9300000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9956", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9957", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 6499999, .len = 3 }, + .{ .min = 6500000, .max = 6799999, .len = 2 }, + .{ .min = 6800000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8499999, .len = 2 }, + .{ .min = 8500000, .max = 8799999, .len = 4 }, + .{ .min = 8800000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "9958", + .rules = &.{ + .{ .min = 0, .max = 199999, .len = 2 }, + .{ .min = 200000, .max = 299999, .len = 3 }, + .{ .min = 300000, .max = 399999, .len = 4 }, + .{ .min = 400000, .max = 899999, .len = 3 }, + .{ .min = 900000, .max = 999999, .len = 4 }, + .{ .min = 1000000, .max = 1899999, .len = 2 }, + .{ .min = 1900000, .max = 1999999, .len = 4 }, + .{ .min = 2000000, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9959", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9699999, .len = 4 }, + .{ .min = 9700000, .max = 9799999, .len = 3 }, + .{ .min = 9800000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "9960", + .rules = &.{ + .{ .min = 0, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9961", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9962", + .rules = &.{ + .{ .min = 0, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 5599999, .len = 4 }, + .{ .min = 5600000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8499999, .len = 3 }, + .{ .min = 8500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9963", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 2499999, .len = 4 }, + .{ .min = 2500000, .max = 2799999, .len = 3 }, + .{ .min = 2800000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7349999, .len = 3 }, + .{ .min = 7350000, .max = 7499999, .len = 4 }, + .{ .min = 7500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9964", + .rules = &.{ + .{ .min = 0, .max = 6999999, .len = 1 }, + .{ .min = 7000000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "9965", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9966", + .rules = &.{ + .{ .min = 0, .max = 1399999, .len = 3 }, + .{ .min = 1400000, .max = 1499999, .len = 2 }, + .{ .min = 1500000, .max = 1999999, .len = 4 }, + .{ .min = 2000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 7499999, .len = 4 }, + .{ .min = 7500000, .max = 8209999, .len = 3 }, + .{ .min = 8210000, .max = 8249999, .len = 4 }, + .{ .min = 8250000, .max = 8259999, .len = 3 }, + .{ .min = 8260000, .max = 8289999, .len = 4 }, + .{ .min = 8290000, .max = 9599999, .len = 3 }, + .{ .min = 9600000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9967", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9968", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 9399999, .len = 3 }, + .{ .min = 9400000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9969", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 7499999, .len = 3 }, + .{ .min = 7500000, .max = 9299999, .len = 0 }, + .{ .min = 9300000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9970", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9971", + .rules = &.{ + .{ .min = 0, .max = 5999999, .len = 1 }, + .{ .min = 6000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9972", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 2499999, .len = 3 }, + .{ .min = 2500000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9973", + .rules = &.{ + .{ .min = 0, .max = 599999, .len = 2 }, + .{ .min = 600000, .max = 899999, .len = 3 }, + .{ .min = 900000, .max = 999999, .len = 4 }, + .{ .min = 1000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9699999, .len = 3 }, + .{ .min = 9700000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9974", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7499999, .len = 3 }, + .{ .min = 7500000, .max = 8799999, .len = 4 }, + .{ .min = 8800000, .max = 9099999, .len = 3 }, + .{ .min = 9100000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "9975", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 2999999, .len = 3 }, + .{ .min = 3000000, .max = 3999999, .len = 4 }, + .{ .min = 4000000, .max = 4499999, .len = 4 }, + .{ .min = 4500000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9976", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 5799999, .len = 4 }, + .{ .min = 5800000, .max = 5899999, .len = 3 }, + .{ .min = 5900000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9977", + .rules = &.{ + .{ .min = 0, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9978", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 2 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9979", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 6499999, .len = 2 }, + .{ .min = 6500000, .max = 6599999, .len = 3 }, + .{ .min = 6600000, .max = 7599999, .len = 2 }, + .{ .min = 7600000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9980", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9981", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 2 }, + .{ .min = 1000000, .max = 1599999, .len = 3 }, + .{ .min = 1600000, .max = 1999999, .len = 4 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9982", + .rules = &.{ + .{ .min = 0, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9983", + .rules = &.{ + .{ .min = 0, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9984", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9985", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9986", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9399999, .len = 4 }, + .{ .min = 9400000, .max = 9699999, .len = 3 }, + .{ .min = 9700000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "9987", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 2 }, + .{ .min = 4000000, .max = 8799999, .len = 3 }, + .{ .min = 8800000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9988", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7499999, .len = 3 }, + .{ .min = 7500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "9989", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1999999, .len = 3 }, + .{ .min = 2000000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9999999, .len = 4 }, + }, + }, + .{ + .ean = 978, + .digits = "99901", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99902", + .rules = &.{ + .{ .min = 0, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "99903", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99904", + .rules = &.{ + .{ .min = 0, .max = 5999999, .len = 1 }, + .{ .min = 6000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99905", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99906", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99908", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99909", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99910", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99911", + .rules = &.{ + .{ .min = 0, .max = 4699999, .len = 2 }, + .{ .min = 4700000, .max = 4799999, .len = 3 }, + .{ .min = 4800000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99912", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99913", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 3599999, .len = 2 }, + .{ .min = 3600000, .max = 5999999, .len = 0 }, + .{ .min = 6000000, .max = 6049999, .len = 3 }, + .{ .min = 6050000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "99914", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 7999999, .len = 1 }, + .{ .min = 8000000, .max = 8699999, .len = 2 }, + .{ .min = 8700000, .max = 8799999, .len = 3 }, + .{ .min = 8800000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99915", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99916", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99917", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 8899999, .len = 2 }, + .{ .min = 8900000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99918", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99919", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99920", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99921", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8999999, .len = 1 }, + .{ .min = 9000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99922", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99923", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99924", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99925", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 2999999, .len = 3 }, + .{ .min = 3000000, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99926", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8699999, .len = 3 }, + .{ .min = 8700000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99927", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99928", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99929", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99930", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99931", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99932", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 7999999, .len = 1 }, + .{ .min = 8000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99933", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99934", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99935", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 1 }, + .{ .min = 9000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99936", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99937", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99938", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8999999, .len = 3 }, + .{ .min = 9000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99939", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99940", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99941", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99942", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99943", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99944", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99945", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9799999, .len = 3 }, + .{ .min = 9800000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99946", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99947", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99948", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99949", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 8999999, .len = 1 }, + .{ .min = 9000000, .max = 9899999, .len = 3 }, + .{ .min = 9900000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99950", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99951", + .rules = &.{ + .{ .min = 0, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "99952", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99953", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9399999, .len = 3 }, + .{ .min = 9400000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99954", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 8799999, .len = 3 }, + .{ .min = 8800000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99955", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99956", + .rules = &.{ + .{ .min = 0, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8599999, .len = 3 }, + .{ .min = 8600000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99957", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99958", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 9399999, .len = 2 }, + .{ .min = 9400000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99959", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99960", + .rules = &.{ + .{ .min = 0, .max = 699999, .len = 0 }, + .{ .min = 700000, .max = 999999, .len = 3 }, + .{ .min = 1000000, .max = 9499999, .len = 2 }, + .{ .min = 9500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99961", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 3699999, .len = 3 }, + .{ .min = 3700000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99962", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99963", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 2 }, + .{ .min = 5000000, .max = 9199999, .len = 3 }, + .{ .min = 9200000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99964", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99965", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 3599999, .len = 3 }, + .{ .min = 3600000, .max = 6299999, .len = 2 }, + .{ .min = 6300000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99966", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 9699999, .len = 2 }, + .{ .min = 9700000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99967", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99968", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 5999999, .len = 3 }, + .{ .min = 6000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99969", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9499999, .len = 3 }, + .{ .min = 9500000, .max = 9999999, .len = 2 }, + }, + }, + .{ + .ean = 978, + .digits = "99970", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99971", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 8499999, .len = 2 }, + .{ .min = 8500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99972", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99973", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99974", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 2599999, .len = 2 }, + .{ .min = 2600000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 6399999, .len = 2 }, + .{ .min = 6400000, .max = 6499999, .len = 3 }, + .{ .min = 6500000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99975", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 3999999, .len = 3 }, + .{ .min = 4000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99976", + .rules = &.{ + .{ .min = 0, .max = 399999, .len = 2 }, + .{ .min = 400000, .max = 999999, .len = 3 }, + .{ .min = 1000000, .max = 1599999, .len = 2 }, + .{ .min = 1600000, .max = 1999999, .len = 3 }, + .{ .min = 2000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8199999, .len = 3 }, + .{ .min = 8200000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99977", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 7999999, .len = 3 }, + .{ .min = 8000000, .max = 8999999, .len = 0 }, + .{ .min = 9000000, .max = 9249999, .len = 3 }, + .{ .min = 9250000, .max = 9749999, .len = 0 }, + .{ .min = 9750000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99978", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99979", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 1 }, + .{ .min = 4000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99980", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 2499999, .len = 0 }, + .{ .min = 2500000, .max = 6499999, .len = 2 }, + .{ .min = 6500000, .max = 6699999, .len = 0 }, + .{ .min = 6700000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99981", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1099999, .len = 2 }, + .{ .min = 1100000, .max = 1499999, .len = 3 }, + .{ .min = 1500000, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 2199999, .len = 3 }, + .{ .min = 2200000, .max = 7499999, .len = 2 }, + .{ .min = 7500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99982", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 8449999, .len = 0 }, + .{ .min = 8450000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99983", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3499999, .len = 0 }, + .{ .min = 3500000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 8499999, .len = 0 }, + .{ .min = 8500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99984", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99985", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 2299999, .len = 3 }, + .{ .min = 2300000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99986", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99987", + .rules = &.{ + .{ .min = 0, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99988", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 1199999, .len = 2 }, + .{ .min = 1200000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 8249999, .len = 3 }, + .{ .min = 8250000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 978, + .digits = "99989", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 7999999, .len = 2 }, + .{ .min = 8000000, .max = 8999999, .len = 0 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99990", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 4499999, .len = 0 }, + .{ .min = 4500000, .max = 5799999, .len = 2 }, + .{ .min = 5800000, .max = 9299999, .len = 0 }, + .{ .min = 9300000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99991", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 6099999, .len = 2 }, + .{ .min = 6100000, .max = 9599999, .len = 0 }, + .{ .min = 9600000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99992", + .rules = &.{ + .{ .min = 0, .max = 2999999, .len = 1 }, + .{ .min = 3000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 6999999, .len = 2 }, + .{ .min = 7000000, .max = 8999999, .len = 0 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99993", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 1 }, + .{ .min = 5000000, .max = 5499999, .len = 2 }, + .{ .min = 5500000, .max = 9799999, .len = 0 }, + .{ .min = 9800000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99994", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5699999, .len = 2 }, + .{ .min = 5700000, .max = 9599999, .len = 0 }, + .{ .min = 9600000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99995", + .rules = &.{ + .{ .min = 0, .max = 4999999, .len = 0 }, + .{ .min = 5000000, .max = 5599999, .len = 2 }, + .{ .min = 5600000, .max = 9749999, .len = 0 }, + .{ .min = 9750000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99996", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 1 }, + .{ .min = 2000000, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 5999999, .len = 2 }, + .{ .min = 6000000, .max = 8999999, .len = 0 }, + .{ .min = 9000000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99997", + .rules = &.{ + .{ .min = 0, .max = 999999, .len = 1 }, + .{ .min = 1000000, .max = 3999999, .len = 0 }, + .{ .min = 4000000, .max = 6199999, .len = 2 }, + .{ .min = 6200000, .max = 9199999, .len = 0 }, + .{ .min = 9200000, .max = 9999999, .len = 3 }, + }, + }, + .{ + .ean = 978, + .digits = "99998", + .rules = &.{ + .{ .min = 0, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 8999999, .len = 2 }, + .{ .min = 9000000, .max = 9999999, .len = 0 }, + }, + }, + .{ + .ean = 979, + .digits = "10", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 2 }, + .{ .min = 2000000, .max = 6999999, .len = 3 }, + .{ .min = 7000000, .max = 8999999, .len = 4 }, + .{ .min = 9000000, .max = 9759999, .len = 5 }, + .{ .min = 9760000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 979, + .digits = "11", + .rules = &.{ + .{ .min = 0, .max = 2199999, .len = 2 }, + .{ .min = 2200000, .max = 2299999, .len = 6 }, + .{ .min = 2300000, .max = 2499999, .len = 5 }, + .{ .min = 2500000, .max = 5499999, .len = 3 }, + .{ .min = 5500000, .max = 8499999, .len = 4 }, + .{ .min = 8500000, .max = 9499999, .len = 5 }, + .{ .min = 9500000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 979, + .digits = "12", + .rules = &.{ + .{ .min = 0, .max = 1999999, .len = 0 }, + .{ .min = 2000000, .max = 2999999, .len = 3 }, + .{ .min = 3000000, .max = 5449999, .len = 0 }, + .{ .min = 5450000, .max = 5999999, .len = 4 }, + .{ .min = 6000000, .max = 7999999, .len = 0 }, + .{ .min = 8000000, .max = 8499999, .len = 5 }, + .{ .min = 8500000, .max = 9849999, .len = 0 }, + .{ .min = 9850000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 979, + .digits = "13", + .rules = &.{ + .{ .min = 0, .max = 99999, .len = 2 }, + .{ .min = 100000, .max = 5999999, .len = 0 }, + .{ .min = 6000000, .max = 6049999, .len = 3 }, + .{ .min = 6050000, .max = 6999999, .len = 0 }, + .{ .min = 7000000, .max = 7349999, .len = 4 }, + .{ .min = 7350000, .max = 8749999, .len = 0 }, + .{ .min = 8750000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9899999, .len = 0 }, + .{ .min = 9900000, .max = 9999999, .len = 6 }, + }, + }, + .{ + .ean = 979, + .digits = "8", + .rules = &.{ + .{ .min = 0, .max = 299999, .len = 0 }, + .{ .min = 300000, .max = 349999, .len = 3 }, + .{ .min = 350000, .max = 1699999, .len = 0 }, + .{ .min = 1700000, .max = 1799999, .len = 4 }, + .{ .min = 1800000, .max = 1949999, .len = 4 }, + .{ .min = 1950000, .max = 1999999, .len = 4 }, + .{ .min = 2000000, .max = 2399999, .len = 3 }, + .{ .min = 2400000, .max = 2599999, .len = 4 }, + .{ .min = 2600000, .max = 2799999, .len = 4 }, + .{ .min = 2800000, .max = 2999999, .len = 4 }, + .{ .min = 3000000, .max = 8849999, .len = 4 }, + .{ .min = 8850000, .max = 8999999, .len = 5 }, + .{ .min = 9000000, .max = 9099999, .len = 5 }, + .{ .min = 9100000, .max = 9499999, .len = 0 }, + .{ .min = 9500000, .max = 9699999, .len = 6 }, + .{ .min = 9700000, .max = 9849999, .len = 0 }, + .{ .min = 9850000, .max = 9929999, .len = 7 }, + .{ .min = 9930000, .max = 9959999, .len = 7 }, + .{ .min = 9960000, .max = 9984999, .len = 7 }, + .{ .min = 9985000, .max = 9999999, .len = 7 }, + }, + }, +}; diff --git a/tools/generate_ranges.zig b/tools/generate_ranges.zig new file mode 100644 index 0000000..2362b1c --- /dev/null +++ b/tools/generate_ranges.zig @@ -0,0 +1,195 @@ +// SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie +// SPDX-License-Identifier: MIT + +//! Generates src/ranges.zig from the International ISBN Agency's range +//! data, fetched from https://www.isbn-international.org/. +//! +//! Usage: +//! zig build update-ranges +//! +//! or directly, optionally with a previously downloaded range file +//! instead of the network: +//! zig run tools/generate_ranges.zig -- src/ranges.zig [RangeMessage.xml] + +const std = @import("std"); + +const range_message_url = "https://www.isbn-international.org/export_rangemessage.xml"; + +const Rule = struct { + min: u32, + max: u32, + len: u8, +}; + +const Group = struct { + ean: u16, + digits: []const u8, + rules: []const Rule, +}; + +/// A sequential scanner over the XML text. The range message's regular, +/// machine-generated structure lets us get by with tag matching instead +/// of a full XML parser. +const Cursor = struct { + text: []const u8, + pos: usize = 0, + + /// Returns the text between the next `` and `` at or + /// after `pos` but before `limit`, advancing past the closing tag. + fn between(c: *Cursor, comptime tag: []const u8, limit: usize) ?[]const u8 { + const open = "<" ++ tag ++ ">"; + const close = ""; + const start = std.mem.indexOfPos(u8, c.text[0..limit], c.pos, open) orelse return null; + const inner = start + open.len; + const end = std.mem.indexOfPos(u8, c.text[0..limit], inner, close) orelse return null; + c.pos = end + close.len; + return c.text[inner..end]; + } +}; + +fn splitOnDash(s: []const u8) ?struct { []const u8, []const u8 } { + const dash = std.mem.indexOfScalar(u8, s, '-') orelse return null; + return .{ s[0..dash], s[dash + 1 ..] }; +} + +pub fn main(init: std.process.Init) !void { + const arena = init.arena.allocator(); + const io = init.io; + + var it: std.process.Args.Iterator = .init(init.minimal.args); + _ = it.next(); + const output_path = it.next(); + const input_path = it.next(); + if (output_path == null or it.next() != null) { + std.debug.print("usage: generate_ranges [RangeMessage.xml]\n", .{}); + return error.InvalidArguments; + } + + const xml = if (input_path) |path| + try std.Io.Dir.cwd().readFileAlloc(io, path, arena, .limited(16 * 1024 * 1024)) + else xml: { + var client: std.http.Client = .{ .allocator = init.gpa, .io = io }; + defer client.deinit(); + var body: std.Io.Writer.Allocating = .init(arena); + const result = try client.fetch(.{ + .location = .{ .url = range_message_url }, + .response_writer = &body.writer, + }); + if (result.status != .ok) { + std.debug.print("HTTP {d} fetching {s}\n", .{ @intFromEnum(result.status), range_message_url }); + return error.HttpRequestFailed; + } + break :xml body.written(); + }; + + var c: Cursor = .{ .text = xml }; + const serial = c.between("MessageSerialNumber", xml.len) orelse return error.MalformedXml; + const date = c.between("MessageDate", xml.len) orelse return error.MalformedXml; + + // Skip the EAN.UCCPrefixes section; only the registration groups are + // needed. + c.pos = std.mem.indexOfPos(u8, xml, c.pos, "") orelse return error.MalformedXml; + + var groups: std.ArrayList(Group) = .empty; + while (std.mem.indexOfPos(u8, xml, c.pos, "")) |group_start| { + c.pos = group_start; + const group_end = std.mem.indexOfPos(u8, xml, c.pos, "") orelse return error.MalformedXml; + + const prefix = c.between("Prefix", group_end) orelse return error.MalformedXml; + const ean_str, const digits = splitOnDash(prefix) orelse return error.MalformedXml; + const ean = try std.fmt.parseInt(u16, ean_str, 10); + if (ean != 978 and ean != 979) return error.MalformedXml; + + var rules: std.ArrayList(Rule) = .empty; + while (c.between("Range", group_end)) |range| { + const lo, const hi = splitOnDash(range) orelse return error.MalformedXml; + if (lo.len != 7 or hi.len != 7) return error.MalformedXml; + const length = c.between("Length", group_end) orelse return error.MalformedXml; + try rules.append(arena, .{ + .min = try std.fmt.parseInt(u32, lo, 10), + .max = try std.fmt.parseInt(u32, hi, 10), + .len = try std.fmt.parseInt(u8, length, 10), + }); + } + + try groups.append(arena, .{ .ean = ean, .digits = digits, .rules = rules.items }); + c.pos = group_end; + } + if (groups.items.len == 0) return error.MalformedXml; + + std.mem.sort(Group, groups.items, {}, struct { + fn lessThan(_: void, a: Group, b: Group) bool { + if (a.ean != b.ean) return a.ean < b.ean; + return std.mem.order(u8, a.digits, b.digits) == .lt; + } + }.lessThan); + + // Group lookup relies on group prefixes being prefix-free per EAN + // prefix. + for (groups.items) |a| { + for (groups.items) |b| { + if (a.ean == b.ean and !std.mem.eql(u8, a.digits, b.digits) and + std.mem.startsWith(u8, b.digits, a.digits)) + { + std.debug.print("group {d}-{s} is a prefix of {d}-{s}\n", .{ a.ean, a.digits, b.ean, b.digits }); + return error.GroupsNotPrefixFree; + } + } + } + + var out: std.Io.Writer.Allocating = .init(arena); + const w = &out.writer; + // REUSE-IgnoreStart + try w.writeAll("// SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie\n"); + try w.writeAll("// SPDX-License-Identifier: MIT\n"); + // REUSE-IgnoreEnd + try w.writeAll("\n"); + try w.writeAll("//! ISBN registration group and registrant ranges, generated by\n"); + try w.writeAll("//! tools/generate_ranges.zig from the International ISBN Agency's\n"); + try w.writeAll("//! range data (https://www.isbn-international.org/export_rangemessage.xml).\n"); + try w.writeAll("//! Do not edit by hand.\n"); + try w.writeAll("//!\n"); + try w.print("//! Message date: {s}\n", .{date}); + try w.print("//! Serial number: {s}\n", .{serial}); + try w.writeAll("\n"); + try w.writeAll("/// Determines the length of the registrant element from the value of\n"); + try w.writeAll("/// the seven digits that follow the registration group.\n"); + try w.writeAll("pub const Rule = struct {\n"); + try w.writeAll(" /// Inclusive lower bound on the seven-digit value.\n"); + try w.writeAll(" min: u32,\n"); + try w.writeAll(" /// Inclusive upper bound on the seven-digit value.\n"); + try w.writeAll(" max: u32,\n"); + try w.writeAll(" /// Number of digits in the registrant element; 0 means the range\n"); + try w.writeAll(" /// has not been assigned and cannot be hyphenated.\n"); + try w.writeAll(" len: u8,\n"); + try w.writeAll("};\n"); + try w.writeAll("\n"); + try w.writeAll("/// A registration group (a country, region, or language area).\n"); + try w.writeAll("pub const Group = struct {\n"); + try w.writeAll(" /// The EAN prefix, 978 or 979.\n"); + try w.writeAll(" ean: u16,\n"); + try w.writeAll(" /// The registration group digits that follow the EAN prefix.\n"); + try w.writeAll(" digits: []const u8,\n"); + try w.writeAll(" /// Registrant length rules for this group.\n"); + try w.writeAll(" rules: []const Rule,\n"); + try w.writeAll("};\n"); + try w.writeAll("\n"); + try w.writeAll("pub const groups: []const Group = &.{\n"); + for (groups.items) |group| { + try w.writeAll(" .{\n"); + try w.print(" .ean = {d},\n", .{group.ean}); + try w.print(" .digits = \"{s}\",\n", .{group.digits}); + try w.writeAll(" .rules = &.{\n"); + for (group.rules) |rule| { + try w.print(" .{{ .min = {d}, .max = {d}, .len = {d} }},\n", .{ rule.min, rule.max, rule.len }); + } + try w.writeAll(" },\n"); + try w.writeAll(" },\n"); + } + try w.writeAll("};\n"); + + try std.Io.Dir.cwd().writeFile(io, .{ + .sub_path = output_path.?, + .data = out.written(), + }); +}