Ubuntu commited on
Commit
1468869
Β·
1 Parent(s): 5507b03

added items

Browse files
core/config.py CHANGED
@@ -15,170 +15,1581 @@ SIMPLE_MODEL_PATH = "./simple_autogluon_models"
15
  DATA_DIR = "./data"
16
 
17
  # Define structured make-model data for dynamic dropdowns
 
18
  MAKE_MODEL_DATA = {
19
- "Toyota": [
20
- "Camry",
21
- "Corolla",
22
- "HiAce",
23
- "Hilux",
24
- "Kluger",
25
- "Landcruiser",
26
- "Landcruiser Prado",
27
- "Prius V",
28
- "RAV4",
29
- "Yaris",
30
- "Yaris Cross"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  ],
32
  "Audi": [
 
 
 
 
 
 
 
 
 
 
33
  "Q3",
34
- "SQ7",
35
- "TT"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  ],
37
- "BMW": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  "125I",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  "5",
40
- "M2"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  ],
42
  "Fiat": [
43
  "500",
44
  "500C",
45
- "Ducato"
 
 
 
 
 
 
 
 
 
 
 
46
  ],
47
  "Ford": [
 
 
 
 
 
 
 
48
  "Everest",
 
 
 
49
  "F150",
 
 
 
 
 
 
50
  "Falcon",
 
51
  "Fiesta",
 
 
 
 
 
 
 
 
 
 
52
  "Ranger",
53
- "Territory"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  ],
55
- "GWM": [
56
- "Haval H6"
 
 
 
 
 
57
  ],
58
  "Great Wall": [
59
- "Steed"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  ],
61
  "Holden": [
 
 
 
 
 
 
62
  "Calais",
 
63
  "Captiva",
 
64
  "Colorado",
65
  "Colorado 7",
 
66
  "Commodore",
 
67
  "Cruze",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  "Trax",
69
- "UTE"
 
 
 
70
  ],
71
  "Honda": [
72
- "CR-V"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  ],
74
  "Hyundai": [
75
  "Accent",
76
  "Elantra",
 
 
 
 
 
 
77
  "I30",
78
- "IX35",
 
79
  "Iload",
 
 
 
 
 
80
  "Kona",
81
- "Santa FE",
 
 
 
 
 
 
 
 
 
82
  "Tucson",
83
- "Veloster"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  ],
85
  "Isuzu": [
86
- "D-MAX"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  ],
88
  "Jaguar": [
89
- "E-Pace"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  ],
91
  "Jeep": [
92
- "Grand Cherokee"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  ],
94
  "Kia": [
 
95
  "Cerato",
 
 
 
 
 
 
 
96
  "Optima",
 
 
 
 
 
97
  "Sorento",
98
- "Sportage"
 
 
 
 
99
  ],
100
- "LDV": [
101
- "D90",
102
- "Deliver 9"
 
 
 
 
 
 
 
 
 
 
103
  ],
104
  "Land Rover": [
105
- "Discovery Sport"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  ],
107
- "MG": [
108
- "MG3 Auto"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  ],
110
  "Mazda": [
 
 
 
111
  "3",
 
112
  "6",
113
- "BT-50",
114
- "CX-3",
115
- "CX-30",
116
- "CX-5",
117
- "CX-9",
118
- "MX-5"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  ],
120
  "Mercedes-Benz": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  "C180",
 
 
 
 
 
 
 
 
122
  "C250",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  "E350",
124
- "EQS",
125
- "GL320",
126
- "GLC250",
127
- "SL400",
128
- "Sprinter"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  ],
130
  "Mini": [
131
- "3D Hatch"
 
 
 
 
 
 
 
 
 
 
 
132
  ],
133
  "Mitsubishi": [
134
- "ASX",
 
 
 
 
 
 
 
 
135
  "Eclipse Cross",
 
 
 
 
 
 
136
  "Lancer",
 
 
 
 
137
  "Outlander",
 
 
138
  "Pajero Sport",
139
- "Triton"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  ],
141
  "Nissan": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  "Maxima",
 
 
143
  "Navara",
 
 
 
 
 
144
  "Pathfinder",
145
  "Patrol",
 
146
  "Qashqai",
 
 
 
147
  "Skyline",
148
- "X-Trail"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  ],
150
  "Porsche": [
 
 
 
 
151
  "Cayenne",
152
- "Macan"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  ],
154
  "Renault": [
 
155
  "Captur",
156
- "Megane"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  ],
158
  "Skoda": [
159
- "Octavia"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  ],
161
  "Subaru": [
 
 
 
162
  "Forester",
163
  "Impreza",
 
 
164
  "Liberty",
165
- "XV"
 
 
 
 
 
 
 
166
  ],
167
  "Suzuki": [
 
 
 
 
 
 
 
 
168
  "Jimny",
169
- "Swift"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
  ],
171
  "Volkswagen": [
172
  "Amarok",
 
 
 
 
 
 
 
 
 
 
173
  "Golf",
 
 
 
 
 
174
  "Polo",
175
- "T-ROC",
176
- "Tiguan"
 
 
 
 
 
 
 
177
  ],
178
  "Volvo": [
179
- "XC40",
180
- "XC60"
181
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  }
183
 
184
  # Extract makes list for dropdown
 
15
  DATA_DIR = "./data"
16
 
17
  # Define structured make-model data for dynamic dropdowns
