1 CAR DATASET

This car data set will provide the readers some information about the cars and all related things to cars such as reviews for the cars from multiple sources of website, fuel type which is being used by specific cars, and all other information which will enrich the knowledge about cars.

At the end of this project, I hope the reader will comprehend things that matters as what interest people to review the car, and what is other thing that leave people a good impression towards that specific car as well. Let’s wait no more and dive deep into the data :)

2 DATA PREPARATION

2.1 Import Data

car <- read.csv("CARS_1.csv")

Now the data has been imported, let’s moving onto inspect the data!

2.2 Inspect Data

head(car)
dim(car)
names(car)

After inspecting the data, we can draw us some conclusions: 1. The Data consists of 203 rows and 16 columns 2. column “car_name” consists of the names of the cars, and other columns giving out different kinds of information about specific car in each row.

2.3 Data Cleansing & Coertions

str(car)
car$seating_capacity <- as.integer(car$seating_capacity)

We’ve got all the data types as it should, we will be treating the missing values. But first, we gotta check for it whether if there is any.

2.4 Check Missing Values

colSums(is.na(car))

of all columns, we can see that there is one missing value on seating_capacity column. Now, we’re gonna treat this missing value with excluding this missing value out of the data.

car <- na.exclude(car)

after doing the data some treatment, we will re-check if the missing data has been excluded successfully.

colSums(is.na(car))
dim(car)

we see that there is no more missing value on the data in any column. as for the dimension, the total rows has been deducted one single row to 202 rows from its initial form, which was 203 rows. As the data has been cleansed and coerced, we can now proceed to process, analyze, and explain the data.

3 DATA EXPLANATION

3.1 Summarize the data set

summary(car)

From the summary of data, we can conclude several things as follows:

  1. There are 202 cars on the data

  2. The minimum rating on the single car is 3 and the maximum rating of a single car is 5. There is also the mean rating for all cars which is 4.43

  3. There is a car which only got 1 review, and there is another car which got an outstanding 2392 reviews.

  4. The seating capacity for cars on the data ranging from 2 seaters to 8 seaters.

  5. The cheapest car’s starting price is standing at 339,000 meanwhile for the most expensive car’s starting price is at an amazing price of 70,600,000

  6. The cheapest car’s ending price is at 361.000, as for the most expensive car’s end price is stood at an awesome price of 90,000,000

  7. The lowest max torque of a car by NM is 16.1, as for the highest max torque by NM is 1020.0

  8. The lowest max torque of a car by RPM is 0, as for the highest max torque by RPM is 7,000

  9. The lowest max power by BHP is 10.8 and for the highest of it is standing at 788.5

  10. The lowest max power by RP is 0 meanwhile for the highest of it is at 8,500

table(car$body_type)
  1. Based on body type, most cars on the data are the SUVs
table(car$fuel_type)
  1. Based on fuel type, most cars are the Petrol ones
table(car$transmission_type)
  1. While based on transmission type, most cars are automatic

4 WHAT PEOPLE THINK ABOUT CAR’S..

4.1 Body Type

Convertible <- (mean(car$rating[car$body_type == "Convertible"]))
Coupe <- (mean(car$rating[car$body_type == "Coupe"]))
Hatchback <- (mean(car$rating[car$body_type == "Hatchback"]))
Hybrid <- (mean(car$rating[car$body_type == "Hybrid"]))
Luxury <- (mean(car$rating[car$body_type == "Luxury"]))
Minivan <- (mean(car$rating[car$body_type == "Minivan"]))
MUV <- (mean(car$rating[car$body_type == "MUV"]))
Pickup_truck <- (mean(car$rating[car$body_type == "Pickup Truck"]))
Sedan <- (mean(car$rating[car$body_type == "Sedan"]))
SUV <- (mean(car$rating[car$body_type == "SUV"]))
Wagon <- (mean(car$rating[car$body_type == "Wagon"]))

bt_mean <- cbind(body_type=c("Convertible","Coupe","Hatchback","Hybrid","Luxury","Minivan","MUV","Pickup Truck","Sedan", "SUV","Wagon"))
bt_mean <- cbind(bt_mean,as.data.frame(c(Convertible,Coupe,Hatchback,Hybrid,Luxury,Minivan,MUV,Pickup_truck,Sedan,SUV,Wagon)))
names(bt_mean)[2] <- paste("Mean")
btmo <- bt_mean[order(bt_mean$Mean, decreasing= T),]
btmo

Based on Body Type, cars with kind of body type Coupe, Hybrid, Luxury, Minivan, MUV, Pickup Truck, and Wagon, has the best mean of rating of 4.5

