Test Failed
Push — master ( 31f401...61e299 )
by Anatoly
03:02 queued 13s
created
data/years.php 1 patch
Indentation   +51 added lines, -51 removed lines patch added patch discarded remove patch
@@ -21,55 +21,55 @@
 block discarded – undo
21 21
  * @link https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/Model_year
22 22
  */
23 23
 const YEARS = [
24
-    1980 => 'A',
25
-    1981 => 'B',
26
-    1982 => 'C',
27
-    1983 => 'D',
28
-    1984 => 'E',
29
-    1985 => 'F',
30
-    1986 => 'G',
31
-    1987 => 'H',
32
-    1988 => 'J',
33
-    1989 => 'K',
34
-    1990 => 'L',
35
-    1991 => 'M',
36
-    1992 => 'N',
37
-    1993 => 'P',
38
-    1994 => 'R',
39
-    1995 => 'S',
40
-    1996 => 'T',
41
-    1997 => 'V',
42
-    1998 => 'W',
43
-    1999 => 'X',
44
-    2000 => 'Y',
45
-    2001 => '1',
46
-    2002 => '2',
47
-    2003 => '3',
48
-    2004 => '4',
49
-    2005 => '5',
50
-    2006 => '6',
51
-    2007 => '7',
52
-    2008 => '8',
53
-    2009 => '9',
54
-    2010 => 'A',
55
-    2011 => 'B',
56
-    2012 => 'C',
57
-    2013 => 'D',
58
-    2014 => 'E',
59
-    2015 => 'F',
60
-    2016 => 'G',
61
-    2017 => 'H',
62
-    2018 => 'J',
63
-    2019 => 'K',
64
-    2020 => 'L',
65
-    2021 => 'M',
66
-    2022 => 'N',
67
-    2023 => 'P',
68
-    2024 => 'R',
69
-    2025 => 'S',
70
-    2026 => 'T',
71
-    2027 => 'V',
72
-    2028 => 'W',
73
-    2029 => 'X',
74
-    2030 => 'Y',
24
+	1980 => 'A',
25
+	1981 => 'B',
26
+	1982 => 'C',
27
+	1983 => 'D',
28
+	1984 => 'E',
29
+	1985 => 'F',
30
+	1986 => 'G',
31
+	1987 => 'H',
32
+	1988 => 'J',
33
+	1989 => 'K',
34
+	1990 => 'L',
35
+	1991 => 'M',
36
+	1992 => 'N',
37
+	1993 => 'P',
38
+	1994 => 'R',
39
+	1995 => 'S',
40
+	1996 => 'T',
41
+	1997 => 'V',
42
+	1998 => 'W',
43
+	1999 => 'X',
44
+	2000 => 'Y',
45
+	2001 => '1',
46
+	2002 => '2',
47
+	2003 => '3',
48
+	2004 => '4',
49
+	2005 => '5',
50
+	2006 => '6',
51
+	2007 => '7',
52
+	2008 => '8',
53
+	2009 => '9',
54
+	2010 => 'A',
55
+	2011 => 'B',
56
+	2012 => 'C',
57
+	2013 => 'D',
58
+	2014 => 'E',
59
+	2015 => 'F',
60
+	2016 => 'G',
61
+	2017 => 'H',
62
+	2018 => 'J',
63
+	2019 => 'K',
64
+	2020 => 'L',
65
+	2021 => 'M',
66
+	2022 => 'N',
67
+	2023 => 'P',
68
+	2024 => 'R',
69
+	2025 => 'S',
70
+	2026 => 'T',
71
+	2027 => 'V',
72
+	2028 => 'W',
73
+	2029 => 'X',
74
+	2030 => 'Y',
75 75
 ];
Please login to merge, or discard this patch.
data/regions.php 1 patch
Indentation   +240 added lines, -240 removed lines patch added patch discarded remove patch
@@ -20,244 +20,244 @@
 block discarded – undo
20 20
  * @link https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/World_Manufacturer_Identifier_(WMI)#WMI_Regions
21 21
  */