18
+ # Auto-generated MAKE_MODEL_DATA from extract_makes_models_clean.py
19
  MAKE_MODEL_DATA = {
20
+ "Abarth": [
21
+ "124",
22
+ "500",
23
+ "500E",
24
+ "595",
25
+ "595C",
26
+ "695",
27
+ ],
28
+ "Alfa Romeo": [
29
+ "147",
30
+ "156",
31
+ "159",
32
+ "4C",
33
+ "Brera",
34
+ "Giulia",
35
+ "Giulietta",
36
+ "Gt",
37
+ "Mito",
38
+ "Spider",
39
+ "Stelvio",
40
+ "Tonale",
41
+ ],
42
+ "Alpine": [
43
+ "110",
44
+ ],
45
+ "Aston Martin": [
46
+ "Db7",
47
+ "Db9",
48
+ "Dbx",
49
+ "Rapide",
50
+ "V8",
51
+ "Vantage",
52
+ ],
53
+ "Atlantic Caravans": [
54
+ "Columbus",
55
  ],
56
  "Audi": [
57
+ "A1",
58
+ "A3",
59
+ "A4",
60
+ "A5",
61
+ "A6",
62
+ "A7",
63
+ "A8",
64
+ "Allroad Quattro",
65
+ "E-Tron",
66
+ "Q2",
67
  "Q3",
68
+ "Q4 E-Tron",
69
+ "Q5",
70
+ "Q7",
71
+ "Q8",
72
+ "R8",
73
+ "Rs 3",
74
+ "Rs 4",
75
+ "Rs 5",
76
+ "Rs 6",
77
+ "Rs 7",
78
+ "Rs Q3",
79
+ "Rs Q8",
80
+ "Rs3",
81
+ "Rs4",
82
+ "Rs5",
83
+ "Rs6",
84
+ "S1",
85
+ "S3",
86
+ "S4",
87
+ "S5",
88
+ "S6",
89
+ "S7",
90
+ "S8",
91
+ "Sq2",
92
+ "Sq5",
93
+ "Sq5 Plus",
94
+ "Sq7",
95
+ "Sq8",
96
+ "Sq8 E-Tron",
97
+ "Tt",
98
  ],
99
+ "Bentley": [
100
+ "Bentayga",
101
+ "Continental",
102
+ "Flying Spur",
103
+ "Mulsanne",
104
+ "S2",
105
+ ],
106
+ "Bmw": [
107
+ "1",
108
+ "1 Series",
109
+ "116I",
110
+ "118D",
111
+ "118I",
112
+ "120I",
113
+ "123D",
114
  "125I",
115
+ "128Ti",
116
+ "130I",
117
+ "2",
118
+ "2 Series",
119
+ "218D",
120
+ "218I",
121
+ "220D",
122
+ "220I",
123
+ "225I",
124
+ "228I",
125
+ "230I",
126
+ "3",
127
+ "3 Series",
128
+ "316I",
129
+ "318D",
130
+ "318I",
131
+ "318Is",
132
+ "320D",
133
+ "320I",
134
+ "323",
135
+ "323Ci",
136
+ "323I",
137
+ "325Ci",
138
+ "325I",
139
+ "328I",
140
+ "328I Gt",
141
+ "330Ci",
142
+ "330D",
143
+ "330I",
144
+ "335I",
145
+ "340I",
146
+ "4",
147
+ "420D",
148
+ "420I",
149
+ "428I",
150
+ "430I",
151
+ "435I",
152
+ "440I",
153
  "5",
154
+ "5 Series",
155
+ "520D",
156
+ "520I",
157
+ "525E",
158
+ "525I",
159
+ "528I",
160
+ "530D",
161
+ "530I",
162
+ "535D",
163
+ "535I",
164
+ "540I",
165
+ "550I",
166
+ "6",
167
+ "620D",
168
+ "630I",
169
+ "640I",
170
+ "645Ci",
171
+ "650Ci",
172
+ "650I",
173
+ "7",
174
+ "730D",
175
+ "735I",
176
+ "740I",
177
+ "750I",
178
+ "8 Series",
179
+ "840I",
180
+ "850I",
181
+ "I3",
182
+ "I4",
183
+ "I5",
184
+ "I8",
185
+ "Ix",
186
+ "Ix1",
187
+ "Ix2",
188
+ "Ix3",
189
+ "M",
190
+ "M135I",
191
+ "M140I",
192
+ "M2",
193
+ "M235I",
194
+ "M240I",
195
+ "M3",
196
+ "M4",
197
+ "M440I",
198
+ "M5",
199
+ "M6",
200
+ "M850I",
201
+ "Other",
202
+ "X1",
203
+ "X2",
204
+ "X3",
205
+ "X4",
206
+ "X5",
207
+ "X6",
208
+ "X7",
209
+ "Xm",
210
+ "Z3",
211
+ "Z4",
212
+ ],
213
+ "Bmw Alpina": [
214
+ "Xb7",
215
+ ],
216
+ "Bncu": [
217
+ "Drifter",
218
+ ],
219
+ "Bobcat": [
220
+ "463",
221
+ ],
222
+ "Boeing Trailer": [
223
+ "Boeing",
224
+ ],
225
+ "Brabham": [
226
+ "Bt16",
227
+ ],
228
+ "Byd": [
229
+ "Atto 3",
230
+ "Dolphin",
231
+ "E6",
232
+ "Seal",
233
+ ],
234
+ "Cadillac": [
235
+ "De Ville",
236
+ "Eldorado",
237
+ ],
238
+ "Camel Camper Trailer": [
239
+ "Nomad",
240
+ ],
241
+ "Carribean": [
242
+ "Jaguar",
243
+ ],
244
+ "Chery": [
245
+ "J11",
246
+ "J3",
247
+ "Omoda 5",
248
+ "Omoda5",
249
+ "Tiggo 7 Pro",
250
+ "Tiggo 8 Pro Max",
251
+ ],
252
+ "Chevrolet": [
253
+ "Bel Air",
254
+ "Camaro",
255
+ "Corvette",
256
+ "El Camino",
257
+ "Fleetline",
258
+ "Silverado",
259
+ "Silverado Hd",
260
+ ],
261
+ "Chrysler": [
262
+ "300",
263
+ "300C",
264
+ "Crossfire",
265
+ "Gladiator",
266
+ "Grand Voyager",
267
+ "Pt Cruiser",
268
+ "Regal",
269
+ "Sebring",
270
+ "Valiant",
271
+ ],
272
+ "Citroen": [
273
+ "Berlingo",
274
+ "Berlingo Ii",
275
+ "C2",
276
+ "C3",
277
+ "C4",
278
+ "C4 Cactus",
279
+ "C4 Picasso",
280
+ "C5",
281
+ "C5 Aircross",
282
+ "Ds3",
283
+ "Ds4",
284
+ "Ds5",
285
+ "Grand C4",
286
+ "Grand C4 Picasso",
287
+ "Xsara",
288
+ ],
289
+ "Crownline": [
290
+ "19Ss",
291
+ ],
292
+ "Cupra": [
293
+ "Ateca",
294
+ "Born",
295
+ "Formentor",
296
+ "Leon",
297
+ ],
298
+ "Daewoo": [
299
+ "Lanos",
300
+ ],
301
+ "Daihatsu": [
302
+ "Atrai",
303
+ "Charade",
304
+ "Copen",
305
+ "Cuore",
306
+ "Hi Jet",
307
+ "Hi-Jet",
308
+ "Hijet",
309
+ "Midget Ii",
310
+ "Rocky",
311
+ "Taft",
312
+ "Terios",
313
+ ],
314
+ "Daimler": [
315
+ "250",
316
+ "Sovereign",
317
+ ],
318
+ "Datsun": [
319
+ "1200",
320
+ "Stanza",
321
+ ],
322
+ "De Tomaso": [
323
+ "Longchamp",
324
+ ],
325
+ "Dodge": [
326
+ "Caliber",
327
+ "Challenger",
328
+ "Journey",
329
+ "Nitro",
330
+ "Ram",
331
+ "Viper",
332
+ ],
333
+ "Ducati": [
334
+ "Hypermotard 821",
335
+ ],
336
+ "Easytow": [
337
+ "Trailer",
338
+ ],
339
+ "Eunos": [
340
+ "30",
341
+ "30X",
342
+ ],
343
+ "Ferrari": [
344
+ "328",
345
+ "348",
346
+ "360",
347
+ "458",
348
+ "488",
349
+ "California",
350
+ "F355",
351
+ "F430",
352
+ "F8 Tributo",
353
+ "Gtc4",
354
+ "Mondial",
355
+ "Roma",
356
+ "Superamerica",
357
  ],
358
  "Fiat": [
359
  "500",
360
  "500C",
361
+ "500E",
362
+ "500X",
363
+ "Doblo",
364
+ "Ducato",
365
+ "Freemont",
366
+ "Panda",
367
+ "Punto",
368
+ "Ritmo",
369
+ "Scudo",
370
+ ],
371
+ "Flight Craft": [
372
+ "Flight Craft By Malibu",
373
  ],
374
  "Ford": [
375
+ "Bronco",
376
+ "Courier",
377
+ "E-Transit",
378
+ "Econovan",
379
+ "Ecosport",
380
+ "Endura",
381
+ "Escape",
382
  "Everest",
383
+ "Explorer",
384
+ "F -150",
385
+ "F100",
386
  "F150",
387
+ "F150 Lariat",
388
+ "F250",
389
+ "F350",
390
+ "F450",
391
+ "Fairlane",
392
+ "Fairmont",
393
  "Falcon",
394
+ "Festiva",
395
  "Fiesta",
396
+ "Focus",
397
+ "Fpv",
398
+ "G6",
399
+ "Ka",
400
+ "Kuga",
401
+ "Laser",
402
+ "Ltd",
403
+ "Mondeo",
404
+ "Mustang",
405
+ "Puma",
406
  "Ranger",
407
+ "Telstar",
408
+ "Territory",
409
+ "Transit",
410
+ "Transit Custom",
411
+ "Transit Van",
412
+ ],
413
+ "Foton": [
414
+ "Aumark",
415
+ "Sauvana",
416
+ "Tunland",
417
+ "View Cs2",
418
+ ],
419
+ "Fpv": [
420
+ "F6",
421
+ "Gs",
422
+ "Gt",
423
+ "Gt-P",
424
+ "Super Pursuit",
425
+ ],
426
+ "Fuso": [
427
+ "Canter",
428
+ "Fighter",
429
+ ],
430
+ "Genesis": [
431
+ "G70",
432
+ "G80",
433
+ "Gv70",
434
+ "Gv80",
435
  ],
436
+ "Gmc": [
437
+ "3500",
438
+ "Other",
439
+ "Sierra",
440
+ ],
441
+ "Gmsv": [
442
+ "Corvette",
443
  ],
444
  "Great Wall": [
445
+ "Steed",
446
+ "V200",
447
+ "V240",
448
+ "X200",
449
+ "X240",
450
+ ],
451
+ "Gwm": [
452
+ "Cannon Alpha",
453
+ "Haval H6",
454
+ "Haval H6Gt",
455
+ "Haval Jolion",
456
+ "Ora",
457
+ "Steed",
458
+ "Tank 300",
459
+ "Tank 500",
460
+ "Ute",
461
+ ],
462
+ "Harley Davidson": [
463
+ "Hard Tail",
464
+ "Roadster",
465
+ ],
466
+ "Haval": [
467
+ "H2",
468
+ "H6",
469
+ "H6Gt",
470
+ "H8",
471
+ "H9",
472
+ "Jolion",
473
+ ],
474
+ "Hino": [
475
+ "300",
476
+ "300 Series",
477
+ "500 Series",
478
+ "Dutro",
479
+ "Gh Super Eagle",
480
+ "Other",
481
+ "Ranger",
482
  ],
483
  "Holden": [
484
+ "Acadia",
485
+ "Adventra",
486
+ "Astra",
487
+ "Barina",
488
+ "Barina Spark",
489
+ "Berlina",
490
  "Calais",
491
+ "Caprice",
492
  "Captiva",
493
+ "Cascada",
494
  "Colorado",
495
  "Colorado 7",
496
+ "Combo",
497
  "Commodore",
498
+ "Crewman",
499
  "Cruze",
500
+ "Cruze Equipe",
501
+ "Epica",
502
+ "Equinox",
503
+ "Frontera",
504
+ "Hg",
505
+ "Hz",
506
+ "Insignia",
507
+ "Jackaroo",
508
+ "Kingswood",
509
+ "Malibu",
510
+ "Monaro",
511
+ "Other",
512
+ "Rodeo",
513
+ "Sandman",
514
+ "Spark",
515
+ "Statesman",
516
+ "Tigra",
517
+ "Torana",
518
+ "Trailblazer",
519
  "Trax",
520
+ "Ute",
521
+ "Vectra",
522
+ "Viva",
523
+ "Volt",
524
  ],
525
  "Honda": [
526
+ "Accord",
527
+ "Accord Euro",
528
+ "Acty",
529
+ "Beat",
530
+ "Cbr",
531
+ "City",
532
+ "Civic",
533
+ "Cr-V",
534
+ "Cr-Z",
535
+ "Crx",
536
+ "Fit",
537
+ "Fit Shuttle",
538
+ "Hr-V",
539
+ "Insight",
540
+ "Integra",
541
+ "Jazz",
542
+ "Legend",
543
+ "Mdx",
544
+ "N-Box",
545
+ "N-One",
546
+ "Odyssey",
547
+ "Other",
548
+ "Prelude",
549
+ "S2000",
550
+ "S660",
551
+ "Shuttle",
552
+ "Vezel",
553
+ "Zr-V",
554
+ ],
555
+ "Hsv": [
556
+ "Avalanche",
557
+ "Clubsport",
558
+ "Colorado",
559
+ "Coupe",
560
+ "Grange",
561
+ "Gts",
562
+ "Gtsr",
563
+ "Gtsr Maloo",
564
+ "Maloo",
565
+ "Manta",
566
+ "Other",
567
+ "Senator",
568
+ ],
569
+ "Hummer": [
570
+ "H3",
571
+ ],
572
+ "Hyosung": [
573
+ "Gt650R",
574
  ],
575
  "Hyundai": [
576
  "Accent",
577
  "Elantra",
578
+ "Elantra Lavita",
579
+ "Excel",
580
+ "Genesis",
581
+ "Getz",
582
+ "Grandeur",
583
+ "I20",
584
  "I30",
585
+ "I40",
586
+ "I45",
587
  "Iload",
588
+ "Imax",
589
+ "Ioniq",
590
+ "Ioniq 5",
591
+ "Ioniq 6",
592
+ "Ix35",
593
  "Kona",
594
+ "Lantra",
595
+ "Mighty",
596
+ "Palisade",
597
+ "Santa Fe",
598
+ "Sonata",
599
+ "Staria",
600
+ "Staria Load",
601
+ "Terracan",
602
+ "Tiburon",
603
+ "Trajet",
604
  "Tucson",
605
+ "Veloster",
606
+ "Venue",
607
+ ],
608
+ "Indian": [
609
+ "Touring",
610
+ ],
611
+ "Ineos": [
612
+ "Grenadier",
613
+ ],
614
+ "Infiniti": [
615
+ "Fx30D",
616
+ "G37",
617
+ "M37",
618
+ "Q30",
619
+ "Q50",
620
+ "Q70",
621
+ "Qx30",
622
+ "Qx70",
623
+ "Qx80",
624
+ ],
625
+ "International": [
626
+ "Acco",
627
  ],
628
  "Isuzu": [
629
+ "200",
630
+ "550 Long",
631
+ "D-Max",
632
+ "Frr500",
633
+ "Fts",
634
+ "Mu-X",
635
+ "Nkr200",
636
+ "Nnr",
637
+ "Npr",
638
+ "Npr 200",
639
+ "Nqr",
640
+ "Nqr N5",
641
+ "Other",
642
+ ],
643
+ "Iveco": [
644
+ "Daily",
645
+ "Eurocargo",
646
  ],
647
  "Jaguar": [
648
+ "E Type",
649
+ "E-Pace",
650
+ "F-Pace",
651
+ "F-Type",
652
+ "I-Pace",
653
+ "Mk Ii",
654
+ "S Type",
655
+ "Sovereign",
656
+ "V12",
657
+ "X Type",
658
+ "Xe",
659
+ "Xf",
660
+ "Xj",
661
+ "Xj6",
662
+ "Xj8",
663
+ "Xjr",
664
+ "Xjsc",
665
+ "Xk",
666
+ "Xk8",
667
+ "Xkr",
668
+ ],
669
+ "Jayco": [
670
+ "Eagle",
671
  ],
672
  "Jeep": [
673
+ "Cherokee",
674
+ "Commander",
675
+ "Compass",
676
+ "Gladiator",
677
+ "Grand Cherokee",
678
+ "Grand Cherokee L",
679
+ "Patriot",
680
+ "Renegade",
681
+ "Wrangler",
682
+ "Wrangler Unlimited",
683
+ ],
684
+ "Jensen": [
685
+ "Interceptor",
686
+ ],
687
+ "Jmc": [
688
+ "Conquer",
689
+ "Vigus",
690
  ],
691
  "Kia": [
692
+ "Carnival",
693
  "Cerato",
694
+ "Ev6",
695
+ "Ev9",
696
+ "Grand Carnival",
697
+ "K2700",
698
+ "K2900",
699
+ "Magentis",
700
+ "Niro",
701
  "Optima",
702
+ "Picanto",
703
+ "Pregio",
704
+ "Rio",
705
+ "Rondo",
706
+ "Seltos",
707
  "Sorento",
708
+ "Soul",
709
+ "Spectra",
710
+ "Sportage",
711
+ "Stinger",
712
+ "Stonic",
713
  ],
714
+ "Kobelco": [
715
+ "Sk09Sr",
716
+ ],
717
+ "Koda": [
718
+ "Karoq",
719
+ ],
720
+ "Lamborghini": [
721
+ "Aventador",
722
+ "Countach",
723
+ "Espada",
724
+ "Gallardo",
725
+ "Huracan",
726
+ "Urus",
727
  ],
728
  "Land Rover": [
729
+ "Defender",
730
+ "Discovery",
731
+ "Discovery 3",
732
+ "Discovery 4",
733
+ "Discovery Sport",
734
+ "Freelander",
735
+ "Freelander 2",
736
+ "Other",
737
+ "Range Rover",
738
+ "Range Rover Autobiograph",
739
+ "Range Rover Evoque",
740
+ "Range Rover Fifty",
741
+ "Range Rover Sport",
742
+ "Range Rover Velar",
743
+ "Series 1",
744
+ ],
745
+ "Ldv": [
746
+ "D90",
747
+ "Deliver 9",
748
+ "Delivery9",
749
+ "Edeliver 7",
750
+ "Et60",
751
+ "G10",
752
+ "Mifa",
753
+ "Mifa 9",
754
+ "T60",
755
+ "T60 Max",
756
+ "V80",
757
  ],
758
+ "Lexus": [
759
+ "Ct",
760
+ "Ct 200H",
761
+ "Ct 200H. Hybrid",
762
+ "Ct200H",
763
+ "Es250",
764
+ "Es300",
765
+ "Es300H",
766
+ "Es350",
767
+ "Gs250",
768
+ "Gs300",
769
+ "Gs300H",
770
+ "Gs350",
771
+ "Gs430",
772
+ "Gs450H",
773
+ "Gs460",
774
+ "Hs",
775
+ "Hs250H Hybrid",
776
+ "Is",
777
+ "Is F",
778
+ "Is200",
779
+ "Is200T",
780
+ "Is250",
781
+ "Is250C",
782
+ "Is300",
783
+ "Is300H",
784
+ "Is350",
785
+ "Lc500",
786
+ "Lm",
787
+ "Ls430",
788
+ "Ls460",
789
+ "Ls460L",
790
+ "Ls500",
791
+ "Ls500H",
792
+ "Lx",
793
+ "Lx450D",
794
+ "Lx470",
795
+ "Lx500D",
796
+ "Lx570",
797
+ "Lx600",
798
+ "Nx",
799
+ "Nx200T",
800
+ "Nx250",
801
+ "Nx300",
802
+ "Nx300H",
803
+ "Nx350",
804
+ "Nx350H",
805
+ "Rc F",
806
+ "Rc200T",
807
+ "Rc350",
808
+ "Rx",
809
+ "Rx200T",
810
+ "Rx270",
811
+ "Rx300",
812
+ "Rx330",
813
+ "Rx350",
814
+ "Rx350H",
815
+ "Rx350L",
816
+ "Rx400H",
817
+ "Rx450H",
818
+ "Rx450Hl",
819
+ "Rx500H",
820
+ "Rz",
821
+ "Rz450E",
822
+ "Sc430",
823
+ "Ux",
824
+ "Ux200",
825
+ "Ux250H",
826
+ "Ux300E",
827
+ ],
828
+ "Leyland": [
829
+ "Mini",
830
+ ],
831
+ "Lotus": [
832
+ "Elise",
833
+ "Exige",
834
+ "Super 7",
835
+ ],
836
+ "Mahindra": [
837
+ "Other",
838
+ "Pik-Up",
839
+ "Scorpio",
840
+ "Scorpio-N",
841
+ "Xuv500",
842
+ "Xuv700",
843
+ ],
844
+ "Maserati": [
845
+ "Ghibli",
846
+ "Grancabrio",
847
+ "Granturismo",
848
+ "Grecale",
849
+ "Levante",
850
+ "Mc20",
851
+ "Quattroporte",
852
+ ],
853
+ "Mastercraft": [
854
+ "X15",
855
  ],
856
  "Mazda": [
857
+ "1000",
858
+ "121",
859
+ "2",
860
  "3",
861
+ "323",
862
  "6",
863
+ "626",
864
+ "929",
865
+ "Axela",
866
+ "B2500",
867
+ "B2600",
868
+ "B4000",
869
+ "Bravo",
870
+ "Bt-50",
871
+ "Cx-3",
872
+ "Cx-30",
873
+ "Cx-5",
874
+ "Cx-60",
875
+ "Cx-7",
876
+ "Cx-8",
877
+ "Cx-9",
878
+ "Cx-90",
879
+ "Cx30",
880
+ "E2000",
881
+ "E2500",
882
+ "Mazda2",
883
+ "Mazda3",
884
+ "Mazda6",
885
+ "Mpv",
886
+ "Mx-30",
887
+ "Mx-5",
888
+ "Mx6",
889
+ "Rx-7",
890
+ "Rx-8",
891
+ "Rx7",
892
+ "Tribute",
893
+ ],
894
+ "Mclaren": [
895
+ "570S",
896
+ "650S",
897
+ "720S",
898
+ ],
899
+ "Mer": [
900
+ "Gle450 Amg 4M C",
901
+ ],
902
+ "Mercedes": [
903
+ "Sprinter",
904
+ ],
905
+ "Mercedes Benz": [
906
+ "Sprinter",
907
+ ],
908
+ "Mercedes-Amg": [
909
+ "A45",
910
+ "C",
911
+ "Cla",
912
+ "E",
913
+ "G",
914
+ "Gla",
915
+ "Glb",
916
+ "Glc",
917
+ "Gle",
918
+ "Gls",
919
+ "Gt",
920
  ],
921
  "Mercedes-Benz": [
922
+ "190",
923
+ "250",
924
+ "280",
925
+ "280Se",
926
+ "300",
927
+ "300Sl",
928
+ "380",
929
+ "420",
930
+ "450",
931
+ "500",
932
+ "560",
933
+ "560Sl",
934
+ "A-Class",
935
+ "A150",
936
+ "A160",
937
+ "A170",
938
+ "A180",
939
+ "A200",
940
+ "A250",
941
+ "A35",
942
+ "A45",
943
+ "B-Class",
944
+ "B180",
945
+ "B200",
946
+ "B250",
947
+ "C",
948
+ "C-Class",
949
  "C180",
950
+ "C200",
951
+ "C200 Cdi",
952
+ "C200 Cgi",
953
+ "C200 Kompressor",
954
+ "C220",
955
+ "C220 Cdi",
956
+ "C230",
957
+ "C240",
958
  "C250",
959
+ "C280",
960
+ "C300",
961
+ "C320",
962
+ "C320 Cdi",
963
+ "C350",
964
+ "C43",
965
+ "C55",
966
+ "C63",
967
+ "Cl-Class",
968
+ "Cl500",
969
+ "Cl55",
970
+ "Cla",
971
+ "Cla-Class",
972
+ "Cla180",
973
+ "Cla200",
974
+ "Cla250",
975
+ "Cla35",
976
+ "Cla45",
977
+ "Clc",
978
+ "Clc200",
979
+ "Clc200 Kompressor",
980
+ "Clk-Class",
981
+ "Clk200",
982
+ "Clk200K",
983
+ "Clk240",
984
+ "Clk280",
985
+ "Clk320",
986
+ "Clk350",
987
+ "Clk500",
988
+ "Clk55",
989
+ "Clk63",
990
+ "Cls",
991
+ "Cls-Class",
992
+ "Cls250",
993
+ "Cls350",
994
+ "Cls400",
995
+ "Cls500",
996
+ "Cls63",
997
+ "E-Class",
998
+ "E200",
999
+ "E200K",
1000
+ "E220",
1001
+ "E240",
1002
+ "E250",
1003
+ "E250 Cdi",
1004
+ "E250 Cgi",
1005
+ "E270",
1006
+ "E280",
1007
+ "E300",
1008
+ "E320",
1009
  "E350",
1010
+ "E400",
1011
+ "E43",
1012
+ "E450",
1013
+ "E500",
1014
+ "E53",
1015
+ "E55",
1016
+ "E62",
1017
+ "E63",
1018
+ "Eqa",
1019
+ "Eqb",
1020
+ "Eqc",
1021
+ "Eqe",
1022
+ "Eqe53",
1023
+ "Eqs",
1024
+ "Eqs53",
1025
+ "G",
1026
+ "G-Class",
1027
+ "G63",
1028
+ "Gl",
1029
+ "Gl-Class",
1030
+ "Gl320",
1031
+ "Gl350",
1032
+ "Gl450",
1033
+ "Gl500",
1034
+ "Gl63",
1035
+ "Gla",
1036
+ "Gla-Class",
1037
+ "Gla180",
1038
+ "Gla200",
1039
+ "Gla220",
1040
+ "Gla250",
1041
+ "Gla35",
1042
+ "Gla45",
1043
+ "Glb",
1044
+ "Glb-Class",
1045
+ "Glb35",
1046
+ "Glc",
1047
+ "Glc-Class",
1048
+ "Glc200",
1049
+ "Glc220",
1050
+ "Glc250",
1051
+ "Glc300",
1052
+ "Glc350",
1053
+ "Glc43",
1054
+ "Glc63",
1055
+ "Gle",
1056
+ "Gle-Class",
1057
+ "Gle-Class C167",
1058
+ "Gle250",
1059
+ "Gle300",
1060
+ "Gle350",
1061
+ "Gle400",
1062
+ "Gle43",
1063
+ "Gle450",
1064
+ "Gle500",
1065
+ "Gle53",
1066
+ "Gle63",
1067
+ "Gls",
1068
+ "Gls-Class",
1069
+ "Gls350",
1070
+ "Gls500",
1071
+ "Gls63",
1072
+ "Gt",
1073
+ "Gt63",
1074
+ "M-Class",
1075
+ "Maybach",
1076
+ "Mb100",
1077
+ "Ml",
1078
+ "Ml250",
1079
+ "Ml270",
1080
+ "Ml280",
1081
+ "Ml300",
1082
+ "Ml300 Cdi",
1083
+ "Ml320",
1084
+ "Ml350",
1085
+ "Ml400",
1086
+ "Ml500",
1087
+ "Ml63",
1088
+ "R",
1089
+ "R350",
1090
+ "S-Class",
1091
+ "S300",
1092
+ "S320",
1093
+ "S350",
1094
+ "S400",
1095
+ "S450",
1096
+ "S450E",
1097
+ "S500",
1098
+ "S560",
1099
+ "S600",
1100
+ "S600 L",
1101
+ "S63",
1102
+ "Sl",
1103
+ "Sl320",
1104
+ "Sl350",
1105
+ "Sl400",
1106
+ "Sl500",
1107
+ "Sl55",
1108
+ "Sl63",
1109
+ "Slc",
1110
+ "Slc180",
1111
+ "Slc200",
1112
+ "Slk",
1113
+ "Slk-Class",
1114
+ "Slk200",
1115
+ "Slk230",
1116
+ "Slk250",
1117
+ "Slk350",
1118
+ "Slk55",
1119
+ "Sprinter",
1120
+ "V",
1121
+ "V220",
1122
+ "V250",
1123
+ "Valente",
1124
+ "Viano",
1125
+ "Vito",
1126
+ "X",
1127
+ "X250",
1128
+ "X350",
1129
+ ],
1130
+ "Mg": [
1131
+ "3",
1132
+ "6 Plus",
1133
+ "F",
1134
+ "Gs",
1135
+ "Hs",
1136
+ "Hs Plus Ev",
1137
+ "Mg3",
1138
+ "Mg3 Auto",
1139
+ "Mg4",
1140
+ "Mg5",
1141
+ "Mg6",
1142
+ "Mg6 Plus",
1143
+ "Mgb",
1144
+ "Zs",
1145
+ "Zs Ev",
1146
+ "Zst",
1147
  ],
1148
  "Mini": [
1149
+ "3D Hatch",
1150
+ "5D Hatch",
1151
+ "Cabrio",
1152
+ "Clubman",
1153
+ "Convertible",
1154
+ "Cooper",
1155
+ "Countryman",
1156
+ "Coupe",
1157
+ "Hatch",
1158
+ "One",
1159
+ "Paceman",
1160
+ "Roadster",
1161
  ],
1162
  "Mitsubishi": [
1163
+ "3000Gt",
1164
+ "380",
1165
+ "Airtrek",
1166
+ "Asx",
1167
+ "Canter",
1168
+ "Challenger",
1169
+ "Colt",
1170
+ "Delica",
1171
+ "Eclipse",
1172
  "Eclipse Cross",
1173
+ "Express",
1174
+ "Fe649",
1175
+ "Fuso",
1176
+ "Glx",
1177
+ "Grandis",
1178
+ "I-Miev",
1179
  "Lancer",
1180
+ "Magna",
1181
+ "Mirage",
1182
+ "Nimbus",
1183
+ "Other",
1184
  "Outlander",
1185
+ "Pajero",
1186
+ "Pajero Mini",
1187
  "Pajero Sport",
1188
+ "Rosa",
1189
+ "System.Data.Datarowview",
1190
+ "Triton",
1191
+ "Verada",
1192
+ ],
1193
+ "Mitsubishi Fuso": [
1194
+ "Canter",
1195
+ "Other",
1196
+ ],
1197
+ "Morgan": [
1198
+ "Aero 8",
1199
+ "Plus 8",
1200
+ "Roadster",
1201
+ ],
1202
+ "Morris": [
1203
+ "Major",
1204
  ],
1205
  "Nissan": [
1206
+ "300Zx",
1207
+ "350Z",
1208
+ "370Z",
1209
+ "Almera",
1210
+ "Altima",
1211
+ "Atlas",
1212
+ "Aura",
1213
+ "Caravan",
1214
+ "Caravan Nv350",
1215
+ "Cube",
1216
+ "Dualis",
1217
+ "E-Nv200",
1218
+ "El Grand",
1219
+ "El Grande",
1220
+ "Elgrand",
1221
+ "Figaro",
1222
+ "Gt-R",
1223
+ "Juke",
1224
+ "Kicks",
1225
+ "Leaf",
1226
  "Maxima",
1227
+ "Micra",
1228
+ "Murano",
1229
  "Navara",
1230
+ "Note",
1231
+ "Nv200",
1232
+ "Nv350",
1233
+ "Nvdp4Tast225",
1234
+ "Other",
1235
  "Pathfinder",
1236
  "Patrol",
1237
+ "Pulsar",
1238
  "Qashqai",
1239
+ "R35 Gt-R",
1240
+ "Serena",
1241
+ "Silvia",
1242
  "Skyline",
1243
+ "Stagea",
1244
+ "Tiida",
1245
+ "Titan",
1246
+ "Vanette",
1247
+ "X-Trail",
1248
+ "Xtrail St-L Ts 2 Wagon",
1249
+ "Z",
1250
+ ],
1251
+ "Opel": [
1252
+ "Astra",
1253
+ "Corsa",
1254
+ "Insignia",
1255
+ "Zafira",
1256
+ ],
1257
+ "Packard": [
1258
+ "120",
1259
+ ],
1260
+ "Peugeot": [
1261
+ "2008",
1262
+ "206",
1263
+ "207",
1264
+ "208",
1265
+ "3008",
1266
+ "307",
1267
+ "308",
1268
+ "4007",
1269
+ "4008",
1270
+ "405",
1271
+ "406",
1272
+ "407",
1273
+ "408",
1274
+ "5008",
1275
+ "508",
1276
+ "Boxer",
1277
+ "E-2008",
1278
+ "E-Partner",
1279
+ "Expert",
1280
+ "Partner",
1281
+ "Rcz",
1282
+ ],
1283
+ "Polestar": [
1284
+ "2",
1285
+ ],
1286
+ "Pontiac": [
1287
+ "Firebird",
1288
+ "Gto",
1289
+ "Parisienne",
1290
  ],
1291
  "Porsche": [
1292
+ "356",
1293
+ "718",
1294
+ "911",
1295
+ "Boxster",
1296
  "Cayenne",
1297
+ "Cayman",
1298
+ "Macan",
1299
+ "Panamera",
1300
+ "Taycan",
1301
+ ],
1302
+ "Pride": [
1303
+ "Ssr 1800",
1304
+ ],
1305
+ "Proton": [
1306
+ "Gen.2",
1307
+ "Jumbuck",
1308
+ "Persona",
1309
+ "Preve",
1310
+ "Satria",
1311
+ ],
1312
+ "Ram": [
1313
+ "1500",
1314
+ "2500",
1315
+ "Laramie",
1316
+ ],
1317
+ "Range Rover": [
1318
+ "Evoque",
1319
+ "Range Rover",
1320
+ "Velar",
1321
+ ],
1322
+ "Rcr": [
1323
+ "Superlite",
1324
  ],
1325
  "Renault": [
1326
+ "Arkana",
1327
  "Captur",
1328
+ "Clio",
1329
+ "Fluence",
1330
+ "Kadjar",
1331
+ "Kangoo",
1332
+ "Koleos",
1333
+ "Laguna",
1334
+ "Latitude",
1335
+ "Master",
1336
+ "Megane",
1337
+ "Megane E-Tech",
1338
+ "Megane Hatch 5Dr",
1339
+ "Scenic",
1340
+ "Scenic Ii",
1341
+ "Trafic",
1342
+ ],
1343
+ "Rolls-Royce": [
1344
+ "Corniche",
1345
+ "Ghost",
1346
+ "Phantom",
1347
+ "Silver",
1348
+ "Silver Spirit",
1349
+ "Wraith",
1350
+ ],
1351
+ "Rover": [
1352
+ "75",
1353
+ "Mini",
1354
+ ],
1355
+ "Saab": [
1356
+ "9-Mar",
1357
+ "9-May",
1358
+ "900",
1359
+ ],
1360
+ "Sea Doo": [
1361
+ "Gti",
1362
+ ],
1363
+ "Seadoo": [
1364
+ "Fishpro 155",
1365
+ ],
1366
+ "Seat": [
1367
+ "250 Slx",
1368
  ],
1369
  "Skoda": [
1370
+ "Fabia",
1371
+ "Kamiq",
1372
+ "Karoq",
1373
+ "Kodiaq",
1374
+ "Octavia",
1375
+ "Rapid",
1376
+ "Rapid Spaceback",
1377
+ "Roomster",
1378
+ "Scala",
1379
+ "Superb",
1380
+ "Yeti",
1381
+ ],
1382
+ "Smart": [
1383
+ "Fortwo",
1384
+ ],
1385
+ "Ssangyong": [
1386
+ "Actyon",
1387
+ "Actyon Sports",
1388
+ "Korando",
1389
+ "Kyron",
1390
+ "Musso",
1391
+ "Musso Xlv",
1392
+ "Rexton",
1393
+ "Stavic",
1394
+ "Tivoli",
1395
  ],
1396
  "Subaru": [
1397
+ "Brumby",
1398
+ "Brz",
1399
+ "Crosstrek",
1400
  "Forester",
1401
  "Impreza",
1402
+ "Legacy",
1403
+ "Levorg",
1404
  "Liberty",
1405
+ "Other",
1406
+ "Outback",
1407
+ "Sambar",
1408
+ "Solterra",
1409
+ "Tribeca",
1410
+ "Wrx",
1411
+ "Wrx Premium",
1412
+ "Xv",
1413
  ],
1414
  "Suzuki": [
1415
+ "Alto",
1416
+ "Apv",
1417
+ "Baleno",
1418
+ "Carry",
1419
+ "Celerio",
1420
+ "Every",
1421
+ "Grand Vitara",
1422
+ "Ignis",
1423
  "Jimny",
1424
+ "Kizashi",
1425
+ "Liana",
1426
+ "S-Cross",
1427
+ "Sierra",
1428
+ "Spacia Custom",
1429
+ "Swift",
1430
+ "Sx4",
1431
+ "Vitara",
1432
+ "Volusia",
1433
+ "X-90",
1434
+ "Xl-7",
1435
+ ],
1436
+ "Tata": [
1437
+ "Xenon",
1438
+ ],
1439
+ "Tesla": [
1440
+ "Model 3",
1441
+ "Model S",
1442
+ "Model X",
1443
+ "Model Y",
1444
+ ],
1445
+ "Toro": [
1446
+ "Workman",
1447
+ ],
1448
+ "Toyota": [
1449
+ "4 Runner",
1450
+ "86",
1451
+ "Alphard",
1452
+ "Altezza",
1453
+ "Aristo",
1454
+ "Aurion",
1455
+ "Avalon",
1456
+ "Avensis",
1457
+ "Axio",
1458
+ "Bb",
1459
+ "Blade",
1460
+ "C-Hr",
1461
+ "Camry",
1462
+ "Celica",
1463
+ "Century",
1464
+ "Chaser",
1465
+ "Coaster",
1466
+ "Corolla",
1467
+ "Corolla Cross",
1468
+ "Corona",
1469
+ "Crown",
1470
+ "Crown Crossover",
1471
+ "Dyna",
1472
+ "Echo",
1473
+ "Esquire",
1474
+ "Estima",
1475
+ "Estima T",
1476
+ "Fielder",
1477
+ "Fj Cruiser",
1478
+ "Fortuner",
1479
+ "Gr Corolla",
1480
+ "Gr Yaris",
1481
+ "Gr86",
1482
+ "Grand Hiace",
1483
+ "Granvia",
1484
+ "Hiace",
1485
+ "Hiace Camper",
1486
+ "Hiace Regius",
1487
+ "Hilux",
1488
+ "Hilux Surf",
1489
+ "Kluger",
1490
+ "Landcruiser",
1491
+ "Landcruiser 70 Series",
1492
+ "Landcruiser Prado",
1493
+ "Lexcen",
1494
+ "Mark Ii",
1495
+ "Mark X",
1496
+ "Mr2",
1497
+ "Noah",
1498
+ "Other",
1499
+ "Porte",
1500
+ "Prado",
1501
+ "Prius",
1502
+ "Prius C",
1503
+ "Prius V",
1504
+ "Prius-C",
1505
+ "Probox",
1506
+ "Ractis",
1507
+ "Raize",
1508
+ "Rav4",
1509
+ "Regius",
1510
+ "Rukus",
1511
+ "Sai",
1512
+ "Sienta",
1513
+ "Soarer",
1514
+ "Spacia",
1515
+ "Spade",
1516
+ "Starlet",
1517
+ "Supra",
1518
+ "Tarago",
1519
+ "Townace",
1520
+ "Tundra",
1521
+ "Vellfire",
1522
+ "Vienta",
1523
+ "Vitz",
1524
+ "Voxy",
1525
+ "Yaris",
1526
+ "Yaris Cross",
1527
+ ],
1528
+ "Trailer And Tractor": [
1529
+ "East Wind Tractor",
1530
+ ],
1531
+ "Trd": [
1532
+ "Hilux",
1533
+ ],
1534
+ "Triumph": [
1535
+ "2500",
1536
+ "Thruxton",
1537
+ "Tr",
1538
  ],
1539
  "Volkswagen": [
1540
  "Amarok",
1541
+ "Arteon",
1542
+ "Beetle",
1543
+ "Bora",
1544
+ "Caddy",
1545
+ "Caddy 5",
1546
+ "California",
1547
+ "Caravelle",
1548
+ "Cc",
1549
+ "Crafter",
1550
+ "Eos",
1551
  "Golf",
1552
+ "Jetta",
1553
+ "Kombi",
1554
+ "Multivan",
1555
+ "Passat",
1556
+ "Passat Cc",
1557
  "Polo",
1558
+ "Scirocco",
1559
+ "T-Cross",
1560
+ "T-Roc",
1561
+ "Tiguan",
1562
+ "Touareg",
1563
+ "Transporter",
1564
+ ],
1565
+ "Volkwagen": [
1566
+ "Crafter 35",
1567
  ],
1568
  "Volvo": [
1569
+ "8",
1570
+ "940",
1571
+ "C30",
1572
+ "C40",
1573
+ "C70",
1574
+ "Ex30",
1575
+ "S40",
1576
+ "S60",
1577
+ "S80",
1578
+ "S90",
1579
+ "V40",
1580
+ "V50",
1581
+ "V60",
1582
+ "V60 Cross Country",
1583
+ "V70",
1584
+ "Xc40",
1585
+ "Xc60",
1586
+ "Xc70",
1587
+ "Xc90",
1588
+ ],
1589
+ "Yamaha": [
1590
+ "Golf Buggy",
1591
+ "Mt-09",
1592
+ ],
1593
  }