4.2 Fuel Type

CNG.rev <- (mean(car$rating[car$fuel_type == "CNG"]))
Diesel.rev <- (mean(car$rating[car$fuel_type == "Diesel"]))
Electric.rev <- (mean(car$rating[car$fuel_type == "Electric"]))
Petrol.rev <- (mean(car$rating[car$fuel_type == "Petrol"]))

ft_mean <- cbind(fuel_type=c("CNG","Diesel","Electric","Petrol"))
ft_mean <- cbind(ft_mean,as.data.frame(c(CNG.rev,Diesel.rev,Electric.rev,Petrol.rev)))
names(ft_mean)[2] <- paste("Mean")
ftmo <- ft_mean[order(ft_mean$Mean, decreasing= T),]
ftmo

If we look at based on the fuel type, the best rating mean goes to Electric for the highest mean rating with slightly better than the Diesel ones

4.3 Transmission Type

AutomaticTT <- (mean(car$rating[car$transmission_type == "Automatic"]))
ManualTT <- (mean(car$rating[car$transmission_type == "Manual"]))
ElectricTT <- (mean(car$rating[car$transmission_type == "Electric"]))

tt_mean <- cbind(transmission_type=c("Automatic","Manual","Electric"))
tt_mean <- cbind(tt_mean,as.data.frame(c(AutomaticTT,ManualTT,ElectricTT)))
names(tt_mean)[2] <- paste("Mean")
ttmo <- tt_mean[order(tt_mean$Mean, decreasing= T),]
ttmo

Based on the transmission type, the best rating with the highest mean is the Electric transmission car at 4.46.

Therefore, the best car with the highest rating is Electric Transmission Coupe Car with Electricity as the Fuel.

5 SEVERAL CORRELATION BETWEEN CAR’S ATTRIBUTES AND CAR’S RATING

cor(car$max_power_rp,car$rating)
cor(car$max_torque_nm,car$rating)
cor(car$max_torque_rpm,car$rating)
cor(car$max_power_bhp,car$rating)
cor(car$no_cylinder,car$rating)
cor(car$fuel_tank_capacity,car$rating)
cor(car$seating_capacity,car$rating)

from the correlation between data above, we can conclude that no performance of a car impacts the rating given by the audience, although there is somehow a weak positive correlation between the fuel tank capacity, and the seating capacity with the car’s rating

6 PROPORTION OF CAR REVIEWED BASED ON

6.1 Fuel Type

agg1 <- aggregate(reviews_count~fuel_type,car,sum)
pie(agg1$reviews_count, agg1$fuel_type, main = "Car Reviewed Based on Fuel Type") 

The most reviewed car based on the fuel type is the Diesel car

6.2 Body Type

agg2 <- aggregate(reviews_count~body_type,car,sum)
agg22 <- agg2[order(agg2$reviews_count, decreasing=T),]
agg222 <- head(agg22)
pie(agg222$reviews_count, agg222$body_type, cex=0.5, main = "Car Reviewed Based on Body Type")

The most reviewed car based on the body type is the SUV car

6.3 Transmission Type

agg3 <- aggregate(reviews_count~transmission_type,car,sum)
pie(agg3$reviews_count, agg3$transmission_type, main = "Car Reviewed Based on Transmission Type")

The most reviewed car based on the transmission is the Automatic car

Therefore, the most reviewed car is automatic transmission SUV with Diesel as a Fuel.

7 CONCLUSION

From the Data set, we can see that the automatic transmission SUV with Diesel as a fuel has a higher chance of getting the most review by people. However, given the fact that that specific type of car is drawing people attention to put a review on it, that is not the case with how good people will give the rating to it. The best rating given is to the electric transmission Coupe car with Electricity as a fuel regardless the performances of a car. As the data correlation shown above, the performance of a car are negating every possibility to positively correlates, does not matter whether it’s the performance by how much base horse power or the torques that the car entitled. However, the seating capacity and the fuel tank capacity has a little effect to the car’s rating. This case where Electric car is preferable, could be happened related to the reason of global warming, where green energy is more preferable by most of the people all around the world.