22 22
 const REGIONS = [
23
-    'A' => [
24
-        'region' => 'Africa',
25
-        'countries' => [
26
-            'ABCDEFGH' => 'South Africa',
27
-            'JKLMN' => 'Ivory Coast',
28
-        ],
29
-    ],
30
-    'B' => [
31
-        'region' => 'Africa',
32
-        'countries' => [
33
-            'ABCDE' => 'Angola',
34
-            'FGHJK' => 'Kenya',
35
-            'LMNPR' => 'Tanzania',
36
-        ],
37
-    ],
38
-    'C' => [
39
-        'region' => 'Africa',
40
-        'countries' => [
41
-            'ABCDE' => 'Benin',
42
-            'FGHJK' => 'Madagascar',
43
-            'LMNPR' => 'Tunisia',
44
-        ],
45
-    ],
46
-    'D' => [
47
-        'region' => 'Africa',
48
-        'countries' => [
49
-            'ABCDE' => 'Egypt',
50
-            'FGHJK' => 'Morocco',
51
-            'LMNPR' => 'Zambia',
52
-        ],
53
-    ],
54
-    'E' => [
55
-        'region' => 'Africa',
56
-        'countries' => [
57
-            'ABCDE' => 'Ethiopia',
58
-            'FGHJK' => 'Mozambique',
59
-        ],
60
-    ],
61
-    'F' => [
62
-        'region' => 'Africa',
63
-        'countries' => [
64
-            'ABCDE' => 'Ghana',
65
-            'FGHJK' => 'Nigeria',
66
-        ],
67
-    ],
68
-    'J' => [
69
-        'region' => 'Asia',
70
-        'countries' => [
71
-            'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'Japan',
72
-        ],
73
-    ],
74
-    'K' => [
75
-        'region' => 'Asia',
76
-        'countries' => [
77
-            'ABCDE' => 'Sri Lanka',
78
-            'FGHJK' => 'Israel',
79
-            'LMNPR' => 'South Korea',
80
-            'STUVWXYZ1234567890' => 'Kazakhstan',
81
-        ],
82
-    ],
83
-    'L' => [
84
-        'region' => 'Asia',
85
-        'countries' => [
86
-            'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'China',
87
-        ],
88
-    ],
89
-    'M' => [
90
-        'region' => 'Asia',
91
-        'countries' => [
92
-            'ABCDE' => 'India',
93
-            'FGHJK' => 'Indonesia',
94
-            'LMNPR' => 'Thailand',
95
-            'STUVWXYZ1234567890' => 'Myanmar',
96
-        ],
97
-    ],
98
-    'N' => [
99
-        'region' => 'Asia',
100
-        'countries' => [
101
-            'ABCDE' => 'Iran',
102
-            'FGHJK' => 'Pakistan',
103
-            'LMNPR' => 'Turkey',
104
-        ],
105
-    ],
106
-    'P' => [
107
-        'region' => 'Asia',
108
-        'countries' => [
109
-            'ABCDE' => 'Philippines',
110
-            'FGHJK' => 'Singapore',
111
-            'LMNPR' => 'Malaysia',
112
-        ],
113
-    ],
114
-    'R' => [
115
-        'region' => 'Asia',
116
-        'countries' => [
117
-            'ABCDE' => 'United Arab Emirates',
118
-            'FGHJK' => 'Taiwan',
119
-            'LMNPR' => 'Vietnam',
120
-            'STUVWXYZ1234567890' => 'Saudi Arabia',
121
-        ],
122
-    ],
123
-    'S' => [
124
-        'region' => 'Europe',
125
-        'countries' => [
126
-            'ABCDEFGHJKLM' => 'United Kingdom',
127
-            'NPRST' => 'East Germany',
128
-            'UVWXYZ' => 'Poland',
129
-            '1234' => 'Latvia',
130
-        ],
131
-    ],
132
-    'T' => [
133
-        'region' => 'Europe',
134
-        'countries' => [
135
-            'ABCDEFGH' => 'Switzerland',
136
-            'JKLMNP' => 'Czech Republic',
137
-            'RSTUV' => 'Hungary',
138
-            'WXYZ1' => 'Portugal',
139
-        ],
140
-    ],
141
-    'U' => [
142
-        'region' => 'Europe',
143
-        'countries' => [
144
-            'HJKLM' => 'Denmark',
145
-            'NPRST' => 'Ireland',
146
-            'UVWXYZ' => 'Romania',
147
-            '567' => 'Slovakia',
148
-        ],
149
-    ],
150
-    'V' => [
151
-        'region' => 'Europe',
152
-        'countries' => [
153
-            'ABCDE' => 'Austria',
154
-            'FGHJKLMNPR' => 'France',
155
-            'STUVW' => 'Spain',
156
-            'XYZ12' => 'Serbia',
157
-            '345' => 'Croatia',
158
-            '67890' => 'Estonia',
159
-        ],
160
-    ],
161
-    'W' => [
162
-        'region' => 'Europe',
163
-        'countries' => [
164
-            'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'Germany',
165
-        ],
166
-    ],
167
-    'X' => [
168
-        'region' => 'Europe',
169
-        'countries' => [
170
-            'ABCDE' => 'Bulgaria',
171
-            'FGHJK' => 'Greece',
172
-            'LMNPR' => 'Netherlands',
173
-            'STUVW' => 'Russia (USSR)',
174
-            'XYZ12' => 'Luxembourg',
175
-            '34567890' => 'Russia',
176
-        ],
177
-    ],
178
-    'Y' => [
179
-        'region' => 'Europe',
180
-        'countries' => [
181
-            'ABCDE' => 'Belgium',
182
-            'FGHJK' => 'Finland',
183
-            'LMNPR' => 'Malta',
184
-            'STUVW' => 'Sweden',
185
-            'XYZ12' => 'Norway',
186
-            '345' => 'Belarus',
187
-            '67890' => 'Ukraine',
188
-        ],
189
-    ],
190
-    'Z' => [
191
-        'region' => 'Europe',
192
-        'countries' => [
193
-            'ABCDEFGHJKLMNPR' => 'Italy',
194
-            'XYZ12' => 'Slovenia',
195
-            '345' => 'Lithuania',
196
-        ],
197
-    ],
198
-    '1' => [
199
-        'region' => 'North America',
200
-        'countries' => [
201
-            'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'USA',
202
-        ],
203
-    ],
204
-    '2' => [
205
-        'region' => 'North America',
206
-        'countries' => [
207
-            'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'Canada',
208
-        ],
209
-    ],
210
-    '3' => [
211
-        'region' => 'North America',
212
-        'countries' => [
213
-            'ABCDEFGHJKLMNPRSTUVW' => 'Mexico',
214
-            'XYZ1234567' => 'Costa Rica',
215
-            '890' => 'Cayman Islands',
216
-        ],
217
-    ],
218
-    '4' => [
219
-        'region' => 'North America',
220
-        'countries' => [
221
-            'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'USA',
222
-        ],
223
-    ],
224
-    '5' => [
225
-        'region' => 'North America',
226
-        'countries' => [
227
-            'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'USA',
228
-        ],
229
-    ],
230
-    '6' => [
231
-        'region' => 'Oceania',
232
-        'countries' => [
233
-            'ABCDEFGHJKLMNPRSTUVW' => 'Australia',
234
-        ],
235
-    ],
236
-    '7' => [
237
-        'region' => 'Oceania',
238
-        'countries' => [
239
-            'ABCDE' => 'New Zealand',
240
-        ],
241
-    ],
242
-    '8' => [
243
-        'region' => 'South America',
244
-        'countries' => [
245
-            'ABCDE' => 'Argentina',
246
-            'FGHJK' => 'Chile',
247
-            'LMNPR' => 'Ecuador',
248
-            'STUVW' => 'Peru',
249
-            'XYZ12' => 'Venezuela',
250
-        ],
251
-    ],
252
-    '9' => [
253
-        'region' => 'South America',
254
-        'countries' => [
255
-            'ABCDE' => 'Brazil',
256
-            'FGHJK' => 'Colombia',
257
-            'LMNPR' => 'Paraguay',
258
-            'STUVW' => 'Uruguay',
259
-            'XYZ12' => 'Trinidad & Tobago',
260
-            '3456789' => 'Brazil',
261
-        ],
262
-    ],
23
+	'A' => [
24
+		'region' => 'Africa',
25
+		'countries' => [
26
+			'ABCDEFGH' => 'South Africa',
27
+			'JKLMN' => 'Ivory Coast',
28
+		],
29
+	],
30
+	'B' => [
31
+		'region' => 'Africa',
32
+		'countries' => [
33
+			'ABCDE' => 'Angola',
34
+			'FGHJK' => 'Kenya',
35
+			'LMNPR' => 'Tanzania',
36
+		],
37
+	],
38
+	'C' => [
39
+		'region' => 'Africa',
40
+		'countries' => [
41
+			'ABCDE' => 'Benin',
42
+			'FGHJK' => 'Madagascar',
43
+			'LMNPR' => 'Tunisia',
44
+		],
45
+	],
46
+	'D' => [
47
+		'region' => 'Africa',
48
+		'countries' => [
49
+			'ABCDE' => 'Egypt',
50
+			'FGHJK' => 'Morocco',
51
+			'LMNPR' => 'Zambia',
52
+		],
53
+	],
54
+	'E' => [
55
+		'region' => 'Africa',
56
+		'countries' => [
57
+			'ABCDE' => 'Ethiopia',
58
+			'FGHJK' => 'Mozambique',
59
+		],
60
+	],
61
+	'F' => [
62
+		'region' => 'Africa',
63
+		'countries' => [
64
+			'ABCDE' => 'Ghana',
65
+			'FGHJK' => 'Nigeria',
66
+		],
67
+	],
68
+	'J' => [
69
+		'region' => 'Asia',
70
+		'countries' => [
71
+			'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'Japan',
72
+		],
73
+	],
74
+	'K' => [
75
+		'region' => 'Asia',
76
+		'countries' => [
77
+			'ABCDE' => 'Sri Lanka',
78
+			'FGHJK' => 'Israel',
79
+			'LMNPR' => 'South Korea',
80
+			'STUVWXYZ1234567890' => 'Kazakhstan',
81
+		],
82
+	],
83
+	'L' => [
84
+		'region' => 'Asia',
85
+		'countries' => [
86
+			'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'China',
87
+		],
88
+	],
89
+	'M' => [
90
+		'region' => 'Asia',
91
+		'countries' => [
92
+			'ABCDE' => 'India',
93
+			'FGHJK' => 'Indonesia',
94
+			'LMNPR' => 'Thailand',
95
+			'STUVWXYZ1234567890' => 'Myanmar',
96
+		],
97
+	],
98
+	'N' => [
99
+		'region' => 'Asia',
100
+		'countries' => [
101
+			'ABCDE' => 'Iran',
102
+			'FGHJK' => 'Pakistan',
103
+			'LMNPR' => 'Turkey',
104
+		],
105
+	],
106
+	'P' => [
107
+		'region' => 'Asia',
108
+		'countries' => [
109
+			'ABCDE' => 'Philippines',
110
+			'FGHJK' => 'Singapore',
111
+			'LMNPR' => 'Malaysia',
112
+		],
113
+	],
114
+	'R' => [
115
+		'region' => 'Asia',
116
+		'countries' => [
117
+			'ABCDE' => 'United Arab Emirates',
118
+			'FGHJK' => 'Taiwan',
119
+			'LMNPR' => 'Vietnam',
120
+			'STUVWXYZ1234567890' => 'Saudi Arabia',
121
+		],
122
+	],
123
+	'S' => [
124
+		'region' => 'Europe',
125
+		'countries' => [
126
+			'ABCDEFGHJKLM' => 'United Kingdom',
127
+			'NPRST' => 'East Germany',
128
+			'UVWXYZ' => 'Poland',
129
+			'1234' => 'Latvia',
130
+		],
131
+	],
132
+	'T' => [
133
+		'region' => 'Europe',
134
+		'countries' => [
135
+			'ABCDEFGH' => 'Switzerland',
136
+			'JKLMNP' => 'Czech Republic',
137
+			'RSTUV' => 'Hungary',
138
+			'WXYZ1' => 'Portugal',
139
+		],
140
+	],
141
+	'U' => [
142
+		'region' => 'Europe',
143
+		'countries' => [
144
+			'HJKLM' => 'Denmark',
145
+			'NPRST' => 'Ireland',
146
+			'UVWXYZ' => 'Romania',
147
+			'567' => 'Slovakia',
148
+		],
149
+	],
150
+	'V' => [
151
+		'region' => 'Europe',
152
+		'countries' => [
153
+			'ABCDE' => 'Austria',
154
+			'FGHJKLMNPR' => 'France',
155
+			'STUVW' => 'Spain',
156
+			'XYZ12' => 'Serbia',
157
+			'345' => 'Croatia',
158
+			'67890' => 'Estonia',
159
+		],
160
+	],
161
+	'W' => [
162
+		'region' => 'Europe',
163
+		'countries' => [
164
+			'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'Germany',
165
+		],
166
+	],
167
+	'X' => [
168
+		'region' => 'Europe',
169
+		'countries' => [
170
+			'ABCDE' => 'Bulgaria',
171
+			'FGHJK' => 'Greece',
172
+			'LMNPR' => 'Netherlands',
173
+			'STUVW' => 'Russia (USSR)',
174
+			'XYZ12' => 'Luxembourg',
175
+			'34567890' => 'Russia',
176
+		],
177
+	],
178
+	'Y' => [
179
+		'region' => 'Europe',
180
+		'countries' => [
181
+			'ABCDE' => 'Belgium',
182
+			'FGHJK' => 'Finland',
183
+			'LMNPR' => 'Malta',
184
+			'STUVW' => 'Sweden',
185
+			'XYZ12' => 'Norway',
186
+			'345' => 'Belarus',
187
+			'67890' => 'Ukraine',
188
+		],
189
+	],
190
+	'Z' => [
191
+		'region' => 'Europe',
192
+		'countries' => [
193
+			'ABCDEFGHJKLMNPR' => 'Italy',
194
+			'XYZ12' => 'Slovenia',
195
+			'345' => 'Lithuania',
196
+		],
197
+	],
198
+	'1' => [
199
+		'region' => 'North America',
200
+		'countries' => [
201
+			'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'USA',
202
+		],
203
+	],
204
+	'2' => [
205
+		'region' => 'North America',
206
+		'countries' => [
207
+			'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'Canada',
208
+		],
209
+	],
210
+	'3' => [
211
+		'region' => 'North America',
212
+		'countries' => [
213
+			'ABCDEFGHJKLMNPRSTUVW' => 'Mexico',
214
+			'XYZ1234567' => 'Costa Rica',
215
+			'890' => 'Cayman Islands',
216
+		],
217
+	],
218
+	'4' => [
219
+		'region' => 'North America',
220
+		'countries' => [
221
+			'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'USA',
222
+		],
223
+	],
224
+	'5' => [
225
+		'region' => 'North America',
226
+		'countries' => [
227
+			'ABCDEFGHJKLMNPRSTUVWXYZ1234567890' => 'USA',
228
+		],
229
+	],
230
+	'6' => [
231
+		'region' => 'Oceania',
232
+		'countries' => [
233
+			'ABCDEFGHJKLMNPRSTUVW' => 'Australia',
234
+		],
235
+	],
236
+	'7' => [
237
+		'region' => 'Oceania',
238
+		'countries' => [
239
+			'ABCDE' => 'New Zealand',
240
+		],
241
+	],
242
+	'8' => [
243
+		'region' => 'South America',
244
+		'countries' => [
245
+			'ABCDE' => 'Argentina',
246
+			'FGHJK' => 'Chile',
247
+			'LMNPR' => 'Ecuador',
248
+			'STUVW' => 'Peru',
249
+			'XYZ12' => 'Venezuela',
250
+		],
251
+	],
252
+	'9' => [
253
+		'region' => 'South America',
254
+		'countries' => [
255
+			'ABCDE' => 'Brazil',
256
+			'FGHJK' => 'Colombia',
257
+			'LMNPR' => 'Paraguay',
258
+			'STUVW' => 'Uruguay',
259
+			'XYZ12' => 'Trinidad & Tobago',
260
+			'3456789' => 'Brazil',
261
+		],
262
+	],
263 263
 ];
Please login to merge, or discard this patch.
src/Vin.php 2 patches
Indentation   +240 added lines, -240 removed lines patch added patch discarded remove patch
@@ -32,244 +32,244 @@
 block discarded – undo
32 32
 class Vin implements VinInterface