1594
 
1595
  # Extract makes list for dropdown
core/matcher.py CHANGED
@@ -295,9 +295,9 @@ class CarDealerMatcher:
295
  self.data_files = []
296
 
297
  def search_data_files(self, keyword_search=None, make=None, model=None, year_min=None, year_max=None,
298
- year_value=None, year_range=None,
299
  body_type=None, fuel_type=None, max_odometer=None,
300
- odometer_value=None, odometer_range=None,
301
  max_price=None, selected_file=None, max_results=100, show_dealer_stats=True):
302
  """Search through CSV data files using pandas filtering"""
303
  try:
@@ -362,13 +362,11 @@ class CarDealerMatcher:
362
  if model and 'model' in df.columns:
363
  df = df[df['model'].astype(str).str.contains(model, case=False, na=False)]
364
 
365
- # Handle year filtering - prioritize range-based search over min/max search
366
- if year_value is not None and year_range is not None and 'manu_year' in df.columns:
367
- # Symmetric range search: year_value Β± year_range
368
- min_year = year_value - year_range
369
- max_year_range = year_value + year_range
370
  year_numeric = pd.to_numeric(df['manu_year'], errors='coerce')
371
- df = df[(year_numeric >= min_year) & (year_numeric <= max_year_range)]
372
  elif year_min and 'manu_year' in df.columns:
