import re def vin_year(vin_char: str) -> int: YEAR_MAPPING = { "A": 1980, "B": 1981, "C": 1982, "D": 1983, "E": 1984, "F": 1985, "G": 1986, "H": 1987, "J": 1988, "K": 1989, "L": 1990, "M": 1991, "N": 1992, "P": 1993, "R": 1994, "S": 1995, "T": 1996, "V": 1997, "W": 1998, "X": 1999, "Y": 2000, "1": 2001, "2": 2002, "3": 2003, "4": 2004, "5": 2005, "6": 2006, "7": 2007, "8": 2008, "9": 2009, "A": 2010, "B": 2011, "C": 2012, "D": 2013, "E": 2014, "F": 2015, "G": 2016, "H": 2017, "J": 2018, "K": 2019, "L": 2020, "M": 2021, "N": 2022, "P": 2023, "R": 2024, "S": 2025, "T": 2026, "V": 2027, "W": 2028, "X": 2029, "Y": 2030, } # Normalize the input character to uppercase vin_char = vin_char.upper() # Check if the character is valid if vin_char not in YEAR_MAPPING: raise ValueError( f"Invalid year character: '{vin_char}'. Expected one of {list(YEAR_MAPPING.keys())}." ) # Return the corresponding year return YEAR_MAPPING[vin_char] wmi_manufacturer_mapping = { "AAA": "Audi", "AAK": "FAW", "AAM": "MAN", "AAV": "Volkswagen", "ABJ": "Mitsubishi", "ABM": "BMW", "ACV": "Isuzu", "AC5": "Hyundai", "ADM": "GM", "ADN": "Nissan", "ADR": "Renault", "ADX": "Tata", "AFA": "Ford", "AFB": "Mazda", "AHH": "Hino", "AHM": "Honda", "AHT": "Toyota", "BR1": "Mercedes-Benz", "HA0": "Wuxi", "HA6": "Niu", "HES": "smart", "HL4": "Morini", "HRV": "Henrey", "JAA": "Isuzu", "JAB": "Isuzu", "JAC": "Isuzu", "JAE": "Acura", "JAL": "Isuzu", "JA3": "Mitsubishi", "JA4": "Mitsubishi", "JA7": "Mitsubishi", "JB3": "Dodge", "JB4": "Dodge", "JB7": "Dodge", "JC0": "Ford", "JC1": "Fiat", "JC2": "Ford", "JDA": "Daihatsu", "JD1": "Daihatsu", "JD2": "Daihatsu", "JD4": "Daihatsu", "JE3": "Eagle", "JE4": "Mitsubishi", "JF1": "Subaru", "JF2": "Subaru", "JF3": "Subaru", "JF4": "Saab", "JG1": "Chevrolet", "JG7": "Pontiac", "JGC": "Chevrolet", "JGT": "GMC", "JHA": "Hino", "JHD": "Hino", "JHF": "Honda", "JHZ": "Honda", "JHN": "Honda", "JHL": "Honda", "JHG": "Honda", "JH5": "Honda", "JH1": "Honda", "JHM": "Honda", "JH3": "Honda", "JH4": "Acura", "JJ3": "Chrysler", "JLF": "Mitsubishi", "JLS": "Sterling", "JL5": "Mitsubishi", "JL6": "Mitsubishi", "JMA": "Mitsubishi", "JMB": "Mitsubishi", "JMF": "Mitsubishi", "JMP": "Mitsubishi", "JMR": "Mitsubishi", "JMY": "Mitsubishi", "JMZ": "Mazda", "JM0": "Mazda", "JM1": "Mazda", "JM2": "Mazda", "JM3": "Mazda", "JM4": "Mazda", "JM6": "Mazda", "JM7": "Mazda", "JNC": "Nissan", "JNE": "Nissan", "JNK": "Infiniti", "JNR": "Infiniti", "JN1": "Nissan", "JN6": "Nissan", "JN8": "Nissan", "JPC": "Nissan", "JP3": "Plymouth", "JP4": "Plymouth", "JP7": "Plymouth", "JR2": "Isuzu", "JST": "Suzuki", "JS2": "Suzuki", "JS3": "Suzuki", "JS4": "Suzuki", "JTB": "Toyota", "JTD": "Toyota", "JTE": "Toyota", "JTF": "Toyota", "JTG": "Toyota", "JTH": "Lexus", "JTJ": "Lexus", "JTK": "Toyota", "JTL": "Toyota", "JTM": "Toyota", "JTN": "Toyota", "JTP": "Toyota", "JT1": "Toyota", "JT2": "Toyota", "JT3": "Toyota", "JT4": "Toyota", "JT6": "Lexus", "JT8": "Lexus", "JW6": "Mitsubishi", "J81": "Chevrolet", "J87": "Pontiac", "J8C": "Chevrolet", "J8T": "GMC", "J8Z": "Chevrolet", "KF3": "Merkavim", "KL": "Daewoo", "KLA": "Daewoo", "KLP": "CT&T United", "KLT": "Tata Daewoo", "KLU": "Tata Daewoo", "KLY": "Daewoo", "KL1": "Daewoo", "KL2": "Daewoo", "KL3": "Daewoo", "KL4": "Daewoo", "KL5": "Daewoo", "KL6": "Daewoo", "KL7": "Daewoo", "KL8": "Daewoo", "KM": "Hyundai", "KMC": "Hyundai", "KME": "Hyundai", "KMF": "Hyundai", "KMH": "Hyundai", "KMJ": "Hyundai", "KMT": "Genesis", "KMU": "Genesis", "KM8": "Hyundai", "KNA": "Kia", "KNC": "Kia", "KND": "Kia", "KNE": "Kia", "KNF": "Kia", "KNG": "Kia", "KNJ": "Ford", "KNM": "Renault", "KN1": "Asia Motors", "KN2": "Asia Motors", "KPA": "SsangYong", "KPB": "SsangYong", "KPH": "Mitsubishi", "KPT": "SsangYong", "LA6": "King Long", "LC0": "BYD", "LBE": "Hyundai Shouwang", "LBM": "Zongshen Piaggio", "LBV": "BMW", "LB1": "Fujian Benz", "LB3": "Geely", "LCR": "Gonow", "LC2": "Kwang Yang", "LDC": "Dongfeng", "LDD": "Dandong Huanghai", "LDK": "FAW Bus", "LDN": "Soueast", "LDP": "Voyah", "LDY": "Zhongtong Bus,", "LEF": "Jiangling", "LET": "Jiangling Isuzu", "LE4": "Beijing Benz", "LFB": "FAW", "LFF": "Wangye", "LFM": "FAW Toyota", "LFN": "FAW", "LFP": "FAW", "LFT": "FAW", "LFV": "FAW Volkswagen,", "LFW": "FAW JieFang,", "LFZ": "Leapmotor", "LGA": "Dongfeng", "LGB": "Dongfeng", "LGD": "Dongfeng", "LGG": "Dongfeng", "LGJ": "Dongfeng", "LGL": "Guilin Daewoo", "LGW": "Great Wall", "LGX": "BYD", "LHA": "Shuanghuan", "LHB": "BAIC", "LHG": "Guangzhou Honda", "LH1": "FAW", "LJC": "Jincheng", "LJD": "Yueda Kia", "LJN": "Zhengzhou Nissan", "LJS": "Yaxing Coach", "LJU": "Lotus Geely", "LJX": "JMC Ford", "LJ1": "JAC", "LJ8": "Zotye", "LKC": "Changhe", "LKL": "Higer Bus", "LKT": "Lifan", "LLC": "Loncin", "LLN": "Qoros", "LLV": "Lifan", "LL3": "Golden Dragon", "LL6": "GAC Mitsubishi", "LL8": "Linhai Yamaha", "LME": "Skyworth", "LMG": "GAC", "LMV": "XPeng", "LMW": "GAC", "LM6": "SWM", "LM8": "Seres", "LNA": "GAC", "LNB": "BAIC", "LND": "JMEV", "LNP": "NAC MG", "LNY": "Yuejin", "LMX": "Dongfeng Forthing", "LPA": "Changan", "LPE": "BYD", "LPS": "Polestar", "LRB": "SAIC Buick", "LRD": "Foton", "LRE": "SAIC Cadillac", "LRW": "Tesla", "LSC": "Changan", "LSF": "SAIC Maxus", "LSG": "SAIC Chevrolet", "LSH": "SAIC Maxus", "LSJ": "SAIC MG", "LSK": "SAIC Maxus", "LSV": "SAIC Volkswagen", "LSY": "Brilliance", "LS1": "Hyundai", "LS4": "Changan", "LS5": "Changan", "LS6": "Changan", "LS7": "JMC", "LTA": "ZX Auto", "LTN": "Soueast", "LTV": "FAW Toyota", "LUC": "Honda", "LUD": "Dongfeng", "LUX": "Dongfeng", "LUZ": "Hozon", "LVA": "Foton", "LVB": "Foton", "LVC": "Foton", "LVF": "Changhe Suzuki", "LVG": "GAC Toyota", "LVH": "Dongfeng", "LVM": "Chery", "LVP": "Dongfeng", "LVR": "Changan Mazda", "LVS": "Changan Ford", "LVT": "Chery", "LVU": "Chery", "LVV": "Chery", "LVX": "Aiways", "LVY": "Volvo", "LVZ": "Dongfeng", "LWG": "Chongqing", "LWL": "Isuzu", "LWV": "GAC", "LW4": "Li Auto", "LXV": "Borgward", "LYB": "Yaxing", "LYV": "Volvo", "LZE": "Isuzu", "LZF": "SAIC", "LZG": "Shaanxi", "LZK": "Huanghe", "LZM": "MAN", "LZS": "Meccanica", "LZU": "Isuzu Bus", "LZW": "SAIC", "LZY": "Yutong", "LZZ": "Sinotruk", "LZ4": "Shangyang", "L1N": "XPeng", "L2C": "Chery", "L3H": "Victory", "L4F": "Suzhou Eagle", "L5C": "KangDi", "L5K": "Yongkang", "L6T": "Lynk & Co", "L82": "Baotian", "L85": "Yongkang Huabao", "L9N": "Taotao", "MAH": "Fiat", "MAJ": "Ford", "MAK": "Honda", "MAL": "Hyundai", "MAT": "Tata", "MA3": "Suzuki", "MA6": "GM", "MA7": "Hindustan", "MBF": "Royal Enfield", "MBH": "Suzuki & Nissan", "MBJ": "Toyota", "MBK": "MAN", "MBL": "Hero MotoCorp", "MBR": "Mercedes-Benz", "MBU": "Swaraj", "MBV": "Premier", "MBX": "Piaggio", "MBY": "Asia Motors", "MB1": "Ashok Leyland", "MCB": "GM", "MCG": "Atul", "MC1": "Force", "MC2": "Eicher", "MDH": "Nissan", "MD6": "TVS", "MD9": "Shuttles", "MEC": "Daimler", "MEE": "Renault", "MEG": "Harley-Davidson", "MER": "Benelli", "MET": "Piaggio", "MEX": "Škoda", "ME1": "Yamaha", "MZB": "Kia", "MZZ": "Citroën", "MZ7": "MG", "M3G": "Isuzu", "MF3": "Hyundai", "MHD": "Suzuki", "MHF": "Toyota", "MHK": "Daihatsu", "MHL": "Mercedes-Benz", "MHR": "Honda", "MLB": "Siam Yamaha Co", "ML3": "Mitsubishi", "MMA": "Mitsubishi", "MMB": "Mitsubishi", "MMC": "Mitsubishi", "MMD": "Mitsubishi", "MMF": "BMW", "MML": "MG", "MMM": "Chevrolet", "MMR": "Subaru", "MMS": "Suzuki", "MMT": "Mitsubishi", "MMU": "Holden", "MNB": "Ford", "MNK": "Hino", "MNT": "Nissan", "MNU": "Great Wall", "MPA": "Isuzu", "MPB": "Ford", "MP1": "Isuzu", "MP2": "Mazda Isuzu", "MP5": "Foton", "MRH": "Honda", "MRT": "Neta", "MR0": "Toyota", "MR1": "Toyota", "MR2": "Toyota", "MR3": "Toyota", "MXL": "Yutong", "MX3": "Hyundai", "NAA": "Iran Khodro", "NAC": "Mammut", "NAD": "Škoda", "NAP": "Pars Khodro", "NC9": "VIRA Diesel", "NFB": "Honda", "NG3": "Lucky Motors", "NLA": "Honda", "NLE": "Mercedes-Benz", "NLH": "Hyundai", "NLJ": "Hyundai", "NLN": "Karsan", "NLR": "Otokar", "NLT": "Temsa", "NL1": "TOGG", "NMA": "MAN", "NMB": "Mercedes-Benz", "NMC": "BMC", "NMT": "Toyota", "NM0": "Ford", "NM1": "Renault", "NM4": "Tofa", "NNA": "Anadolu Isuzu", "NNN": "Gépébus Oréos 4X", "NRE": "Bozankaya", "NSA": "SamAvto", "NS2": "JV MAN Auto", "PAB": "Isuzu", "PAD": "Honda", "PE1": "Ford", "PE3": "Mazda", "PFD": "Hyundai", "PL1": "Proton", "PL8": "Inokom Hyundai", "PLP": "Subaru", "PLZ": "Isuzu", "PMH": "Honda", "PML": "Hicom", "PMN": "Modenas", "PM1": "BMW Mini", "PM2": "Perodua", "PM9/": "Bufori", "PNA": "Stellantis", "PNV": "Volvo", "PN1": "UMW Toyota", "PN2": "UMW Toyota", "PN8": "Nissan", "PPP": "Suzuki", "PPV": "Volkswagen", "PP1": "Mazda", "PP3": "Hyundai", "PRA": "Sinotruk", "PRH": "Chery", "PRX": "Kia", "PR8": "Ford", "RA1": "Steyr", "LFA": "Ford Lio Hon", "RFB": "Kymco", "RFC": "Taiwan Golden Bee", "RFD": "Tai Ling", "RFG": "Sanyang", "RFL": "Adly", "RFT": "CPI", "RF3": "Aeon Motor", "RF5": "Yulon Motor", "RGS": "Kawasaki", "RHA": "Ford Lio Ho", "RKJ": "Prince ", "RKL": "Kuozui", "RKM": "CMC", "RKR": "Yamaha", "RKT": "Honda", "RK7": "Kawasaki", "RLA": "Mitsubishi", "RLC": "Yamaha Motor", "RLE": "Isuzu", "RLH": "Honda", "RLL": "VinFast", "RLM": "Mercedes-Benz", "RLN": "VinFast", "RL0": "Ford", "RL4": "Toyota", "RP8": "Piaggio", "R3M": "Mangosteen", "R4N": "Elyx", "SAA": "Austin", "SAB": "Optare", "SAD": "Jaguar", "SAF": "ERF", "SAH": "Honda", "SAJ": "Jaguar", "SAL": "Land Rover", "SAM": "Morris", "SAR": "Rover MG", "SAT": "Triumph", "SAX": "Austin-Rover", "SAZ": "Freight Rover", "SA9/": "OX Global", "SBB": "Leyland", "SBC": "Iveco Ford", "SBJ": "Leyland", "SBL": "Leyland", "SBM": "McLaren", "SBS": "Scammell", "SB1": "Toyota", "SCA": "Rolls Royce", "SCB": "Bentley", "SCC": "Lotus", "SCD": "Reliant", "SCE": "DeLorean", "SCF": "Aston Martin", "SC5": "Wrightbus", "SC6": "INEOS", "SDB": "Talbot", "SDF": "Dodge", "SDG": "Renault", "SDK": "Caterham", "SDL": "TVR", "SDP": "MG", "SD7": "Aston Martin", "SFA": "Ford", "SFN": "Foden", "SFZ": "Tesla", "SGA": "Avondale", "SGB": "Bailey", "SGD": "Swift", "SGE": "Elddis", "SGL": "Lunaravans", "SG4": "Coachman", "SHH": "Honda", "SHS": "Honda", "SH7": "INEOS", "SJA": "Bentley", "SJK": "Infiniti", "SJN": "Nissan", "SJ1": "Ree", "SKA": "Vauxhall", "SKB": "Kel-Berg", "SKF": "Bedford", "SLA": "Rolls Royce", "SLP": "JC Bamford", "SNE": "Wartburg", "SNT": "Trabant", "SWH": "Temared", "TLJ": "Jawa Moto", "TMA": "Hyundai", "TMB": "Škoda", "TMC": "Hyundai", "TMK": "Karosa", "TMP": "Škoda", "TMT": "Tatra", "TNA": "Avia", "TNE": "TAZ", "TNT": "Tatra", "TNU": "Tatra", "TN9": "Karosa", "TRA": "Ikarus Bus", "TRC": "Csepel", "TRU": "Audi", "TSB": "Ikarus Bus", "TSE": "Ikarus,", "TSF": "Alfabusz", "TSM": "Suzuki Fiat", "TWG": "Ceatano Bus", "TW1": "Toyota", "TW2": "Ford", "TW6": "Citroën", "TW7": "Mini", "TX5": "Mini", "TYA": "Mitsubishi", "TYB": "Mitsubishi", "UN1": "Ford", "UU1": "Dacia", "UU2": "Oltcit", "UU3": "ARO", "UU4": "Roman", "UU5": "Rocar", "UU6": "Daewoo", "UU7": "Euro Bus", "UU9": "Astra Bus", "UV9": "ATP Bus", "UWR": "Robus", "UZT": "UTB", "U1A": "Sanos", "U5Y": "Kia", "U6Y": "Kia", "VAG": "Steyr Daimler", "VA4": "KSR", "VBK": "KTM", "VCF": "Fisker", "VFA": "Renault", "VFN": "Trailor", "VF1": "Renault", "VF2": "Renault", "VF3": "Peugeot", "VF4": "Talbot", "VF5": "Iveco Unic", "VF6": "Renault", "VF7": "Citroën", "VF8": "Matra", "VGY": "Lohr", "VG6": "Renault", "VG7": "Renault", "VG8": "Renault", "VJR": "Ligier", "VJY": "Gruau", "VJ1": "Heuliez Bus", "VJ2": "Mia Electric", "VK1": "SEG", "VK2": "Grandin", "VK8": "Venturi", "VLG": "Aixam-Mega", "VLU": "Scania", "VL4": "Citroën", "VMK": "Renault", "VM3": "Lamberet", "VN1": "Renault", "VN4": "Voxan", "VNE": "Iveco", "VNK": "Toyota", "VNV": "Nissan", "VRW": "Goupil", "VR1": "DS", "VR3": "Peugeot", "VR7": "Citroën", "VXE": "Opel", "VXF": "Fiat", "VXK": "Opel", "VYF": "Fiat", "VSA": "Mercedes-Benz", "VSC": "Talbot", "VSE": "Santana Suzuki", "VSF": "Santana", "VSK": "Nissan", "VSR": "Leciñena", "VSS": "SEAT", "VSX": "Opel", "VSY": "Renault", "VS1": "Pegaso", "VS5": "Renault", "VS6": "Ford", "VS7": "Citroën", "VS8": "Peugeot", "VTR": "Gas Gas", "VVC": "SOR Ibrica", "VV1": "Lecitrailer", "VWA": "Nissan", "VWF": "Guillén", "VWV": "Volkswagen", "WAC": "Audi", "WAG": "Neoplan", "WAP": "Alpina", "WAU": "Audi", "WA1": "Audi", "WBA": "BMW", "WBJ": "Bitters", "WBS": "BMW", "WBU": "Bürstner", "WBX": "BMW", "WBY": "BMW", "WB1": "BMW", "WB5": "BMW", "WCD": "Freightliner", "WDB": "Mercedes-Benz Maybach", "WDC": "Mercedes-Benz", "WDD": "Mercedes-Benz", "WDF": "Mercedes-Benz", "WDR": "Freightliner", "WDT": "Dethleffs", "WDW": "Dodge", "WDY": "Freightliner", "WDZ": "Mercedes-Benz", "WD0": "Dodge", "WD2": "Freightliner", "WD3": "Mercedes-Benz", "WD4": "Mercedes-Benz", "WD5": "Freightliner", "WD6": "Freightliner", "WD8": "Dodge", "WEB": "Evobus GmbH", "WFC": "Fendt", "WFD": "Fliegl Trailer", "WF0": "Ford", "WF1": "Merkur", "WHB": "Hobby", "WHY": "Hymer", "WJM": "Iveco", "WJR": "Irmscher", "WKE": "Krone", "WKK": "Setra", "WKN": "Knaus", "WK0": "Kögel", "WLA": "Langendorf", "WMA": "MAN & Bus", "WME": "smart", "WMW": "MINI", "WMX": "Mercedes-Benz", "WMZ": "MINI", "WNA": "Next.e.GO Mobile SE", "WP0": "Porsche", "WP1": "Porsche", "WSK": "Schmitz-Cargobull", "WSM": "Schmitz-Cargobull", "WSV": "Aebi Schmidt", "WS5": "StreetScooter", "WS7": "Sono", "WTA": "Tabbert", "WUA": "Audi", "WU1": "Audi", "WVG": "Volkswagen", "WVP": "Viseon Bus", "WVW": "Volkswagen", "WV1": "Volkswagen", "WV2": "Volkswagen", "WV3": "Volkswagen", "WV4": "Volkswagen", "WZ1": "Toyota", "W0L": "Opel", "W0V": "Opel", "W04": "Buick", "W06": "Cadillac", "W08": "Saturn Astra", "W1A": "smart", "W1K": "Mercedes-Benz", "W1N": "Mercedes-Benz", "W1T": "Mercedes-Benz", "W1V": "Mercedes-Benz", "W1W": "Mercedes-Benz", "W1Y": "Mercedes-Benz", "W1Z": "Mercedes-Benz", "W2W": "Freightliner", "W2Y": "Freightliner", "W2Z": "Freightliner", "XLA": "DAF Bus", "XLB": "Volvo.", "XLC": "Ford", "XLD": "Pacton", "XLE": "Scania", "XLK": "Burg", "XLR": "DAF", "XLV": "DAF", "XL3": "Ebusco", "XL4": "Lightyear", "XMC": "Mitsubishi", "XMD": "Mitsubishi", "XMG": "VDL Bus", "XMR": "Nooteboom", "XM4": "RAVO Holding", "XNB": "Mitsubishi", "XNC": "Mitsubishi", "XP7": "Tesla", "XTA": "Lada", "XTB": "Moskvitch", "XTC": "KAMAZ", "XTE": "ZAZ", "XTF": "GolAZ", "XTH": "GAZ", "XTK": "IzhAvto", "XTP": "Ural", "XTT": "UAZ", "XTU": "Trolza", "XTW": "LAZ", "XTY": "LiAZ", "XTZ": "ZiL", "XUF": "General", "XUU": "AvtoTor", "XW7": "Toyota", "XW8": "Volkswagen", "XWB": "Daewoo", "XWE": "AvtoTor", "XWF": "AvtoTor", "XX3": "Ujet", "XZG": "Great Wall", "X1E": "KAvZ", "X1F": "NefAZ", "X1M": "PAZ", "X4X": "AvtoTor", "X7L": "Renault", "X7M": "Hyundai Vortex", "X8U": "Scania", "X96": "GAZ", "X9F": "Ford", "X9L": "GM", "X9P": "Volvo", "X9X": "Great Wall", "YAF": "Faymonville", "YAR": "Toyota", "YBW": "Volkswagen", "YB1": "Volvo", "YB2": "Volvo", "YB6": "Jonckheere", "YE2": "Van Hool", "YH1": "Solifer", "YH2": "BRP", "YH4": "Fisker", "YK1": "Saab", "YSC": "Cadillac", "YSM": "Polestars", "YSP": "Volta AB", "YSR": "Polestar", "YS2": "Scania", "YS3": "Saabs", "YS4": "Scania", "YTN": "Saab", "YT7": "Kabe", "YV1": "Volvo", "YV2": "Volvo", "YV3": "Volvos", "YV4": "Volvo", "YYC": "Think Nordic", "Y3M": "MAZ", "Y4F": "Ford", "Y4K": "Geely", "Y6D": "ZAZ", "Y6J": "Bogdan", "Y6L": "Hyundai", "Y6U": "Škoda", "Y7B": "Bogdan", "Y7C": "Great Wall", "Y7F": "Boryspil Bus", "Y8A": "LAZ", "Y9H": "LAZ", "ZAA": "Autobianchi", "ZAC": "Jeep Dodge", "ZAM": "Maserati", "ZAP": "Piaggio", "ZAR": "Alfa Romeo", "ZAS": "Alfa Romeo", "ZBB": "Bertone", "ZBN": "Benelli", "ZBW": "Rayton-Fissore", "ZCB": "Bartoletti", "ZCF": "Iveco", "ZCG": "Cagiva", "ZCM": "Menarinibus", "ZC2": "Chrysler", "ZDC": "Honda", "ZDF": "Ferrari", "ZDM": "Ducati", "ZDT": "De Tomaso", "ZDY": "Cacciamali", "ZD0": "Yamaha", "ZD3": "Beta Motor", "ZD4": "Aprilia", "ZES": "Bimota", "ZFA": "Fiat", "ZFB": "Fiat", "ZFC": "Fiat", "ZFF": "Ferrari", "ZFM": "Fantic", "ZFR": "Pininfarina", "ZF4": "Qvale", "ZGA": "Iveco Bus", "ZGU": "Moto Guzzi", "ZHW": "Lamborghini", "ZJM": "Malaguti", "ZJN": "Innocenti", "ZJT": "Italjet", "ZLA": "Lancia", "ZLF": "Tazzari", "ZLM": "Moto Morini", "ZLV": "Laverda", "ZNN": "Energica", "ZN3": "Iveco Defence", "ZN6": "Maserati", "ZPB": "Lamborghini", "ZPY": "DR", "ZRG": "Tazzari", "ZSG": "Ferrari", "ZY1": "Adria", "Z6F": "Ford", "Z76": "SEMAZ", "Z8M": "Marussia", "Z8N": "Nissan", "Z8T": "PCMA", "Z9M": "Mercedes-Benz", "Z94": "Hyundai", "1B3": "Dodge", "1B4": "Dodge", "1B7": "Dodge", "1BA": "Blue Bird", "1BB": "Blue Bird", "1BL": "Balko", "1C3": "Chrysler", "1C4": "Chrysler", "1C6": "Chrysler", "1C8": "Chrysler", "1CM": "Checker", "1CU": "Cushman Haulster", "1CY": "Cranerier", "1D3": "Dodge", "1D4": "Dodge", "1D7": "Dodge", "1D8": "Dodge", "1FA": "Ford", "1FB": "Ford", "1FC": "Ford", "1FM": "Ford", "1FT": "Ford", "1FU": "Freightliner", "1FV": "Freightliner", "1F1": "Ford", "1F6": "Ford", "1G": "GM", "1G0": "Opel", "1G1": "Chevrolet", "1G2": "Pontiac", "1G3": "Oldsmobile", "1G4": "Buick", "1G5": "GMC", "1G6": "Cadillac", "1G7": "Pontiac", "1G8": "Saturn", "1GA": "Chevrolet", "1GC": "Chevrolet", "1GF": "Flxible", "1GG": "Isuzu", "1GH": "Holden", "1GJ": "GMC", "1GK": "GMC", "1GM": "Pontiac", "1GN": "Chevrolet", "1GT": "GMC", "1GY": "Cadillac", "1HD": "Harley-Davidson", "1HG": "Honda", "1HS": "Caterpillar", "1JC": "Jeep", "1JT": "Jeep", "1JU": "Marmon", "1J4": "Jeep", "1J7": "Jeep", "1J8": "Jeep", "1LN": "Lincoln", "1L1": "Lincoln", "1MB": "Mercedes-Benz", "1ME": "Mercury", "1MR": "Continental", "1M0": "John Deere Gator", "1M1": "Mack USA", "1M2": "Mack USA", "1M3": "Mack USA", "1M4": "Mack USA", "1N4": "Nissan", "1N6": "Nissan", "1NX": "Toyota", "1P3": "Plymouth", "1P4": "Plymouth", "1PY": "John Deere", "1TC": "Coachmen", "1UJ": "Jayco", "1UT": "Jeep", "1VH": "Orion Bus", "1VW": "Volkswagen", "1V1": "Volkswagen", "1V2": "Volkswagen", "1WT": "Winnebago", "1WU": "White Motor", "1XA": "Excalibur", "1XK": "Kenworth", "1XM": "Renault", "1XP": "Peterbilt", "1Y1": "Chevrolet", "1YJ": "Rokon", "1YV": "Mazda", "1ZV": "Ford", "1ZW": "Mercury", "10T": "Oshkosh", "12A": "Avanti", "137": "Hummer", "16X": "Vixen", "19U": "Acura", "19V": "Acura", "19X": "Honda", "2A3": "Imperial", "2BC": "Jeep", "2BP": "Ski-Doo", "2B1": "Orion Bus", "2B3": "Dodge", "2B4": "Dodge", "2B5": "Dodge", "2B7": "Dodge", "2C1": "Chevrolet", "2C3": "Chrysler", "2C4": "Chrysler", "2C7": "Pontiac", "2C8": "Chrysler", "2CC": "American Corporation", "2CG": "Pontiac", "2CK": "Pontiac", "2CM": "American Corporation", "2CN": "Chevrolet", "2CT": "GMC", "2D4": "Dodge", "2D7": "Dodge", "2D8": "Dodge", "2EZ": "Electra Meccanica", "2FA": "Ford", "2FH": "Zenn", "2FM": "Ford", "2FT": "Ford", "2FU": "Freightliner", "2FV": "Freightliner", "2FW": "Sterling", "2FY": "New Flyer", "2Gx": "GM", "2G0": "GMC", "2G1": "Chevrolet", "2G2": "Pontiac", "2G3": "Oldsmobile", "2G4": "Buick", "2G5": "GMC", "2G6": "Cadillac", "2G7": "Pontiac", "2G8": "Chevrolet", "2GA": "Chevrolet", "2GC": "Chevrolet", "2GH": "GMC", "2GJ": "GMC", "2GK": "GMC", "2GN": "Chevrolet", "2GT": "GMC", "2HG": "Honda", "2HH": "Acura", "2HJ": "Honda", "2HK": "Honda", "2HM": "Hyundai", "2HN": "Acura", "2HS": "International Trucks", "2J4": "Jeep", "2LM": "Lincoln", "2LN": "Lincoln", "2M1": "Mack", "2M2": "Mack", "2ME": "Mercury", "2MG": "Motor Coach Industries", "2MR": "Mercury", "2NV": "Nova Bus", "2P3": "Plymouth", "2P4": "Plymouth", "2P5": "Plymouth", "2PC": "Prevost", "2S2": "Suzuki", "2S3": "Suzuki", "2T1": "Toyota", "2T2": "Lexus", "2T3": "Toyota", "2V4": "Volkswagen", "2V8": "Volkswagen", "2WK": "WWestern Star Truck", "2XK": "Kenworth", "2XM": "Eagle Premier", "2XP": "Peterbilt Truck", "3AK": "Freightliner", "3AL": "Freightliner", "3AX": "Scania", "3BE": "Scania", "3BJ": "Western Star", "3B3": "Dodge", "3B4": "Dodge", "3B7": "Dodge", "3C3": "Chrysler", "3C4": "Chrysler", "3C6": "Chrysler", "3C8": "Chrysler", "3CE": "Volvo", "3CZ": "Honda", "3D3": "Dodge", "3D4": "Dodge", "3D7": "Dodge", "3FA": "Ford", "3FC": "Ford", "3FE": "Ford", "3FM": "Ford", "3FN": "Ford", "3FT": "Ford", "3F6": "Sterling Bullet", "3G": "GM", "3G0": "Holden", "3G1": "Chevrolet", "3G2": "Pontiac", "3G4": "Buick", "3G5": "Buick", "3G7": "Pontiac", "3GC": "Chevrolet", "3GK": "GMC", "3GM": "Holden", "3GN": "Chevrolet", "3GP": "Honda", "3GS": "Saturn", "3GT": "GMC", "3GY": "Cadillac", "3H3": "Hyundai", "3HC": "International Trucks", "3HG": "Honda", "3HS": "International Trucks & Caterpillar", "3JB": "BRP", "3KP": "Kia Hyundai", "3LN": "Lincoln", "3MA": "Mercury", "3MD": "Mazda", "3ME": "Mercury", "3MF": "BMW", "3MV": "Mazda", "3MW": "BMW", "3MY": "Toyota", "3MZ": "Mazda", "3N1": "Nissan", "3N6": "Nissan Chevrolet", "3N8": "Nissan", "3NS": "Polaris", "3NE": "Polaris", "3P3": "Plymouth", "3PC": "Infiniti", "3TM": "Toyota", "3TY": "Toyota", "3VV": "Volkswagen", "3VW": "Volkswagen", "3WK": "Kenworth", "3WP": "Peterbilt Truck", "4A3": "Mitsubishi", "4A4": "Mitsubishi", "4B3": "Dodge", "4C3": "Chrysler", "4DR": "IC Bus", "4EN": "E-ONE", "4F2": "Mazda", "4F4": "Mazda", "4G1": "Chevrolet", "4G2": "Pontiac", "4G3": "Toyota", "4G5": "GM", "4GD": "Opel", "4JG": "Mercedes-Benz", "4KL": "Isuzu", "4M2": "Mercury", "4ML": "Oshkosh Trailer", "4N2": "Nissan", "4NU": "Isuzu", "4P1": "Pierce", "4P3": "Mitsubishi", "4RK": "Nova Bus", "4S1": "Isuzu", "4S2": "Isuzu", "4S3": "Subaru", "4S4": "Subaru", "4S6": "Honda", "4TA": "Toyota", "4T1": "Toyota", "4T3": "Toyota", "4T4": "Toyota", "4UF": "Arctic Cat", "4US": "BMW", "4UZ": "Freightliner", "4V1": "WhiteGMC Truck", "4V3": "Volvo", "4V4": "Volvo", "4V6": "Volvo", "4VA": "Volvo", "4VG": "Volvo", "4W5": "Acura", "4XA": "Polaris", "4X4": "Forest River", "4YM": "Carry-On Trailer, Inc.", "4Z3": "American LaFrance", "43C": "Consulier", "478": "Honda", "480": "Sterling", "5AS": "Global Electric Motorcars", "5BP": "Solectria", "5BZ": "Nissan", "5CX": "Shelby", "5DF": "Thomas Dennis", "5FC": "Columbia Vehicle", "5FN": "Honda", "5FP": "Honda", "5FR": "Acura", "5FY": "New Flyer", "5GA": "Buick", "5GD": "Daewoo", "5GN": "Hummer", "5GR": "Hummer", "5GT": "Hummer", "5GZ": "Saturn", "5G8": "Holden", "5HD": "Harley-Davidson", "5J6": "Honda", "5J8": "Acura", "5KB": "Honda", "5KJ": "Western Star", "5KK": "Western Star", "5L1": "Lincoln", "5LM": "Lincoln", "5LT": "Lincoln", "5N1": "Nissan Infiniti", "5N3": "Infiniti", "5NH": "Forest River", "5NM": "Hyundai", "5NP": "Hyundai", "5NT": "Hyundai", "5S3": "Saab", "5SA": "Suzuki", "5TB": "Toyota", "5TD": "Toyota", "5TE": "Toyota", "5TF": "Toyota", "5UM": "BMW", "5UX": "BMW", "5VF": "American Electric Vehicle Company", "5XX": "Kia", "5XY": "Kia Hyundai", "5YF": "Toyota", "5YJ": "Tesla", "5YM": "BMW ", "5YN": "Cruise", "5Y2": "Pontiac", "5ZT": "Forest River", "5Z6": "Suzuki", "50E": "Lucid", "50G": "Karma Automotive", "516": "Autocar", "523": "VPG", "52C": "GEM", "53G": "Coda Automotive", "53T": "Think North America in Elkhart, IN", "546": "EBR", "54C": "Winnebago", "54D": "Chevrolet", "55S": "Mercedes-Benz", "57W": "Mobility Ventures", "57X": "Polaris Slingshot", "58A": "Lexus", "6AB": "MAN", "6AM": "Jayco", "6F1": "Ford", "6F2": "Iveco", "6F4": "Nissan", "6F5": "Kenworth", "6FM": "Mack", "6FP": "Ford", "6G1": "GM", "6G2": "Pontiac", "6G3": "GM", "6H8": "GM", "6MM": "Mitsubishi", "6MP": "Mercury", "6T1": "Toyota", "6U9": "Privately", "7A1": "Mitsubishi", "7A3": "Honda", "7A4": "Toyota", "7A5": "Ford", "7A7": "Nissan", "7FA": "Honda", "7FC": "Rivian", "7F7": "Arcimoto", "7G2": "Tesla", "7H4": "Hino", "7H8": "Cenntro", "7JD": "Volvo", "7JR": "Volvo", "7JZ": "Proterra", "7KG": "Vanderhall", "7MM": "Mazda", "7MU": "Toyota", "7MW": "Cenntro", "7NA": "Navistar", "7NY": "Lordstown", "7PD": "Rivian", "7SA": "Tesla", "7SU": "Blue Arc", "7SV": "Toyota", "7SX": "Global Electric Motorcars", "7SY": "Polestar", "7TN": "Canoo", "7VV": "Ree", "7Z0": "Zoox", "8AB": "Mercedes-Benz", "8AC": "Mercedes-Benz", "8AD": "Peugeot", "8AE": "Peugeot", "8AF": "Ford", "8AG": "Chevrolet", "8AJ": "Toyota", "8AK": "Suzuki", "8AN": "Nissan", "8AP": "Fiat", "8AT": "Iveco", "8AW": "Volkswagen", "8A1": "Renault", "8A3": "Scania", "8BB": "Agrale", "8BC": "Citroën", "8BR": "Mercedes-Benz", "8BT": "Mercedes-Benz", "8BU": "Mercedes-Benz", "8C3": "Honda", "8G1": "Renault", "8GD": "Peugeot", "8GG": "Chevrolet", "8LD": "Chevrolet", "8LF": "Maresa", "8LG": "Aymesa", "8L4": "Great Wall", "8XD": "Ford", "9BD": "Fiat", "9BF": "Ford", "9BG": "Chevrolet", "9BH": "Hyundai", "9BM": "Mercedes-Benz", "9BN": "Mafersa", "9BR": "Toyota", "9BS": "Scania", "9BV": "Volvo", "9BW": "Volkswagen", "9DF": "Puma", "932": "Harley-Davidson", "935": "Citroën", "936": "Peugeot", "937": "Dodge", "93C": "Chevrolet", "93H": "Honda", "93K": "Volvo", "93P": "Volare", "93S": "Navistar", "93R": "Toyota", "93U": "Audi", "93W": "Fiat", "93V": "Navistar", "93X": "Mitsubishi", "93Y": "Renault", "93Z": "Iveco", "94D": "Nissan", "94N": "RWM", "95P": "CAOA", "988": "Jeep Fiat", "98M": "BMW", "98P": "DAF", "98R": "Chery", "99A": "Audi", "99H": "Shineray", "99J": "Jaguar Land Rover", "99K": "Haojue Kymco", "99L": "BYD", "9FB": "Renault", "9FC": "Compañía", "9GA": "Chevrolet", "9UJ": "Chery", "9UK": "Lifan", "9UT": "Dongfeng", "9UW": "Kia", "9VC": "Fiat", "9V7": "Citroën", "9V8": "Peugeot", "MM0": "Mazda", "MM6": "Mazda", "MM7": "Mazda", "MM8": "Mazda", } def decode_vds(manufacturer, vds): # Mapping of manufacturers to their VDS positions and corresponding models vds_model_mapping = { "Honda": { 1: { "F": "Agila", "G": "Insignia", "J": "Mokka", "L": "Antara", "M": "Movano", "P": ["Astra J", "Zafira C"], "R": "Astra GTC J", "S": "Meriva", "V": "Combo II", "W": "Cascada", } }, "Kia": { 1: { "A": ["Rio", "EV9"], "C": ["Niro", "EV6"], "D": "Rio", "E": ["Stinger", "Seltos"], "F": ["Forte", "K4"], "G": ["Optima", "Magentis", "K5"], "H": "Rondo", "J": "Soul", "K": ["Mohave", "Sorento", "Sportage"], "L": ["Cadenza", "K9"], "M": "Sedona", "N": "Carnival", "P": ["Sportage", "Sorento", "Telluride"], "R": "Sorento", "S": "K9", } }, "Peugeot": { 1: { "A": "604", "2": "206", "8": ["406", "508"], "6": "407", "9": "308", "4": "308", "B": "Expert", "C": ["208", "504"], "D": "301", "3": "307", "7": ["306", "Partner"], "U": "2008", "M": "3008", } }, "Toyota": { 1: { # 5th character in VDS "0": "MR2 Spyder", "1": "Tundra", "3": ["Echo", "Yaris"], "A": ["Highlander", "Sequoia", "Celica", "Supra"], "B": "Avalon", "C": ["Sienna", "Previa"], "D": "T100", "E": ["Corolla", "Matrix"], "F": "FJ Cruiser", "G": "Hilux", "H": "Highlander", "J": "Land Cruiser", "K": "Camry", "L": ["Tercel", "Paseo"], "M": "Previa", "N": "Tacoma", "P": "Camry", "R": ["4Runner", "Corolla"], "T": "Celica FWD", "U": "Prius", "V": "RAV4", "W": "MR2 non Spyder", "X": "Cressida", } }, "Nissan": { 2: { "A": ["Armada", "Titan", "Maxima"], "B": "Sentra", "C": "Versa (07-11)", "D": ["Truck", "Xterra (00-04)", "Frontier"], "J": "Maxima", "L": "Altima", "N": "Xterra (05-11)", "P": "Kicks", "R": "Pathfinder", "S": ["240SX", "Rogue (08-11)"], "T": "X Trail", "U": "Altima", "Y": "Patrol", "Z": ["300Z", "350Z", "Murano"], } }, "Renault": { 2: { # 5th character in VDS "0": "Twingo", "1": "R4", "2": "R25", "3": "R4", "4": ["R21", "Express"], "5": ["Clio I", "Laguna", "R19", "Safrane"], "A": ["Megane I", "Master"], "B": "Clio II", "C": "Kangoo", "D": "Master", "E": ["Espace III", "Avantime"], "G": "Laguna II", "H": "Master Propulsion", "J": ["Vel Satis", "New Trafic"], "K": "Espace IV", "L": "Trafic", "M": "Megan II", "P": "Modus", "S": ["Logan", "Sandero", "Duster", "Dokker", "Lodgy"], "Y": "Koleos", } }, # New Manufacturers Added Below "Ford": { 3: { "A": ["Fiesta", "Focus"], "B": ["Mustang", "Explorer"], "C": "Ranger", "D": ["Escape", "Edge"], "E": "F-150", "F": "Transit", "G": "Bronco", "H": "Expedition", } }, "BMW": { 4: { "1": "1 Series", "2": "2 Series", "3": "3 Series", "4": "4 Series", "5": "5 Series", "6": "6 Series", "7": "7 Series", "8": "8 Series", "X": "X Series (SUV)", "Z": "Z Series (Roadster)", } }, "Mercedes-Benz": { 3: { "A": "A-Class", "B": "B-Class", "C": "C-Class", "E": "E-Class", "G": "G-Class", "S": "S-Class", "V": "V-Class", "X": "GL-Class", } }, "Volkswagen": { 2: { "1": "Golf", "2": "Jetta", "3": "Passat", "4": "Tiguan", "5": "Polo", "6": "Arteon", "7": "Atlas", "8": "Touareg", "9": "Beetle", } }, "Hyundai": { 1: { "A": "Accent", "B": "Elantra", "C": "Sonata", "D": "Tucson", "E": "Santa Fe", "F": "Kona", "G": "Palisade", "H": "Veloster", "J": "Genesis", } }, "Chevrolet": { 2: { "A": "Camaro", "B": "Corvette", "C": "Cruze", "D": "Malibu", "E": "Equinox", "F": "Traverse", "G": "Silverado", "H": "Tahoe", "J": "Suburban", } }, "Audi": { 3: { "1": "A1", "2": "A2", "3": "A3", "4": "A4", "5": "A5", "6": "A6", "7": "A7", "8": "A8", "Q": "Q Series (SUV)", "T": "TT", } }, "Subaru": { 2: { "A": "Impreza", "B": "Legacy", "C": "Outback", "D": "Forester", "E": "Crosstrek", "F": "BRZ", "G": "Ascent", } }, "Mazda": { 1: { "A": "Mazda3", "B": "Mazda6", "C": "CX-5", "D": "CX-9", "E": "MX-5 Miata", "F": "CX-30", "G": "RX-8", } }, "Dongfeng": { 1: { "A": "A-Series", "B": "SHINE", "C": "C-Series", "D": "MAGE", "E": ["CAPTAIN E", "E32"], "F": "CAPTAIN C", "G": "S50", "H": "Dongfeng Fengshen AX3", "J": "Dongfeng Joyear SUV", "K": "Dongfeng Rich 6", "L": "Dongfeng Sokon", "M": "Dongfeng Glory 580", }, 2: { "3": "C35", # Specific models in C-Series "1": "C31", "2": "C32", "7": "C72", "6": "A60", # Specific models in A-Series "3": "A30", "X": ["AX7", "AX4"], }, 3: { # Third character (for AX models) "7": "AX7", # Resolves AX7 "4": "AX4", # Resolves AX4 }, }, "Changan": { 1: { "A": "Changan CS35", "B": "Changan CS55", "C": "Changan CS75", "D": "Changan CS85", "E": "Changan CS95", "F": "Changan Eado", "G": "Changan Raeton", "H": "Changan Alsvin", "J": "Changan UNI-T", "K": "Changan UNI-K", "L": "Changan Oushang", "M": "Changan Benni", } }, "Chery": { 1: { "A": "Chery Arrizo 5", "B": "Chery Arrizo 7", "C": "Chery Tiggo 3", "D": "Chery Tiggo 5", "E": "Chery Tiggo 7", "F": "Chery Tiggo 8", "G": "Chery QQ", "H": "Chery Fulwin", "J": "Chery Cowin", "K": "Chery eQ1", "L": "Chery Exeed TX", "M": "Chery Exeed LX", } }, "MG": { 1: { "A": "MG 3", "B": "MG 5", "C": "MG 6", "D": "MG ZS", "E": "MG HS", "F": "MG RX5", "G": "MG Marvel R", "H": "MG EZS", "J": "MG GT", "K": "MG TF", "L": "MG Cyberster", } }, "JMC": { 1: { "A": "JMC Yusheng", "B": "JMC Vigus", "C": "JMC Baodian", "D": "JMC Ford Transit", "E": "JMC S350", "F": "JMC Teshun", "G": "JMC Realm", "H": "JMC Yuhu", "J": "JMC E200", "K": "JMC E400", } }, "JAC": { 1: { "A": "JAC J3", "B": "JAC J4", "C": "JAC J5", "D": "JAC J6", "E": "JAC J7", "F": "JAC S2", "G": "JAC S3", "H": "JAC S4", "J": "JAC S5", "K": "JAC S7", "L": "JAC iEV7S", "M": "JAC iEVS4", } }, "BYD": { 1: { "A": "BYD F3", "B": "BYD F6", "C": "BYD S6", "D": "BYD Tang", "E": "BYD Song", "F": "BYD Yuan", "G": "BYD Qin", "H": "BYD Han", "J": "BYD e5", "K": "BYD e6", "L": "BYD Dolphin", "M": "BYD Seal", } }, "Geely": { 1: { "A": "Geely Emgrand EC7", "B": "Geely Emgrand GS", "C": "Geely Emgrand GL", "D": "Geely Boyue", "E": "Geely Xingyue", "F": "Geely Binrui", "G": "Geely Borui", "H": "Geely Vision", "J": "Geely Coolray", "K": "Geely Monjaro", "L": "Geely Geometry A", "M": "Geely Geometry C", } }, "Great Wall Motors (GWM)": { 1: { "A": "GWM Haval H6", "B": "GWM Haval H9", "C": "GWM Haval Jolion", "D": "GWM WEY VV5", "E": "GWM WEY VV6", "F": "GWM WEY VV7", "G": "GWM Ora R1", "H": "GWM Ora Good Cat", "J": "GWM Poer", "K": "GWM Tank 300", "L": "GWM Tank 500", } }, "FAW": { 1: { "A": "FAW Besturn B50", "B": "FAW Besturn X40", "C": "FAW Besturn X80", "D": "FAW Hongqi H5", "E": "FAW Hongqi H7", "F": "FAW Hongqi HS5", "G": "FAW Hongqi HS7", "H": "FAW Jiefang Truck", "J": "FAW Oley", "K": "FAW Vita", } }, "SAIC Motor": { 1: { "A": "SAIC Maxus G10", "B": "SAIC Maxus G50", "C": "SAIC Maxus T60", "D": "SAIC Roewe RX5", "E": "SAIC Roewe i5", "F": "SAIC Roewe i6", "G": "SAIC MG ZS", "H": "SAIC MG HS", "J": "SAIC IM LS7", "K": "SAIC IM Marvel R", } }, } # Get the mapping for the specified manufacturer manufacturer_mapping = vds_model_mapping.get(manufacturer, {}) # Iterate through the positions and models in the manufacturer's mapping for position, models in manufacturer_mapping.items(): # Check if the VDS has enough characters for the specified position if position - 1 < len(vds): key = vds[position - 1] # Get the character at the specified position model = models.get(key, None) # Get the model(s) for the key if model: return model # Return the model if found # Return "Unknown Model" if no match is found return "Unknown Model" def decode_vin_haikalna(vin): if len(vin) != 17: raise ValueError("Invalid VIN length. VIN must be 17 characters.") pattern = r"^[A-HJ-NPR-Z0-9]{17}$" if not re.match(pattern, vin): raise Exception( "VIN number must only contain alphanumeric symbols except 'I', 'O', and 'Q' " ) vin = vin.upper() wmi = vin[:3] vds = vin[3:9] vis = vin[9:17] manufacturer = wmi_manufacturer_mapping.get(wmi, vds) year_code = vis[0] year = vin_year(year_code) model = decode_vds(manufacturer, vds) data = { "maker": manufacturer, "model": model, "modelYear": year, } print(data) return data