LS0tCnRpdGxlOiAiQ2FyIgphdXRob3I6ICJTaG9sYWgiCmRhdGU6ICIyMDIyLTEwLTEwIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIHRoZW1lOiBzcGFjZWxhYgogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogVHJ1ZQogICAgdG9jX2Zsb2F0OiBUcnVlCi0tLQojIENBUiBEQVRBU0VUCiAgVGhpcyBjYXIgZGF0YSBzZXQgd2lsbCBwcm92aWRlIHRoZSByZWFkZXJzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcnMgYW5kIGFsbCByZWxhdGVkIHRoaW5ncyB0byBjYXJzIHN1Y2ggYXMgcmV2aWV3cyBmb3IgdGhlIGNhcnMgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIG9mIHdlYnNpdGUsIGZ1ZWwgdHlwZSB3aGljaCBpcyBiZWluZyB1c2VkIGJ5IHNwZWNpZmljIGNhcnMsIGFuZCBhbGwgb3RoZXIgaW5mb3JtYXRpb24gd2hpY2ggd2lsbCBlbnJpY2ggdGhlIGtub3dsZWRnZSBhYm91dCBjYXJzLiAKICAKICBBdCB0aGUgZW5kIG9mIHRoaXMgcHJvamVjdCwgSSBob3BlIHRoZSByZWFkZXIgd2lsbCBjb21wcmVoZW5kIHRoaW5ncyB0aGF0IG1hdHRlcnMgYXMgd2hhdCBpbnRlcmVzdCBwZW9wbGUgdG8gcmV2aWV3IHRoZSBjYXIsIGFuZCB3aGF0IGlzIG90aGVyIHRoaW5nIHRoYXQgbGVhdmUgcGVvcGxlIGEgZ29vZCBpbXByZXNzaW9uIHRvd2FyZHMgdGhhdCBzcGVjaWZpYyBjYXIgYXMgd2VsbC4gTGV0J3Mgd2FpdCBubyBtb3JlIGFuZCBkaXZlIGRlZXAgaW50byB0aGUgZGF0YSA6KQogIAojIERBVEEgUFJFUEFSQVRJT04KCiMjIEltcG9ydCAgRGF0YQpgYGB7cn0KY2FyIDwtIHJlYWQuY3N2KCJDQVJTXzEuY3N2IikKYGBgCk5vdyB0aGUgZGF0YSBoYXMgYmVlbiBpbXBvcnRlZCwgbGV0J3MgbW92aW5nIG9udG8gaW5zcGVjdCB0aGUgZGF0YSEKCiMjIEluc3BlY3QgRGF0YQpgYGB7cn0KaGVhZChjYXIpCmBgYApgYGB7cn0KZGltKGNhcikKYGBgCgpgYGB7cn0KbmFtZXMoY2FyKQpgYGAKQWZ0ZXIgaW5zcGVjdGluZyB0aGUgZGF0YSwgd2UgY2FuIGRyYXcgdXMgc29tZSBjb25jbHVzaW9uczoKMS4gVGhlIERhdGEgY29uc2lzdHMgb2YgMjAzIHJvd3MgYW5kIDE2IGNvbHVtbnMKMi4gY29sdW1uICJjYXJfbmFtZSIgY29uc2lzdHMgb2YgdGhlIG5hbWVzIG9mIHRoZSBjYXJzLCBhbmQgb3RoZXIgY29sdW1ucyBnaXZpbmcgb3V0IGRpZmZlcmVudCBraW5kcyBvZiAgaW5mb3JtYXRpb24gYWJvdXQgc3BlY2lmaWMgY2FyIGluIGVhY2ggcm93LiAKCiMjIERhdGEgQ2xlYW5zaW5nICYgQ29lcnRpb25zCmBgYHtyfQpzdHIoY2FyKQpgYGAKCgpgYGB7cn0KY2FyJHNlYXRpbmdfY2FwYWNpdHkgPC0gYXMuaW50ZWdlcihjYXIkc2VhdGluZ19jYXBhY2l0eSkKYGBgCldlJ3ZlIGdvdCBhbGwgdGhlIGRhdGEgdHlwZXMgYXMgaXQgc2hvdWxkLCB3ZSB3aWxsIGJlIHRyZWF0aW5nIHRoZSBtaXNzaW5nIHZhbHVlcy4gQnV0IGZpcnN0LCB3ZSBnb3R0YSBjaGVjayBmb3IgaXQgd2hldGhlciBpZiB0aGVyZSBpcyBhbnkuCgojIyBDaGVjayBNaXNzaW5nIFZhbHVlcwoKYGBge3J9CmNvbFN1bXMoaXMubmEoY2FyKSkKYGBgCm9mIGFsbCBjb2x1bW5zLCB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgaXMgb25lIG1pc3NpbmcgdmFsdWUgb24gc2VhdGluZ19jYXBhY2l0eSBjb2x1bW4uIE5vdywgd2UncmUgZ29ubmEgdHJlYXQgdGhpcyBtaXNzaW5nIHZhbHVlIHdpdGggZXhjbHVkaW5nIHRoaXMgbWlzc2luZyB2YWx1ZSBvdXQgb2YgdGhlIGRhdGEuCmBgYHtyfQpjYXIgPC0gbmEuZXhjbHVkZShjYXIpCmBgYAphZnRlciBkb2luZyB0aGUgZGF0YSBzb21lIHRyZWF0bWVudCwgd2Ugd2lsbCByZS1jaGVjayBpZiB0aGUgbWlzc2luZyBkYXRhIGhhcyBiZWVuIGV4Y2x1ZGVkIHN1Y2Nlc3NmdWxseS4KYGBge3J9CmNvbFN1bXMoaXMubmEoY2FyKSkKYGBgCmBgYHtyfQpkaW0oY2FyKQpgYGAKCndlIHNlZSB0aGF0IHRoZXJlIGlzIG5vIG1vcmUgbWlzc2luZyB2YWx1ZSBvbiB0aGUgZGF0YSBpbiBhbnkgY29sdW1uLiBhcyBmb3IgdGhlIGRpbWVuc2lvbiwgdGhlIHRvdGFsIHJvd3MgaGFzIGJlZW4gZGVkdWN0ZWQgb25lIHNpbmdsZSByb3cgdG8gMjAyIHJvd3MgZnJvbSBpdHMgaW5pdGlhbCBmb3JtLCB3aGljaCB3YXMgMjAzIHJvd3MuIEFzIHRoZSBkYXRhIGhhcyBiZWVuIGNsZWFuc2VkIGFuZCBjb2VyY2VkLCB3ZSBjYW4gbm93IHByb2NlZWQgdG8gcHJvY2VzcywgYW5hbHl6ZSwgYW5kIGV4cGxhaW4gdGhlIGRhdGEuIAoKIyBEQVRBIEVYUExBTkFUSU9OCiMjIFN1bW1hcml6ZSB0aGUgZGF0YSBzZXQKCmBgYHtyfQpzdW1tYXJ5KGNhcikKYGBgCgpGcm9tIHRoZSBzdW1tYXJ5IG9mIGRhdGEsIHdlIGNhbiBjb25jbHVkZSBzZXZlcmFsIHRoaW5ncyBhcyBmb2xsb3dzOgoKMS4gVGhlcmUgYXJlIDIwMiBjYXJzIG9uIHRoZSBkYXRhCgoyLiBUaGUgbWluaW11bSByYXRpbmcgb24gdGhlIHNpbmdsZSBjYXIgaXMgMyBhbmQgdGhlIG1heGltdW0gcmF0aW5nIG9mIGEgc2luZ2xlIGNhciBpcyA1LiBUaGVyZSBpcyBhbHNvIHRoZSBtZWFuIHJhdGluZyBmb3IgYWxsIGNhcnMgd2hpY2ggaXMgNC40MwoKMy4gVGhlcmUgaXMgYSBjYXIgd2hpY2ggb25seSBnb3QgMSByZXZpZXcsIGFuZCB0aGVyZSBpcyBhbm90aGVyIGNhciB3aGljaCBnb3QgYW4gb3V0c3RhbmRpbmcgMjM5MiByZXZpZXdzLgoKNC4gVGhlIHNlYXRpbmcgY2FwYWNpdHkgZm9yIGNhcnMgb24gdGhlIGRhdGEgcmFuZ2luZyBmcm9tIDIgc2VhdGVycyB0byA4IHNlYXRlcnMuIAoKNS4gVGhlIGNoZWFwZXN0IGNhcidzIHN0YXJ0aW5nIHByaWNlIGlzIHN0YW5kaW5nIGF0IDMzOSwwMDAgbWVhbndoaWxlIGZvciB0aGUgbW9zdCBleHBlbnNpdmUgY2FyJ3Mgc3RhcnRpbmcgcHJpY2UgaXMgYXQgYW4gYW1hemluZyBwcmljZSBvZiA3MCw2MDAsMDAwCgo2LiBUaGUgY2hlYXBlc3QgY2FyJ3MgZW5kaW5nIHByaWNlIGlzIGF0IDM2MS4wMDAsIGFzIGZvciB0aGUgbW9zdCBleHBlbnNpdmUgY2FyJ3MgZW5kIHByaWNlIGlzIHN0b29kIGF0IGFuIGF3ZXNvbWUgcHJpY2Ugb2YgOTAsMDAwLDAwMAoKNy4gVGhlIGxvd2VzdCBtYXggdG9ycXVlIG9mIGEgY2FyIGJ5IE5NIGlzIDE2LjEsIGFzIGZvciB0aGUgaGlnaGVzdCBtYXggdG9ycXVlIGJ5IE5NIGlzIDEwMjAuMAoKOC4gVGhlIGxvd2VzdCBtYXggdG9ycXVlIG9mIGEgY2FyIGJ5IFJQTSBpcyAwLCBhcyBmb3IgdGhlIGhpZ2hlc3QgbWF4IHRvcnF1ZSBieSBSUE0gaXMgNywwMDAKCjkuIFRoZSBsb3dlc3QgbWF4IHBvd2VyIGJ5IEJIUCBpcyAxMC44IGFuZCBmb3IgdGhlIGhpZ2hlc3Qgb2YgaXQgaXMgc3RhbmRpbmcgYXQgNzg4LjUKCjEwLiBUaGUgbG93ZXN0IG1heCBwb3dlciBieSBSUCBpcyAwIG1lYW53aGlsZSBmb3IgdGhlIGhpZ2hlc3Qgb2YgaXQgaXMgYXQgOCw1MDAKCmBgYHtyfQp0YWJsZShjYXIkYm9keV90eXBlKQpgYGAKMTEuIEJhc2VkIG9uIGJvZHkgdHlwZSwgbW9zdCBjYXJzIG9uIHRoZSBkYXRhIGFyZSB0aGUgU1VWcwpgYGB7cn0KdGFibGUoY2FyJGZ1ZWxfdHlwZSkKYGBgCjEyLiBCYXNlZCBvbiBmdWVsIHR5cGUsIG1vc3QgY2FycyBhcmUgdGhlIFBldHJvbCBvbmVzCmBgYHtyfQp0YWJsZShjYXIkdHJhbnNtaXNzaW9uX3R5cGUpCmBgYAoxMy4gV2hpbGUgYmFzZWQgb24gdHJhbnNtaXNzaW9uIHR5cGUsIG1vc3QgY2FycyBhcmUgYXV0b21hdGljCgoKIyBXSEFUIFBFT1BMRSBUSElOSyBBQk9VVCBDQVInUy4uCiMjIEJvZHkgVHlwZQpgYGB7cn0KQ29udmVydGlibGUgPC0gKG1lYW4oY2FyJHJhdGluZ1tjYXIkYm9keV90eXBlID09ICJDb252ZXJ0aWJsZSJdKSkKQ291cGUgPC0gKG1lYW4oY2FyJHJhdGluZ1tjYXIkYm9keV90eXBlID09ICJDb3VwZSJdKSkKSGF0Y2hiYWNrIDwtIChtZWFuKGNhciRyYXRpbmdbY2FyJGJvZHlfdHlwZSA9PSAiSGF0Y2hiYWNrIl0pKQpIeWJyaWQgPC0gKG1lYW4oY2FyJHJhdGluZ1tjYXIkYm9keV90eXBlID09ICJIeWJyaWQiXSkpCkx1eHVyeSA8LSAobWVhbihjYXIkcmF0aW5nW2NhciRib2R5X3R5cGUgPT0gIkx1eHVyeSJdKSkKTWluaXZhbiA8LSAobWVhbihjYXIkcmF0aW5nW2NhciRib2R5X3R5cGUgPT0gIk1pbml2YW4iXSkpCk1VViA8LSAobWVhbihjYXIkcmF0aW5nW2NhciRib2R5X3R5cGUgPT0gIk1VViJdKSkKUGlja3VwX3RydWNrIDwtIChtZWFuKGNhciRyYXRpbmdbY2FyJGJvZHlfdHlwZSA9PSAiUGlja3VwIFRydWNrIl0pKQpTZWRhbiA8LSAobWVhbihjYXIkcmF0aW5nW2NhciRib2R5X3R5cGUgPT0gIlNlZGFuIl0pKQpTVVYgPC0gKG1lYW4oY2FyJHJhdGluZ1tjYXIkYm9keV90eXBlID09ICJTVVYiXSkpCldhZ29uIDwtIChtZWFuKGNhciRyYXRpbmdbY2FyJGJvZHlfdHlwZSA9PSAiV2Fnb24iXSkpCgpidF9tZWFuIDwtIGNiaW5kKGJvZHlfdHlwZT1jKCJDb252ZXJ0aWJsZSIsIkNvdXBlIiwiSGF0Y2hiYWNrIiwiSHlicmlkIiwiTHV4dXJ5IiwiTWluaXZhbiIsIk1VViIsIlBpY2t1cCBUcnVjayIsIlNlZGFuIiwgIlNVViIsIldhZ29uIikpCmJ0X21lYW4gPC0gY2JpbmQoYnRfbWVhbixhcy5kYXRhLmZyYW1lKGMoQ29udmVydGlibGUsQ291cGUsSGF0Y2hiYWNrLEh5YnJpZCxMdXh1cnksTWluaXZhbixNVVYsUGlja3VwX3RydWNrLFNlZGFuLFNVVixXYWdvbikpKQpuYW1lcyhidF9tZWFuKVsyXSA8LSBwYXN0ZSgiTWVhbiIpCmJ0bW8gPC0gYnRfbWVhbltvcmRlcihidF9tZWFuJE1lYW4sIGRlY3JlYXNpbmc9IFQpLF0KYnRtbwpgYGAKCioqQmFzZWQgb24gQm9keSBUeXBlLCBjYXJzIHdpdGgga2luZCBvZiBib2R5IHR5cGUgQ291cGUqKiwgSHlicmlkLCBMdXh1cnksIE1pbml2YW4sIE1VViwgUGlja3VwIFRydWNrLCBhbmQgV2Fnb24sICoqaGFzIHRoZSBiZXN0IG1lYW4gb2YgcmF0aW5nIG9mIDQuNSoqCgojIyBGdWVsIFR5cGUKYGBge3J9CkNORy5yZXYgPC0gKG1lYW4oY2FyJHJhdGluZ1tjYXIkZnVlbF90eXBlID09ICJDTkciXSkpCkRpZXNlbC5yZXYgPC0gKG1lYW4oY2FyJHJhdGluZ1tjYXIkZnVlbF90eXBlID09ICJEaWVzZWwiXSkpCkVsZWN0cmljLnJldiA8LSAobWVhbihjYXIkcmF0aW5nW2NhciRmdWVsX3R5cGUgPT0gIkVsZWN0cmljIl0pKQpQZXRyb2wucmV2IDwtIChtZWFuKGNhciRyYXRpbmdbY2FyJGZ1ZWxfdHlwZSA9PSAiUGV0cm9sIl0pKQoKZnRfbWVhbiA8LSBjYmluZChmdWVsX3R5cGU9YygiQ05HIiwiRGllc2VsIiwiRWxlY3RyaWMiLCJQZXRyb2wiKSkKZnRfbWVhbiA8LSBjYmluZChmdF9tZWFuLGFzLmRhdGEuZnJhbWUoYyhDTkcucmV2LERpZXNlbC5yZXYsRWxlY3RyaWMucmV2LFBldHJvbC5yZXYpKSkKbmFtZXMoZnRfbWVhbilbMl0gPC0gcGFzdGUoIk1lYW4iKQpmdG1vIDwtIGZ0X21lYW5bb3JkZXIoZnRfbWVhbiRNZWFuLCBkZWNyZWFzaW5nPSBUKSxdCmZ0bW8KYGBgCgoKSWYgd2UgbG9vayBhdCAqKmJhc2VkIG9uIHRoZSBmdWVsIHR5cGUsIHRoZSBiZXN0IHJhdGluZyoqIG1lYW4gZ29lcyB0byAqKkVsZWN0cmljKiogZm9yIHRoZSBoaWdoZXN0IG1lYW4gcmF0aW5nIHdpdGggc2xpZ2h0bHkgYmV0dGVyIHRoYW4gdGhlIERpZXNlbCBvbmVzCgojIyBUcmFuc21pc3Npb24gVHlwZQoKYGBge3J9CkF1dG9tYXRpY1RUIDwtIChtZWFuKGNhciRyYXRpbmdbY2FyJHRyYW5zbWlzc2lvbl90eXBlID09ICJBdXRvbWF0aWMiXSkpCk1hbnVhbFRUIDwtIChtZWFuKGNhciRyYXRpbmdbY2FyJHRyYW5zbWlzc2lvbl90eXBlID09ICJNYW51YWwiXSkpCkVsZWN0cmljVFQgPC0gKG1lYW4oY2FyJHJhdGluZ1tjYXIkdHJhbnNtaXNzaW9uX3R5cGUgPT0gIkVsZWN0cmljIl0pKQoKdHRfbWVhbiA8LSBjYmluZCh0cmFuc21pc3Npb25fdHlwZT1jKCJBdXRvbWF0aWMiLCJNYW51YWwiLCJFbGVjdHJpYyIpKQp0dF9tZWFuIDwtIGNiaW5kKHR0X21lYW4sYXMuZGF0YS5mcmFtZShjKEF1dG9tYXRpY1RULE1hbnVhbFRULEVsZWN0cmljVFQpKSkKbmFtZXModHRfbWVhbilbMl0gPC0gcGFzdGUoIk1lYW4iKQp0dG1vIDwtIHR0X21lYW5bb3JkZXIodHRfbWVhbiRNZWFuLCBkZWNyZWFzaW5nPSBUKSxdCnR0bW8KYGBgCgoqKkJhc2VkIG9uIHRoZSB0cmFuc21pc3Npb24gdHlwZSwgdGhlIGJlc3QgcmF0aW5nKiogd2l0aCB0aGUgaGlnaGVzdCBtZWFuIGlzIHRoZSAqKkVsZWN0cmljKiogdHJhbnNtaXNzaW9uIGNhciBhdCA0LjQ2LgoKVGhlcmVmb3JlLCAqKnRoZSBiZXN0IGNhciB3aXRoIHRoZSBoaWdoZXN0IHJhdGluZyoqIGlzICoqRWxlY3RyaWMgVHJhbnNtaXNzaW9uIENvdXBlIENhciB3aXRoIEVsZWN0cmljaXR5IGFzIHRoZSBGdWVsKiouCgojIFNFVkVSQUwgQ09SUkVMQVRJT04gQkVUV0VFTiBDQVInUyBBVFRSSUJVVEVTIEFORCBDQVInUyBSQVRJTkcKCmBgYHtyfQpjb3IoY2FyJG1heF9wb3dlcl9ycCxjYXIkcmF0aW5nKQpjb3IoY2FyJG1heF90b3JxdWVfbm0sY2FyJHJhdGluZykKY29yKGNhciRtYXhfdG9ycXVlX3JwbSxjYXIkcmF0aW5nKQpjb3IoY2FyJG1heF9wb3dlcl9iaHAsY2FyJHJhdGluZykKY29yKGNhciRub19jeWxpbmRlcixjYXIkcmF0aW5nKQpjb3IoY2FyJGZ1ZWxfdGFua19jYXBhY2l0eSxjYXIkcmF0aW5nKQpjb3IoY2FyJHNlYXRpbmdfY2FwYWNpdHksY2FyJHJhdGluZykKYGBgCmZyb20gdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gZGF0YSBhYm92ZSwgd2UgY2FuIGNvbmNsdWRlIHRoYXQgKipubyBwZXJmb3JtYW5jZSBvZiBhIGNhciBpbXBhY3RzIHRoZSByYXRpbmcgZ2l2ZW4gYnkgdGhlIGF1ZGllbmNlKiosIGFsdGhvdWdoIHRoZXJlIGlzIHNvbWVob3cgYSAqKndlYWsgcG9zaXRpdmUgY29ycmVsYXRpb24qKiBiZXR3ZWVuICoqdGhlIGZ1ZWwgdGFuayBjYXBhY2l0eSwgYW5kIHRoZSBzZWF0aW5nIGNhcGFjaXR5IHdpdGggdGhlIGNhcidzIHJhdGluZyoqCgoKIyBQUk9QT1JUSU9OIE9GIENBUiBSRVZJRVdFRCBCQVNFRCBPTgojIyBGdWVsIFR5cGUKCmBgYHtyfQphZ2cxIDwtIGFnZ3JlZ2F0ZShyZXZpZXdzX2NvdW50fmZ1ZWxfdHlwZSxjYXIsc3VtKQpwaWUoYWdnMSRyZXZpZXdzX2NvdW50LCBhZ2cxJGZ1ZWxfdHlwZSwgbWFpbiA9ICJDYXIgUmV2aWV3ZWQgQmFzZWQgb24gRnVlbCBUeXBlIikgCmBgYAoKClRoZSBtb3N0ICoqcmV2aWV3ZWQqKiBjYXIgYmFzZWQgb24gdGhlICoqZnVlbCB0eXBlKiogaXMgdGhlICoqRGllc2VsIGNhcioqCgojIyBCb2R5IFR5cGUKYGBge3J9CmFnZzIgPC0gYWdncmVnYXRlKHJldmlld3NfY291bnR+Ym9keV90eXBlLGNhcixzdW0pCmFnZzIyIDwtIGFnZzJbb3JkZXIoYWdnMiRyZXZpZXdzX2NvdW50LCBkZWNyZWFzaW5nPVQpLF0KYWdnMjIyIDwtIGhlYWQoYWdnMjIpCnBpZShhZ2cyMjIkcmV2aWV3c19jb3VudCwgYWdnMjIyJGJvZHlfdHlwZSwgY2V4PTAuNSwgbWFpbiA9ICJDYXIgUmV2aWV3ZWQgQmFzZWQgb24gQm9keSBUeXBlIikKYGBgCgoKVGhlIG1vc3QgKipyZXZpZXdlZCoqIGNhciBiYXNlZCBvbiB0aGUgKipib2R5IHR5cGUqKiBpcyB0aGUgKipTVVYgY2FyKioKCgojIyBUcmFuc21pc3Npb24gVHlwZQpgYGB7cn0KYWdnMyA8LSBhZ2dyZWdhdGUocmV2aWV3c19jb3VudH50cmFuc21pc3Npb25fdHlwZSxjYXIsc3VtKQpwaWUoYWdnMyRyZXZpZXdzX2NvdW50LCBhZ2czJHRyYW5zbWlzc2lvbl90eXBlLCBtYWluID0gIkNhciBSZXZpZXdlZCBCYXNlZCBvbiBUcmFuc21pc3Npb24gVHlwZSIpCmBgYAoKClRoZSBtb3N0ICoqcmV2aWV3ZWQqKiBjYXIgYmFzZWQgb24gdGhlICoqdHJhbnNtaXNzaW9uKiogaXMgdGhlICoqQXV0b21hdGljIGNhcioqCgpUaGVyZWZvcmUsICoqdGhlIG1vc3QgcmV2aWV3ZWQgY2FyKiogaXMgKiphdXRvbWF0aWMgdHJhbnNtaXNzaW9uIFNVViB3aXRoIERpZXNlbCBhcyBhIEZ1ZWwqKi4gCgojIENPTkNMVVNJT04KRnJvbSB0aGUgRGF0YSBzZXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgKiphdXRvbWF0aWMgdHJhbnNtaXNzaW9uIFNVViB3aXRoIERpZXNlbCBhcyBhIGZ1ZWwgaGFzIGEgaGlnaGVyIGNoYW5jZSBvZiBnZXR0aW5nIHRoZSBtb3N0IHJldmlldyoqIGJ5IHBlb3BsZS4gSG93ZXZlciwgZ2l2ZW4gdGhlIGZhY3QgdGhhdCB0aGF0IHNwZWNpZmljIHR5cGUgb2YgY2FyIGlzIGRyYXdpbmcgcGVvcGxlIGF0dGVudGlvbiB0byBwdXQgYSByZXZpZXcgb24gaXQsIHRoYXQgaXMgbm90IHRoZSBjYXNlIHdpdGggaG93IGdvb2QgcGVvcGxlIHdpbGwgZ2l2ZSB0aGUgcmF0aW5nIHRvIGl0LiAqKlRoZSBiZXN0IHJhdGluZyBnaXZlbiBpcyB0byB0aGUgZWxlY3RyaWMgdHJhbnNtaXNzaW9uIENvdXBlIGNhciB3aXRoIEVsZWN0cmljaXR5IGFzIGEgZnVlbCByZWdhcmRsZXNzIHRoZSBwZXJmb3JtYW5jZXMgb2YgYSBjYXIqKi4gQXMgdGhlIGRhdGEgY29ycmVsYXRpb24gc2hvd24gYWJvdmUsICoqdGhlIHBlcmZvcm1hbmNlIG9mIGEgY2FyIGFyZSBuZWdhdGluZyBldmVyeSBwb3NzaWJpbGl0eSB0byBwb3NpdGl2ZWx5IGNvcnJlbGF0ZXMsKiogZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgaXQncyB0aGUgcGVyZm9ybWFuY2UgYnkgaG93IG11Y2ggYmFzZSBob3JzZSBwb3dlciBvciB0aGUgdG9ycXVlcyB0aGF0IHRoZSBjYXIgZW50aXRsZWQuICoqSG93ZXZlciwgdGhlIHNlYXRpbmcgY2FwYWNpdHkgYW5kIHRoZSBmdWVsIHRhbmsgY2FwYWNpdHkgaGFzIGEgbGl0dGxlIGVmZmVjdCB0byB0aGUgY2FyJ3MgcmF0aW5nLioqIFRoaXMgY2FzZSB3aGVyZSBFbGVjdHJpYyBjYXIgaXMgcHJlZmVyYWJsZSwgY291bGQgYmUgaGFwcGVuZWQgcmVsYXRlZCB0byB0aGUgcmVhc29uIG9mIGdsb2JhbCB3YXJtaW5nLCB3aGVyZSBncmVlbiBlbmVyZ3kgaXMgbW9yZSBwcmVmZXJhYmxlIGJ5IG1vc3Qgb2YgdGhlIHBlb3BsZSBhbGwgYXJvdW5kIHRoZSB3b3JsZC4g