373
  df = df[pd.to_numeric(df['manu_year'], errors='coerce') >= year_min]
374
  elif year_max and 'manu_year' in df.columns:
@@ -380,13 +378,11 @@ class CarDealerMatcher:
380
  if fuel_type and 'vehicle_fuel_type' in df.columns:
381
  df = df[df['vehicle_fuel_type'].astype(str).str.contains(fuel_type, case=False, na=False)]
382
 
383
- # Handle odometer filtering - prioritize range-based search over max search
384
- if odometer_value is not None and odometer_range is not None and 'odometer' in df.columns:
385
- # Symmetric range search: odometer_value Β± odometer_range
386
- min_odometer = odometer_value - odometer_range
387
- max_odometer_range = odometer_value + odometer_range
388
  odometer_numeric = pd.to_numeric(df['odometer'], errors='coerce')
389
- df = df[(odometer_numeric >= min_odometer) & (odometer_numeric <= max_odometer_range)]
390
  elif max_odometer and 'odometer' in df.columns:
391
  # Fallback to max odometer filter if range search not specified
392
  df = df[pd.to_numeric(df['odometer'], errors='coerce') <= max_odometer]
 
295
  self.data_files = []
296
 
297
  def search_data_files(self, keyword_search=None, make=None, model=None, year_min=None, year_max=None,
298
+ year_from=None, year_to=None,
299
  body_type=None, fuel_type=None, max_odometer=None,
300
+ odometer_from=None, odometer_to=None,
301
  max_price=None, selected_file=None, max_results=100, show_dealer_stats=True):