33 33
 {
34 34
 
35
-    /**
36
-     * Regular expression for a VIN parsing/validation (ISO 3779)
37
-     *
38
-     * @var string
39
-     */
40
-    public const REGEX = '/^(?<wmi>[0-9A-HJ-NPR-Z]{3})(?<vds>[0-9A-HJ-NPR-Z]{6})(?<vis>[0-9A-HJ-NPR-Z]{8})$/';
41
-
42
-    /**
43
-     * The VIN code
44
-     *
45
-     * @var string
46
-     */
47
-    private $vin;
48
-
49
-    /**
50
-     * World manufacturer identifier
51
-     *
52
-     * @var string
53
-     */
54
-    private $wmi;
55
-
56
-    /**
57
-     * Vehicle descriptor section
58
-     *
59
-     * @var string
60
-     */
61
-    private $vds;
62
-
63
-    /**
64
-     * Vehicle identifier section
65
-     *
66
-     * @var string
67
-     */
68
-    private $vis;
69
-
70
-    /**
71
-     * Vehicle region
72
-     *
73
-     * @var null|string
74
-     */
75
-    private $region;
76
-
77
-    /**
78
-     * Vehicle country
79
-     *
80
-     * @var null|string
81
-     */
82
-    private $country;
83
-
84
-    /**
85
-     * Vehicle manufacturer
86
-     *
87
-     * @var null|string
88
-     */
89
-    private $manufacturer;
90
-
91
-    /**
92
-     * Vehicle model year
93
-     *
94
-     * @var int[]
95
-     */
96
-    private $modelYear;
97
-
98
-    /**
99
-     * Constructor of the class
100
-     *
101
-     * @param string $value
102
-     *
103
-     * @throws InvalidArgumentException If the given string is not a valid VIN.
104
-     */
105
-    public function __construct(string $value)
106
-    {
107
-        // The given VIN must be in upper case...
108
-        $value = strtoupper($value);
109
-
110
-        if (!preg_match(self::REGEX, $value, $match)) {
111
-            throw new InvalidArgumentException(
112
-                sprintf('The value "%s" is not a valid VIN', $value)
113
-            );
114
-        }
115
-
116
-        // Base values
117
-        $this->vin = $value;
118
-        $this->wmi = $match['wmi'];
119
-        $this->vds = $match['vds'];
120
-        $this->vis = $match['vis'];
121
-
122
-        // Parsed values
123
-        $this->region = $this->determineRegion();
124
-        $this->country = $this->determineCountry();
125
-        $this->manufacturer = $this->determineManufacturer();
126
-        $this->modelYear = $this->determineModelYear();
127
-    }
128
-
129
-    /**
130
-     * {@inheritDoc}
131
-     */
132
-    public function getVin() : string
133
-    {
134
-        return $this->vin;
135
-    }
136
-
137
-    /**
138
-     * {@inheritDoc}
139
-     */
140
-    public function getWmi() : string
141
-    {
142
-        return $this->wmi;
143
-    }
144
-
145
-    /**
146
-     * {@inheritDoc}
147
-     */
148
-    public function getVds() : string
149
-    {
150
-        return $this->vds;
151
-    }
152
-
153
-    /**
154
-     * {@inheritDoc}
155
-     */
156
-    public function getVis() : string
157
-    {
158
-        return $this->vis;
159
-    }
160
-
161
-    /**
162
-     * {@inheritDoc}
163
-     */
164
-    public function getRegion() : ?string
165
-    {
166
-        return $this->region;
167
-    }
168
-
169
-    /**
170
-     * {@inheritDoc}
171
-     */
172
-    public function getCountry() : ?string
173
-    {
174
-        return $this->country;
175
-    }
176
-
177
-    /**
178
-     * {@inheritDoc}
179
-     */
180
-    public function getManufacturer() : ?string
181
-    {
182
-        return $this->manufacturer;
183
-    }
184
-
185
-    /**
186
-     * {@inheritDoc}
187
-     */
188
-    public function getModelYear() : array
189
-    {
190
-        return $this->modelYear;
191
-    }
192
-
193
-    /**
194
-     * Converts the object to array
195
-     *
196
-     * @return array
197
-     */
198
-    public function toArray() : array
199
-    {
200
-        return [
201
-            'vin' => $this->vin,
202
-            'wmi' => $this->wmi,
203
-            'vds' => $this->vds,
204
-            'vis' => $this->vis,
205
-            'region' => $this->region,
206
-            'country' => $this->country,
207
-            'manufacturer' => $this->manufacturer,
208
-            'modelYear' => $this->modelYear,
209
-        ];
210
-    }
211
-
212
-    /**
213
-     * Tries to determine vehicle region
214
-     *
215
-     * @return null|string
216
-     */
217
-    private function determineRegion() : ?string
218
-    {
219
-        return REGIONS[$this->wmi[0]]['region'] ?? null;
220
-    }
221
-
222
-    /**
223
-     * Tries to determine vehicle country
224
-     *
225
-     * @return null|string
226
-     */
227
-    private function determineCountry() : ?string
228
-    {
229
-        $countries = REGIONS[$this->wmi[0]]['countries'] ?? null;
230
-        if (null === $countries) {
231
-            return null;
232
-        }
233
-
234
-        foreach ($countries as $chars => $name) {
235
-            if (!(false === strpbrk($this->wmi[1], (string) $chars))) {
236
-                return $name;
237
-            }
238
-        }
239
-
240
-        return null;
241
-    }
242
-
243
-    /**
244
-     * Tries to determine vehicle manufacturer
245
-     *
246
-     * @return null|string
247
-     */
248
-    private function determineManufacturer() : ?string
249
-    {
250
-        return MANUFACTURERS[$this->wmi] ?? MANUFACTURERS[$this->wmi[0] . $this->wmi[1]] ?? null;
251
-    }
252
-
253
-    /**
254
-     * Tries to determine vehicle model year(s)
255
-     *
256
-     * @return int[]
257
-     */
258
-    private function determineModelYear() : array
259
-    {
260
-        $comingYear = (int) date('Y') + 1;
261
-        $estimatedYears = [];
262
-
263
-        foreach (YEARS as $year => $char) {
264
-            if ($this->vis[0] === $char) {
265
-                $estimatedYears[] = $year;
266
-            }
267
-
268
-            if ($comingYear === $year) {
269
-                break;
270
-            }
271
-        }
272
-
273
-        return $estimatedYears;
274
-    }
35
+	/**
36
+	 * Regular expression for a VIN parsing/validation (ISO 3779)
37
+	 *
38
+	 * @var string
39
+	 */
40
+	public const REGEX = '/^(?<wmi>[0-9A-HJ-NPR-Z]{3})(?<vds>[0-9A-HJ-NPR-Z]{6})(?<vis>[0-9A-HJ-NPR-Z]{8})$/';
41
+
42
+	/**
43
+	 * The VIN code
44
+	 *
45
+	 * @var string
46
+	 */
47
+	private $vin;
48
+
49
+	/**
50
+	 * World manufacturer identifier
51
+	 *
52
+	 * @var string
53
+	 */
54
+	private $wmi;
55
+
56
+	/**
57
+	 * Vehicle descriptor section
58
+	 *
59
+	 * @var string
60
+	 */
61
+	private $vds;
62
+
63
+	/**
64
+	 * Vehicle identifier section
65
+	 *
66
+	 * @var string
67
+	 */
68
+	private $vis;
69
+
70
+	/**
71
+	 * Vehicle region
72
+	 *
73
+	 * @var null|string
74
+	 */
75
+	private $region;
76
+
77
+	/**
78
+	 * Vehicle country
79
+	 *
80
+	 * @var null|string
81
+	 */
82
+	private $country;
83
+
84
+	/**
85
+	 * Vehicle manufacturer
86
+	 *
87
+	 * @var null|string
88
+	 */
89
+	private $manufacturer;
90
+
91
+	/**
92
+	 * Vehicle model year
93
+	 *
94
+	 * @var int[]
95
+	 */
96
+	private $modelYear;
97
+
98
+	/**
99
+	 * Constructor of the class
100
+	 *
101
+	 * @param string $value
102
+	 *
103
+	 * @throws InvalidArgumentException If the given string is not a valid VIN.
104
+	 */
105
+	public function __construct(string $value)
106
+	{
107
+		// The given VIN must be in upper case...
108
+		$value = strtoupper($value);
109
+
110
+		if (!preg_match(self::REGEX, $value, $match)) {
111
+			throw new InvalidArgumentException(
112
+				sprintf('The value "%s" is not a valid VIN', $value)
113
+			);
114
+		}
115
+
116
+		// Base values
117
+		$this->vin = $value;
118
+		$this->wmi = $match['wmi'];
119
+		$this->vds = $match['vds'];
120
+		$this->vis = $match['vis'];
121
+
122
+		// Parsed values
123
+		$this->region = $this->determineRegion();
124
+		$this->country = $this->determineCountry();
125
+		$this->manufacturer = $this->determineManufacturer();
126
+		$this->modelYear = $this->determineModelYear();
127
+	}
128
+
129
+	/**
130
+	 * {@inheritDoc}
131
+	 */
132
+	public function getVin() : string
133
+	{
134
+		return $this->vin;
135
+	}
136
+
137
+	/**
138
+	 * {@inheritDoc}
139
+	 */
140
+	public function getWmi() : string
141
+	{
142
+		return $this->wmi;
143
+	}
144
+
145
+	/**
146
+	 * {@inheritDoc}
147
+	 */
148
+	public function getVds() : string
149
+	{
150
+		return $this->vds;
151
+	}
152
+
153
+	/**
154
+	 * {@inheritDoc}
155
+	 */
156
+	public function getVis() : string
157
+	{
158
+		return $this->vis;
159
+	}
160
+
161
+	/**
162
+	 * {@inheritDoc}
163
+	 */
164
+	public function getRegion() : ?string
165
+	{
166
+		return $this->region;
167
+	}
168
+
169
+	/**
170
+	 * {@inheritDoc}
171
+	 */
172
+	public function getCountry() : ?string
173
+	{
174
+		return $this->country;
175
+	}
176
+
177
+	/**
178
+	 * {@inheritDoc}
179
+	 */
180
+	public function getManufacturer() : ?string
181
+	{
182
+		return $this->manufacturer;
183
+	}
184
+
185
+	/**
186
+	 * {@inheritDoc}
187
+	 */
188
+	public function getModelYear() : array
189
+	{
190
+		return $this->modelYear;
191
+	}
192
+
193
+	/**
194
+	 * Converts the object to array
195
+	 *
196
+	 * @return array
197
+	 */
198
+	public function toArray() : array
199
+	{
200
+		return [
201
+			'vin' => $this->vin,
202
+			'wmi' => $this->wmi,
203
+			'vds' => $this->vds,
204
+			'vis' => $this->vis,
205
+			'region' => $this->region,
206
+			'country' => $this->country,
207
+			'manufacturer' => $this->manufacturer,
208
+			'modelYear' => $this->modelYear,
209
+		];
210
+	}
211
+
212
+	/**
213
+	 * Tries to determine vehicle region
214
+	 *
215
+	 * @return null|string
216
+	 */
217
+	private function determineRegion() : ?string
218
+	{
219
+		return REGIONS[$this->wmi[0]]['region'] ?? null;
220
+	}
221
+
222
+	/**
223
+	 * Tries to determine vehicle country
224
+	 *
225
+	 * @return null|string
226
+	 */
227
+	private function determineCountry() : ?string
228
+	{
229
+		$countries = REGIONS[$this->wmi[0]]['countries'] ?? null;
230
+		if (null === $countries) {
231
+			return null;
232
+		}
233
+
234
+		foreach ($countries as $chars => $name) {
235
+			if (!(false === strpbrk($this->wmi[1], (string) $chars))) {
236
+				return $name;
237
+			}
238
+		}
239
+
240
+		return null;
241
+	}
242
+
243
+	/**
244
+	 * Tries to determine vehicle manufacturer
245
+	 *
246
+	 * @return null|string
247
+	 */
248
+	private function determineManufacturer() : ?string
249
+	{
250
+		return MANUFACTURERS[$this->wmi] ?? MANUFACTURERS[$this->wmi[0] . $this->wmi[1]] ?? null;
251
+	}
252
+
253
+	/**
254
+	 * Tries to determine vehicle model year(s)
255
+	 *
256
+	 * @return int[]
257
+	 */
258
+	private function determineModelYear() : array
259
+	{
260
+		$comingYear = (int) date('Y') + 1;
261
+		$estimatedYears = [];
262
+
263
+		foreach (YEARS as $year => $char) {
264
+			if ($this->vis[0] === $char) {
265
+				$estimatedYears[] = $year;
266
+			}
267
+
268
+			if ($comingYear === $year) {
269
+				break;
270
+			}
271
+		}
272
+
273
+		return $estimatedYears;
274
+	}
275 275
 }
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -115,9 +115,9 @@  discard block
 block discarded – undo
115 115
 
116 116
         // Base values
117 117
         $this->vin = $value;
118
-        $this->wmi = $match['wmi'];
119
-        $this->vds = $match['vds'];
120
-        $this->vis = $match['vis'];
118
+        $this->wmi = $match[ 'wmi' ];
119
+        $this->vds = $match[ 'vds' ];
120
+        $this->vis = $match[ 'vis' ];
121 121
 
122 122
         // Parsed values
123 123
         $this->region = $this->determineRegion();
@@ -216,7 +216,7 @@  discard block
 block discarded – undo
216 216
      */
217 217
     private function determineRegion() : ?string
218 218
     {
219
-        return REGIONS[$this->wmi[0]]['region'] ?? null;
219
+        return REGIONS[ $this->wmi[ 0 ] ][ 'region' ] ?? null;
220 220
     }
221 221
 
222 222
     /**
@@ -226,13 +226,13 @@  discard block
 block discarded – undo
226 226
      */
227 227
     private function determineCountry() : ?string
