import Foundation

// TODO: These are not used, should they be removed??

// TODO: Add other description / label for items that have same group & letter, but
//       different effective length.
public struct EffectiveLengthGroup: Codable, Equatable, Sendable {
  public let group: Int
  public let letter: String
  public let effectiveLength: Int
  public let category: Category
  public var label: String { "\(group)\(letter.uppercased())" }

  public init(
    group: Int,
    letter: String,
    effectiveLength: Int,
    category: Category
  ) {
    self.group = group
    self.letter = letter
    self.effectiveLength = effectiveLength
    self.category = category
  }
}

extension EffectiveLengthGroup {

  public enum Category: String, Codable, Equatable, Sendable {
    case any
    case supply
    case `return`
  }

}

public let effectiveLengthsLookup: [String: EffectiveLengthGroup] = {
  [
    "1a": .init(group: 1, letter: "a", effectiveLength: 35, category: .supply),
    "1b": .init(group: 1, letter: "b", effectiveLength: 10, category: .supply),
    "1c": .init(group: 1, letter: "c", effectiveLength: 35, category: .supply),
    "1d": .init(group: 1, letter: "d", effectiveLength: 10, category: .supply),
    "1e": .init(group: 1, letter: "e", effectiveLength: 10, category: .supply),
    "1f-0.5": .init(group: 1, letter: "f", effectiveLength: 120, category: .supply),
    "1f-1": .init(group: 1, letter: "f", effectiveLength: 85, category: .supply),
    "1g-0.5": .init(group: 1, letter: "g", effectiveLength: 35, category: .supply),
    "1g-1": .init(group: 1, letter: "g", effectiveLength: 25, category: .supply),
    "1h-0.5": .init(group: 1, letter: "h", effectiveLength: 120, category: .supply),
    "1h-1": .init(group: 1, letter: "h", effectiveLength: 85, category: .supply),
    "1i": .init(group: 1, letter: "i", effectiveLength: 20, category: .supply),
    "1k": .init(group: 1, letter: "k", effectiveLength: 85, category: .supply),
    "1l-0.25": .init(group: 1, letter: "l", effectiveLength: 40, category: .supply),
    "1l-0.5": .init(group: 1, letter: "l", effectiveLength: 20, category: .supply),
    "1l-1": .init(group: 1, letter: "l", effectiveLength: 10, category: .supply),
    "1m-0.05-1": .init(group: 1, letter: "m", effectiveLength: 30, category: .supply),
    "1m-0.05-2": .init(group: 1, letter: "m", effectiveLength: 20, category: .supply),
    "1m-0.25-1": .init(group: 1, letter: "m", effectiveLength: 20, category: .supply),
    "1m-0.25-2": .init(group: 1, letter: "m", effectiveLength: 10, category: .supply),
    "1m-0.5-1": .init(group: 1, letter: "m", effectiveLength: 10, category: .supply),
    "1m-0.5-2": .init(group: 1, letter: "m", effectiveLength: 10, category: .supply),
    "1n": .init(group: 1, letter: "n", effectiveLength: 15, category: .supply),
    "1o-0.5": .init(group: 1, letter: "o", effectiveLength: 120, category: .supply),
    "1o-1": .init(group: 1, letter: "o", effectiveLength: 85, category: .supply),
    "1p": .init(group: 1, letter: "p", effectiveLength: 20, category: .supply),
    "1q": .init(group: 1, letter: "q", effectiveLength: 50, category: .supply),
    "1r": .init(group: 1, letter: "r", effectiveLength: 120, category: .supply),
    "1s-0": .init(group: 1, letter: "s", effectiveLength: 60, category: .supply),
    "1s-1": .init(group: 1, letter: "s", effectiveLength: 40, category: .supply),
    "1s-2": .init(group: 1, letter: "s", effectiveLength: 30, category: .supply),
    "1t": .init(group: 1, letter: "t", effectiveLength: 60, category: .supply),
    // Group 2
    "2a-0": .init(group: 2, letter: "a", effectiveLength: 35, category: .supply),
    "2a-1": .init(group: 2, letter: "a", effectiveLength: 45, category: .supply),
    "2a-2": .init(group: 2, letter: "a", effectiveLength: 55, category: .supply),
    "2a-3": .init(group: 2, letter: "a", effectiveLength: 65, category: .supply),
    "2a-4": .init(group: 2, letter: "a", effectiveLength: 70, category: .supply),
    "2a-5": .init(group: 2, letter: "a", effectiveLength: 80, category: .supply),

    "2b-0": .init(group: 2, letter: "b", effectiveLength: 20, category: .supply),
    "2b-1": .init(group: 2, letter: "b", effectiveLength: 30, category: .supply),
    "2b-2": .init(group: 2, letter: "b", effectiveLength: 35, category: .supply),
    "2b-3": .init(group: 2, letter: "b", effectiveLength: 40, category: .supply),
    "2b-4": .init(group: 2, letter: "b", effectiveLength: 45, category: .supply),
    "2b-5": .init(group: 2, letter: "b", effectiveLength: 50, category: .supply),

    "2c-0": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
    "2c-1": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
    "2c-2": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
    "2c-3": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
    "2c-4": .init(group: 2, letter: "c", effectiveLength: 70, category: .supply),
    "2c-5": .init(group: 2, letter: "c", effectiveLength: 80, category: .supply),

    "2d-0": .init(group: 2, letter: "d", effectiveLength: 40, category: .supply),
    "2d-1": .init(group: 2, letter: "d", effectiveLength: 50, category: .supply),
    "2d-2": .init(group: 2, letter: "d", effectiveLength: 60, category: .supply),
    "2d-3": .init(group: 2, letter: "d", effectiveLength: 65, category: .supply),
    "2d-4": .init(group: 2, letter: "d", effectiveLength: 75, category: .supply),
    "2d-5": .init(group: 2, letter: "d", effectiveLength: 85, category: .supply),

    "2e-0": .init(group: 2, letter: "e", effectiveLength: 25, category: .supply),
    "2e-1": .init(group: 2, letter: "e", effectiveLength: 30, category: .supply),
    "2e-2": .init(group: 2, letter: "e", effectiveLength: 35, category: .supply),
    "2e-3": .init(group: 2, letter: "e", effectiveLength: 40, category: .supply),
    "2e-4": .init(group: 2, letter: "e", effectiveLength: 45, category: .supply),
    "2e-5": .init(group: 2, letter: "e", effectiveLength: 50, category: .supply),

    "2f-0": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
    "2f-1": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
    "2f-2": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
    "2f-3": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
    "2f-4": .init(group: 2, letter: "f", effectiveLength: 25, category: .supply),
    "2f-5": .init(group: 2, letter: "f", effectiveLength: 25, category: .supply),

    "2g-0": .init(group: 2, letter: "g", effectiveLength: 65, category: .supply),
    "2g-1": .init(group: 2, letter: "g", effectiveLength: 65, category: .supply),
    "2g-2": .init(group: 2, letter: "g", effectiveLength: 65, category: .supply),
    "2g-3": .init(group: 2, letter: "g", effectiveLength: 70, category: .supply),
    "2g-4": .init(group: 2, letter: "g", effectiveLength: 80, category: .supply),
    "2g-5": .init(group: 2, letter: "g", effectiveLength: 90, category: .supply),

    "2h-0": .init(group: 2, letter: "h", effectiveLength: 70, category: .supply),
    "2h-1": .init(group: 2, letter: "h", effectiveLength: 70, category: .supply),
    "2h-2": .init(group: 2, letter: "h", effectiveLength: 70, category: .supply),
    "2h-3": .init(group: 2, letter: "h", effectiveLength: 75, category: .supply),
    "2h-4": .init(group: 2, letter: "h", effectiveLength: 85, category: .supply),
    "2h-5": .init(group: 2, letter: "h", effectiveLength: 95, category: .supply),

    "2i-0": .init(group: 2, letter: "i", effectiveLength: 65, category: .supply),
    "2i-1": .init(group: 2, letter: "i", effectiveLength: 75, category: .supply),
    "2i-2": .init(group: 2, letter: "i", effectiveLength: 85, category: .supply),
    "2i-3": .init(group: 2, letter: "i", effectiveLength: 95, category: .supply),
    "2i-4": .init(group: 2, letter: "i", effectiveLength: 100, category: .supply),
    "2i-5": .init(group: 2, letter: "i", effectiveLength: 110, category: .supply),

    "2j-0": .init(group: 2, letter: "j", effectiveLength: 50, category: .supply),
    "2j-1": .init(group: 2, letter: "j", effectiveLength: 60, category: .supply),
    "2j-2": .init(group: 2, letter: "j", effectiveLength: 65, category: .supply),
    "2j-3": .init(group: 2, letter: "j", effectiveLength: 70, category: .supply),
    "2j-4": .init(group: 2, letter: "j", effectiveLength: 75, category: .supply),
    "2j-5": .init(group: 2, letter: "j", effectiveLength: 80, category: .supply),

    "2k-0": .init(group: 2, letter: "k", effectiveLength: 50, category: .supply),
    "2k-1": .init(group: 2, letter: "k", effectiveLength: 60, category: .supply),
    "2k-2": .init(group: 2, letter: "k", effectiveLength: 65, category: .supply),
    "2k-3": .init(group: 2, letter: "k", effectiveLength: 70, category: .supply),
    "2k-4": .init(group: 2, letter: "k", effectiveLength: 75, category: .supply),
    "2k-5": .init(group: 2, letter: "k", effectiveLength: 80, category: .supply),

    "2l-0": .init(group: 2, letter: "l", effectiveLength: 70, category: .supply),
    "2l-1": .init(group: 2, letter: "l", effectiveLength: 80, category: .supply),
    "2l-2": .init(group: 2, letter: "l", effectiveLength: 90, category: .supply),
    "2l-3": .init(group: 2, letter: "l", effectiveLength: 95, category: .supply),
    "2l-4": .init(group: 2, letter: "l", effectiveLength: 105, category: .supply),
    "2l-5": .init(group: 2, letter: "l", effectiveLength: 115, category: .supply),

    "2m-0": .init(group: 2, letter: "m", effectiveLength: 70, category: .supply),
    "2m-1": .init(group: 2, letter: "m", effectiveLength: 80, category: .supply),
    "2m-2": .init(group: 2, letter: "m", effectiveLength: 90, category: .supply),
    "2m-3": .init(group: 2, letter: "m", effectiveLength: 95, category: .supply),
    "2m-4": .init(group: 2, letter: "m", effectiveLength: 105, category: .supply),
    "2m-5": .init(group: 2, letter: "m", effectiveLength: 115, category: .supply),

    "2n-0": .init(group: 2, letter: "n", effectiveLength: 35, category: .supply),
    "2n-1": .init(group: 2, letter: "n", effectiveLength: 35, category: .supply),
    "2n-2": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),
    "2n-3": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),
    "2n-4": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),
    "2n-5": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),

    "2o-0": .init(group: 2, letter: "o", effectiveLength: 55, category: .supply),
    "2o-1": .init(group: 2, letter: "o", effectiveLength: 65, category: .supply),
    "2o-2": .init(group: 2, letter: "o", effectiveLength: 75, category: .supply),
    "2o-3": .init(group: 2, letter: "o", effectiveLength: 85, category: .supply),
    "2o-4": .init(group: 2, letter: "o", effectiveLength: 90, category: .supply),
    "2o-5": .init(group: 2, letter: "o", effectiveLength: 100, category: .supply),

    "2p-0": .init(group: 2, letter: "p", effectiveLength: 50, category: .supply),
    "2p-1": .init(group: 2, letter: "p", effectiveLength: 55, category: .supply),
    "2p-2": .init(group: 2, letter: "p", effectiveLength: 60, category: .supply),
    "2p-3": .init(group: 2, letter: "p", effectiveLength: 65, category: .supply),
    "2p-4": .init(group: 2, letter: "p", effectiveLength: 70, category: .supply),
    "2p-5": .init(group: 2, letter: "p", effectiveLength: 75, category: .supply),

    "2q-0": .init(group: 2, letter: "q", effectiveLength: 10, category: .supply),
    "2q-1": .init(group: 2, letter: "q", effectiveLength: 10, category: .supply),
    "2q-2": .init(group: 2, letter: "q", effectiveLength: 15, category: .supply),
    "2q-3": .init(group: 2, letter: "q", effectiveLength: 20, category: .supply),
    "2q-4": .init(group: 2, letter: "q", effectiveLength: 20, category: .supply),
    "2q-5": .init(group: 2, letter: "q", effectiveLength: 25, category: .supply),

    // Group 3
    "3a": .init(group: 3, letter: "a", effectiveLength: 15, category: .supply),
    "3b": .init(group: 3, letter: "b", effectiveLength: 30, category: .supply),
    "3c": .init(group: 3, letter: "c", effectiveLength: 20, category: .supply),
    "3d-f": .init(group: 3, letter: "d", effectiveLength: 35, category: .supply),
    "3d-t": .init(group: 3, letter: "d", effectiveLength: 55, category: .supply),
    "3d-m": .init(group: 3, letter: "d", effectiveLength: 110, category: .supply),
    "3e": .init(group: 3, letter: "e", effectiveLength: 30, category: .supply),
    "3f-f": .init(group: 3, letter: "f", effectiveLength: 50, category: .supply),
    "3f-t": .init(group: 3, letter: "f", effectiveLength: 70, category: .supply),
    "3f-m": .init(group: 3, letter: "f", effectiveLength: 125, category: .supply),
    "3g": .init(group: 3, letter: "g", effectiveLength: 35, category: .supply),
    "3h": .init(group: 3, letter: "h", effectiveLength: 35, category: .supply),
    "3i": .init(group: 3, letter: "i", effectiveLength: 15, category: .supply),
    "3k": .init(group: 3, letter: "k", effectiveLength: 20, category: .supply),
    "3l": .init(group: 3, letter: "l", effectiveLength: 30, category: .supply),
    "3m": .init(group: 3, letter: "m", effectiveLength: 25, category: .supply),
    "3n": .init(group: 3, letter: "n", effectiveLength: 40, category: .supply),
    "3o": .init(group: 3, letter: "o", effectiveLength: 20, category: .supply),
    "3p": .init(group: 3, letter: "p", effectiveLength: 50, category: .supply),
    "3q": .init(group: 3, letter: "q", effectiveLength: 35, category: .supply),
    "3r": .init(group: 3, letter: "r", effectiveLength: 20, category: .supply),
    "3s-f": .init(group: 3, letter: "s", effectiveLength: 15, category: .supply),
    "3s-t": .init(group: 3, letter: "s", effectiveLength: 35, category: .supply),
    "3s-m": .init(group: 3, letter: "s", effectiveLength: 90, category: .supply),
    "3t": .init(group: 3, letter: "t", effectiveLength: 10, category: .supply),
    "3u": .init(group: 3, letter: "u", effectiveLength: 80, category: .supply),
    "3u-v": .init(group: 3, letter: "u", effectiveLength: 10, category: .supply),
    "3v": .init(group: 3, letter: "v", effectiveLength: 30, category: .supply),
    "3w-f": .init(group: 3, letter: "w", effectiveLength: 15, category: .supply),
    "3w-t": .init(group: 3, letter: "w", effectiveLength: 35, category: .supply),
    "3w-m": .init(group: 3, letter: "w", effectiveLength: 90, category: .supply),

    // Group 4
    "4a": .init(group: 4, letter: "a", effectiveLength: 30, category: .supply),
    "4b": .init(group: 4, letter: "b", effectiveLength: 35, category: .supply),
    "4c": .init(group: 4, letter: "c", effectiveLength: 60, category: .supply),
    "4d": .init(group: 4, letter: "d", effectiveLength: 55, category: .supply),
    "4e": .init(group: 4, letter: "e", effectiveLength: 70, category: .supply),
    "4f": .init(group: 4, letter: "f", effectiveLength: 45, category: .supply),
    "4g": .init(group: 4, letter: "g", effectiveLength: 80, category: .supply),
    "4h": .init(group: 4, letter: "h", effectiveLength: 50, category: .supply),
    "4i": .init(group: 4, letter: "i", effectiveLength: 10, category: .supply),
    "4j": .init(group: 4, letter: "j", effectiveLength: 30, category: .supply),
    "4k": .init(group: 4, letter: "k", effectiveLength: 30, category: .supply),
    "4l": .init(group: 4, letter: "l", effectiveLength: 30, category: .supply),
    "4m": .init(group: 4, letter: "m", effectiveLength: 20, category: .supply),
    "4n": .init(group: 4, letter: "n", effectiveLength: 45, category: .supply),
    "4o": .init(group: 4, letter: "o", effectiveLength: 20, category: .supply),
    "4p": .init(group: 4, letter: "p", effectiveLength: 10, category: .supply),
    "4q": .init(group: 4, letter: "q", effectiveLength: 50, category: .supply),
    "4r": .init(group: 4, letter: "r", effectiveLength: 20, category: .supply),
    "4s": .init(group: 4, letter: "s", effectiveLength: 20, category: .supply),
    "4t": .init(group: 4, letter: "t", effectiveLength: 20, category: .supply),
    "4u": .init(group: 4, letter: "u", effectiveLength: 20, category: .supply),
    "4v": .init(group: 4, letter: "v", effectiveLength: 60, category: .supply),
    "4w": .init(group: 4, letter: "w", effectiveLength: 35, category: .supply),
    "4x": .init(group: 4, letter: "x", effectiveLength: 35, category: .supply),
    "4y": .init(group: 4, letter: "y", effectiveLength: 35, category: .supply),
    "4z": .init(group: 4, letter: "z", effectiveLength: 60, category: .supply),
    "4aa": .init(group: 4, letter: "aa", effectiveLength: 35, category: .supply),
    "4ab": .init(group: 4, letter: "ab", effectiveLength: 90, category: .supply),
    "4ac": .init(group: 4, letter: "ac", effectiveLength: 100, category: .supply),
    "4ad": .init(group: 4, letter: "ad", effectiveLength: 60, category: .supply),
    "4ae": .init(group: 4, letter: "ae", effectiveLength: 55, category: .supply),
    "4af": .init(group: 4, letter: "af", effectiveLength: 50, category: .supply),
    "4ag": .init(group: 4, letter: "ag", effectiveLength: 60, category: .supply),
    "4ah": .init(group: 4, letter: "ah", effectiveLength: 60, category: .supply),
    "4ai": .init(group: 4, letter: "ai", effectiveLength: 20, category: .supply),
    "4aj": .init(group: 4, letter: "aj", effectiveLength: 25, category: .supply),
    "4ak": .init(group: 4, letter: "ak", effectiveLength: 55, category: .supply),
    "4al": .init(group: 4, letter: "al", effectiveLength: 70, category: .supply),
    "4am": .init(group: 4, letter: "am", effectiveLength: 70, category: .supply),
    "4an": .init(group: 4, letter: "an", effectiveLength: 70, category: .supply),
    "4ao": .init(group: 4, letter: "ao", effectiveLength: 40, category: .supply),
    "4ap": .init(group: 4, letter: "ap", effectiveLength: 40, category: .supply),
    "4aq": .init(group: 4, letter: "aq", effectiveLength: 10, category: .supply),
    "4ar": .init(group: 4, letter: "ar", effectiveLength: 70, category: .supply),

    // Group 5
    "5a": .init(group: 5, letter: "a", effectiveLength: 40, category: .return),
    "5b": .init(group: 5, letter: "b", effectiveLength: 40, category: .return),
    "5c": .init(group: 5, letter: "c", effectiveLength: 40, category: .return),
    "5d": .init(group: 5, letter: "d", effectiveLength: 40, category: .return),
    "5e-1": .init(group: 5, letter: "e", effectiveLength: 10, category: .return),
    "5e-2": .init(group: 5, letter: "e", effectiveLength: 35, category: .return),
    "5f-1": .init(group: 5, letter: "f", effectiveLength: 45, category: .return),
    "5f-2": .init(group: 5, letter: "f", effectiveLength: 70, category: .return),
    "5g-1": .init(group: 5, letter: "g", effectiveLength: 45, category: .return),
    "5g-2": .init(group: 5, letter: "g", effectiveLength: 70, category: .return),
    "5h-1": .init(group: 5, letter: "h", effectiveLength: 45, category: .return),
    "5h-2": .init(group: 5, letter: "h", effectiveLength: 30, category: .return),
    "5i-1": .init(group: 5, letter: "i", effectiveLength: 45, category: .return),
    "5i-2": .init(group: 5, letter: "i", effectiveLength: 30, category: .return),
    "5j-0.25": .init(group: 5, letter: "j", effectiveLength: 20, category: .return),
    "5j-0.5": .init(group: 5, letter: "j", effectiveLength: 15, category: .return),
    "5j-1": .init(group: 5, letter: "j", effectiveLength: 10, category: .return),
    "5k": .init(group: 5, letter: "k", effectiveLength: 10, category: .return),
    "5l": .init(group: 5, letter: "l", effectiveLength: 75, category: .return),
    "5m": .init(group: 5, letter: "m", effectiveLength: 10, category: .return),
    "5n": .init(group: 5, letter: "n", effectiveLength: 55, category: .return),
    "5o": .init(group: 5, letter: "o", effectiveLength: 35, category: .return),

    // Group 6
    "6a-0.4-b": .init(group: 6, letter: "a", effectiveLength: 10, category: .return),
    "6a-0.4-t": .init(group: 6, letter: "a", effectiveLength: 10, category: .return),
    "6a-0.5-b": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
    "6a-0.5-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
    "6a-0.6-b": .init(group: 6, letter: "a", effectiveLength: 40, category: .return),
    "6a-0.6-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
    "6a-0.7-b": .init(group: 6, letter: "a", effectiveLength: 60, category: .return),
    "6a-0.7-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
    "6a-0.8-b": .init(group: 6, letter: "a", effectiveLength: 75, category: .return),
    "6a-0.8-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
    "6a-1-b": .init(group: 6, letter: "a", effectiveLength: 75, category: .return),

    "6b-0.4-b": .init(group: 6, letter: "b", effectiveLength: 10, category: .return),
    "6b-0.4-t": .init(group: 6, letter: "b", effectiveLength: 10, category: .return),
    "6b-0.5-b": .init(group: 6, letter: "b", effectiveLength: 40, category: .return),
    "6b-0.5-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
    "6b-0.6-b": .init(group: 6, letter: "b", effectiveLength: 40, category: .return),
    "6b-0.6-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
    "6b-0.7-b": .init(group: 6, letter: "b", effectiveLength: 75, category: .return),
    "6b-0.7-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
    "6b-0.8-b": .init(group: 6, letter: "b", effectiveLength: 110, category: .return),
    "6b-0.8-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
    "6b-1-b": .init(group: 6, letter: "b", effectiveLength: 110, category: .return),

    "6c-0.4-b": .init(group: 6, letter: "c", effectiveLength: 10, category: .return),
    "6c-0.4-t": .init(group: 6, letter: "c", effectiveLength: 10, category: .return),
    "6c-0.5-b": .init(group: 6, letter: "c", effectiveLength: 30, category: .return),
    "6c-0.5-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
    "6c-0.6-b": .init(group: 6, letter: "c", effectiveLength: 50, category: .return),
    "6c-0.6-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
    "6c-0.7-b": .init(group: 6, letter: "c", effectiveLength: 75, category: .return),
    "6c-0.7-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
    "6c-0.8-b": .init(group: 6, letter: "c", effectiveLength: 115, category: .return),
    "6c-0.8-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
    "6c-1-b": .init(group: 6, letter: "c", effectiveLength: 115, category: .return),

    "6d-0.1-b": .init(group: 6, letter: "d", effectiveLength: 10, category: .return),
    "6d-0.1-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
    "6d-0.2-b": .init(group: 6, letter: "d", effectiveLength: 15, category: .return),
    "6d-0.2-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
    "6d-0.3-b": .init(group: 6, letter: "d", effectiveLength: 20, category: .return),
    "6d-0.3-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
    "6d-0.4-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),
    "6d-0.4-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
    "6d-0.6-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),
    "6d-0.6-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
    "6d-0.8-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),
    "6d-0.8-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
    "6d-1-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),

    "6e-0.1-b": .init(group: 6, letter: "e", effectiveLength: 15, category: .return),
    "6e-0.1-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
    "6e-0.2-b": .init(group: 6, letter: "e", effectiveLength: 30, category: .return),
    "6e-0.2-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
    "6e-0.3-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
    "6e-0.3-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
    "6e-0.4-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
    "6e-0.4-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
    "6e-0.6-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
    "6e-0.6-t": .init(group: 6, letter: "e", effectiveLength: 25, category: .return),
    "6e-0.8-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
    "6e-0.8-t": .init(group: 6, letter: "e", effectiveLength: 25, category: .return),
    "6e-1-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),

    "6f": .init(group: 6, letter: "f", effectiveLength: 25, category: .return),
    "6g": .init(group: 6, letter: "g", effectiveLength: 30, category: .return),
    "6h": .init(group: 6, letter: "h", effectiveLength: 15, category: .return),
    "6i": .init(group: 6, letter: "i", effectiveLength: 30, category: .return),
    "6j": .init(group: 6, letter: "j", effectiveLength: 55, category: .return),
    "6k": .init(group: 6, letter: "k", effectiveLength: 10, category: .return),
    "6l": .init(group: 6, letter: "l", effectiveLength: 20, category: .return),
    "6m": .init(group: 6, letter: "m", effectiveLength: 20, category: .return),
    "6n": .init(group: 6, letter: "n", effectiveLength: 10, category: .return),
    "6o": .init(group: 6, letter: "o", effectiveLength: 10, category: .return),
    "6p": .init(group: 6, letter: "p", effectiveLength: 5, category: .return),

    // Group 7
    "7a": .init(group: 7, letter: "a", effectiveLength: 25, category: .return),

    "7b-100": .init(group: 7, letter: "b", effectiveLength: 10, category: .return),
    "7b-150": .init(group: 7, letter: "b", effectiveLength: 15, category: .return),
    "7b-200": .init(group: 7, letter: "b", effectiveLength: 25, category: .return),

    "7c-100": .init(group: 7, letter: "c", effectiveLength: 10, category: .return),
    "7c-200": .init(group: 7, letter: "c", effectiveLength: 30, category: .return),
    "7c-300": .init(group: 7, letter: "c", effectiveLength: 60, category: .return),
    "7c-400": .init(group: 7, letter: "c", effectiveLength: 110, category: .return),

    "7d-100": .init(group: 7, letter: "d", effectiveLength: 20, category: .return),
    "7d-150": .init(group: 7, letter: "d", effectiveLength: 50, category: .return),
    "7d-200": .init(group: 7, letter: "d", effectiveLength: 90, category: .return),

    "7e-200": .init(group: 7, letter: "e", effectiveLength: 10, category: .return),
    "7e-400": .init(group: 7, letter: "e", effectiveLength: 30, category: .return),
    "7e-600": .init(group: 7, letter: "e", effectiveLength: 60, category: .return),
    "7e-800": .init(group: 7, letter: "e", effectiveLength: 110, category: .return),

    // Group 8
    "8a-0-s": .init(group: 8, letter: "a", effectiveLength: 75, category: .any),
    "8a-0.75-s": .init(group: 8, letter: "a", effectiveLength: 20, category: .any),
    "8a-0.75-3": .init(group: 8, letter: "a", effectiveLength: 35, category: .any),
    "8a-0.75-5": .init(group: 8, letter: "a", effectiveLength: 30, category: .any),
    "8a-1-s": .init(group: 8, letter: "a", effectiveLength: 15, category: .any),
    "8a-1-3": .init(group: 8, letter: "a", effectiveLength: 20, category: .any),
    "8a-1-5": .init(group: 8, letter: "a", effectiveLength: 25, category: .any),
    "8a-1.5-s": .init(group: 8, letter: "a", effectiveLength: 10, category: .any),
    "8a-1.5-3": .init(group: 8, letter: "a", effectiveLength: 15, category: .any),
    "8a-1.5-5": .init(group: 8, letter: "a", effectiveLength: 20, category: .any),
    "8a-oe-4": .init(group: 8, letter: "a", effectiveLength: 25, category: .any),
    "8a-oh-4": .init(group: 8, letter: "a", effectiveLength: 30, category: .any),
    "8a-oe-3": .init(group: 8, letter: "a", effectiveLength: 30, category: .any),
    "8a-oh-3": .init(group: 8, letter: "a", effectiveLength: 35, category: .any),
    "8a-45-3": .init(group: 8, letter: "a", effectiveLength: 10, category: .any),
    "8a-45-2": .init(group: 8, letter: "a", effectiveLength: 15, category: .any),

    "8b-0-h": .init(group: 8, letter: "b", effectiveLength: 90, category: .any),
    "8b-0.25-h": .init(group: 8, letter: "b", effectiveLength: 35, category: .any),
    "8b-0.5-h": .init(group: 8, letter: "b", effectiveLength: 20, category: .any),
    "8b-0-1": .init(group: 8, letter: "b", effectiveLength: 75, category: .any),
    "8b-0.25-1": .init(group: 8, letter: "b", effectiveLength: 30, category: .any),
    "8b-0.5-1": .init(group: 8, letter: "b", effectiveLength: 15, category: .any),
    "8b-0-e": .init(group: 8, letter: "b", effectiveLength: 65, category: .any),
    "8b-0.25-e": .init(group: 8, letter: "b", effectiveLength: 25, category: .any),
    "8b-0.5-e": .init(group: 8, letter: "b", effectiveLength: 10, category: .any),

    "8c-0-h": .init(group: 8, letter: "c", effectiveLength: 30, category: .any),
    "8c-0.25-h": .init(group: 8, letter: "c", effectiveLength: 10, category: .any),
    "8c-0.5-h": .init(group: 8, letter: "c", effectiveLength: 5, category: .any),
    "8c-0-1": .init(group: 8, letter: "c", effectiveLength: 25, category: .any),
    "8c-0.25-1": .init(group: 8, letter: "c", effectiveLength: 10, category: .any),
    "8c-0.5-1": .init(group: 8, letter: "c", effectiveLength: 5, category: .any),
    "8c-0-e": .init(group: 8, letter: "c", effectiveLength: 40, category: .any),
    "8c-0.25-e": .init(group: 8, letter: "c", effectiveLength: 10, category: .any),
    "8c-0.5-e": .init(group: 8, letter: "c", effectiveLength: 5, category: .any),

    "8d-h": .init(group: 8, letter: "d", effectiveLength: 80, category: .any),
    "8d-1": .init(group: 8, letter: "d", effectiveLength: 80, category: .any),
    "8d-e": .init(group: 8, letter: "d", effectiveLength: 65, category: .any),

    "8e-h": .init(group: 8, letter: "e", effectiveLength: 10, category: .any),
    "8e-1": .init(group: 8, letter: "e", effectiveLength: 10, category: .any),
    "8e-e": .init(group: 8, letter: "e", effectiveLength: 10, category: .any),

    "8f-1": .init(group: 8, letter: "f", effectiveLength: 160, category: .any),
    "8f-2": .init(group: 8, letter: "f", effectiveLength: 260, category: .any),
    "8f-4": .init(group: 8, letter: "f", effectiveLength: 190, category: .any),

    "8g": .init(group: 8, letter: "g", effectiveLength: 200, category: .any),

    "8h-0.5": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),
    "8h-1": .init(group: 8, letter: "h", effectiveLength: 330, category: .any),
    "8h-1.5": .init(group: 8, letter: "h", effectiveLength: 430, category: .any),
    "8h-2": .init(group: 8, letter: "h", effectiveLength: 470, category: .any),
    "8h-1-v": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),
    "8h-1.5-v": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),
    "8h-2-v": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),

    "8i": .init(group: 8, letter: "i", effectiveLength: 20, category: .any),
    "8j": .init(group: 8, letter: "j", effectiveLength: 20, category: .any),

    "8k-0.25": .init(group: 8, letter: "k", effectiveLength: 100, category: .any),
    "8k-0.5": .init(group: 8, letter: "k", effectiveLength: 20, category: .any),
    "8k-1": .init(group: 8, letter: "k", effectiveLength: 20, category: .any),

    // NOTE: 8L and 8M use multipliers, make user supply them.

    "8n": .init(group: 8, letter: "n", effectiveLength: 10, category: .any),
    "8o-0": .init(group: 8, letter: "o", effectiveLength: 235, category: .any),
    "8o-0.25": .init(group: 8, letter: "o", effectiveLength: 90, category: .any),
    "8o-0.5": .init(group: 8, letter: "o", effectiveLength: 45, category: .any),

    "8p-10-m": .init(group: 8, letter: "p", effectiveLength: 75, category: .any),
    "8p-10-r": .init(group: 8, letter: "p", effectiveLength: 60, category: .any),
    "8p-12-m": .init(group: 8, letter: "p", effectiveLength: 90, category: .any),
    "8p-12-r": .init(group: 8, letter: "p", effectiveLength: 75, category: .any),
    "8p-14-m": .init(group: 8, letter: "p", effectiveLength: 90, category: .any),
    "8p-14-r": .init(group: 8, letter: "p", effectiveLength: 75, category: .any),

    // Group 9
    "9a-b": .init(group: 9, letter: "a", effectiveLength: 80, category: .supply),
    "9a-m": .init(group: 9, letter: "a", effectiveLength: 5, category: .supply),

    "9b-b": .init(group: 9, letter: "b", effectiveLength: 80, category: .supply),
    "9b-m": .init(group: 9, letter: "b", effectiveLength: 5, category: .supply),

    "9c-b": .init(group: 9, letter: "c", effectiveLength: 80, category: .supply),
    "9c-m": .init(group: 9, letter: "c", effectiveLength: 5, category: .supply),

    "9d-b": .init(group: 9, letter: "d", effectiveLength: 75, category: .supply),
    "9d-m": .init(group: 9, letter: "d", effectiveLength: 5, category: .supply),

    "9e-b": .init(group: 9, letter: "e", effectiveLength: 50, category: .supply),
    "9e-m": .init(group: 9, letter: "e", effectiveLength: 5, category: .supply),

    "9f-b": .init(group: 9, letter: "f", effectiveLength: 45, category: .supply),
    "9f-m": .init(group: 9, letter: "f", effectiveLength: 5, category: .supply),

    "9g-b": .init(group: 9, letter: "g", effectiveLength: 35, category: .supply),
    "9g-m": .init(group: 9, letter: "g", effectiveLength: 5, category: .supply),

    "9h-b": .init(group: 9, letter: "h", effectiveLength: 100, category: .supply),
    "9h-m": .init(group: 9, letter: "h", effectiveLength: 5, category: .supply),

    "9i-b": .init(group: 9, letter: "i", effectiveLength: 85, category: .supply),
    "9i-m": .init(group: 9, letter: "i", effectiveLength: 5, category: .supply),

    "9j-b": .init(group: 9, letter: "j", effectiveLength: 25, category: .supply),
    "9j-m": .init(group: 9, letter: "j", effectiveLength: 5, category: .supply),

    "9k": .init(group: 9, letter: "k", effectiveLength: 65, category: .supply),
    "9l": .init(group: 9, letter: "l", effectiveLength: 20, category: .supply),
    "9m": .init(group: 9, letter: "m", effectiveLength: 20, category: .supply),
    "9n": .init(group: 9, letter: "n", effectiveLength: 15, category: .supply),
    "9o": .init(group: 9, letter: "o", effectiveLength: 15, category: .supply),
    "9p": .init(group: 9, letter: "p", effectiveLength: 70, category: .supply),
    "9q": .init(group: 9, letter: "q", effectiveLength: 55, category: .supply),
    "9r": .init(group: 9, letter: "r", effectiveLength: 35, category: .supply),

    // Group 10
    "10a": .init(group: 10, letter: "a", effectiveLength: 75, category: .return),
    "10b": .init(group: 10, letter: "b", effectiveLength: 10, category: .return),
    "10c": .init(group: 10, letter: "c", effectiveLength: 10, category: .return),
    "10d": .init(group: 10, letter: "d", effectiveLength: 25, category: .return),
    "10e": .init(group: 10, letter: "e", effectiveLength: 25, category: .return),
    "10f": .init(group: 10, letter: "f", effectiveLength: 35, category: .return),
    "10g": .init(group: 10, letter: "g", effectiveLength: 75, category: .return),

    // NOTE: Group 11, not entered make user enter them manually.

    // Group 12
    "12a-1:1-2": .init(group: 12, letter: "a", effectiveLength: 20, category: .any),
    "12a-2:1-2": .init(group: 12, letter: "a", effectiveLength: 20, category: .any),
    "12a-4:1-2": .init(group: 12, letter: "a", effectiveLength: 20, category: .any),
    "12a-1:1-4": .init(group: 12, letter: "a", effectiveLength: 40, category: .any),
    "12a-2:1-4": .init(group: 12, letter: "a", effectiveLength: 40, category: .any),
    "12a-4:1-4": .init(group: 12, letter: "a", effectiveLength: 30, category: .any),

    "12b-2": .init(group: 12, letter: "b", effectiveLength: 20, category: .any),
    "12b-4": .init(group: 12, letter: "b", effectiveLength: 40, category: .any),

    "12c-1:1-2": .init(group: 12, letter: "c", effectiveLength: 20, category: .any),
    "12c-2:1-2": .init(group: 12, letter: "c", effectiveLength: 20, category: .any),
    "12c-4:1-2": .init(group: 12, letter: "c", effectiveLength: 20, category: .any),
    "12c-1:1-4": .init(group: 12, letter: "c", effectiveLength: 40, category: .any),
    "12c-2:1-4": .init(group: 12, letter: "c", effectiveLength: 40, category: .any),
    "12c-4:1-4": .init(group: 12, letter: "c", effectiveLength: 30, category: .any),

    "12d-1:1-2": .init(group: 12, letter: "d", effectiveLength: 20, category: .any),
    "12d-2:1-2": .init(group: 12, letter: "d", effectiveLength: 20, category: .any),
    "12d-4:1-2": .init(group: 12, letter: "d", effectiveLength: 20, category: .any),
    "12d-1:1-4": .init(group: 12, letter: "d", effectiveLength: 40, category: .any),
    "12d-2:1-4": .init(group: 12, letter: "d", effectiveLength: 40, category: .any),
    "12d-4:1-4": .init(group: 12, letter: "d", effectiveLength: 30, category: .any),

    "12e": .init(group: 12, letter: "e", effectiveLength: 25, category: .any),

    "12f-1:1-2": .init(group: 12, letter: "f", effectiveLength: 20, category: .any),
    "12f-2:1-2": .init(group: 12, letter: "f", effectiveLength: 20, category: .any),
    "12f-4:1-2": .init(group: 12, letter: "f", effectiveLength: 15, category: .any),
    "12f-1:1-4": .init(group: 12, letter: "f", effectiveLength: 40, category: .any),
    "12f-2:1-4": .init(group: 12, letter: "f", effectiveLength: 40, category: .any),
    "12f-4:1-4": .init(group: 12, letter: "f", effectiveLength: 30, category: .any),

    "12g-2": .init(group: 12, letter: "g", effectiveLength: 20, category: .any),
    "12g-4": .init(group: 12, letter: "g", effectiveLength: 40, category: .any),

    "12h-1:1-2": .init(group: 12, letter: "h", effectiveLength: 20, category: .any),
    "12h-2:1-2": .init(group: 12, letter: "h", effectiveLength: 20, category: .any),
    "12h-4:1-2": .init(group: 12, letter: "h", effectiveLength: 15, category: .any),
    "12h-1:1-4": .init(group: 12, letter: "h", effectiveLength: 40, category: .any),
    "12h-2:1-4": .init(group: 12, letter: "h", effectiveLength: 40, category: .any),
    "12h-4:1-4": .init(group: 12, letter: "h", effectiveLength: 25, category: .any),

    "12i-1:1-2": .init(group: 12, letter: "i", effectiveLength: 20, category: .any),
    "12i-2:1-2": .init(group: 12, letter: "i", effectiveLength: 15, category: .any),
    "12i-4:1-2": .init(group: 12, letter: "i", effectiveLength: 10, category: .any),
    "12i-1:1-4": .init(group: 12, letter: "i", effectiveLength: 35, category: .any),
    "12i-2:1-4": .init(group: 12, letter: "i", effectiveLength: 25, category: .any),
    "12i-4:1-4": .init(group: 12, letter: "i", effectiveLength: 10, category: .any),

    "12j-1:1-2": .init(group: 12, letter: "j", effectiveLength: 10, category: .any),
    "12j-2:1-2": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),
    "12j-4:1-2": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),
    "12j-1:1-4": .init(group: 12, letter: "j", effectiveLength: 10, category: .any),
    "12j-2:1-4": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),
    "12j-4:1-4": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),

    "12k-2": .init(group: 12, letter: "k", effectiveLength: 25, category: .any),
    "12k-4": .init(group: 12, letter: "k", effectiveLength: 25, category: .any),

    "12l-1:1-2": .init(group: 12, letter: "l", effectiveLength: 10, category: .any),
    "12l-2:1-2": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),
    "12l-4:1-2": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),
    "12l-1:1-4": .init(group: 12, letter: "l", effectiveLength: 10, category: .any),
    "12l-2:1-4": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),
    "12l-4:1-4": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),

    "12m-1:1-2": .init(group: 12, letter: "m", effectiveLength: 10, category: .any),
    "12m-2:1-2": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),
    "12m-4:1-2": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),
    "12m-1:1-4": .init(group: 12, letter: "m", effectiveLength: 10, category: .any),
    "12m-2:1-4": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),
    "12m-4:1-4": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),

    "12n": .init(group: 12, letter: "n", effectiveLength: 10, category: .any),

    "12o-1:1-2": .init(group: 12, letter: "o", effectiveLength: 10, category: .any),
    "12o-2:1-2": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),
    "12o-4:1-2": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),
    "12o-1:1-4": .init(group: 12, letter: "o", effectiveLength: 10, category: .any),
    "12o-2:1-4": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),
    "12o-4:1-4": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),

    "12p-2": .init(group: 12, letter: "p", effectiveLength: 30, category: .any),
    "12p-4": .init(group: 12, letter: "p", effectiveLength: 30, category: .any),

    "12q-1:1-2": .init(group: 12, letter: "q", effectiveLength: 10, category: .any),
    "12q-2:1-2": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),
    "12q-4:1-2": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),
    "12q-1:1-4": .init(group: 12, letter: "q", effectiveLength: 10, category: .any),
    "12q-2:1-4": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),
    "12q-4:1-4": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),

    "12r-1:1-2": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
    "12r-2:1-2": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
    "12r-4:1-2": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
    "12r-1:1-4": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
    "12r-2:1-4": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
    "12r-4:1-4": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),

    "12s": .init(group: 12, letter: "s", effectiveLength: 30, category: .any),
    "12t": .init(group: 12, letter: "t", effectiveLength: 30, category: .any),
    "12u": .init(group: 12, letter: "u", effectiveLength: 25, category: .any),
    "12v": .init(group: 12, letter: "v", effectiveLength: 30, category: .any),
  ]
}()