302
  """Search through CSV data files using pandas filtering"""
303
  try:
 
362
  if model and 'model' in df.columns:
363
  df = df[df['model'].astype(str).str.contains(model, case=False, na=False)]
364
 
365
+ # Handle year filtering - prioritize from/to range search over min/max search
366
+ if year_from is not None and year_to is not None and 'manu_year' in df.columns:
367
+ # Direct range search: year_from to year_to
 
 
368
  year_numeric = pd.to_numeric(df['manu_year'], errors='coerce')
369
+ df = df[(year_numeric >= year_from) & (year_numeric <= year_to)]
370
  elif year_min and 'manu_year' in df.columns:
371
  df = df[pd.to_numeric(df['manu_year'], errors='coerce') >= year_min]
372
  elif year_max and 'manu_year' in df.columns:
 
378
  if fuel_type and 'vehicle_fuel_type' in df.columns:
379
  df = df[df['vehicle_fuel_type'].astype(str).str.contains(fuel_type, case=False, na=False)]
380
 
381
+ # Handle odometer filtering - prioritize from/to range search over max search
382
+ if odometer_from is not None and odometer_to is not None and 'odometer' in df.columns:
383
+ # Direct range search: odometer_from to odometer_to
 
 
384
  odometer_numeric = pd.to_numeric(df['odometer'], errors='coerce')
385
+ df = df[(odometer_numeric >= odometer_from) & (odometer_numeric <= odometer_to)]
386
  elif max_odometer and 'odometer' in df.columns:
387
  # Fallback to max odometer filter if range search not specified
388
  df = df[pd.to_numeric(df['odometer'], errors='coerce') <= max_odometer]
ui/interface.py CHANGED
@@ -12,27 +12,46 @@ def update_models(make):
12
  """Update model choices based on selected make"""
13
  if make in MAKE_MODEL_DATA:
14
  models = MAKE_MODEL_DATA[make]
15
- return gr.Dropdown(choices=models, value=models[0] if models else None)
 
 
16
  else:
17
- return gr.Dropdown(choices=[], value=None)
18
 
19
 
20
  def predict_dealers_interface(matcher, make, model, year, body_type, fuel_type, transmission,
21
  odometer, doors, seats, engine_size, power, cylinders,
22
  safety_rating, drive_type, segment, condition, selected_model):
23
  """Interface function for detailed Gradio prediction"""
24
- return matcher.predict_dealers(make, model, year, body_type, fuel_type, transmission,
25
- odometer, doors, seats, engine_size, power, cylinders,
26
- safety_rating, drive_type, segment, condition, selected_model)
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
 
29
  def simple_predict_dealers_interface(matcher, simple_make, simple_model, simple_year,
30
  simple_odometer, simple_model_selection):
31
  """Simple interface function for Gradio with conditional parameters"""
 
 
 
 
32
 