228 228
     {
229
-        $countries = REGIONS[$this->wmi[0]]['countries'] ?? null;
229
+        $countries = REGIONS[ $this->wmi[ 0 ] ][ 'countries' ] ?? null;
230 230
         if (null === $countries) {
231 231
             return null;
232 232
         }
233 233
 
234 234
         foreach ($countries as $chars => $name) {
235
-            if (!(false === strpbrk($this->wmi[1], (string) $chars))) {
235
+            if (!(false === strpbrk($this->wmi[ 1 ], (string) $chars))) {
236 236
                 return $name;
237 237
             }
238 238
         }
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
      */
248 248
     private function determineManufacturer() : ?string
249 249
     {
250
-        return MANUFACTURERS[$this->wmi] ?? MANUFACTURERS[$this->wmi[0] . $this->wmi[1]] ?? null;
250
+        return MANUFACTURERS[ $this->wmi ] ?? MANUFACTURERS[ $this->wmi[ 0 ].$this->wmi[ 1 ] ] ?? null;
251 251
     }
252 252
 
253 253
     /**
@@ -258,11 +258,11 @@  discard block
 block discarded – undo
258 258
     private function determineModelYear() : array
259 259
     {
260 260
         $comingYear = (int) date('Y') + 1;
261
-        $estimatedYears = [];
261
+        $estimatedYears = [ ];
262 262
 
263 263
         foreach (YEARS as $year => $char) {
264
-            if ($this->vis[0] === $char) {
265
-                $estimatedYears[] = $year;
264
+            if ($this->vis[ 0 ] === $char) {
265
+                $estimatedYears[ ] = $year;
266 266
             }
267 267
 
268 268
             if ($comingYear === $year) {
Please login to merge, or discard this patch.
src/VinInterface.php 1 patch
Indentation   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -21,79 +21,79 @@
 block discarded – undo
21 21
 interface VinInterface
22 22
 {
23 23
 
24
-    /**
25
-     * Gets the VIN
26
-     *
27
-     * The length of this string must be 17 characters.
28
-     *
29
-     * @return string
30
-     */
31
-    public function getVin() : string;
24
+	/**
25
+	 * Gets the VIN
26
+	 *
27
+	 * The length of this string must be 17 characters.
28
+	 *
29
+	 * @return string
30
+	 */
31
+	public function getVin() : string;
32 32
 
33
-    /**
34
-     * Gets WMI (World Manufacturer Identifier) from the VIN
35
-     *
36
-     * The length of this string must be 3 characters.
37
-     *
38
-     * @return string
39
-     */
40
-    public function getWmi() : string;
33
+	/**
34
+	 * Gets WMI (World Manufacturer Identifier) from the VIN
35
+	 *
36
+	 * The length of this string must be 3 characters.
37
+	 *
38
+	 * @return string
39
+	 */
40
+	public function getWmi() : string;
41 41
 
42
-    /**
43
-     * Gets VDS (Vehicle Descriptor Section) from the VIN
44
-     *
45
-     * The length of this string must be 6 characters.
46
-     *
47
-     * @return string
48
-     */
49
-    public function getVds() : string;
42
+	/**
43
+	 * Gets VDS (Vehicle Descriptor Section) from the VIN
44
+	 *
45
+	 * The length of this string must be 6 characters.
46
+	 *
47
+	 * @return string
48
+	 */
49
+	public function getVds() : string;
50 50
 
51
-    /**
52
-     * Gets VIS (Vehicle Identifier Section) from the VIN
53
-     *
54
-     * The length of this string must be 8 characters.
55
-     *
56
-     * @return string
57
-     */
58
-    public function getVis() : string;
51
+	/**
52
+	 * Gets VIS (Vehicle Identifier Section) from the VIN
53
+	 *
54
+	 * The length of this string must be 8 characters.
55
+	 *
56
+	 * @return string
57
+	 */
58
+	public function getVis() : string;
59 59
 
60
-    /**
61
-     * Gets a region from the VIN
62
-     *
63
-     * The region must be determined by the first character of the VIN.
64
-     *
65
-     * @return null|string
66
-     */
67
-    public function getRegion() : ?string;
60
+	/**
61
+	 * Gets a region from the VIN
62
+	 *
63
+	 * The region must be determined by the first character of the VIN.
64
+	 *
65
+	 * @return null|string
66
+	 */
67
+	public function getRegion() : ?string;
68 68
 
69
-    /**
70
-     * Gets a country from the VIN
71
-     *
72
-     * The country must be determined by the second character of the VIN.
73
-     *
74
-     * @return null|string
75
-     */
76
-    public function getCountry() : ?string;
69
+	/**
70
+	 * Gets a country from the VIN
71
+	 *
72
+	 * The country must be determined by the second character of the VIN.
73
+	 *
74
+	 * @return null|string
75
+	 */
76
+	public function getCountry() : ?string;
77 77
 
78
-    /**
79
-     * Gets a manufacturer from the VIN
80
-     *
81
-     * The manufacturer must be determined by the first 2 or 3 characters of the VIN.
82
-     *
83
-     * @return null|string
84
-     */
85
-    public function getManufacturer() : ?string;
78
+	/**
79
+	 * Gets a manufacturer from the VIN
80
+	 *
81
+	 * The manufacturer must be determined by the first 2 or 3 characters of the VIN.
82
+	 *
83
+	 * @return null|string
84
+	 */
85
+	public function getManufacturer() : ?string;
86 86
 
87
-    /**
88
-     * Gets a model year from the VIN
89
-     *
90
-     * The model year must be determined by the tenth character of the VIN.
91
-     *
92
-     * NOTE! The model year may not be determined correctly.
93
-     *
94
-     * @return int[]
95
-     *
96
-     * @since 1.0.13
97
-     */
98
-    public function getModelYear() : array;
87
+	/**
88
+	 * Gets a model year from the VIN
89
+	 *
90
+	 * The model year must be determined by the tenth character of the VIN.
91
+	 *
92
+	 * NOTE! The model year may not be determined correctly.
93
+	 *
94
+	 * @return int[]
95
+	 *
96
+	 * @since 1.0.13
97
+	 */
98
+	public function getModelYear() : array;
99 99
 }
Please login to merge, or discard this patch.
data/manufacturers.php 1 patch
Indentation   +498 added lines, -498 removed lines patch added patch discarded remove patch
@@ -20,502 +20,502 @@
 block discarded – undo
20 20
  * @link https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/World_Manufacturer_Identifier_(WMI)#List_of_all_WMIs
21 21
  */
22 22
 const MANUFACTURERS = [
23
-    'AAV' => 'Volkswagen',
24
-    'AC5' => 'Hyundai',
25
-    'ADD' => 'Hyundai',
26
-    'AFA' => 'Ford',
27
-    'AHT' => 'Toyota',
28
-    'JA3' => 'Mitsubishi',
29
-    'JA4' => 'Mitsubishi',
30
-    'JA'  => 'Isuzu',
31
-    'JD'  => 'Daihatsu',
32
-    'JF'  => 'Fuji Heavy Industries (Subaru)',
33
-    'JH'  => 'Honda',
34
-    'JK'  => 'Kawasaki (motorcycles)',
35
-    'JL5' => 'Mitsubishi Fuso',
36
-    'JMB' => 'Mitsubishi Motors',
37
-    'JMY' => 'Mitsubishi Motors',
38
-    'JMZ' => 'Mazda',
39
-    'JN'  => 'Nissan',
40
-    'JS'  => 'Suzuki',
41
-    'JT'  => 'Toyota',
42
-    'JY'  => 'Yamaha (motorcycles)',
43
-    'KL'  => 'Daewoo General Motors',
44
-    'KM'  => 'Hyundai',
45
-    'KMY' => 'Daelim (motorcycles)',
46
-    'KM1' => 'Hyosung (motorcycles)',
47
-    'KN'  => 'Kia',
48
-    'KNM' => 'Renault Samsung',
49
-    'KPA' => 'SsangYong',
50
-    'KPT' => 'SsangYong',
51
-    'LAE' => 'Jinan Qingqi Motorcycle',
52
-    'LAN' => 'Changzhou Yamasaki Motorcycle',
53
-    'LBB' => 'Zhejiang Qianjiang Motorcycle (Keeway/Generic)',
54
-    'LBE' => 'Beijing Hyundai',
55
-    'LBM' => 'Zongshen Piaggio',
56
-    'LBP' => 'Chongqing Jainshe Yamaha (motorcycles)',
57
-    'LB2' => 'Geely Motorcycles',
58
-    'LCE' => 'Hangzhou Chunfeng Motorcycles (CFMOTO)',
59
-    'LDC' => 'Dong Feng Peugeot Citroen (DPCA)',
60
-    'LDD' => 'Dandong Huanghai Automobile',
61
-    'LDN' => 'SouEast Motor',
62
-    'LDY' => 'Zhongtong Coach',
63
-    'LET' => 'Jiangling-Isuzu Motors',
64
-    'LE4' => 'Beijing Benz',
65
-    'LFB' => 'FAW (busses)',
66
-    'LFG' => 'Taizhou Chuanl Motorcycle Manufacturing',
67
-    'LFP' => 'FAW (passenger vehicles)',
68
-    'LFT' => 'FAW (trailers)',
69
-    'LFV' => 'FAW-Volkswagen',
70
-    'LFW' => 'FAW JieFang',
71
-    'LFY' => 'Changshu Light Motorcycle Factory',
72
-    'LGB' => 'Dong Feng (DFM)',
73
-    'LGH' => 'Qoros (formerly Dong Feng (DFM))',
74
-    'LGX' => 'BYD Auto',
75
-    'LHB' => 'Beijing Automotive Industry Holding',
76
-    'LH1' => 'FAW-Haima',
77
-    'LJC' => 'JAC',
78
-    'LJ1' => 'JAC',
79
-    'LKL' => 'Suzhou King Long',
80
-    'LL6' => 'Hunan Changfeng Manufacture Joint-Stock',
81
-    'LL8' => 'Linhai (ATV)',
82
-    'LMC' => 'Suzuki Hong Kong (motorcycles)',
83
-    'LPR' => 'Yamaha Hong Kong (motorcycles)',
84
-    'LSG' => 'SAIC General Motors',
85
-    'LSJ' => 'SAIC MG',
86
-    'LSV' => 'SAIC Volkswagen',
87
-    'LSY' => 'Brilliance Zhonghua',
88
-    'LTV' => 'Toyota Tian Jin',
89
-    'LUC' => 'Guangqi Honda',
90
-    'LVS' => 'Ford Chang An',
91
-    'LVV' => 'Chery',
92
-    'LVZ' => 'Dong Feng Sokon Motor Company (DFSK)',
93
-    'LZM' => 'MAN',
94
-    'LZE' => 'Isuzu Guangzhou',
95
-    'LZG' => 'Shaanxi Automobile Group',
96
-    'LZP' => 'Zhongshan Guochi Motorcycle (Baotian)',
97
-    'LZY' => 'Yutong Zhengzhou',
98
-    'LZZ' => 'Chongqing Shuangzing Mech & Elec (Howo)',
99
-    'L4B' => 'Xingyue Group (motorcycles)',
100
-    'L5C' => 'KangDi (ATV)',
101
-    'L5K' => 'Zhejiang Yongkang Easy Vehicle',
102
-    'L5N' => 'Zhejiang Taotao (ATV & motorcycles)',
103
-    'L5Y' => 'Merato Motorcycle Taizhou Zhongneng',
104
-    'L85' => 'Zhejiang Yongkang Huabao Electric Appliance',
105
-    'L8X' => 'Zhejiang Summit Huawin Motorcycle',
106
-    'MAB' => 'Mahindra & Mahindra',
107
-    'MAC' => 'Mahindra & Mahindra',
108
-    'MAJ' => 'Ford',
109
-    'MAK' => 'Honda Siel Cars',
110
-    'MAL' => 'Hyundai',
111
-    'MAT' => 'Tata Motors',
112
-    'MA1' => 'Mahindra & Mahindra',
113
-    'MA3' => 'Suzuki (Maruti)',
114
-    'MA6' => 'GM',
115
-    'MA7' => 'Mitsubishi (formerly Honda)',
116
-    'MBH' => 'Suzuki (Maruti)',
117
-    'MBJ' => 'Toyota',
118
-    'MBR' => 'Mercedes-Benz',
119
-    'MB1' => 'Ashok Leyland',
120
-    'MCA' => 'Fiat',
121
-    'MCB' => 'GM',
122
-    'MC2' => 'Volvo Eicher commercial vehicles limited.',
123
-    'MDH' => 'Nissan',
124
-    'MD2' => 'Bajaj Auto',
125
-    'MD9' => 'Shuttle Cars',
126
-    'MEE' => 'Renault',
127
-    'MEX' => 'Volkswagen',
128
-    'MHF' => 'Toyota',
129
-    'MHR' => 'Honda',
130
-    'MLC' => 'Suzuki',
131
-    'MLH' => 'Honda',
132
-    'MMB' => 'Mitsubishi',
133
-    'MMC' => 'Mitsubishi',
134
-    'MMM' => 'Chevrolet',
135
-    'MMS' => 'Suzuki',
136
-    'MMT' => 'Mitsubishi',
137
-    'MM8' => 'Mazda',
138
-    'MNB' => 'Ford',
139
-    'MNT' => 'Nissan',
140
-    'MPA' => 'Isuzu',
141
-    'MP1' => 'Isuzu',
142
-    'MRH' => 'Honda',
143
-    'MR0' => 'Toyota',
144
-    'MS0' => 'KIA',
145
-    'MS3' => 'Suzuki Motor Co., Ltd.',
146
-    'NLA' => 'Honda',
147
-    'NLE' => 'Mercedes-Benz Truck',
148
-    'NLH' => 'Hyundai Assan',
149
-    'NLT' => 'TEMSA',
150
-    'NMB' => 'Mercedes-Benz Buses',
151
-    'NMC' => 'BMC',
152
-    'NM0' => 'Ford',
153
-    'NM4' => 'Tofaş',
154
-    'NMT' => 'Toyota',
155
-    'NNA' => 'Isuzu',
156
-    'PE1' => 'Ford',
157
-    'PE3' => 'Mazda',
158
-    'PL1' => 'Proton',
159
-    'PNA' => 'NAZA (Peugeot)',
160
-    'R1N' => 'NIU',
161
-    'RA1' => 'Steyr Trucks International FZE',
162
-    'RFB' => 'Kymco',
163
-    'RFG' => 'Sanyang SYM',
164
-    'RFL' => 'Adly',
165
-    'RFT' => 'CPI',
166
-    'RF3' => 'Aeon Motor',
167
-    'RL0' => 'Ford',
168
-    'RL1' => 'Suzuki',
169
-    'RL2' => 'Ford',
170
-    'RL3' => 'Ford',
171
-    'RL4' => 'Toyota',
172
-    'RL5' => 'Lifan',
173
-    'RL6' => 'Piaggio',
174
-    'RL8' => 'Lifan',
175
-    'RLA' => 'Mitsubishi',
176
-    'RLC' => 'Yamaha',
177
-    'RLD' => 'Isuzu',
178
-    'RLE' => 'Isuzu',
179
-    'RLF' => 'BMW',
180
-    'RLG' => 'SYM',
181
-    'RLH' => 'Honda',
182
-    'RLM' => 'Mercedes-Benz',
183
-    'RLS' => 'Suzuki',
184
-    'RP8' => 'Piaggio',
185
-    'SAD' => 'Jaguar (F-Pace)',
186
-    'SAL' => 'Land Rover',
187
-    'SAJ' => 'Jaguar',
188
-    'SAR' => 'Rover',
189
-    'SB1' => 'Toyota',
190
-    'SBM' => 'McLaren',
191
-    'SCA' => 'Rolls Royce',
192
-    'SCB' => 'Bentley',
193
-    'SCC' => 'Lotus Cars',
194
-    'SCE' => 'DeLorean Motor Cars N. Ireland',
195
-    'SCF' => 'Aston',
196
-    'SDB' => 'Peugeot (formerly Talbot)',
197
-    'SED' => 'General Motors Luton Plant',
198
-    'SEY' => 'LDV',
199
-    'SFA' => 'Ford',
200
-    'SFD' => 'Alexander Dennis',
201
-    'SHH' => 'Honda',
202
-    'SHS' => 'Honda',
203
-    'SJN' => 'Nissan',
204
-    'SKF' => 'Vauxhall',
205
-    'SLP' => 'JCB Research',
206
-    'SMT' => 'Triumph Motorcycles',
207
-    'SUF' => 'Fiat Auto',
208
-    'SUL' => 'FSC',
209
-    'SUP' => 'FSO-Daewoo',
210
-    'SUU' => 'Solaris Bus & Coach',
211
-    'SWV' => 'TA-NO',
212
-    'TCC' => 'Micro Compact Car AG (smart 1998-1999)',
213
-    'TDM' => 'QUANTYA Swiss Electric Movement',
214
-    'TK9' => 'SOR buses',
215
-    'TMA' => 'Hyundai Motor Manufacturing',
216
-    'TMB' => 'Škoda',
217
-    'TMK' => 'Karosa',
218
-    'TMP' => 'Škoda trolleybuses',
219
-    'TMT' => 'Tatra',
220
-    'TM9' => 'Škoda trolleybuses',
221
-    'TNE' => 'TAZ',
222
-    'TN9' => 'Karosa',
223
-    'TRA' => 'Ikarus Bus',
224
-    'TRU' => 'Audi',
225
-    'TSE' => 'Ikarus Egyedi Autobuszgyar',
226
-    'TSM' => 'Suzuki',
227
-    'TW1' => 'Toyota Caetano',
228
-    'TYA' => 'Mitsubishi Trucks',
229
-    'TYB' => 'Mitsubishi Trucks',
230
-    'UU1' => 'Renault Dacia',
231
-    'UU3' => 'ARO',
232
-    'UU6' => 'Daewoo',
233
-    'U5Y' => 'Kia Motors',
234
-    'U6Y' => 'Kia Motors',
235
-    'VAG' => 'Magna Steyr Puch',
236
-    'VAN' => 'MAN',
237
-    'VBK' => 'KTM (Motorcycles)',
238
-    'VF1' => 'Renault',
239
-    'VF2' => 'Renault',
240
-    'VF3' => 'Peugeot',
241
-    'VF4' => 'Talbot',
242
-    'VF6' => 'Renault (Trucks & Buses)',
243
-    'VF7' => 'Citroën',
244
-    'VF8' => 'Matra',
245
-    'VF9' => 'Bugatti',
246
-    '795' => 'Bugatti',
247
-    'VG5' => 'MBK (motorcycles)',
248
-    'VLU' => 'Scania',
249
-    'VN1' => 'SOVAB',
250
-    'VNE' => 'Irisbus',
251
-    'VNK' => 'Toyota',
252
-    'VNV' => 'Renault-Nissan',
253
-    'VSA' => 'Mercedes-Benz',
254
-    'VSE' => 'Suzuki (Santana Motors)',
255
-    'VSK' => 'Nissan',
256
-    'VSS' => 'SEAT',
257
-    'VSX' => 'Opel',
258
-    'VS6' => 'Ford',
259
-    'VS7' => 'Citroën',
260
-    'VS9' => 'Carrocerias Ayats',
261
-    'VTH' => 'Derbi (motorcycles)',
262
-    'VTL' => 'Yamaha (motorcycles)',
263
-    'VTT' => 'Suzuki (motorcycles)',
264
-    'VV9' => 'TAURO',
265
-    'VWA' => 'Nissan',
266
-    'VWV' => 'Volkswagen',
267
-    'VX1' => 'Zastava / Yugo Serbia',
268
-    'WAG' => 'Neoplan',
269
-    'WAU' => 'Audi',
270
-    'WA1' => 'Audi SUV',
271
-    'WBA' => 'BMW',
272
-    'WBS' => 'BMW M',
273
-    'WBW' => 'BMW',
274
-    'WBY' => 'BMW',
275
-    'WDA' => 'Daimler',
276
-    'WDB' => 'Mercedes-Benz',
277
-    'WDC' => 'DaimlerChrysler',
278
-    'WDD' => 'Mercedes-Benz',
279
-    'WDF' => 'Mercedes-Benz (commercial vehicles)',
280
-    'WEB' => 'Evobus GmbH (Mercedes-Bus)',
281
-    'WJM' => 'Iveco Magirus',
282
-    'WF0' => 'Ford',
283
-    'WKE' => 'Fahrzeugwerk Bernard Krone GmbH & Co. KG',
284
-    'WKK' => 'Kässbohrer/Setra',
285
-    'WMA' => 'MAN',
286
-    'WME' => 'smart',
287
-    'WMW' => 'MINI',
288
-    'WMX' => 'Mercedes-AMG',
289
-    'WP0' => 'Porsche',
290
-    'WP1' => 'Porsche SUV',
291
-    'W09' => 'RUF',
292
-    'W0L' => 'Opel',
293
-    'W0V' => 'Opel',
294
-    'WUA' => 'quattro GmbH',
295
-    'WVG' => 'Volkswagen MPV/SUV',
296
-    'WVW' => 'Volkswagen',
297
-    'WV1' => 'Volkswagen Commercial Vehicles',
298
-    'WV2' => 'Volkswagen Bus/Van',
299
-    'WV3' => 'Volkswagen Trucks',
300
-    'XLB' => 'Volvo (NedCar)',
301
-    'XLE' => 'Scania',
302
-    'XLR' => 'DAF (trucks)',
303
-    'XL9' => 'Spyker',
304
-    '363' => 'Spyker',
305
-    'XMC' => 'Mitsubishi (NedCar)',
306
-    'XTA' => 'Lada/AvtoVAZ',
307
-    'XTC' => 'KAMAZ',
308
-    'XTH' => 'GAZ',
309
-    'XTT' => 'UAZ/Sollers',
310
-    'XTY' => 'LiAZ',
311
-    'XUF' => 'General Motors',
312
-    'XUU' => 'AvtoTor (General Motors SKD)',
313
-    'XW8' => 'Volkswagen Group',
314
-    'XWB' => 'UZ-Daewoo',
315
-    'XWE' => 'AvtoTor (Hyundai-Kia SKD)',
316
-    'X1M' => 'PAZ',
317
-    'X4X' => 'AvtoTor (BMW SKD)',
318
-    'X7L' => 'Renault AvtoFramos',
319
-    'X7M' => 'Hyundai TagAZ',
320
-    'YBW' => 'Volkswagen',
321
-    'YB1' => 'Volvo Trucks',
322
-    'YCM' => 'Mazda',
323
-    'YE2' => 'Van Hool (buses)',
324
-    'YH2' => 'BRP (Lynx snowmobiles)',
325
-    'YK1' => 'Saab-Valmet',
326
-    'YS2' => 'Scania AB',
327
-    'YS3' => 'Saab',
328
-    'YS4' => 'Scania Bus',
329
-    'YTN' => 'Saab NEVS',
330
-    'YT9' => 'Koenigsegg',
331
-    '007' => 'Koenigsegg',
332
-    '034' => 'Carvia',
333
-    'YU7' => 'Husaberg (motorcycles)',
334
-    'YV1' => 'Volvo Cars',
335
-    'YV4' => 'Volvo Cars',
336
-    'YV2' => 'Volvo Trucks',
337
-    'YV3' => 'Volvo Buses',
338
-    'Y3M' => 'MAZ',
339
-    'Y6D' => 'Zaporozhets/AvtoZAZ',
340
-    'ZAA' => 'Autobianchi',
341
-    'ZAM' => 'Maserati',
342
-    'ZAP' => 'Piaggio/Vespa/Gilera',
343
-    'ZAR' => 'Alfa Romeo',
344
-    'ZBN' => 'Benelli',
345
-    'ZCG' => 'Cagiva SpA / MV Agusta',
346
-    'ZCF' => 'Iveco',
347
-    'ZDM' => 'Ducati Motor Holdings SpA',
348
-    'ZDF' => 'Ferrari Dino',
349
-    'ZD0' => 'Yamaha',
350
-    'ZD3' => 'Beta Motor',
351
-    'ZD4' => 'Aprilia',
352
-    'ZFA' => 'Fiat',
353
-    'ZFC' => 'Fiat V.I.',
354
-    'ZFF' => 'Ferrari',
355
-    'ZGU' => 'Moto Guzzi',
356
-    'ZHW' => 'Lamborghini',
357
-    'ZJM' => 'Malaguti',
358
-    'ZJN' => 'Innocenti',
359
-    'ZKH' => 'Husqvarna Motorcycles',
360
-    'ZLA' => 'Lancia',
361
-    'ZOM' => 'OM',
362
-    'Z8M' => 'Marussia',
363
-    '1B3' => 'Dodge',
364
-    '1C3' => 'Chrysler',
365
-    '1C4' => 'Chrysler',
366
-    '1C6' => 'Chrysler',
367
-    '1D3' => 'Dodge',
368
-    '1FA' => 'Ford Motor Company',
369
-    '1FB' => 'Ford Motor Company',
370
-    '1FC' => 'Ford Motor Company',
371
-    '1FD' => 'Ford Motor Company',
372
-    '1FM' => 'Ford Motor Company',
373
-    '1FT' => 'Ford Motor Company',
374
-    '1FU' => 'Freightliner',
375
-    '1FV' => 'Freightliner',
376
-    '1F9' => 'FWD Corp.',
377
-    '1G'  => 'General Motors',
378
-    '1GC' => 'Chevrolet Truck',
379
-    '1GT' => 'GMC Truck',
380
-    '1G1' => 'Chevrolet',
381
-    '1G2' => 'Pontiac',
382
-    '1G3' => 'Oldsmobile',
383
-    '1G4' => 'Buick',
384
-    '1G6' => 'Cadillac',
385
-    '1G8' => 'Saturn',
386
-    '1GM' => 'Pontiac',
387
-    '1GY' => 'Cadillac',
388
-    '1H'  => 'Honda',
389
-    '1HD' => 'Harley-Davidson',
390
-    '1J4' => 'Jeep',
391
-    '1J8' => 'Jeep',
392
-    '1L'  => 'Lincoln',
393
-    '1ME' => 'Mercury',
394
-    '1M1' => 'Mack Truck',
395
-    '1M2' => 'Mack Truck',
396
-    '1M3' => 'Mack Truck',
397
-    '1M4' => 'Mack Truck',
398
-    '1M9' => 'Mynatt Truck & Equipment',
399
-    '1N'  => 'Nissan',
400
-    '1NX' => 'NUMMI',
401
-    '1P3' => 'Plymouth',
402
-    '1R9' => 'Roadrunner Hay Squeeze',
403
-    '1VW' => 'Volkswagen',
404
-    '1XK' => 'Kenworth',
405
-    '1XP' => 'Peterbilt',
406
-    '1YV' => 'Mazda (AutoAlliance International)',
407
-    '1ZV' => 'Ford (AutoAlliance International)',
408
-    '2A4' => 'Chrysler',
409
-    '2BP' => 'Bombardier Recreational Products',
410
-    '2B3' => 'Dodge',
411
-    '2B7' => 'Dodge',
412
-    '2C3' => 'Chrysler',
413
-    '2CN' => 'CAMI',
414
-    '2D3' => 'Dodge',
415
-    '2FA' => 'Ford Motor Company',
416
-    '2FB' => 'Ford Motor Company',
417
-    '2FC' => 'Ford Motor Company',
418
-    '2FM' => 'Ford Motor Company',
419
-    '2FT' => 'Ford Motor Company',
420
-    '2FU' => 'Freightliner',
421
-    '2FV' => 'Freightliner',
422
-    '2FZ' => 'Sterling',
423
-    '2Gx' => 'General Motors',
424
-    '2G1' => 'Chevrolet',
425
-    '2G2' => 'Pontiac',
426
-    '2G3' => 'Oldsmobile',
427
-    '2G4' => 'Buick',
428
-    '2G9' => 'Gnome Homes',
429
-    '2HG' => 'Honda',
430
-    '2HK' => 'Honda',
431
-    '2HJ' => 'Honda',
432
-    '2HM' => 'Hyundai',
433
-    '2M'  => 'Mercury',
434
-    '2NV' => 'Nova Bus',
435
-    '2P3' => 'Plymouth',
436
-    '2T'  => 'Toyota',
437
-    '2TP' => 'Triple E LTD',
438
-    '2V4' => 'Volkswagen',
439
-    '2V8' => 'Volkswagen',
440
-    '2WK' => 'Western Star',
441
-    '2WL' => 'Western Star',
442
-    '2WM' => 'Western Star',
443
-    '3C4' => 'Chrysler',
444
-    '3D3' => 'Dodge',
445
-    '3D4' => 'Dodge',
446
-    '3FA' => 'Ford Motor Company',
447
-    '3FE' => 'Ford Motor Company',
448
-    '3G'  => 'General Motors',
449
-    '3H'  => 'Honda',
450
-    '3JB' => 'BRP (all-terrain vehicles)',
451
-    '3MD' => 'Mazda',
452
-    '3MZ' => 'Mazda',
453
-    '3N'  => 'Nissan',
454
-    '3P3' => 'Plymouth',
455
-    '3VW' => 'Volkswagen',
456
-    '4F'  => 'Mazda',
457
-    '4JG' => 'Mercedes-Benz',
458
-    '4M'  => 'Mercury',
459
-    '4RK' => 'Nova Bus',
460
-    '4S'  => 'Subaru-Isuzu Automotive',
461
-    '4T'  => 'Toyota',
462
-    '4T9' => 'Lumen Motors',
463
-    '4UF' => 'Arctic Cat Inc.',
464
-    '4US' => 'BMW',
465
-    '4UZ' => 'Frt-Thomas Bus',
466
-    '4V1' => 'Volvo',
467
-    '4V2' => 'Volvo',
468
-    '4V3' => 'Volvo',
469
-    '4V4' => 'Volvo',
470
-    '4V5' => 'Volvo',
471
-    '4V6' => 'Volvo',
472
-    '4VL' => 'Volvo',
473
-    '4VM' => 'Volvo',
474
-    '4VZ' => 'Volvo',
475
-    '538' => 'Zero Motorcycles',
476
-    '5F'  => 'Honda Alabama',
477
-    '5J'  => 'Honda Ohio',
478
-    '5L'  => 'Lincoln',
479
-    '5N1' => 'Nissan',
480
-    '5NP' => 'Hyundai',
481
-    '5T'  => 'Toyota - trucks',
482
-    '5YJ' => 'Tesla, Inc.',
483
-    '6AB' => 'MAN',
484
-    '6F4' => 'Nissan Motor Company',
485
-    '6F5' => 'Kenworth',
486
-    '6FP' => 'Ford Motor Company',
487
-    '6G1' => 'General Motors-Holden (post Nov 2002)',
488
-    '6G2' => 'Pontiac (GTO & G8)',
489
-    '6H8' => 'General Motors-Holden (pre Nov 2002)',
490
-    '6MM' => 'Mitsubishi Motors',
491
-    '6T1' => 'Toyota Motor Corporation',
492
-    '6U9' => 'Privately Imported car',
493
-    '8AD' => 'Peugeot',
494
-    '8AF' => 'Ford Motor Company',
495
-    '8AG' => 'Chevrolet',
496
-    '8AJ' => 'Toyota',
497
-    '8AK' => 'Suzuki',
498
-    '8AP' => 'Fiat',
499
-    '8AW' => 'Volkswagen',
500
-    '8A1' => 'Renault',
501
-    '8GD' => 'Peugeot',
502
-    '8GG' => 'Chevrolet',
503
-    '935' => 'Citroën',
504
-    '936' => 'Peugeot',
505
-    '93H' => 'Honda',
506
-    '93R' => 'Toyota',
507
-    '93U' => 'Audi',
508
-    '93V' => 'Audi',
509
-    '93X' => 'Mitsubishi Motors',
510
-    '93Y' => 'Renault',
511
-    '94D' => 'Nissan',
512
-    '9BD' => 'Fiat',
513
-    '9BF' => 'Ford Motor Company',
514
-    '9BG' => 'Chevrolet',
515
-    '9BM' => 'Mercedes-Benz',
516
-    '9BR' => 'Toyota',
517
-    '9BS' => 'Scania',
518
-    '9BW' => 'Volkswagen',
519
-    '9FB' => 'Renault',
520
-    'WB1' => 'BMW Motorrad of North America',
23
+	'AAV' => 'Volkswagen',
24
+	'AC5' => 'Hyundai',
25
+	'ADD' => 'Hyundai',
26
+	'AFA' => 'Ford',
27
+	'AHT' => 'Toyota',
28
+	'JA3' => 'Mitsubishi',
29
+	'JA4' => 'Mitsubishi',
30
+	'JA'  => 'Isuzu',
31
+	'JD'  => 'Daihatsu',
32
+	'JF'  => 'Fuji Heavy Industries (Subaru)',
33
+	'JH'  => 'Honda',
34
+	'JK'  => 'Kawasaki (motorcycles)',
35
+	'JL5' => 'Mitsubishi Fuso',
36
+	'JMB' => 'Mitsubishi Motors',
37
+	'JMY' => 'Mitsubishi Motors',
38
+	'JMZ' => 'Mazda',
39
+	'JN'  => 'Nissan',
40
+	'JS'  => 'Suzuki',
41
+	'JT'  => 'Toyota',
42
+	'JY'  => 'Yamaha (motorcycles)',
43
+	'KL'  => 'Daewoo General Motors',
44
+	'KM'  => 'Hyundai',
45
+	'KMY' => 'Daelim (motorcycles)',
46
+	'KM1' => 'Hyosung (motorcycles)',
47
+	'KN'  => 'Kia',
48
+	'KNM' => 'Renault Samsung',
49
+	'KPA' => 'SsangYong',
50
+	'KPT' => 'SsangYong',
51
+	'LAE' => 'Jinan Qingqi Motorcycle',
52
+	'LAN' => 'Changzhou Yamasaki Motorcycle',
53
+	'LBB' => 'Zhejiang Qianjiang Motorcycle (Keeway/Generic)',
54
+	'LBE' => 'Beijing Hyundai',
55
+	'LBM' => 'Zongshen Piaggio',
56
+	'LBP' => 'Chongqing Jainshe Yamaha (motorcycles)',
57
+	'LB2' => 'Geely Motorcycles',
58
+	'LCE' => 'Hangzhou Chunfeng Motorcycles (CFMOTO)',
59
+	'LDC' => 'Dong Feng Peugeot Citroen (DPCA)',
60
+	'LDD' => 'Dandong Huanghai Automobile',
61
+	'LDN' => 'SouEast Motor',
62
+	'LDY' => 'Zhongtong Coach',
63
+	'LET' => 'Jiangling-Isuzu Motors',
64
+	'LE4' => 'Beijing Benz',
65
+	'LFB' => 'FAW (busses)',
66
+	'LFG' => 'Taizhou Chuanl Motorcycle Manufacturing',
67
+	'LFP' => 'FAW (passenger vehicles)',
68
+	'LFT' => 'FAW (trailers)',
69
+	'LFV' => 'FAW-Volkswagen',
70
+	'LFW' => 'FAW JieFang',
71
+	'LFY' => 'Changshu Light Motorcycle Factory',
72
+	'LGB' => 'Dong Feng (DFM)',
73
+	'LGH' => 'Qoros (formerly Dong Feng (DFM))',
74
+	'LGX' => 'BYD Auto',
75
+	'LHB' => 'Beijing Automotive Industry Holding',
76
+	'LH1' => 'FAW-Haima',
77
+	'LJC' => 'JAC',
78
+	'LJ1' => 'JAC',
79
+	'LKL' => 'Suzhou King Long',
80
+	'LL6' => 'Hunan Changfeng Manufacture Joint-Stock',
81
+	'LL8' => 'Linhai (ATV)',
82
+	'LMC' => 'Suzuki Hong Kong (motorcycles)',
83
+	'LPR' => 'Yamaha Hong Kong (motorcycles)',
84
+	'LSG' => 'SAIC General Motors',
85
+	'LSJ' => 'SAIC MG',
86
+	'LSV' => 'SAIC Volkswagen',
87
+	'LSY' => 'Brilliance Zhonghua',
88
+	'LTV' => 'Toyota Tian Jin',
89
+	'LUC' => 'Guangqi Honda',
90
+	'LVS' => 'Ford Chang An',
91
+	'LVV' => 'Chery',
92
+	'LVZ' => 'Dong Feng Sokon Motor Company (DFSK)',
93
+	'LZM' => 'MAN',
94
+	'LZE' => 'Isuzu Guangzhou',
95
+	'LZG' => 'Shaanxi Automobile Group',
96
+	'LZP' => 'Zhongshan Guochi Motorcycle (Baotian)',
97
+	'LZY' => 'Yutong Zhengzhou',
98
+	'LZZ' => 'Chongqing Shuangzing Mech & Elec (Howo)',
99
+	'L4B' => 'Xingyue Group (motorcycles)',
100
+	'L5C' => 'KangDi (ATV)',
101
+	'L5K' => 'Zhejiang Yongkang Easy Vehicle',
102
+	'L5N' => 'Zhejiang Taotao (ATV & motorcycles)',
103
+	'L5Y' => 'Merato Motorcycle Taizhou Zhongneng',
104
+	'L85' => 'Zhejiang Yongkang Huabao Electric Appliance',
105
+	'L8X' => 'Zhejiang Summit Huawin Motorcycle',
106
+	'MAB' => 'Mahindra & Mahindra',
107
+	'MAC' => 'Mahindra & Mahindra',
108
+	'MAJ' => 'Ford',
109
+	'MAK' => 'Honda Siel Cars',
110
+	'MAL' => 'Hyundai',
111
+	'MAT' => 'Tata Motors',
112
+	'MA1' => 'Mahindra & Mahindra',
113
+	'MA3' => 'Suzuki (Maruti)',
114
+	'MA6' => 'GM',
115
+	'MA7' => 'Mitsubishi (formerly Honda)',
116
+	'MBH' => 'Suzuki (Maruti)',
117
+	'MBJ' => 'Toyota',
118
+	'MBR' => 'Mercedes-Benz',
119
+	'MB1' => 'Ashok Leyland',
120
+	'MCA' => 'Fiat',
121
+	'MCB' => 'GM',
122
+	'MC2' => 'Volvo Eicher commercial vehicles limited.',
123
+	'MDH' => 'Nissan',
124
+	'MD2' => 'Bajaj Auto',
125
+	'MD9' => 'Shuttle Cars',
126
+	'MEE' => 'Renault',
127
+	'MEX' => 'Volkswagen',
128
+	'MHF' => 'Toyota',
129
+	'MHR' => 'Honda',
130
+	'MLC' => 'Suzuki',
131
+	'MLH' => 'Honda',
132
+	'MMB' => 'Mitsubishi',
133
+	'MMC' => 'Mitsubishi',
134
+	'MMM' => 'Chevrolet',
135
+	'MMS' => 'Suzuki',
136
+	'MMT' => 'Mitsubishi',
137
+	'MM8' => 'Mazda',
138
+	'MNB' => 'Ford',
139
+	'MNT' => 'Nissan',
140
+	'MPA' => 'Isuzu',
141
+	'MP1' => 'Isuzu',
142
+	'MRH' => 'Honda',
143
+	'MR0' => 'Toyota',
144
+	'MS0' => 'KIA',
145
+	'MS3' => 'Suzuki Motor Co., Ltd.',
146
+	'NLA' => 'Honda',
147
+	'NLE' => 'Mercedes-Benz Truck',
148
+	'NLH' => 'Hyundai Assan',
149
+	'NLT' => 'TEMSA',
150
+	'NMB' => 'Mercedes-Benz Buses',
151
+	'NMC' => 'BMC',
152
+	'NM0' => 'Ford',
153
+	'NM4' => 'Tofaş',
154
+	'NMT' => 'Toyota',
155
+	'NNA' => 'Isuzu',
156
+	'PE1' => 'Ford',
157
+	'PE3' => 'Mazda',
158
+	'PL1' => 'Proton',
159
+	'PNA' => 'NAZA (Peugeot)',
160
+	'R1N' => 'NIU',
161
+	'RA1' => 'Steyr Trucks International FZE',
162
+	'RFB' => 'Kymco',
163
+	'RFG' => 'Sanyang SYM',
164
+	'RFL' => 'Adly',
165
+	'RFT' => 'CPI',
166
+	'RF3' => 'Aeon Motor',
167
+	'RL0' => 'Ford',
168
+	'RL1' => 'Suzuki',
169
+	'RL2' => 'Ford',
170
+	'RL3' => 'Ford',
171
+	'RL4' => 'Toyota',
172
+	'RL5' => 'Lifan',
173
+	'RL6' => 'Piaggio',
174
+	'RL8' => 'Lifan',
175
+	'RLA' => 'Mitsubishi',
176
+	'RLC' => 'Yamaha',
177
+	'RLD' => 'Isuzu',
178
+	'RLE' => 'Isuzu',
179
+	'RLF' => 'BMW',
180
+	'RLG' => 'SYM',
181
+	'RLH' => 'Honda',
182
+	'RLM' => 'Mercedes-Benz',
183
+	'RLS' => 'Suzuki',
184
+	'RP8' => 'Piaggio',
185
+	'SAD' => 'Jaguar (F-Pace)',
186
+	'SAL' => 'Land Rover',
187
+	'SAJ' => 'Jaguar',
188
+	'SAR' => 'Rover',
189
+	'SB1' => 'Toyota',
190
+	'SBM' => 'McLaren',
191
+	'SCA' => 'Rolls Royce',
192
+	'SCB' => 'Bentley',
193
+	'SCC' => 'Lotus Cars',
194
+	'SCE' => 'DeLorean Motor Cars N. Ireland',
195
+	'SCF' => 'Aston',
196
+	'SDB' => 'Peugeot (formerly Talbot)',
197
+	'SED' => 'General Motors Luton Plant',
198
+	'SEY' => 'LDV',
199
+	'SFA' => 'Ford',
200
+	'SFD' => 'Alexander Dennis',
201
+	'SHH' => 'Honda',
202
+	'SHS' => 'Honda',
203
+	'SJN' => 'Nissan',
204
+	'SKF' => 'Vauxhall',
205
+	'SLP' => 'JCB Research',
206
+	'SMT' => 'Triumph Motorcycles',
207
+	'SUF' => 'Fiat Auto',
208
+	'SUL' => 'FSC',
209
+	'SUP' => 'FSO-Daewoo',
210
+	'SUU' => 'Solaris Bus & Coach',
211
+	'SWV' => 'TA-NO',
212
+	'TCC' => 'Micro Compact Car AG (smart 1998-1999)',
213
+	'TDM' => 'QUANTYA Swiss Electric Movement',
214
+	'TK9' => 'SOR buses',
215
+	'TMA' => 'Hyundai Motor Manufacturing',
216
+	'TMB' => 'Škoda',
217
+	'TMK' => 'Karosa',
218
+	'TMP' => 'Škoda trolleybuses',
219
+	'TMT' => 'Tatra',
220
+	'TM9' => 'Škoda trolleybuses',
221
+	'TNE' => 'TAZ',
222
+	'TN9' => 'Karosa',
223
+	'TRA' => 'Ikarus Bus',
224
+	'TRU' => 'Audi',
225
+	'TSE' => 'Ikarus Egyedi Autobuszgyar',
226
+	'TSM' => 'Suzuki',
227
+	'TW1' => 'Toyota Caetano',
228
+	'TYA' => 'Mitsubishi Trucks',
229
+	'TYB' => 'Mitsubishi Trucks',
230
+	'UU1' => 'Renault Dacia',
231
+	'UU3' => 'ARO',
232
+	'UU6' => 'Daewoo',
233
+	'U5Y' => 'Kia Motors',
234
+	'U6Y' => 'Kia Motors',
235
+	'VAG' => 'Magna Steyr Puch',
236
+	'VAN' => 'MAN',
237
+	'VBK' => 'KTM (Motorcycles)',
238
+	'VF1' => 'Renault',
239
+	'VF2' => 'Renault',
240
+	'VF3' => 'Peugeot',
241
+	'VF4' => 'Talbot',
242
+	'VF6' => 'Renault (Trucks & Buses)',
243
+	'VF7' => 'Citroën',
244
+	'VF8' => 'Matra',
245
+	'VF9' => 'Bugatti',
246
+	'795' => 'Bugatti',
247
+	'VG5' => 'MBK (motorcycles)',
248
+	'VLU' => 'Scania',
249
+	'VN1' => 'SOVAB',
250
+	'VNE' => 'Irisbus',
251
+	'VNK' => 'Toyota',
252
+	'VNV' => 'Renault-Nissan',
253
+	'VSA' => 'Mercedes-Benz',
254
+	'VSE' => 'Suzuki (Santana Motors)',
255
+	'VSK' => 'Nissan',
256
+	'VSS' => 'SEAT',
257
+	'VSX' => 'Opel',
258
+	'VS6' => 'Ford',
259
+	'VS7' => 'Citroën',
260
+	'VS9' => 'Carrocerias Ayats',
261
+	'VTH' => 'Derbi (motorcycles)',
262
+	'VTL' => 'Yamaha (motorcycles)',
263
+	'VTT' => 'Suzuki (motorcycles)',
264
+	'VV9' => 'TAURO',
265
+	'VWA' => 'Nissan',
266
+	'VWV' => 'Volkswagen',
267
+	'VX1' => 'Zastava / Yugo Serbia',
268
+	'WAG' => 'Neoplan',
269
+	'WAU' => 'Audi',
270
+	'WA1' => 'Audi SUV',
271
+	'WBA' => 'BMW',
272
+	'WBS' => 'BMW M',
273
+	'WBW' => 'BMW',
274
+	'WBY' => 'BMW',
275
+	'WDA' => 'Daimler',
276
+	'WDB' => 'Mercedes-Benz',
277
+	'WDC' => 'DaimlerChrysler',
278
+	'WDD' => 'Mercedes-Benz',
279
+	'WDF' => 'Mercedes-Benz (commercial vehicles)',
280
+	'WEB' => 'Evobus GmbH (Mercedes-Bus)',
281
+	'WJM' => 'Iveco Magirus',
282
+	'WF0' => 'Ford',
283
+	'WKE' => 'Fahrzeugwerk Bernard Krone GmbH & Co. KG',
284
+	'WKK' => 'Kässbohrer/Setra',
285
+	'WMA' => 'MAN',
286
+	'WME' => 'smart',
287
+	'WMW' => 'MINI',
288
+	'WMX' => 'Mercedes-AMG',
289
+	'WP0' => 'Porsche',
290
+	'WP1' => 'Porsche SUV',
291
+	'W09' => 'RUF',
292
+	'W0L' => 'Opel',
293
+	'W0V' => 'Opel',
294
+	'WUA' => 'quattro GmbH',
295
+	'WVG' => 'Volkswagen MPV/SUV',
296
+	'WVW' => 'Volkswagen',
297
+	'WV1' => 'Volkswagen Commercial Vehicles',
298
+	'WV2' => 'Volkswagen Bus/Van',
299
+	'WV3' => 'Volkswagen Trucks',
300
+	'XLB' => 'Volvo (NedCar)',
301
+	'XLE' => 'Scania',
302
+	'XLR' => 'DAF (trucks)',
303
+	'XL9' => 'Spyker',
304
+	'363' => 'Spyker',
305
+	'XMC' => 'Mitsubishi (NedCar)',
306
+	'XTA' => 'Lada/AvtoVAZ',
307
+	'XTC' => 'KAMAZ',
308
+	'XTH' => 'GAZ',
309
+	'XTT' => 'UAZ/Sollers',
310
+	'XTY' => 'LiAZ',
311
+	'XUF' => 'General Motors',
312
+	'XUU' => 'AvtoTor (General Motors SKD)',
313
+	'XW8' => 'Volkswagen Group',
314
+	'XWB' => 'UZ-Daewoo',
315
+	'XWE' => 'AvtoTor (Hyundai-Kia SKD)',
316
+	'X1M' => 'PAZ',
317
+	'X4X' => 'AvtoTor (BMW SKD)',
318
+	'X7L' => 'Renault AvtoFramos',
319
+	'X7M' => 'Hyundai TagAZ',
320
+	'YBW' => 'Volkswagen',
321
+	'YB1' => 'Volvo Trucks',
322
+	'YCM' => 'Mazda',
323
+	'YE2' => 'Van Hool (buses)',
324
+	'YH2' => 'BRP (Lynx snowmobiles)',
325
+	'YK1' => 'Saab-Valmet',
326
+	'YS2' => 'Scania AB',
327
+	'YS3' => 'Saab',
328
+	'YS4' => 'Scania Bus',
329
+	'YTN' => 'Saab NEVS',
330
+	'YT9' => 'Koenigsegg',
331
+	'007' => 'Koenigsegg',
332
+	'034' => 'Carvia',
333
+	'YU7' => 'Husaberg (motorcycles)',
334
+	'YV1' => 'Volvo Cars',
335
+	'YV4' => 'Volvo Cars',
336
+	'YV2' => 'Volvo Trucks',
337
+	'YV3' => 'Volvo Buses',
338
+	'Y3M' => 'MAZ',
339
+	'Y6D' => 'Zaporozhets/AvtoZAZ',
340
+	'ZAA' => 'Autobianchi',
341
+	'ZAM' => 'Maserati',
342
+	'ZAP' => 'Piaggio/Vespa/Gilera',
343
+	'ZAR' => 'Alfa Romeo',
344
+	'ZBN' => 'Benelli',
345
+	'ZCG' => 'Cagiva SpA / MV Agusta',
346
+	'ZCF' => 'Iveco',
347
+	'ZDM' => 'Ducati Motor Holdings SpA',
348
+	'ZDF' => 'Ferrari Dino',
349
+	'ZD0' => 'Yamaha',
350
+	'ZD3' => 'Beta Motor',
351
+	'ZD4' => 'Aprilia',
352
+	'ZFA' => 'Fiat',
353
+	'ZFC' => 'Fiat V.I.',
354
+	'ZFF' => 'Ferrari',
355
+	'ZGU' => 'Moto Guzzi',
356
+	'ZHW' => 'Lamborghini',
357
+	'ZJM' => 'Malaguti',
358
+	'ZJN' => 'Innocenti',
359
+	'ZKH' => 'Husqvarna Motorcycles',
360
+	'ZLA' => 'Lancia',
361
+	'ZOM' => 'OM',
362
+	'Z8M' => 'Marussia',
363
+	'1B3' => 'Dodge',
364
+	'1C3' => 'Chrysler',
365
+	'1C4' => 'Chrysler',
366
+	'1C6' => 'Chrysler',
367
+	'1D3' => 'Dodge',
368
+	'1FA' => 'Ford Motor Company',
369
+	'1FB' => 'Ford Motor Company',
370
+	'1FC' => 'Ford Motor Company',
371
+	'1FD' => 'Ford Motor Company',
372
+	'1FM' => 'Ford Motor Company',
373
+	'1FT' => 'Ford Motor Company',
374
+	'1FU' => 'Freightliner',
375
+	'1FV' => 'Freightliner',
376
+	'1F9' => 'FWD Corp.',
377
+	'1G'  => 'General Motors',
378
+	'1GC' => 'Chevrolet Truck',
379
+	'1GT' => 'GMC Truck',
380
+	'1G1' => 'Chevrolet',
381
+	'1G2' => 'Pontiac',
382
+	'1G3' => 'Oldsmobile',
383
+	'1G4' => 'Buick',
384
+	'1G6' => 'Cadillac',
385
+	'1G8' => 'Saturn',
386
+	'1GM' => 'Pontiac',
387
+	'1GY' => 'Cadillac',
388
+	'1H'  => 'Honda',
389
+	'1HD' => 'Harley-Davidson',
390
+	'1J4' => 'Jeep',
391
+	'1J8' => 'Jeep',
392
+	'1L'  => 'Lincoln',
393
+	'1ME' => 'Mercury',
394
+	'1M1' => 'Mack Truck',
395
+	'1M2' => 'Mack Truck',
396
+	'1M3' => 'Mack Truck',
397
+	'1M4' => 'Mack Truck',
398
+	'1M9' => 'Mynatt Truck & Equipment',
399
+	'1N'  => 'Nissan',
400
+	'1NX' => 'NUMMI',
401
+	'1P3' => 'Plymouth',
402
+	'1R9' => 'Roadrunner Hay Squeeze',
403
+	'1VW' => 'Volkswagen',
404
+	'1XK' => 'Kenworth',
405
+	'1XP' => 'Peterbilt',
406
+	'1YV' => 'Mazda (AutoAlliance International)',
407
+	'1ZV' => 'Ford (AutoAlliance International)',
408
+	'2A4' => 'Chrysler',
409
+	'2BP' => 'Bombardier Recreational Products',
410
+	'2B3' => 'Dodge',
411
+	'2B7' => 'Dodge',
412
+	'2C3' => 'Chrysler',
413
+	'2CN' => 'CAMI',
414
+	'2D3' => 'Dodge',
415
+	'2FA' => 'Ford Motor Company',
416
+	'2FB' => 'Ford Motor Company',
417
+	'2FC' => 'Ford Motor Company',
418
+	'2FM' => 'Ford Motor Company',
419
+	'2FT' => 'Ford Motor Company',
420
+	'2FU' => 'Freightliner',
421
+	'2FV' => 'Freightliner',
422
+	'2FZ' => 'Sterling',
423
+	'2Gx' => 'General Motors',
424
+	'2G1' => 'Chevrolet',
425
+	'2G2' => 'Pontiac',
426
+	'2G3' => 'Oldsmobile',
427
+	'2G4' => 'Buick',
428
+	'2G9' => 'Gnome Homes',
429
+	'2HG' => 'Honda',
430
+	'2HK' => 'Honda',
431
+	'2HJ' => 'Honda',
432
+	'2HM' => 'Hyundai',
433
+	'2M'  => 'Mercury',
434
+	'2NV' => 'Nova Bus',
435
+	'2P3' => 'Plymouth',
436
+	'2T'  => 'Toyota',
437
+	'2TP' => 'Triple E LTD',
438
+	'2V4' => 'Volkswagen',
439
+	'2V8' => 'Volkswagen',
440
+	'2WK' => 'Western Star',
441
+	'2WL' => 'Western Star',
442
+	'2WM' => 'Western Star',
443
+	'3C4' => 'Chrysler',
444
+	'3D3' => 'Dodge',
445
+	'3D4' => 'Dodge',
446
+	'3FA' => 'Ford Motor Company',
447
+	'3FE' => 'Ford Motor Company',
448
+	'3G'  => 'General Motors',
449
+	'3H'  => 'Honda',
450
+	'3JB' => 'BRP (all-terrain vehicles)',
451
+	'3MD' => 'Mazda',
452
+	'3MZ' => 'Mazda',
453
+	'3N'  => 'Nissan',
454
+	'3P3' => 'Plymouth',
455
+	'3VW' => 'Volkswagen',
456
+	'4F'  => 'Mazda',
457
+	'4JG' => 'Mercedes-Benz',
458
+	'4M'  => 'Mercury',
459
+	'4RK' => 'Nova Bus',
460
+	'4S'  => 'Subaru-Isuzu Automotive',
461
+	'4T'  => 'Toyota',
462
+	'4T9' => 'Lumen Motors',
463
+	'4UF' => 'Arctic Cat Inc.',
464
+	'4US' => 'BMW',
465
+	'4UZ' => 'Frt-Thomas Bus',
466
+	'4V1' => 'Volvo',
467
+	'4V2' => 'Volvo',
468
+	'4V3' => 'Volvo',
469
+	'4V4' => 'Volvo',
470
+	'4V5' => 'Volvo',
471
+	'4V6' => 'Volvo',
472
+	'4VL' => 'Volvo',
473
+	'4VM' => 'Volvo',
474
+	'4VZ' => 'Volvo',
475
+	'538' => 'Zero Motorcycles',
476
+	'5F'  => 'Honda Alabama',
477
+	'5J'  => 'Honda Ohio',
478
+	'5L'  => 'Lincoln',
479
+	'5N1' => 'Nissan',
480
+	'5NP' => 'Hyundai',
481
+	'5T'  => 'Toyota - trucks',
482
+	'5YJ' => 'Tesla, Inc.',
483
+	'6AB' => 'MAN',
484
+	'6F4' => 'Nissan Motor Company',
485
+	'6F5' => 'Kenworth',
486
+	'6FP' => 'Ford Motor Company',
487
+	'6G1' => 'General Motors-Holden (post Nov 2002)',
488
+	'6G2' => 'Pontiac (GTO & G8)',
489
+	'6H8' => 'General Motors-Holden (pre Nov 2002)',
490
+	'6MM' => 'Mitsubishi Motors',
491
+	'6T1' => 'Toyota Motor Corporation',
492
+	'6U9' => 'Privately Imported car',
493
+	'8AD' => 'Peugeot',
494
+	'8AF' => 'Ford Motor Company',
495
+	'8AG' => 'Chevrolet',
496
+	'8AJ' => 'Toyota',
497
+	'8AK' => 'Suzuki',
498
+	'8AP' => 'Fiat',
499
+	'8AW' => 'Volkswagen',
500
+	'8A1' => 'Renault',
501
+	'8GD' => 'Peugeot',
502
+	'8GG' => 'Chevrolet',
503
+	'935' => 'Citroën',
504
+	'936' => 'Peugeot',
505
+	'93H' => 'Honda',
506
+	'93R' => 'Toyota',
507
+	'93U' => 'Audi',
508
+	'93V' => 'Audi',
509
+	'93X' => 'Mitsubishi Motors',
510
+	'93Y' => 'Renault',
511
+	'94D' => 'Nissan',
512
+	'9BD' => 'Fiat',
513
+	'9BF' => 'Ford Motor Company',
514
+	'9BG' => 'Chevrolet',
515
+	'9BM' => 'Mercedes-Benz',
516
+	'9BR' => 'Toyota',
517
+	'9BS' => 'Scania',
518
+	'9BW' => 'Volkswagen',
519
+	'9FB' => 'Renault',
520
+	'WB1' => 'BMW Motorrad of North America',
521 521
 ];
Please login to merge, or discard this patch.