33
  return matcher.predict_dealers(
34
- make=simple_make,
35
- model=simple_model,
36
  year=simple_year,
37
  body_type=None,
38
  fuel_type=None,
@@ -47,18 +66,27 @@ def simple_predict_dealers_interface(matcher, simple_make, simple_model, simple_
47
  drive_type=None,
48
  segment=None,
49
  condition=None,
50
- selected_model=simple_model_selection
51
  )
52
 
53
 
54
- def search_data_interface(matcher, keyword_search, make, model, year_value, year_range, body_type, fuel_type,
55
- odometer_value, odometer_range, max_price, selected_file, max_results, show_dealer_stats):
56
  """Interface function for traditional data search"""
57
- message, result_data = matcher.search_data_files(keyword_search=keyword_search, make=make, model=model, year_min=None, year_max=None,
58
- year_value=year_value, year_range=year_range,
59
- body_type=body_type, fuel_type=fuel_type, max_odometer=None,
60
- odometer_value=odometer_value, odometer_range=odometer_range,
61
- max_price=max_price, selected_file=selected_file,
 
 
 
 
 
 
 
 
 
62
  max_results=max_results, show_dealer_stats=show_dealer_stats)
63
 
64
  if isinstance(result_data, pd.DataFrame) and result_data.empty:
@@ -83,25 +111,29 @@ def search_data_interface(matcher, keyword_search, make, model, year_value, year
83
  return message, "No results to display", ""
84
 
85
 
86
- def simple_search_data_interface(matcher, keyword_search, make, model, year_value, year_range, odometer_value, odometer_range, selected_file,
87
  max_results, show_dealer_stats):
88
  """Interface function for simple traditional data search"""
 
 
 
 
89
 
90
  message, result_data = matcher.search_data_files(
91
  keyword_search=keyword_search,
92
- make=make,
93
- model=model,
94
  year_min=None,
95
  year_max=None,
96
- year_value=year_value,
97
- year_range=year_range,
98
  body_type=None, # Not used in simple search
99
  fuel_type=None, # Not used in simple search
100
  max_odometer=None, # Not using max_odometer anymore
101
- odometer_value=odometer_value,
102
- odometer_range=odometer_range,
103
  max_price=None, # Not used in simple search
104
- selected_file=selected_file,
105
  max_results=max_results,
106
  show_dealer_stats=show_dealer_stats
107
  )
 
12
  """Update model choices based on selected make"""
13
  if make in MAKE_MODEL_DATA:
14
  models = MAKE_MODEL_DATA[make]
15
+ # Add ALL option at the beginning
16
+ models_with_all = ["ALL"] + models
17
+ return gr.Dropdown(choices=models_with_all, value="ALL")
18
  else:
19
+ return gr.Dropdown(choices=["ALL"], value="ALL")
20
 
21
 
22
  def predict_dealers_interface(matcher, make, model, year, body_type, fuel_type, transmission,
23
  odometer, doors, seats, engine_size, power, cylinders,
24
  safety_rating, drive_type, segment, condition, selected_model):
25
  """Interface function for detailed Gradio prediction"""
26
+ # Handle placeholder values - convert to None for backend processing
27
+ processed_make = None if make == "Select Make" else make
28
+ processed_model = None if model == "ALL" else model # Convert ALL to None for all models
29
+ processed_body_type = None if body_type == "Select Body Type" else body_type
30
+ processed_fuel_type = None if fuel_type == "Select Fuel Type" else fuel_type
31
+ processed_transmission = None if transmission == "Select Transmission" else transmission
32
+ processed_drive_type = None if drive_type == "Select Drive Type" else drive_type
33
+ processed_segment = None if segment == "Select Segment" else segment
34
+ processed_condition = None if condition == "Select Condition" else condition
35
+ processed_selected_model = None if selected_model == "Select AI Model" else selected_model
36
+
37
+ return matcher.predict_dealers(processed_make, processed_model, year, processed_body_type,
38
+ processed_fuel_type, processed_transmission, odometer, doors,
39
+ seats, engine_size, power, cylinders, safety_rating,
40
+ processed_drive_type, processed_segment, processed_condition,
41
+ processed_selected_model)
42
 
43
 
44
  def simple_predict_dealers_interface(matcher, simple_make, simple_model, simple_year,
45
  simple_odometer, simple_model_selection):
46
  """Simple interface function for Gradio with conditional parameters"""
47
+ # Handle placeholder values - convert to None for backend processing
48
+ processed_make = None if simple_make == "Select Make" else simple_make
49
+ processed_model = None if simple_model == "ALL" else simple_model # Convert ALL to None for all models
50
+ processed_model_selection = None if simple_model_selection == "Select AI Model" else simple_model_selection
51
 
52
  return matcher.predict_dealers(
53
+ make=processed_make,
54
+ model=processed_model,
55
  year=simple_year,
56
  body_type=None,
57
  fuel_type=None,
 
66
  drive_type=None,
67
  segment=None,
68
  condition=None,
69
+ selected_model=processed_model_selection
70
  )
71
 
72
 
73
+ def search_data_interface(matcher, keyword_search, make, model, year_from, year_to, body_type, fuel_type,
74
+ odometer_from, odometer_to, max_price, selected_file, max_results, show_dealer_stats):
75
  """Interface function for traditional data search"""
76
+ # Handle placeholder values - convert to None for backend processing
77
+ processed_make = None if make == "Select Make" else make
78
+ processed_model = None if model == "ALL" else model # Convert ALL to None for all models
79
+ processed_body_type = None if body_type == "Select Body Type" else body_type
80
+ processed_fuel_type = None if fuel_type == "Select Fuel Type" else fuel_type
81
+ processed_selected_file = None if selected_file == "Select File" else selected_file
82
+
83
+ message, result_data = matcher.search_data_files(keyword_search=keyword_search, make=processed_make,
84
+ model=processed_model, year_min=None, year_max=None,
85
+ year_from=year_from, year_to=year_to,
86
+ body_type=processed_body_type, fuel_type=processed_fuel_type,
87
+ max_odometer=None, odometer_from=odometer_from,
88
+ odometer_to=odometer_to, max_price=max_price,
89
+ selected_file=processed_selected_file,
90
  max_results=max_results, show_dealer_stats=show_dealer_stats)
91
 
92
  if isinstance(result_data, pd.DataFrame) and result_data.empty:
 
111
  return message, "No results to display", ""
112
 
113
 
114
+ def simple_search_data_interface(matcher, keyword_search, make, model, year_from, year_to, odometer_from, odometer_to, selected_file,
115
  max_results, show_dealer_stats):
116
  """Interface function for simple traditional data search"""
117
+ # Handle placeholder values - convert to None for backend processing
118
+ processed_make = None if make == "Select Make" else make
119
+ processed_model = None if model == "ALL" else model # Convert ALL to None for all models
120
+ processed_selected_file = None if selected_file == "Select File" else selected_file
121
 
122
  message, result_data = matcher.search_data_files(
123
  keyword_search=keyword_search,
124
+ make=processed_make,
125
+ model=processed_model,
126
  year_min=None,
127
  year_max=None,
128
+ year_from=year_from,
129
+ year_to=year_to,
130
  body_type=None, # Not used in simple search
131
  fuel_type=None, # Not used in simple search
132
  max_odometer=None, # Not using max_odometer anymore
133
+ odometer_from=odometer_from,
134
+ odometer_to=odometer_to,
135
  max_price=None, # Not used in simple search
136
+ selected_file=processed_selected_file,
137
  max_results=max_results,
138
  show_dealer_stats=show_dealer_stats
139
  )
ui/tabs/detailed_tab.py CHANGED
@@ -18,10 +18,11 @@ def create_detailed_tab(matcher):
18
 
19
  # Model Selection Section
20
  with gr.Row():
 
21
  model_selection = gr.Dropdown(
22
- choices=matcher.available_models if matcher.model_loaded else ['Model not loaded'],
23
  label="πŸ€– Select AI Model",
24
- value=matcher.available_models[0] if matcher.available_models else 'Model not loaded',
25
  info="WeightedEnsemble_L3 provides the best overall performance",
26
  scale=2
27
  )
@@ -40,15 +41,16 @@ def create_detailed_tab(matcher):
40
  with gr.Column(scale=1):
41
  gr.Markdown("### πŸš— Basic Vehicle Information")
42
 
 
43
  make = gr.Dropdown(
44
- choices=CAR_MAKES,
45
  label="Make",
46
- value=DEFAULT_VALUES['make']
47
  )
48
  model = gr.Dropdown(
49
- choices=MAKE_MODEL_DATA[DEFAULT_VALUES['make']],
50
  label="Model",
51
- value=DEFAULT_VALUES['model']
52
  )
53
  year = gr.Number(
54
  label="Year",
@@ -56,25 +58,28 @@ def create_detailed_tab(matcher):
56
  minimum=1990,
57
  maximum=2025
58
  )
 
59
  condition = gr.Dropdown(
60
- choices=CONDITIONS,
61
  label="Condition",
62
- value=DEFAULT_VALUES['condition']
63
  )
64
 
65
  # Body & Style
66
  with gr.Column(scale=1):
67
  gr.Markdown("### πŸ—οΈ Body & Style")
68
 
 
69
  body_type = gr.Dropdown(
70
- choices=BODY_TYPES,
71
  label="Body Type",
72
- value=DEFAULT_VALUES['body_type']
73
  )
 
74
  segment = gr.Dropdown(
75
- choices=SEGMENTS,
76
  label="Vehicle Segment",
77
- value=DEFAULT_VALUES['segment']
78
  )
79
  doors = gr.Number(
80
  label="Doors",
@@ -93,15 +98,17 @@ def create_detailed_tab(matcher):
93
  with gr.Column(scale=1):
94
  gr.Markdown("### ⚑ Engine & Performance")
95
 
 
96
  fuel_type = gr.Dropdown(
97
- choices=FUEL_TYPES,
98
  label="Fuel Type",
99
- value=DEFAULT_VALUES['fuel_type']
100
  )
 
101
  transmission = gr.Dropdown(
102
- choices=TRANSMISSION_TYPES,
103
  label="Transmission",
104
- value=DEFAULT_VALUES['transmission']
105
  )
106
  engine_size = gr.Number(
107
  label="Engine Size (L)",
@@ -127,10 +134,11 @@ def create_detailed_tab(matcher):
127
  minimum=50,
128
  maximum=1000
129
  )
 
130
  drive_type = gr.Dropdown(
131
- choices=DRIVE_TYPES,
132
  label="Drive Type",
133
- value=DEFAULT_VALUES['drive_type']
134
  )
135
  safety_rating = gr.Number(
136
  label="Safety Rating (1-5)",
 
18
 
19
  # Model Selection Section
20
  with gr.Row():
21
+ ai_model_choices = ["Select AI Model"] + (matcher.available_models if matcher.model_loaded else ['Model not loaded'])
22
  model_selection = gr.Dropdown(
23
+ choices=ai_model_choices,
24
  label="πŸ€– Select AI Model",
25
+ value="Select AI Model",
26
  info="WeightedEnsemble_L3 provides the best overall performance",
27
  scale=2
28
  )
 
41
  with gr.Column(scale=1):
42
  gr.Markdown("### πŸš— Basic Vehicle Information")
43
 
44
+ make_choices = ["Select Make"] + CAR_MAKES
45
  make = gr.Dropdown(
46
+ choices=make_choices,
47
  label="Make",
48
+ value="Select Make"
49
  )
50
  model = gr.Dropdown(
51
+ choices=["ALL"],
52
  label="Model",
53
+ value="ALL"
54
  )
55
  year = gr.Number(
56
  label="Year",
 
58
  minimum=1990,
59
  maximum=2025
60
  )
61
+ condition_choices = ["Select Condition"] + CONDITIONS
62
  condition = gr.Dropdown(
63
+ choices=condition_choices,
64
  label="Condition",
65
+ value="Select Condition"
66
  )
67
 
68
  # Body & Style
69
  with gr.Column(scale=1):
70
  gr.Markdown("### πŸ—οΈ Body & Style")
71
 
72
+ body_type_choices = ["Select Body Type"] + BODY_TYPES
73
  body_type = gr.Dropdown(
74
+ choices=body_type_choices,
75
  label="Body Type",
76
+ value="Select Body Type"
77
  )
78
+ segment_choices = ["Select Segment"] + SEGMENTS
79
  segment = gr.Dropdown(
80
+ choices=segment_choices,
81
  label="Vehicle Segment",
82
+ value="Select Segment"
83
  )
84
  doors = gr.Number(
85
  label="Doors",
 
98
  with gr.Column(scale=1):
99
  gr.Markdown("### ⚑ Engine & Performance")
100
 
101
+ fuel_type_choices = ["Select Fuel Type"] + FUEL_TYPES
102
  fuel_type = gr.Dropdown(
103
+ choices=fuel_type_choices,
104
  label="Fuel Type",
105
+ value="Select Fuel Type"
106
  )
107
+ transmission_choices = ["Select Transmission"] + TRANSMISSION_TYPES
108
  transmission = gr.Dropdown(
109
+ choices=transmission_choices,
110
  label="Transmission",
111
+ value="Select Transmission"
112
  )
113
  engine_size = gr.Number(
114
  label="Engine Size (L)",
 
134
  minimum=50,
135
  maximum=1000
136
  )
137
+ drive_type_choices = ["Select Drive Type"] + DRIVE_TYPES
138
  drive_type = gr.Dropdown(
139
+ choices=drive_type_choices,
140
  label="Drive Type",
141
+ value="Select Drive Type"
142
  )
143
  safety_rating = gr.Number(
144
  label="Safety Rating (1-5)",
ui/tabs/simple_search_tab.py CHANGED
@@ -16,10 +16,11 @@ def create_simple_search_tab(matcher):
16
  with gr.Row():
17
  with gr.Column(scale=1):
18
  gr.Markdown("### πŸ—‚οΈ File & Options")
 
19
  simple_search_file = gr.Dropdown(
20
- choices=matcher.data_files,
21
  label="Select CSV File",
22
- value=matcher.data_files[0] if matcher.data_files else None,
23
  info=f"Available files: {len(matcher.data_files)}"
24
  )
25
 
@@ -50,50 +51,48 @@ def create_simple_search_tab(matcher):
50
  gr.Markdown("#### Specific Filters")
51
 
52
  with gr.Row():
 
53
  simple_search_make = gr.Dropdown(
54
- choices=CAR_MAKES,
55
  label="Make",
56
- value=DEFAULT_VALUES['make'],
57
  info="Select car manufacturer"
58
  )
59
  simple_search_model = gr.Dropdown(
60
- choices=MAKE_MODEL_DATA[DEFAULT_VALUES['make']],
61
  label="Model",
62
- value=DEFAULT_VALUES['model'],
63
  info="Select car model"
64
  )
65
 
66
  with gr.Row():
67
- simple_year_value = gr.Number(
68
- label="Target Year",
69
- value=DEFAULT_VALUES['year'],
70
  minimum=1990,
71
  maximum=2025,
72
- info="Target manufacturing year"
73
  )
74
- simple_year_range = gr.Slider(
75
- minimum=0,
76
- maximum=8,
77
- value=1,
78
- step=1,
79
- label="Year Range (Β±years)",
80
- info="Range around target year"
81
  )
82
 
83
  with gr.Row():
84
- simple_odometer_value = gr.Number(
85
- label="Target Odometer (km)",
86
- value=65000,
87
  minimum=0,
88
- info="Target odometer reading"
89
  )
90
- simple_odometer_range = gr.Slider(
 
 
91
  minimum=0,
92
- maximum=100000,
93
- value=20000,
94
- step=1000,
95
- label="Odometer Range (Β±km)",
96
- info="Range around target (Β±km)"
97
  )
98
 
99
  # Simple traditional search button
@@ -103,6 +102,14 @@ def create_simple_search_tab(matcher):
103
  size="lg"
104
  )
105
 
 
 
 
 
 
 
 
 
106
  # Simple Traditional Search Results Section
107
  with gr.Row():
108
  simple_search_status = gr.Textbox(
@@ -128,21 +135,39 @@ def create_simple_search_tab(matcher):
128
  ### 🎯 Simple Search Features
129
 
130
  **πŸ” Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
131
- **Quick Setup:** Just select make, model, target year Β± range, and odometer target Β± range
132
  **Smart Defaults:** Pre-filled with popular choices
133
- **🎯 Year Range:** Set target year with ± range (e.g., 2020 ± 1 year = 2019-2021)
134
- **🎯 Odometer Range:** Set target odometer reading with ± range (e.g., 65,000 ± 20,000 km)
135
  **Same Power:** Uses the same CSV search engine as Traditional Search
136
  **Dealer Ranking:** Get dealers ranked by inventory matching your criteria
137
  **Fast Results:** Simplified interface for quicker searches
 
138
  """)
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  return {
141
- 'inputs': [simple_keyword_search, simple_search_make, simple_search_model, simple_year_value, simple_year_range,
142
- simple_odometer_value, simple_odometer_range, simple_search_file, simple_max_results,
143
  simple_show_dealer_stats],
144
  'outputs': [simple_search_status, simple_search_info, simple_search_results_table],
145
  'button': simple_search_btn,
 
 
146
  'make_dropdown': simple_search_make,
147
  'model_dropdown': simple_search_model
148
  }
 
16
  with gr.Row():
17
  with gr.Column(scale=1):
18
  gr.Markdown("### πŸ—‚οΈ File & Options")
19
+ file_choices = ["Select File"] + matcher.data_files
20
  simple_search_file = gr.Dropdown(
21
+ choices=file_choices,
22
  label="Select CSV File",
23
+ value="Select File",
24
  info=f"Available files: {len(matcher.data_files)}"
25
  )
26
 
 
51
  gr.Markdown("#### Specific Filters")
52
 
53
  with gr.Row():
54
+ make_choices = ["Select Make"] + CAR_MAKES
55
  simple_search_make = gr.Dropdown(
56
+ choices=make_choices,
57
  label="Make",
58
+ value="Select Make",
59
  info="Select car manufacturer"
60
  )
61
  simple_search_model = gr.Dropdown(
62
+ choices=["ALL"],
63
  label="Model",
64
+ value="ALL",
65
  info="Select car model"
66
  )
67
 
68
  with gr.Row():
69
+ simple_year_from = gr.Number(
70
+ label="Year From",
71
+ value=DEFAULT_VALUES['year'] - 1,
72
  minimum=1990,
73
  maximum=2025,
74
+ info="Minimum manufacturing year"
75
  )
76
+ simple_year_to = gr.Number(
77
+ label="Year To",
78
+ value=DEFAULT_VALUES['year'] + 1,
79
+ minimum=1990,
80
+ maximum=2025,
81
+ info="Maximum manufacturing year"
 
82
  )
83
 
84
  with gr.Row():
85
+ simple_odometer_from = gr.Number(
86
+ label="Odometer From (km)",
87
+ value=45000,
88
  minimum=0,
89
+ info="Minimum odometer reading"
90
  )
91
+ simple_odometer_to = gr.Number(
92
+ label="Odometer To (km)",
93
+ value=85000,
94
  minimum=0,
95
+ info="Maximum odometer reading"
 
 
 
 
96
  )
97
 
98
  # Simple traditional search button
 
102
  size="lg"
103
  )
104
 
105
+ with gr.Row():
106
+ # Reset button
107
+ simple_reset_btn = gr.Button(
108
+ "πŸ”„ Reset to Defaults",
109
+ variant="secondary",
110
+ size="sm"
111
+ )
112
+
113
  # Simple Traditional Search Results Section
114
  with gr.Row():
115
  simple_search_status = gr.Textbox(
 
135
  ### 🎯 Simple Search Features
136
 
137
  **πŸ” Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
138
+ **Quick Setup:** Just select make, model, year range (from-to), and odometer range (from-to)
139
  **Smart Defaults:** Pre-filled with popular choices
140
+ **🎯 Year Range:** Set minimum and maximum manufacturing years (e.g., 2019 to 2021)
141
+ **🎯 Odometer Range:** Set minimum and maximum odometer readings (e.g., 45,000 to 85,000 km)
142
  **Same Power:** Uses the same CSV search engine as Traditional Search
143
  **Dealer Ranking:** Get dealers ranked by inventory matching your criteria
144
  **Fast Results:** Simplified interface for quicker searches
145
+ **πŸ”„ Reset Button:** Quickly restore all fields to their default values
146
  """)
147
 
148
+ def reset_simple_search():
149
+ """Reset all simple search fields to default values"""
150
+ return (
151
+ "", # simple_keyword_search
152
+ "Select Make", # simple_search_make
153
+ "ALL", # simple_search_model
154
+ DEFAULT_VALUES['year'] - 1, # simple_year_from
155
+ DEFAULT_VALUES['year'] + 1, # simple_year_to
156
+ 45000, # simple_odometer_from
157
+ 85000, # simple_odometer_to
158
+ "Select File", # simple_search_file
159
+ DEFAULT_VALUES['max_results'], # simple_max_results
160
+ True, # simple_show_dealer_stats
161
+ )
162
+
163
  return {
164
+ 'inputs': [simple_keyword_search, simple_search_make, simple_search_model, simple_year_from, simple_year_to,
165
+ simple_odometer_from, simple_odometer_to, simple_search_file, simple_max_results,
166
  simple_show_dealer_stats],
167
  'outputs': [simple_search_status, simple_search_info, simple_search_results_table],
168
  'button': simple_search_btn,
169
+ 'reset_button': simple_reset_btn,
170
+ 'reset_function': reset_simple_search,
171
  'make_dropdown': simple_search_make,
172
  'model_dropdown': simple_search_model
173
  }
ui/tabs/simple_tab.py CHANGED
@@ -14,25 +14,27 @@ def create_simple_tab(simple_matcher):
14
  gr.Markdown("Enter just the basic details for a quick recommendation")
15
 
16
  # Model Selection for Simple Tab
 
17
  simple_model_selection = gr.Dropdown(
18
- choices=simple_matcher.available_models if simple_matcher.model_loaded else ['Model not loaded'],
19
  label="πŸ€– Select AI Model",
20
- value=simple_matcher.available_models[0] if simple_matcher.available_models else 'Model not loaded',
21
  info="WeightedEnsemble_L3 provides the best overall performance"
22
  )
23
 
24
  with gr.Row():
25
  # Basic inputs
26
  with gr.Column(scale=1):
 
27
  simple_make = gr.Dropdown(
28
- choices=CAR_MAKES,
29
  label="Make",
30
- value=DEFAULT_VALUES['make']
31
  )
32
  simple_model = gr.Dropdown(
33
- choices=MAKE_MODEL_DATA[DEFAULT_VALUES['make']],
34
  label="Model",
35
- value=DEFAULT_VALUES['model']
36
  )
37
 
38
  with gr.Column(scale=1):
 
14
  gr.Markdown("Enter just the basic details for a quick recommendation")
15
 
16
  # Model Selection for Simple Tab
17
+ ai_model_choices = ["Select AI Model"] + (simple_matcher.available_models if simple_matcher.model_loaded else ['Model not loaded'])
18
  simple_model_selection = gr.Dropdown(
19
+ choices=ai_model_choices,
20
  label="πŸ€– Select AI Model",
21
+ value="Select AI Model",
22
  info="WeightedEnsemble_L3 provides the best overall performance"
23
  )
24
 
25
  with gr.Row():
26
  # Basic inputs
27
  with gr.Column(scale=1):
28
+ make_choices = ["Select Make"] + CAR_MAKES
29
  simple_make = gr.Dropdown(
30
+ choices=make_choices,
31
  label="Make",
32
+ value="Select Make"
33
  )
34
  simple_model = gr.Dropdown(
35
+ choices=["ALL"],
36
  label="Model",
37
+ value="ALL"
38
  )
39
 
40
  with gr.Column(scale=1):
ui/tabs/traditional_tab.py CHANGED
@@ -16,10 +16,11 @@ def create_traditional_tab(matcher):
16
  with gr.Row():
17
  with gr.Column(scale=1):
18
  gr.Markdown("### πŸ—‚οΈ File Selection")
 
19
  selected_file = gr.Dropdown(
20
- choices=matcher.data_files,
21
  label="Select CSV File",
22
- value=matcher.data_files[0] if matcher.data_files else None,
23
  info=f"Available files: {len(matcher.data_files)}"
24
  )
25
 
@@ -62,20 +63,19 @@ def create_traditional_tab(matcher):
62
  )
63
 
64
  with gr.Row():
65
- year_value = gr.Number(
66
- label="Target Year",
67
- value=DEFAULT_VALUES['year'],
68
  minimum=1980,
69
  maximum=2025,
70
- info="Target manufacturing year"
71
  )
72
- year_range = gr.Slider(
73
- minimum=0,
74
- maximum=10,
75
- value=2,
76
- step=1,
77
- label="Year Range (Β±years)",
78
- info="Range around target year (e.g., Β±2 years)"
79
  )
80
 
81
  with gr.Row():
@@ -91,19 +91,17 @@ def create_traditional_tab(matcher):
91
  )
92
 
93
  with gr.Row():
94
- odometer_value = gr.Number(
95
- label="Target Odometer (km)",
96
- value=75000,
97
  minimum=0,
98
- info="Target odometer reading (center value)"
99
  )
100
- odometer_range = gr.Slider(
 
 
101
  minimum=0,
102
- maximum=100000,
103
- value=25000,
104
- step=1000,
105
- label="Odometer Range (Β±km)",
106
- info="Range around target (e.g., Β±25,000 km)"
107
  )
108
 
109
  with gr.Row():
@@ -120,6 +118,14 @@ def create_traditional_tab(matcher):
120
  size="lg"
121
  )
122
 
 
 
 
 
 
 
 
 
123
  # Traditional Search Results Section
124
  with gr.Row():
125
  search_status = gr.Textbox(
@@ -155,15 +161,15 @@ def create_traditional_tab(matcher):
155
  **πŸ” Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
156
  **πŸ“Š Dealer Ranking:** Dealers ranked by number of cars matching your criteria
157
  **πŸ† Inventory Priority:** Dealers with more matching inventory appear first
158
- **🎯 Year Range Search:** Set target year ± range (e.g., 2020 ± 2 years = 2018-2022)
159
- **🎯 Odometer Range Search:** Set target odometer value ± range (e.g., 75,000 ± 25,000 km = 50,000-100,000 km)
160
  **πŸ“ˆ Column Mapping:** Uses actual dataset columns:
161
  - **Make/Model:** `make`, `model`
162
- - **Year:** `manu_year` (searchable by target Β± range)
163
  - **Body Type:** `vehicle_body_type`
164
  - **Fuel Type:** `vehicle_fuel_type`
165
  - **Transmission:** `vehicle_transmission_type`
166
- - **Mileage:** `odometer` (searchable by target Β± range)
167
  - **Price:** `advertised_price`
168
  - **Dealer:** `dealer_trading_name`
169
  - **Location:** `dealer_city`, `dealer_state`
@@ -174,11 +180,32 @@ def create_traditional_tab(matcher):
174
  **Ranking Logic:** Dealers with more matching cars get better ranks (Rank 1 = most inventory)
175
  **Sorting:** Results sorted by dealer inventory count first, then by price
176
  **Performance:** Fast counting using pandas group operations
 
177
  """)
178
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  return {
180
- 'inputs': [keyword_search, search_make, search_model, year_value, year_range, search_body_type,
181
- search_fuel_type, odometer_value, odometer_range, max_price, selected_file, max_results, show_dealer_stats],
182
  'outputs': [search_status, search_info, search_results_table],
183
- 'button': search_btn
 
 
184
  }
 
16
  with gr.Row():
17
  with gr.Column(scale=1):
18
  gr.Markdown("### πŸ—‚οΈ File Selection")
19
+ file_choices = ["Select File"] + matcher.data_files
20
  selected_file = gr.Dropdown(
21
+ choices=file_choices,
22
  label="Select CSV File",
23
+ value="Select File",
24
  info=f"Available files: {len(matcher.data_files)}"
25
  )
26
 
 
63
  )
64
 
65
  with gr.Row():
66
+ year_from = gr.Number(
67
+ label="Year From",
68
+ value=DEFAULT_VALUES['year'] - 2,
69
  minimum=1980,
70
  maximum=2025,
71
+ info="Minimum manufacturing year"
72
  )
73
+ year_to = gr.Number(
74
+ label="Year To",
75
+ value=DEFAULT_VALUES['year'] + 2,
76
+ minimum=1980,
77
+ maximum=2025,
78
+ info="Maximum manufacturing year"
 
79
  )
80
 
81
  with gr.Row():
 
91
  )
92
 
93
  with gr.Row():
94
+ odometer_from = gr.Number(
95
+ label="Odometer From (km)",
96
+ value=50000,
97
  minimum=0,
98
+ info="Minimum odometer reading"
99
  )
100
+ odometer_to = gr.Number(
101
+ label="Odometer To (km)",
102
+ value=100000,
103
  minimum=0,
104
+ info="Maximum odometer reading"
 
 
 
 
105
  )
106
 
107
  with gr.Row():
 
118
  size="lg"
119
  )
120
 
121
+ with gr.Row():
122
+ # Reset button
123
+ reset_btn = gr.Button(
124
+ "πŸ”„ Reset to Defaults",
125
+ variant="secondary",
126
+ size="sm"
127
+ )
128
+
129
  # Traditional Search Results Section
130
  with gr.Row():
131
  search_status = gr.Textbox(
 
161
  **πŸ” Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
162
  **πŸ“Š Dealer Ranking:** Dealers ranked by number of cars matching your criteria
163
  **πŸ† Inventory Priority:** Dealers with more matching inventory appear first
164
+ **🎯 Year Range Search:** Set minimum and maximum manufacturing years (e.g., 2018 to 2022)
165
+ **🎯 Odometer Range Search:** Set minimum and maximum odometer readings (e.g., 50,000 to 100,000 km)
166
  **πŸ“ˆ Column Mapping:** Uses actual dataset columns:
167
  - **Make/Model:** `make`, `model`
168
+ - **Year:** `manu_year` (searchable by from-to range)
169
  - **Body Type:** `vehicle_body_type`
170
  - **Fuel Type:** `vehicle_fuel_type`
171
  - **Transmission:** `vehicle_transmission_type`
172
+ - **Mileage:** `odometer` (searchable by from-to range)
173
  - **Price:** `advertised_price`
174
  - **Dealer:** `dealer_trading_name`
175
  - **Location:** `dealer_city`, `dealer_state`
 
180
  **Ranking Logic:** Dealers with more matching cars get better ranks (Rank 1 = most inventory)
181
  **Sorting:** Results sorted by dealer inventory count first, then by price
182
  **Performance:** Fast counting using pandas group operations
183
+ **πŸ”„ Reset Button:** Quickly restore all fields to their default values
184
  """)
185
 
186
+ def reset_traditional_search():
187
+ """Reset all traditional search fields to default values"""
188
+ return (
189
+ "", # keyword_search
190
+ "", # search_make
191
+ "", # search_model
192
+ DEFAULT_VALUES['year'] - 2, # year_from
193
+ DEFAULT_VALUES['year'] + 2, # year_to
194
+ "", # search_body_type
195
+ "", # search_fuel_type
196
+ 50000, # odometer_from
197
+ 100000, # odometer_to
198
+ None, # max_price
199
+ "Select File", # selected_file
200
+ DEFAULT_VALUES['max_results'], # max_results
201
+ True, # show_dealer_stats
202
+ )
203
+
204
  return {
205
+ 'inputs': [keyword_search, search_make, search_model, year_from, year_to, search_body_type,
206
+ search_fuel_type, odometer_from, odometer_to, max_price, selected_file, max_results, show_dealer_stats],
207
  'outputs': [search_status, search_info, search_results_table],
208
+ 'button': search_btn,
209
+ 'reset_button': reset_btn,
210
+ 'reset_function': reset_traditional_search
211
  }
utils/helpers.py CHANGED
@@ -106,4 +106,19 @@ def setup_event_handlers(tabs_data, interface_functions, matchers):
106
  fn=interface_functions['update_models'],
107
  inputs=simple_search_tab['make_dropdown'],
108
  outputs=simple_search_tab['model_dropdown']
109
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  fn=interface_functions['update_models'],
107
  inputs=simple_search_tab['make_dropdown'],
108
  outputs=simple_search_tab['model_dropdown']
109
+ )
110
+
111
+ # Reset buttons
112
+ if 'reset_button' in simple_search_tab:
113
+ simple_search_tab['reset_button'].click(
114
+ fn=simple_search_tab['reset_function'],
115
+ inputs=[],
116
+ outputs=simple_search_tab['inputs']
117
+ )
118
+
119
+ if 'reset_button' in traditional_tab:
120
+ traditional_tab['reset_button'].click(
121
+ fn=traditional_tab['reset_function'],
122
+ inputs=[],
123
+ outputs=traditional_tab['inputs']
124
+ )