About this Project

Description: Our project is looking into the main factors relating to an automobile that effects that automobile’s gas mileage. We are using the Combined Gas Mileage as the dependent variable and Engine Displacement, Cylinder Count, Transmission Type, Drivetrain, Fuel Type, Emissions Standard Code, Vehicle Class, Smog Rating, Greenhouse Gas Rating, and SmartWay Rating as the indepedent variable. We are attempting to use data from automobiles in 2014 to predict the gas mileage in 2018 automotive data

Resources: RStudio, Excel, Tableu, IBM Watson

Data Descrition: Environmental Protection Agency:SmartWay, 2014 and 2018, U.S.A.

Potentianl Business Case: We hypothesize that the vechicle class has the greatest effect on gas mileage compared to our other independenent variables.


Brief description of your project.

#The spreadsheets we are working with collected data on 615 vehicles in 2014 and 336 vehicles in 2018. For each vechicle the Make, Model, Combined Gas Mileage, City Gas Mileage, Highway Gas Mileage, Engine Displacement, Cylinder Count, Sales Area, Underhood Idenfication Number, Transmission Type, Drivetrain, Fuel Type, Emissions Standard Code, Vehicle Class, Smog Rating, Greenhouse Gas Rating, and SmartWay Rating were collected. All of these measures are assumed to have an effect on gas mileage. SmartWay is a program of the Environmental Protection Agency that acts as a source to benchmark, measure, and improve upon the efficency of freight transportation. #Patterns: Greenhouse Gas Rating appears to be a large driver of Combined MPG. The top 3 drivers of Combined MPG are Greenhouse Gas Rating and Engine Displacment, Greenhouse Gas Rating and Vehicle Class, and Greenhouse Gas Rating and Fuel Type. The most popular Engine Displacment by Vehicle Type is second largest category. All vehicle classes have at least one model with an Engine Displacment between 2.34-2.92 liters. 5 vehicle classes have at least one model with an engine displacment between 1.76-2.34 liters, 2.92-3.5 liters, or an electric motor. The most popular Values for Transmission Type are Semi-Automatic 6 speed with 117 vehicles, Manual 6 speed with 103 vehicles, and then Continously Variable Clutch with 99. #Descriptive Statisticstics: The model surveyed most was the Mazada 3 for 16 vehicles followed by the Honda Accord for 13 vehicles and then the Honda Civic for 12 vehicles. The most popular displacement was 2 liters for 146 vehicles followed by 1.6 liters for 103 vehicles and 1.8 liters for 92 vehicles. SemiAuto-6 for 117 vehicles, Man-6 for 103 vehicles, and CVT for 99 vehicles were the most popular transmissions. There were way more 2WD vehicles at 519 than 4WD vehicles at 78. The most popular fuel for vehicles was gasoline at 527, then Electricity at 28, and finally Gasoline/Electricity at 18. U2 was most widely used standarad for fuel emission for 192 vehicles. This was followed by B5 for 102 vehicles and then PZEV for 77 vehicles. There were mostly small cars surveyed at 312, followed by midsize cars at 187, and then small SUV at 42. Median and mean smog ratings were 6 and 6.732 respectively, with the max value being 10 and the minimum value being 5. The smog rating data has a positve skew across the surveyed vehicles. The Combined MPG that was most popular was 30 for 100 vehicles, then 26 for 86 vehicles, and finally 31 for 64 vehicles. The Greenhouse Gas Rating was a minimum value of 7 and a maximum value of 10, with the mean being 7.898 and a median of 8. The Greenhouse Gas Rating data is evenly distributed across the survey models. All of the vehicles are SmartWay certified and 40 of those vehicles are Elite SmartWay certified. ## Resources Packages Use on this notebook

Install required packages

# Here we are checking if the package is installed
if(!require("tidyverse")){
  
  # If the package is not in the system then it will be install
  install.packages("tidyverse", dependencies = TRUE)
  
  # Here we are loading the package
  library("tidyverse")
}
Loading required package: tidyverse
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v ggplot2 2.2.1     v purrr   0.2.4
v tibble  1.4.2     v dplyr   0.7.4
v tidyr   0.8.0     v stringr 1.2.0
v readr   1.1.1     v forcats 0.2.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
# Here we are checking if the package is installed
if(!require("corrplot")){
  
  # If the package is not in the system then it will be install
  install.packages("corrplot", dependencies = TRUE)
  
  # Here we are loading the package
  library("corrplot")
}
Loading required package: corrplot
package <U+393C><U+3E31>corrplot<U+393C><U+3E32> was built under R version 3.4.4corrplot 0.84 loaded
Loading required package: lpSolveAPI

Data Collection: INDUSTRY - TITLE_OF_YOUR_DATASET


Read the csv file into R Studio and explore the dataset (extract variables)

mydata=read.csv("Original SmartWay Vehicle List for MY 2014.csv")
head(mydata)
summary(mydata) 
               Model          Displ       Cyl              Trans      Drive     
                  :1300          :1300      :1300             :1300      :1300  
 MAZDA 3          :  16   2      : 162   2  :   2   SemiAuto-6: 117   2WD: 535  
 VOLKSWAGEN Jetta :  14   1.6    : 103   3  :  14   Man-6     : 111   4WD:  79  
 HONDA Accord     :  13   1.8    :  92   4  : 525   CVT       :  99             
 HONDA Civic      :  12   2.5    :  59   5  :   8   Auto-6    :  53             
 VOLKSWAGEN Beetle:  10   2.4    :  44   6  :  35   Man-5     :  49             
 (Other)          : 549   (Other): 154   N/A:  30   (Other)   : 185             
                   Fuel      Sales.Area      Stnd     
                     :1300     :1300           :1300  
 Gasoline            : 527   CA: 350    U2     : 192  
 Electricity         :  28   FA: 212    B5     : 102  
 Diesel              :  27   FC:  52    PZEV   :  77  
 Gasoline/Electricity:  18              B3     :  68  
 Ethanol/Gas         :  10              B4     :  54  
 (Other)             :   4              (Other): 121  
               Stnd.Description       Underhood.ID          Veh.Class   
                       :1300                :1300                :1300  
 California LEV-II ULEV: 192    EBMXV01.6N18:  44   large car    :  22  
 Federal Tier 2 Bin 5  : 102    EBMXV01.6N16:  26   midsize car  : 189  
 California PZEV       :  77    EVWXV02.03PA:  24   small car    : 324  
 Federal Tier 2 Bin 3  :  68    EBMXJ02.0N20:  20   small SUV    :  42  
 Federal Tier 2 Bin 4  :  54    EGMXV01.8011:  20   standard SUV :   8  
 (Other)               : 121    (Other)     : 480   station wagon:  29  
  Smog.Rating      City.MPG       Hwy.MPG        Cmb.MPG     Greenhouse.Gas.Rating
        :1300          :1300          :1300          :1300      :1300             
 6      : 258   26     :  71   35     : 101   30     : 102   10 :  59             
 5      : 110   27     :  69   36     :  56   26     :  86   7  : 241             
 9      :  99   25     :  65   37     :  53   31     :  65   8  : 235             
 7      :  70   24     :  60   34     :  48   28     :  62   9  :  62             
 10     :  30   28     :  57   33     :  43   27     :  48   Mod:  17             
 (Other):  47   (Other): 292   (Other): 313   (Other): 251                        
  SmartWay   
      :1300  
 Elite:  40  
 yes  :   1  
 Yes  : 573  
             
             
             
#Descriptive Statisticstics: The model surveyed most was the Mazada 3 for 16 vehicles followed by the Volkswagen Jetta for 14 vehicles and then the Honda Accord for 13 vehicles.  The most popular displacement was 2 liters for 162 vehicles followed by 1.6 liters for 103 vehicles and 1.8 liters for 92 vehicles.  SemiAuto-6 for 117 vehicles, Man-6 for 111 vehicles, and CVT for 99 vehicles were the most popular transmissions.  The most popular cylinder count was 4 at 525, then 5 at 35, and N/A at 30.  There were way more 2WD vehicles at 535 than 4WD vehicles at 79.  The most popular fuel for vehicles was gasoline at 527, then Electricity at 28, and finally Diesel at 27.  The most popular sales was CA 350, then FA at 212, and FC at 212.  U2 was most widely used standarad for fuel emission for 192 vehicles.  This was followed by B5 for 102 vehicles and then PZEV for 77 vehicles.  The most popular standard decription will be California LEV-II at 192, then 121 for (other), and finally 102 for Federal Tier 2 Bin 5.  The underhood had a most popular type of EBMXV01.6N18 at 44, EBXV01.6N16 at 26, and finally EVWXV02.03PA at 24.  There were mostly small cars surveyed at 324, followed by midsize cars at 189, and then small SUV at 42.  The most popular smog rating was 6 at 258, and then 5 at 110, and finally 9 at 99.  26 was the most popular city MPG at 71.  27 was second most popular city MPG at 69, and finally the third most popular 25 at 65.  The most popular highway MPG was 35 at 101, 36 at 56, and 37 at 53.  The Combined MPG that was most popular was 30 for 102 vehicles, then 26 for 86 vehicles, and finally 31 for 65 vehicles.  The Greenhouse gas rating of 7 was most popular at 241, the rating of 8 was second most popular at 235, and the rating of 9 was thrid most popular at 62.  Only 574 cars are Smartway Certified, and 40 of those SmartWay certified cars are elite.  

## Data Preparation: Cleaning and preparing the data for analysis

The first step to cleaning the data is getting rid of all the unessicary columns that don’t predict CMB MPG obviously. We deleted the City MPG, Hwy MPG, and Sales Are Column. We felt like CMB MPG represted a fair standard for all vehicles, not favoring one type of car or another. We also deleted all the diesel cars that used the word “Mod” to describe variables in this study. These cars were part of the Volkswagen Diselgate Scandal and would corrupt the rest of the data. We numerically codified all the written data for the columns: Trans, Drive Fuel, Stnd, Veh Class, and SmartWay. For the eletric and gasoline/electric cars we marked the “N/A”s in the Displ and Cyl columns as “0” and we averaged the CMB MPG colunm number when there were multiple. These steps will allow us to determine the variables that are most correlated with CMB MPG.

Replace strings

drops <- c("Sales.Area", "City.MPG",  "Hwy.MPG" , "Stnd.Description" , "Model" , "Underhood.ID")
mydata2=mydata[ , !(names(mydata) %in% drops)]
mydata3=mydata2[-c(12:12, 565:565, 568:568, 573:574, 579:582, 590:591, 594:595, 601:603, 608:608), ]
Displ_Clean <- sub("N/A" , "0", mydata3$Displ)
mydata3$Displ <- Displ_Clean
Cyl_Clean <- sub("N/A" , "0", mydata3$Cyl)
mydata3$Cyl <- Cyl_Clean 
trans_clean <- sub("AMS-6" , "1.6", mydata3$Trans) 
mydata3$Trans <- trans_clean
trans_clean2 <- sub("AMS-7" , "1.7", mydata3$Trans)
mydata3$Trans <- trans_clean2 
trans_clean3 <- sub("AMS-8" , "1.8", mydata3$Trans) 
mydata3$Trans <- trans_clean3
trans_clean4 <- sub("Auto-1" , "2.1", mydata3$Trans)
mydata3$Trans <- trans_clean4
trans_clean5 <- sub("Auto-4" , "2.4", mydata3$Trans)
mydata3$Trans <- trans_clean5
trans_clean6 <- sub("Auto-5" , "2.5", mydata3$Trans)
mydata3$Trans <- trans_clean6
trans_clean7 <- sub("Auto-6" , "2.6", mydata3$Trans)
mydata3$Trans <- trans_clean7
trans_clean8 <- sub("Auto-7" , "2.7", mydata3$Trans)
mydata3$Trans <- trans_clean8 
trans_clean9 <- sub("AutoMan-5" , "3.5", mydata3$Trans)
mydata3$Trans <- trans_clean9
trans_clean10 <- sub("AutoMan-6" , "3.6", mydata3$Trans)
mydata3$Trans <- trans_clean10 
trans_clean11 <- sub("AutoMan-7" , "3.7", mydata3$Trans)
mydata3$Trans <- trans_clean11  
trans_clean12 <- sub("CVT" , "4", mydata3$Trans)
mydata3$Trans <- trans_clean12 
trans_clean13 <- sub("Man-5" , "5.5" , mydata3$Trans)
mydata3$Trans <- trans_clean13 
trans_clean14 <- sub("Man-6" , "5.6" , mydata3$Trans)
mydata3$Trans <- trans_clean14
trans_clean15 <- sub("SCV-6" , "6.6" , mydata3$Trans)
mydata3$Trans <- trans_clean15
trans_clean16 <- sub("SCV-7" , "6.7" , mydata3$Trans)
mydata3$Trans <- trans_clean16 
trans_clean17 <- sub("SCV-8" , "6.8" , mydata3$Trans)
mydata3$Trans <- trans_clean17
trans_clean18 <- sub("Semi2.5" , "7.5" , mydata3$Trans)
mydata3$Trans <- trans_clean18 
trans_clean19 <- sub("Semi2.6" , "7.6" , mydata3$Trans)
mydata3$Trans <- trans_clean19 
trans_clean20 <- sub("Semi2.7" , "7.7" , mydata3$Trans)
mydata3$Trans <- trans_clean20 
trans_clean21 <- sub("SemiAuto-8" , "7.8" , mydata3$Trans)
mydata3$Trans <- trans_clean21
drive_clean <- sub("2WD" , "2" , mydata3$Drive)
mydata3$Drive <- drive_clean
drive_clean2 <- sub("4WD" , "4" , mydata3$Drive)
mydata3$Drive <- drive_clean2
fuel_clean <- sub("CNG" , "1" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean
fuel_clean2 <- sub("Diesel", "2" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean2
fuel_clean3 <- sub("Electricity" , "3" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean3
fuel_clean4 <- sub("Ethanol/Gas" , "4" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean4 
fuel_clean5 <- sub("Gasoline" , "5" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean5
fuel_clean6 <- sub("Gasoline/Eletricity" , "6" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean6 
fuel_clean7 <- sub("Hydrogen" , "7" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean7
fuel_clean8 <- sub("5/3" , "6" , mydata3$Fuel)
mydata3$Fuel <- fuel_clean8
std_clean <- sub("B1", "1" , mydata3$Stnd) 
mydata3$Stnd <- std_clean
std_clean2 <- sub("B2", "2" , mydata3$Stnd)
mydata3$Stnd <- std_clean2 
std_clean3 <- sub("B3", "3" , mydata3$Stnd)
mydata3$Stnd <- std_clean3
std_clean4 <- sub("B4", "4" , mydata3$Stnd)
mydata3$Stnd <- std_clean4 
std_clean5 <- sub("B5", "5" , mydata3$Stnd)
mydata3$Stnd <- std_clean5
std_clean6 <- sub("L2", "6" , mydata3$Stnd)
mydata3$Stnd <- std_clean6
std_clean7 <- sub("L2ULEV125", "7" , mydata3$Stnd)
mydata3$Stnd <- std_clean7
std_clean8 <- sub("L3SULEV30", "8" , mydata3$Stnd)
mydata3$Stnd <- std_clean8
std_clean9 <- sub("L3ULEV125", "9" , mydata3$Stnd)
mydata3$Stnd <- std_clean9 
std_clean10 <- sub("L3SULEV30/PZEV", "10" , mydata3$Stnd)
mydata3$Stnd <- std_clean10 
std_clean11 <- sub("L3ULEV70", "11" , mydata3$Stnd)
mydata3$Stnd <- std_clean11 
std_clean12 <- sub("PZEV", "12" , mydata3$Stnd)
mydata3$Stnd <- std_clean12
std_clean13 <- sub("S2", "13" , mydata3$Stnd)
mydata3$Stnd <- std_clean13 
std_clean14 <- sub("U2", "14" , mydata3$Stnd)
mydata3$Stnd <- std_clean14
std_clean15 <- sub("ZEV", "15" , mydata3$Stnd)
mydata3$Stnd <- std_clean15 
std_clean16 <- sub("8/12" , "8" , mydata3$Stnd)
mydata3$Stnd <- std_clean16
std_clean17 <- sub("6ULEV125" , "7" , mydata3$Stnd)
mydata3$Stnd <- std_clean17
veh_clean1 <- sub("large car" , "1" , mydata3$Veh.Class)
mydata3$Veh.Class <- veh_clean1
veh_clean2 <- sub("midsize car" , "2" , mydata3$Veh.Class)
mydata3$Veh.Class <- veh_clean2 
veh_clean3 <- sub("small car" , "3" , mydata3$Veh.Class)
mydata3$Veh.Class <- veh_clean3 
veh_clean4 <- sub("small SUV" , "4" , mydata3$Veh.Class)
mydata3$Veh.Class <- veh_clean4 
veh_clean5 <- sub("standard SUV" , "5" , mydata3$Veh.Class)
mydata3$Veh.Class <- veh_clean5 
veh_clean6 <- sub("station wagon" , "6" , mydata3$Veh.Class)
mydata3$Veh.Class <- veh_clean6 
cmb_clean1 <- sub("39/117" , "78", mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean1 
cmb_clean2 <- sub("28/76" , "52", mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean2 
cmb_clean3 <- sub("33/82" , "57.5", mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean3 
cmb_clean4 <- sub("18/26" , "22", mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean4 
cmb_clean5 <- sub("37/98" , "67.5" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean5 
cmb_clean7 <- sub("19/27" , "23" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean7
cmb_clean8 <- sub("38/88" , "63" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean8
cmb_clean9 <- sub("23/30" ,  "26.5" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean9
cmb_clean10 <- sub("22/30" ,  "26" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean10 
cmb_clean11 <- sub("23/33" ,  "28" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean11
cmb_clean12 <- sub("46/115","80.5" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean12
cmb_clean13 <- sub("25/50" ,  "37.5" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean13 
cmb_clean14 <- sub("50/95" ,  "72.5" , mydata3$Cmb.MPG)
mydata3$Cmb.MPG <- cmb_clean14 
sma_clean1 <- sub("Yes" ,  "1" , mydata3$SmartWay)
mydata3$SmartWay <- sma_clean1 
sma_clean2 <- sub("Elite" , "2" , mydata3$SmartWay)
mydata3$SmartWay <- sma_clean2
Trans2 <- as.numeric(mydata3$Trans)
mydata3$Trans = Trans2
Displ2 <- as.numeric(mydata3$Displ)
mydata3$Displ = Displ2
Cyl2 <- as.numeric(mydata3$Cyl)
mydata3$Cyl = Cyl2
Drive2 <- as.numeric(mydata3$Drive)
mydata3$Drive = Drive2
Fuel2 <- as.numeric(mydata3$Fuel)
mydata3$Fuel = Fuel2
Stnd2 <- as.numeric(mydata3$Stnd)
mydata3$Stnd = Stnd2
Veh.Class2 <- as.numeric(mydata3$Veh.Class)
mydata3$Veh.Class = Veh.Class2
Smog.Rating2 <- as.numeric(mydata3$Smog.Rating)
mydata3$Smog.Rating = Smog.Rating2
Cmb.MPG2 <- as.numeric(mydata3$Cmb.MPG)
mydata3$Cmb.MPG = Cmb.MPG2
Greenhouse.Gas.Rating2 <- as.numeric(mydata3$Greenhouse.Gas.Rating)
mydata3$Greenhouse.Gas.Rating = Greenhouse.Gas.Rating2
SmartWay2 <- as.numeric(mydata3$SmartWay)
mydata3$SmartWay = SmartWay2
mydata4=mydata3[-c(598:1898),]

large car=1 midsize car=2 small car= 3 small suv=4 standard suv=5 station wagon=6

Save the new clean data

newdata <- write_csv( mydata4 , "clean_data.csv")

Data Analysis: Descriptive Statistics, Correlations


Basic descriptive statistics of the dataset (write down any observations)

summary(newdata)
     Displ            Cyl            Trans           Drive            Fuel      
 Min.   :0.000   Min.   :0.000   Min.   :1.600   Min.   :2.000   Min.   :1.000  
 1st Qu.:1.600   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:2.000   1st Qu.:5.000  
 Median :1.800   Median :4.000   Median :5.600   Median :2.000   Median :5.000  
 Mean   :1.865   Mean   :3.896   Mean   :5.218   Mean   :2.261   Mean   :4.863  
 3rd Qu.:2.000   3rd Qu.:4.000   3rd Qu.:7.600   3rd Qu.:2.000   3rd Qu.:5.000  
 Max.   :3.500   Max.   :6.000   Max.   :7.800   Max.   :4.000   Max.   :7.000  
      Stnd         Veh.Class      Smog.Rating      Cmb.MPG      
 Min.   : 1.00   Min.   :1.000   Min.   :2.00   Min.   : 22.00  
 1st Qu.: 4.00   1st Qu.:2.000   1st Qu.:4.00   1st Qu.: 28.00  
 Median :12.00   Median :3.000   Median :4.00   Median : 30.00  
 Mean   : 8.93   Mean   :2.841   Mean   :4.43   Mean   : 35.02  
 3rd Qu.:14.00   3rd Qu.:3.000   3rd Qu.:5.00   3rd Qu.: 33.00  
 Max.   :15.00   Max.   :6.000   Max.   :7.00   Max.   :124.00  
 Greenhouse.Gas.Rating    SmartWay    
 Min.   :2.000         Min.   :1.000  
 1st Qu.:3.000         1st Qu.:1.000  
 Median :3.000         Median :1.000  
 Mean   :3.503         Mean   :1.067  
 3rd Qu.:4.000         3rd Qu.:1.000  
 Max.   :5.000         Max.   :2.000  
head(newdata)

For Displ the min is 0 and the max is 3.5 For Cyl the min is 0 and max is 6. For trans the min is 1.6 and the max is 7.8. For Drive the min is 2 and the max is 4. For fuel the min is 1 and the max is 7. For Stnd the min is 1 and the max is 15. For Veh.Class the min is 1 and the max is 6. For Smog.Rating the min is 2 and the max is 7. For Cmb.MPG the min is 22 and the maz is 124. For Greenhouse.Gas.Rating the min is 2 and the max is 5. For Smartway the min is 1 and the max is 2.

Correlation table ( only numeric data )

data_corr <- cor(newdata)
data_corr
                             Displ         Cyl       Trans        Drive        Fuel
Displ                  1.000000000  0.85440858  0.31961523  0.185678195  0.31963120
Cyl                    0.854408576  1.00000000  0.37453543  0.106124902  0.45597007
Trans                  0.319615226  0.37453543  1.00000000  0.095122194  0.14145202
Drive                  0.185678195  0.10612490  0.09512219  1.000000000 -0.07010933
Fuel                   0.319631199  0.45597007  0.14145202 -0.070109326  1.00000000
Stnd                   0.093107998  0.07170740  0.07417265  0.115463800  0.06056462
Veh.Class             -0.002522605  0.04668326  0.05659270  0.297666097 -0.04969399
Smog.Rating            0.392965205  0.37856007  0.04616551  0.004984629  0.26610601
Cmb.MPG               -0.654342568 -0.80120252 -0.41324768 -0.109288949 -0.45230763
Greenhouse.Gas.Rating  0.172973758  0.32216605  0.14496439 -0.154690041  0.10750986
SmartWay              -0.602018944 -0.76278651 -0.37360221 -0.064130955 -0.42238621
                             Stnd    Veh.Class  Smog.Rating     Cmb.MPG
Displ                  0.09310800 -0.002522605  0.392965205 -0.65434257
Cyl                    0.07170740  0.046683259  0.378560074 -0.80120252
Trans                  0.07417265  0.056592695  0.046165507 -0.41324768
Drive                  0.11546380  0.297666097  0.004984629 -0.10928895
Fuel                   0.06056462 -0.049693993  0.266106011 -0.45230763
Stnd                   1.00000000  0.053079168  0.143527620 -0.12746866
Veh.Class              0.05307917  1.000000000 -0.050995964 -0.07422391
Smog.Rating            0.14352762 -0.050995964  1.000000000 -0.27401880
Cmb.MPG               -0.12746866 -0.074223914 -0.274018799  1.00000000
Greenhouse.Gas.Rating -0.14223736 -0.049349151  0.088799249 -0.37298310
SmartWay              -0.02957609 -0.059313640 -0.223096947  0.85114273
                      Greenhouse.Gas.Rating    SmartWay
Displ                            0.17297376 -0.60201894
Cyl                              0.32216605 -0.76278651
Trans                            0.14496439 -0.37360221
Drive                           -0.15469004 -0.06413096
Fuel                             0.10750986 -0.42238621
Stnd                            -0.14223736 -0.02957609
Veh.Class                       -0.04934915 -0.05931364
Smog.Rating                      0.08879925 -0.22309695
Cmb.MPG                         -0.37298310  0.85114273
Greenhouse.Gas.Rating            1.00000000 -0.49737344
SmartWay                        -0.49737344  1.00000000

Displ and Cyl have the highest correlation at .8544 followed closely by SmartWay and Cmb.MPG at .8511. Cyl and Cmb.MPG have the lowest correlation at -0.80120252.

Correlation Plot ( only numeric data )

corrplot(data_corr)

Cyl and displacement have a high positive correlation probably because the bigger the displacement the more cylinders. Cmb.MPG and Cyl are highly negetively correlated because engines with more cylinders burn more gasoline.


Visual Analytics: Use Table or R to create plots


linear_model <- lm(Cmb.MPG ~ Veh.Class)
linear_model

Call:
lm(formula = Cmb.MPG ~ Veh.Class)

Coefficients:
(Intercept)    Veh.Class  
     38.749       -1.313  
summary(linear_model)

Call:
lm(formula = Cmb.MPG ~ Veh.Class)

Residuals:
    Min      1Q  Median      3Q     Max 
-13.123  -7.496  -4.809  -1.809  89.191 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  38.7491     2.1726  17.835   <2e-16 ***
Veh.Class    -1.3132     0.7233  -1.816   0.0699 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 17.24 on 595 degrees of freedom
  (1300 observations deleted due to missingness)
Multiple R-squared:  0.005509,  Adjusted R-squared:  0.003838 
F-statistic: 3.296 on 1 and 595 DF,  p-value: 0.06995

the r-squared is .005509 and the adjusted r-squared is .003838. These scores lead us to believe that Vehicle class doesn’t show much of a correlation with Cmb.MPG as we hypothesized.

linear_model2 <- lm(Cmb.MPG ~ Veh.Class + SmartWay)
linear_model2

Call:
lm(formula = Cmb.MPG ~ Veh.Class + SmartWay)

Coefficients:
(Intercept)    Veh.Class     SmartWay  
   -26.3584      -0.4215      58.6449  
summary(linear_model2)

Call:
lm(formula = Cmb.MPG ~ Veh.Class + SmartWay)

Residuals:
    Min      1Q  Median      3Q     Max 
-44.667  -3.758  -1.022   0.978  49.056 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -26.3584     2.0087 -13.122   <2e-16 ***
Veh.Class    -0.4215     0.3813  -1.105    0.269    
SmartWay     58.6449     1.4876  39.423   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.072 on 594 degrees of freedom
  (1300 observations deleted due to missingness)
Multiple R-squared:  0.725, Adjusted R-squared:  0.7241 
F-statistic:   783 on 2 and 594 DF,  p-value: < 2.2e-16

The r-squared for this model is .725 and the adjusted r-squared is .7241. This shows that Cmb.MPG along with Veh SmartWay have a very high correlation. This makes sense because a SmartWay car with a high score means they’re good for the economy which means they’ll have a higher combined MPG.

linear_model3 <- lm( Cmb.MPG ~ Displ +Veh.Class ) 
linear_model3

Call:
lm(formula = Cmb.MPG ~ Displ + Veh.Class)

Coefficients:
(Intercept)        Displ    Veh.Class  
     71.135      -17.324       -1.342  
summary(linear_model3)

Call:
lm(formula = Cmb.MPG ~ Displ + Veh.Class)

Residuals:
    Min      1Q  Median      3Q     Max 
-16.197  -8.390  -4.925   3.878  56.893 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  71.1345     2.2415  31.735   <2e-16 ***
Displ       -17.3235     0.8171 -21.202   <2e-16 ***
Veh.Class    -1.3424     0.5462  -2.458   0.0143 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.02 on 594 degrees of freedom
  (1300 observations deleted due to missingness)
Multiple R-squared:  0.4339,    Adjusted R-squared:  0.432 
F-statistic: 227.7 on 2 and 594 DF,  p-value: < 2.2e-16

The r-squared for this model is .4339 and the adjusted r-squared is .432. Based off the fact of how much the r-squared value came up, Combined mpg and displacement are more highly correlated than just Combined MPG and vehicle class.

These models show that our original hypothesis was wrong. Vehicle class and combined MPG are not very highly correlated. However, our other models have caused us to think about other factors that may cause combined mpg to be higher or lower such as the displacement or the cylinders.

LS0tDQp0aXRsZTogIkJlc3QgUHJlZGljdG9yIG9mIENvbWJpbmVkIE1QRyINCmF1dGhvcjogIkJyYWQgSG9ydG9uIGFuZCBBc2hlbHkgS3JlbnoiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KZGF0ZTogIjQvMTIvMTgiDQpzdWJ0aXRsZTogIkJ1c2luZXNzIEFuYWx5dGljcyBIb25vcnMgLSBGaW5hbCBQcm9qZWN0Ig0KLS0tDQoNCg0KLS0tLS0tLS0tLS0tLS0NCg0KIyMgQWJvdXQgdGhpcyBQcm9qZWN0DQojRGVzY3JpcHRpb246IE91ciBwcm9qZWN0IGlzIGxvb2tpbmcgaW50byB0aGUgbWFpbiBmYWN0b3JzIHJlbGF0aW5nIHRvIGFuIGF1dG9tb2JpbGUgdGhhdCBlZmZlY3RzIHRoYXQgYXV0b21vYmlsZSdzIGdhcyBtaWxlYWdlLiAgV2UgYXJlIHVzaW5nIHRoZSBDb21iaW5lZCBHYXMgTWlsZWFnZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCBFbmdpbmUgRGlzcGxhY2VtZW50LCBDeWxpbmRlciBDb3VudCwgVHJhbnNtaXNzaW9uIFR5cGUsIERyaXZldHJhaW4sCUZ1ZWwgVHlwZSwgRW1pc3Npb25zIFN0YW5kYXJkIENvZGUsIFZlaGljbGUgQ2xhc3MsCVNtb2cgUmF0aW5nLCBHcmVlbmhvdXNlIEdhcyBSYXRpbmcsIGFuZCBTbWFydFdheSBSYXRpbmcgYXMgdGhlIGluZGVwZWRlbnQgdmFyaWFibGUuICBXZSBhcmUgYXR0ZW1wdGluZyB0byB1c2UgZGF0YSBmcm9tIGF1dG9tb2JpbGVzIGluIDIwMTQgdG8gcHJlZGljdCB0aGUgZ2FzIG1pbGVhZ2UgaW4gMjAxOCBhdXRvbW90aXZlIGRhdGEgDQojUmVzb3VyY2VzOiBSU3R1ZGlvLCBFeGNlbCwgVGFibGV1LCBJQk0gV2F0c29uDQojRGF0YSBEZXNjcml0aW9uOiBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5OlNtYXJ0V2F5LCAyMDE0IGFuZCAyMDE4LCBVLlMuQS4gDQojUG90ZW50aWFubCBCdXNpbmVzcyBDYXNlOiBXZSBoeXBvdGhlc2l6ZSB0aGF0IHRoZSB2ZWNoaWNsZSBjbGFzcyBoYXMgdGhlIGdyZWF0ZXN0IGVmZmVjdCBvbiBnYXMgbWlsZWFnZSBjb21wYXJlZCB0byBvdXIgb3RoZXIgaW5kZXBlbmRlbmVudCB2YXJpYWJsZXMuDQogICANCi0tLS0tLS0tLS0tLS0tDQoNCkJyaWVmIGRlc2NyaXB0aW9uIG9mIHlvdXIgcHJvamVjdC4NCg0KLS0tLS0tLS0tLS0tLS0NCiNUaGUgc3ByZWFkc2hlZXRzIHdlIGFyZSB3b3JraW5nIHdpdGggY29sbGVjdGVkIGRhdGEgb24gNjE1IHZlaGljbGVzIGluIDIwMTQgYW5kIDMzNiB2ZWhpY2xlcyBpbiAyMDE4LiAgRm9yIGVhY2ggdmVjaGljbGUgdGhlIE1ha2UsIE1vZGVsLCBDb21iaW5lZCBHYXMgTWlsZWFnZSwgQ2l0eSBHYXMgTWlsZWFnZSwgSGlnaHdheSBHYXMgTWlsZWFnZSwgRW5naW5lIERpc3BsYWNlbWVudCwgQ3lsaW5kZXIgQ291bnQsIFNhbGVzIEFyZWEsIFVuZGVyaG9vZCBJZGVuZmljYXRpb24gTnVtYmVyLCAgVHJhbnNtaXNzaW9uIFR5cGUsIERyaXZldHJhaW4sCUZ1ZWwgVHlwZSwgRW1pc3Npb25zIFN0YW5kYXJkIENvZGUsIFZlaGljbGUgQ2xhc3MsIFNtb2cgUmF0aW5nLCBHcmVlbmhvdXNlIEdhcyBSYXRpbmcsIGFuZCBTbWFydFdheSBSYXRpbmcgd2VyZSBjb2xsZWN0ZWQuICBBbGwgb2YgdGhlc2UgbWVhc3VyZXMgYXJlIGFzc3VtZWQgdG8gaGF2ZSBhbiBlZmZlY3Qgb24gZ2FzIG1pbGVhZ2UuICBTbWFydFdheSBpcyBhIHByb2dyYW0gb2YgdGhlIEVudmlyb25tZW50YWwgUHJvdGVjdGlvbiBBZ2VuY3kgdGhhdCBhY3RzIGFzIGEgc291cmNlIHRvIGJlbmNobWFyaywgbWVhc3VyZSwgYW5kIGltcHJvdmUgdXBvbiB0aGUgZWZmaWNlbmN5IG9mIGZyZWlnaHQgdHJhbnNwb3J0YXRpb24uIA0KI1BhdHRlcm5zOiBHcmVlbmhvdXNlIEdhcyBSYXRpbmcgYXBwZWFycyB0byBiZSBhIGxhcmdlIGRyaXZlciBvZiBDb21iaW5lZCBNUEcuICBUaGUgdG9wIDMgZHJpdmVycyBvZiBDb21iaW5lZCBNUEcgYXJlIEdyZWVuaG91c2UgR2FzIFJhdGluZyBhbmQgRW5naW5lIERpc3BsYWNtZW50LCBHcmVlbmhvdXNlIEdhcyBSYXRpbmcgYW5kIFZlaGljbGUgQ2xhc3MsIGFuZCBHcmVlbmhvdXNlIEdhcyBSYXRpbmcgYW5kIEZ1ZWwgVHlwZS4gIFRoZSBtb3N0IHBvcHVsYXIgRW5naW5lIERpc3BsYWNtZW50IGJ5IFZlaGljbGUgVHlwZSBpcyBzZWNvbmQgbGFyZ2VzdCBjYXRlZ29yeS4gIEFsbCB2ZWhpY2xlIGNsYXNzZXMgaGF2ZSBhdCBsZWFzdCBvbmUgbW9kZWwgd2l0aCBhbiBFbmdpbmUgRGlzcGxhY21lbnQgYmV0d2VlbiAyLjM0LTIuOTIgbGl0ZXJzLiAgNSB2ZWhpY2xlIGNsYXNzZXMgaGF2ZSBhdCBsZWFzdCBvbmUgbW9kZWwgd2l0aCBhbiBlbmdpbmUgZGlzcGxhY21lbnQgYmV0d2VlbiAxLjc2LTIuMzQgbGl0ZXJzLCAyLjkyLTMuNSBsaXRlcnMsIG9yIGFuIGVsZWN0cmljIG1vdG9yLiAgVGhlIG1vc3QgcG9wdWxhciBWYWx1ZXMgZm9yIFRyYW5zbWlzc2lvbiBUeXBlIGFyZSBTZW1pLUF1dG9tYXRpYyA2IHNwZWVkIHdpdGggMTE3IHZlaGljbGVzLCBNYW51YWwgNiBzcGVlZCB3aXRoIDEwMyB2ZWhpY2xlcywgYW5kIHRoZW4gQ29udGlub3VzbHkgVmFyaWFibGUgQ2x1dGNoIHdpdGggOTkuICAgDQojRGVzY3JpcHRpdmUgU3RhdGlzdGljc3RpY3M6IFRoZSBtb2RlbCBzdXJ2ZXllZCBtb3N0IHdhcyB0aGUgTWF6YWRhIDMgZm9yIDE2IHZlaGljbGVzIGZvbGxvd2VkIGJ5IHRoZSBIb25kYSBBY2NvcmQgZm9yIDEzIHZlaGljbGVzIGFuZCB0aGVuIHRoZSBIb25kYSBDaXZpYyBmb3IgMTIgdmVoaWNsZXMuICBUaGUgbW9zdCBwb3B1bGFyIGRpc3BsYWNlbWVudCB3YXMgMiBsaXRlcnMgZm9yIDE0NiB2ZWhpY2xlcyBmb2xsb3dlZCBieSAxLjYgbGl0ZXJzIGZvciAxMDMgdmVoaWNsZXMgYW5kIDEuOCBsaXRlcnMgZm9yIDkyIHZlaGljbGVzLiAgU2VtaUF1dG8tNiBmb3IgMTE3IHZlaGljbGVzLCBNYW4tNiBmb3IgMTAzIHZlaGljbGVzLCBhbmQgQ1ZUIGZvciA5OSB2ZWhpY2xlcyB3ZXJlIHRoZSBtb3N0IHBvcHVsYXIgdHJhbnNtaXNzaW9ucy4gIFRoZXJlIHdlcmUgd2F5IG1vcmUgMldEIHZlaGljbGVzIGF0IDUxOSB0aGFuIDRXRCB2ZWhpY2xlcyBhdCA3OC4gIFRoZSBtb3N0IHBvcHVsYXIgZnVlbCBmb3IgdmVoaWNsZXMgd2FzIGdhc29saW5lIGF0IDUyNywgdGhlbiBFbGVjdHJpY2l0eSBhdCAyOCwgYW5kIGZpbmFsbHkgR2Fzb2xpbmUvRWxlY3RyaWNpdHkgYXQgMTguICBVMiB3YXMgbW9zdCB3aWRlbHkgdXNlZCBzdGFuZGFyYWQgZm9yIGZ1ZWwgZW1pc3Npb24gZm9yIDE5MiB2ZWhpY2xlcy4gIFRoaXMgd2FzIGZvbGxvd2VkIGJ5IEI1IGZvciAxMDIgdmVoaWNsZXMgYW5kIHRoZW4gUFpFViBmb3IgNzcgdmVoaWNsZXMuICBUaGVyZSB3ZXJlIG1vc3RseSBzbWFsbCBjYXJzIHN1cnZleWVkIGF0IDMxMiwgZm9sbG93ZWQgYnkgbWlkc2l6ZSBjYXJzIGF0IDE4NywgYW5kIHRoZW4gc21hbGwgU1VWIGF0IDQyLiAgTWVkaWFuIGFuZCBtZWFuIHNtb2cgcmF0aW5ncyB3ZXJlIDYgYW5kIDYuNzMyIHJlc3BlY3RpdmVseSwgd2l0aCB0aGUgbWF4IHZhbHVlIGJlaW5nIDEwIGFuZCB0aGUgbWluaW11bSB2YWx1ZSBiZWluZyA1LiAgVGhlIHNtb2cgcmF0aW5nIGRhdGEgaGFzIGEgcG9zaXR2ZSBza2V3IGFjcm9zcyB0aGUgc3VydmV5ZWQgdmVoaWNsZXMuICBUaGUgQ29tYmluZWQgTVBHIHRoYXQgd2FzIG1vc3QgcG9wdWxhciB3YXMgMzAgZm9yIDEwMCB2ZWhpY2xlcywgdGhlbiAyNiBmb3IgODYgdmVoaWNsZXMsIGFuZCBmaW5hbGx5IDMxIGZvciA2NCB2ZWhpY2xlcy4gIFRoZSBHcmVlbmhvdXNlIEdhcyBSYXRpbmcgd2FzIGEgbWluaW11bSB2YWx1ZSBvZiA3IGFuZCBhIG1heGltdW0gdmFsdWUgb2YgMTAsIHdpdGggdGhlIG1lYW4gYmVpbmcgNy44OTggYW5kIGEgbWVkaWFuIG9mIDguICBUaGUgR3JlZW5ob3VzZSBHYXMgUmF0aW5nIGRhdGEgaXMgZXZlbmx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgc3VydmV5IG1vZGVscy4gIEFsbCBvZiB0aGUgdmVoaWNsZXMgYXJlIFNtYXJ0V2F5IGNlcnRpZmllZCBhbmQgNDAgb2YgdGhvc2UgdmVoaWNsZXMgYXJlIEVsaXRlIFNtYXJ0V2F5IGNlcnRpZmllZC4NCiMjIFJlc291cmNlcyBQYWNrYWdlcyBVc2Ugb24gdGhpcyBub3RlYm9vaw0KDQotLS0tLS0tLS0tLS0tLQ0KDQoNCioqSW5zdGFsbCByZXF1aXJlZCBwYWNrYWdlcyoqDQoNCiogUGFja2FnZTogdGlkeXZlcnNlLCBjb3JycGxvdA0KDQpgYGB7cn0NCg0KIyBIZXJlIHdlIGFyZSBjaGVja2luZyBpZiB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQNCmlmKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSl7DQogIA0KICAjIElmIHRoZSBwYWNrYWdlIGlzIG5vdCBpbiB0aGUgc3lzdGVtIHRoZW4gaXQgd2lsbCBiZSBpbnN0YWxsDQogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogIA0KICAjIEhlcmUgd2UgYXJlIGxvYWRpbmcgdGhlIHBhY2thZ2UNCiAgbGlicmFyeSgidGlkeXZlcnNlIikNCn0NCg0KIyBIZXJlIHdlIGFyZSBjaGVja2luZyBpZiB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQNCmlmKCFyZXF1aXJlKCJjb3JycGxvdCIpKXsNCiAgDQogICMgSWYgdGhlIHBhY2thZ2UgaXMgbm90IGluIHRoZSBzeXN0ZW0gdGhlbiBpdCB3aWxsIGJlIGluc3RhbGwNCiAgaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KICANCiAgIyBIZXJlIHdlIGFyZSBsb2FkaW5nIHRoZSBwYWNrYWdlDQogIGxpYnJhcnkoImNvcnJwbG90IikNCn0NCg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQoNCiMgSGVyZSB3ZSBhcmUgY2hlY2tpbmcgaWYgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkDQppZighcmVxdWlyZSgibHBTb2x2ZUFQSSIpKXsNCiAgDQogICMgSWYgdGhlIHBhY2thZ2UgaXMgbm90IGluIHRoZSBzeXN0ZW0gdGhlbiBpdCB3aWxsIGJlIGluc3RhbGwNCiAgaW5zdGFsbC5wYWNrYWdlcygibHBTb2x2ZUFQSSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogIA0KICAjIEhlcmUgd2UgYXJlIGxvYWRpbmcgdGhlIHBhY2thZ2UNCiAgbGlicmFyeSgibHBTb2x2ZUFQSSIpDQp9DQoNCmBgYA0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyBEYXRhIENvbGxlY3Rpb246IElORFVTVFJZIC0gVElUTEVfT0ZfWU9VUl9EQVRBU0VUIA0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyMjIFJlYWQgdGhlIGNzdiBmaWxlIGludG8gUiBTdHVkaW8gYW5kIGV4cGxvcmUgdGhlIGRhdGFzZXQgKGV4dHJhY3QgdmFyaWFibGVzKQ0KDQpgYGB7cn0NCm15ZGF0YT1yZWFkLmNzdigiT3JpZ2luYWwgU21hcnRXYXkgVmVoaWNsZSBMaXN0IGZvciBNWSAyMDE0LmNzdiIpDQpoZWFkKG15ZGF0YSkNCnN1bW1hcnkobXlkYXRhKSANCiNEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzdGljczogVGhlIG1vZGVsIHN1cnZleWVkIG1vc3Qgd2FzIHRoZSBNYXphZGEgMyBmb3IgMTYgdmVoaWNsZXMgZm9sbG93ZWQgYnkgdGhlIFZvbGtzd2FnZW4gSmV0dGEgZm9yIDE0IHZlaGljbGVzIGFuZCB0aGVuIHRoZSBIb25kYSBBY2NvcmQgZm9yIDEzIHZlaGljbGVzLiAgVGhlIG1vc3QgcG9wdWxhciBkaXNwbGFjZW1lbnQgd2FzIDIgbGl0ZXJzIGZvciAxNjIgdmVoaWNsZXMgZm9sbG93ZWQgYnkgMS42IGxpdGVycyBmb3IgMTAzIHZlaGljbGVzIGFuZCAxLjggbGl0ZXJzIGZvciA5MiB2ZWhpY2xlcy4gIFNlbWlBdXRvLTYgZm9yIDExNyB2ZWhpY2xlcywgTWFuLTYgZm9yIDExMSB2ZWhpY2xlcywgYW5kIENWVCBmb3IgOTkgdmVoaWNsZXMgd2VyZSB0aGUgbW9zdCBwb3B1bGFyIHRyYW5zbWlzc2lvbnMuICBUaGUgbW9zdCBwb3B1bGFyIGN5bGluZGVyIGNvdW50IHdhcyA0IGF0IDUyNSwgdGhlbiA1IGF0IDM1LCBhbmQgTi9BIGF0IDMwLiAgVGhlcmUgd2VyZSB3YXkgbW9yZSAyV0QgdmVoaWNsZXMgYXQgNTM1IHRoYW4gNFdEIHZlaGljbGVzIGF0IDc5LiAgVGhlIG1vc3QgcG9wdWxhciBmdWVsIGZvciB2ZWhpY2xlcyB3YXMgZ2Fzb2xpbmUgYXQgNTI3LCB0aGVuIEVsZWN0cmljaXR5IGF0IDI4LCBhbmQgZmluYWxseSBEaWVzZWwgYXQgMjcuICBUaGUgbW9zdCBwb3B1bGFyIHNhbGVzIHdhcyBDQSAzNTAsIHRoZW4gRkEgYXQgMjEyLCBhbmQgRkMgYXQgMjEyLiAgVTIgd2FzIG1vc3Qgd2lkZWx5IHVzZWQgc3RhbmRhcmFkIGZvciBmdWVsIGVtaXNzaW9uIGZvciAxOTIgdmVoaWNsZXMuICBUaGlzIHdhcyBmb2xsb3dlZCBieSBCNSBmb3IgMTAyIHZlaGljbGVzIGFuZCB0aGVuIFBaRVYgZm9yIDc3IHZlaGljbGVzLiAgVGhlIG1vc3QgcG9wdWxhciBzdGFuZGFyZCBkZWNyaXB0aW9uIHdpbGwgYmUgQ2FsaWZvcm5pYSBMRVYtSUkgYXQgMTkyLCB0aGVuIDEyMSBmb3IgKG90aGVyKSwgYW5kIGZpbmFsbHkgMTAyIGZvciBGZWRlcmFsIFRpZXIgMiBCaW4gNS4gIFRoZSB1bmRlcmhvb2QgaGFkIGEgbW9zdCBwb3B1bGFyIHR5cGUgb2YgRUJNWFYwMS42TjE4IGF0IDQ0LCBFQlhWMDEuNk4xNiBhdCAyNiwgYW5kIGZpbmFsbHkgRVZXWFYwMi4wM1BBIGF0IDI0LiAgVGhlcmUgd2VyZSBtb3N0bHkgc21hbGwgY2FycyBzdXJ2ZXllZCBhdCAzMjQsIGZvbGxvd2VkIGJ5IG1pZHNpemUgY2FycyBhdCAxODksIGFuZCB0aGVuIHNtYWxsIFNVViBhdCA0Mi4gIFRoZSBtb3N0IHBvcHVsYXIgc21vZyByYXRpbmcgd2FzIDYgYXQgMjU4LCBhbmQgdGhlbiA1IGF0IDExMCwgYW5kIGZpbmFsbHkgOSBhdCA5OS4gIDI2IHdhcyB0aGUgbW9zdCBwb3B1bGFyIGNpdHkgTVBHIGF0IDcxLiAgMjcgd2FzIHNlY29uZCBtb3N0IHBvcHVsYXIgY2l0eSBNUEcgYXQgNjksIGFuZCBmaW5hbGx5IHRoZSB0aGlyZCBtb3N0IHBvcHVsYXIgMjUgYXQgNjUuICBUaGUgbW9zdCBwb3B1bGFyIGhpZ2h3YXkgTVBHIHdhcyAzNSBhdCAxMDEsIDM2IGF0IDU2LCBhbmQgMzcgYXQgNTMuICBUaGUgQ29tYmluZWQgTVBHIHRoYXQgd2FzIG1vc3QgcG9wdWxhciB3YXMgMzAgZm9yIDEwMiB2ZWhpY2xlcywgdGhlbiAyNiBmb3IgODYgdmVoaWNsZXMsIGFuZCBmaW5hbGx5IDMxIGZvciA2NSB2ZWhpY2xlcy4gIFRoZSBHcmVlbmhvdXNlIGdhcyByYXRpbmcgb2YgNyB3YXMgbW9zdCBwb3B1bGFyIGF0IDI0MSwgdGhlIHJhdGluZyBvZiA4IHdhcyBzZWNvbmQgbW9zdCBwb3B1bGFyIGF0IDIzNSwgYW5kIHRoZSByYXRpbmcgb2YgOSB3YXMgdGhyaWQgbW9zdCBwb3B1bGFyIGF0IDYyLiAgT25seSA1NzQgY2FycyBhcmUgU21hcnR3YXkgQ2VydGlmaWVkLCBhbmQgNDAgb2YgdGhvc2UgU21hcnRXYXkgY2VydGlmaWVkIGNhcnMgYXJlIGVsaXRlLiAgDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0NCg0KIyMgRGF0YSBQcmVwYXJhdGlvbjogQ2xlYW5pbmcgYW5kIHByZXBhcmluZyB0aGUgZGF0YSBmb3IgYW5hbHlzaXMNCi0tLS0tLS0tLS0tLS0tDQojVGhlIGZpcnN0IHN0ZXAgdG8gY2xlYW5pbmcgdGhlIGRhdGEgaXMgZ2V0dGluZyByaWQgb2YgYWxsIHRoZSB1bmVzc2ljYXJ5IGNvbHVtbnMgdGhhdCBkb24ndCBwcmVkaWN0IENNQiBNUEcgb2J2aW91c2x5LiAgV2UgZGVsZXRlZCB0aGUgQ2l0eSBNUEcsIEh3eSBNUEcsIGFuZCBTYWxlcyBBcmUgQ29sdW1uLiAgV2UgZmVsdCBsaWtlIENNQiBNUEcgcmVwcmVzdGVkIGEgZmFpciBzdGFuZGFyZCBmb3IgYWxsIHZlaGljbGVzLCBub3QgZmF2b3Jpbmcgb25lIHR5cGUgb2YgY2FyICBvciBhbm90aGVyLiAgV2UgYWxzbyBkZWxldGVkIGFsbCB0aGUgZGllc2VsIGNhcnMgdGhhdCB1c2VkIHRoZSB3b3JkICJNb2QiIHRvIGRlc2NyaWJlIHZhcmlhYmxlcyBpbiB0aGlzIHN0dWR5LiAgVGhlc2UgY2FycyB3ZXJlIHBhcnQgb2YgdGhlIFZvbGtzd2FnZW4gRGlzZWxnYXRlIFNjYW5kYWwgYW5kIHdvdWxkIGNvcnJ1cHQgdGhlIHJlc3Qgb2YgdGhlIGRhdGEuICBXZSBudW1lcmljYWxseSBjb2RpZmllZCBhbGwgdGhlIHdyaXR0ZW4gZGF0YSBmb3IgdGhlIGNvbHVtbnM6IFRyYW5zLAlEcml2ZQlGdWVsLCBTdG5kLAlWZWggQ2xhc3MsIGFuZCBTbWFydFdheS4gIEZvciB0aGUgZWxldHJpYyBhbmQgZ2Fzb2xpbmUvZWxlY3RyaWMgY2FycyB3ZSBtYXJrZWQgdGhlICJOL0EicyBpbiB0aGUgRGlzcGwgYW5kIEN5bCBjb2x1bW5zIGFzICIwIiBhbmQgd2UgYXZlcmFnZWQgdGhlIENNQiBNUEcgY29sdW5tIG51bWJlciB3aGVuIHRoZXJlIHdlcmUgbXVsdGlwbGUuICBUaGVzZSBzdGVwcyB3aWxsIGFsbG93IHVzIHRvIGRldGVybWluZSB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIG1vc3QgY29ycmVsYXRlZCB3aXRoIENNQiBNUEcuDQoNCg0KICANCg0KIyMjIyBSZXBsYWNlIHN0cmluZ3MNCg0KDQpgYGB7cn0NCmRyb3BzIDwtIGMoIlNhbGVzLkFyZWEiLCAiQ2l0eS5NUEciLCAgIkh3eS5NUEciICwgIlN0bmQuRGVzY3JpcHRpb24iICwgIk1vZGVsIiAsICJVbmRlcmhvb2QuSUQiKQ0KbXlkYXRhMj1teWRhdGFbICwgIShuYW1lcyhteWRhdGEpICVpbiUgZHJvcHMpXQ0KbXlkYXRhMz1teWRhdGEyWy1jKDEyOjEyLCA1NjU6NTY1LCA1Njg6NTY4LCA1NzM6NTc0LCA1Nzk6NTgyLCA1OTA6NTkxLCA1OTQ6NTk1LCA2MDE6NjAzLCA2MDg6NjA4KSwgXQ0KRGlzcGxfQ2xlYW4gPC0gc3ViKCJOL0EiICwgIjAiLCBteWRhdGEzJERpc3BsKQ0KbXlkYXRhMyREaXNwbCA8LSBEaXNwbF9DbGVhbg0KQ3lsX0NsZWFuIDwtIHN1YigiTi9BIiAsICIwIiwgbXlkYXRhMyRDeWwpDQpteWRhdGEzJEN5bCA8LSBDeWxfQ2xlYW4gDQp0cmFuc19jbGVhbiA8LSBzdWIoIkFNUy02IiAsICIxLjYiLCBteWRhdGEzJFRyYW5zKSANCm15ZGF0YTMkVHJhbnMgPC0gdHJhbnNfY2xlYW4NCnRyYW5zX2NsZWFuMiA8LSBzdWIoIkFNUy03IiAsICIxLjciLCBteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA8LSB0cmFuc19jbGVhbjIgDQp0cmFuc19jbGVhbjMgPC0gc3ViKCJBTVMtOCIgLCAiMS44IiwgbXlkYXRhMyRUcmFucykgDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMw0KdHJhbnNfY2xlYW40IDwtIHN1YigiQXV0by0xIiAsICIyLjEiLCBteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA8LSB0cmFuc19jbGVhbjQNCnRyYW5zX2NsZWFuNSA8LSBzdWIoIkF1dG8tNCIgLCAiMi40IiwgbXlkYXRhMyRUcmFucykNCm15ZGF0YTMkVHJhbnMgPC0gdHJhbnNfY2xlYW41DQp0cmFuc19jbGVhbjYgPC0gc3ViKCJBdXRvLTUiICwgIjIuNSIsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuNg0KdHJhbnNfY2xlYW43IDwtIHN1YigiQXV0by02IiAsICIyLjYiLCBteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA8LSB0cmFuc19jbGVhbjcNCnRyYW5zX2NsZWFuOCA8LSBzdWIoIkF1dG8tNyIgLCAiMi43IiwgbXlkYXRhMyRUcmFucykNCm15ZGF0YTMkVHJhbnMgPC0gdHJhbnNfY2xlYW44IA0KdHJhbnNfY2xlYW45IDwtIHN1YigiQXV0b01hbi01IiAsICIzLjUiLCBteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA8LSB0cmFuc19jbGVhbjkNCnRyYW5zX2NsZWFuMTAgPC0gc3ViKCJBdXRvTWFuLTYiICwgIjMuNiIsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMTAgDQp0cmFuc19jbGVhbjExIDwtIHN1YigiQXV0b01hbi03IiAsICIzLjciLCBteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA8LSB0cmFuc19jbGVhbjExICANCnRyYW5zX2NsZWFuMTIgPC0gc3ViKCJDVlQiICwgIjQiLCBteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA8LSB0cmFuc19jbGVhbjEyIA0KdHJhbnNfY2xlYW4xMyA8LSBzdWIoIk1hbi01IiAsICI1LjUiICwgbXlkYXRhMyRUcmFucykNCm15ZGF0YTMkVHJhbnMgPC0gdHJhbnNfY2xlYW4xMyANCnRyYW5zX2NsZWFuMTQgPC0gc3ViKCJNYW4tNiIgLCAiNS42IiAsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMTQNCnRyYW5zX2NsZWFuMTUgPC0gc3ViKCJTQ1YtNiIgLCAiNi42IiAsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMTUNCnRyYW5zX2NsZWFuMTYgPC0gc3ViKCJTQ1YtNyIgLCAiNi43IiAsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMTYgDQp0cmFuc19jbGVhbjE3IDwtIHN1YigiU0NWLTgiICwgIjYuOCIgLCBteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA8LSB0cmFuc19jbGVhbjE3DQp0cmFuc19jbGVhbjE4IDwtIHN1YigiU2VtaTIuNSIgLCAiNy41IiAsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMTggDQp0cmFuc19jbGVhbjE5IDwtIHN1YigiU2VtaTIuNiIgLCAiNy42IiAsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMTkgDQp0cmFuc19jbGVhbjIwIDwtIHN1YigiU2VtaTIuNyIgLCAiNy43IiAsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMjAgDQp0cmFuc19jbGVhbjIxIDwtIHN1YigiU2VtaUF1dG8tOCIgLCAiNy44IiAsIG15ZGF0YTMkVHJhbnMpDQpteWRhdGEzJFRyYW5zIDwtIHRyYW5zX2NsZWFuMjENCmRyaXZlX2NsZWFuIDwtIHN1YigiMldEIiAsICIyIiAsIG15ZGF0YTMkRHJpdmUpDQpteWRhdGEzJERyaXZlIDwtIGRyaXZlX2NsZWFuDQpkcml2ZV9jbGVhbjIgPC0gc3ViKCI0V0QiICwgIjQiICwgbXlkYXRhMyREcml2ZSkNCm15ZGF0YTMkRHJpdmUgPC0gZHJpdmVfY2xlYW4yDQpmdWVsX2NsZWFuIDwtIHN1YigiQ05HIiAsICIxIiAsIG15ZGF0YTMkRnVlbCkNCm15ZGF0YTMkRnVlbCA8LSBmdWVsX2NsZWFuDQpmdWVsX2NsZWFuMiA8LSBzdWIoIkRpZXNlbCIsICIyIiAsIG15ZGF0YTMkRnVlbCkNCm15ZGF0YTMkRnVlbCA8LSBmdWVsX2NsZWFuMg0KZnVlbF9jbGVhbjMgPC0gc3ViKCJFbGVjdHJpY2l0eSIgLCAiMyIgLCBteWRhdGEzJEZ1ZWwpDQpteWRhdGEzJEZ1ZWwgPC0gZnVlbF9jbGVhbjMNCmZ1ZWxfY2xlYW40IDwtIHN1YigiRXRoYW5vbC9HYXMiICwgIjQiICwgbXlkYXRhMyRGdWVsKQ0KbXlkYXRhMyRGdWVsIDwtIGZ1ZWxfY2xlYW40IA0KZnVlbF9jbGVhbjUgPC0gc3ViKCJHYXNvbGluZSIgLCAiNSIgLCBteWRhdGEzJEZ1ZWwpDQpteWRhdGEzJEZ1ZWwgPC0gZnVlbF9jbGVhbjUNCmZ1ZWxfY2xlYW42IDwtIHN1YigiR2Fzb2xpbmUvRWxldHJpY2l0eSIgLCAiNiIgLCBteWRhdGEzJEZ1ZWwpDQpteWRhdGEzJEZ1ZWwgPC0gZnVlbF9jbGVhbjYgDQpmdWVsX2NsZWFuNyA8LSBzdWIoIkh5ZHJvZ2VuIiAsICI3IiAsIG15ZGF0YTMkRnVlbCkNCm15ZGF0YTMkRnVlbCA8LSBmdWVsX2NsZWFuNw0KZnVlbF9jbGVhbjggPC0gc3ViKCI1LzMiICwgIjYiICwgbXlkYXRhMyRGdWVsKQ0KbXlkYXRhMyRGdWVsIDwtIGZ1ZWxfY2xlYW44DQpzdGRfY2xlYW4gPC0gc3ViKCJCMSIsICIxIiAsIG15ZGF0YTMkU3RuZCkgDQpteWRhdGEzJFN0bmQgPC0gc3RkX2NsZWFuDQpzdGRfY2xlYW4yIDwtIHN1YigiQjIiLCAiMiIgLCBteWRhdGEzJFN0bmQpDQpteWRhdGEzJFN0bmQgPC0gc3RkX2NsZWFuMiANCnN0ZF9jbGVhbjMgPC0gc3ViKCJCMyIsICIzIiAsIG15ZGF0YTMkU3RuZCkNCm15ZGF0YTMkU3RuZCA8LSBzdGRfY2xlYW4zDQpzdGRfY2xlYW40IDwtIHN1YigiQjQiLCAiNCIgLCBteWRhdGEzJFN0bmQpDQpteWRhdGEzJFN0bmQgPC0gc3RkX2NsZWFuNCANCnN0ZF9jbGVhbjUgPC0gc3ViKCJCNSIsICI1IiAsIG15ZGF0YTMkU3RuZCkNCm15ZGF0YTMkU3RuZCA8LSBzdGRfY2xlYW41DQpzdGRfY2xlYW42IDwtIHN1YigiTDIiLCAiNiIgLCBteWRhdGEzJFN0bmQpDQpteWRhdGEzJFN0bmQgPC0gc3RkX2NsZWFuNg0Kc3RkX2NsZWFuNyA8LSBzdWIoIkwyVUxFVjEyNSIsICI3IiAsIG15ZGF0YTMkU3RuZCkNCm15ZGF0YTMkU3RuZCA8LSBzdGRfY2xlYW43DQpzdGRfY2xlYW44IDwtIHN1YigiTDNTVUxFVjMwIiwgIjgiICwgbXlkYXRhMyRTdG5kKQ0KbXlkYXRhMyRTdG5kIDwtIHN0ZF9jbGVhbjgNCnN0ZF9jbGVhbjkgPC0gc3ViKCJMM1VMRVYxMjUiLCAiOSIgLCBteWRhdGEzJFN0bmQpDQpteWRhdGEzJFN0bmQgPC0gc3RkX2NsZWFuOSANCnN0ZF9jbGVhbjEwIDwtIHN1YigiTDNTVUxFVjMwL1BaRVYiLCAiMTAiICwgbXlkYXRhMyRTdG5kKQ0KbXlkYXRhMyRTdG5kIDwtIHN0ZF9jbGVhbjEwIA0Kc3RkX2NsZWFuMTEgPC0gc3ViKCJMM1VMRVY3MCIsICIxMSIgLCBteWRhdGEzJFN0bmQpDQpteWRhdGEzJFN0bmQgPC0gc3RkX2NsZWFuMTEgDQpzdGRfY2xlYW4xMiA8LSBzdWIoIlBaRVYiLCAiMTIiICwgbXlkYXRhMyRTdG5kKQ0KbXlkYXRhMyRTdG5kIDwtIHN0ZF9jbGVhbjEyDQpzdGRfY2xlYW4xMyA8LSBzdWIoIlMyIiwgIjEzIiAsIG15ZGF0YTMkU3RuZCkNCm15ZGF0YTMkU3RuZCA8LSBzdGRfY2xlYW4xMyANCnN0ZF9jbGVhbjE0IDwtIHN1YigiVTIiLCAiMTQiICwgbXlkYXRhMyRTdG5kKQ0KbXlkYXRhMyRTdG5kIDwtIHN0ZF9jbGVhbjE0DQpzdGRfY2xlYW4xNSA8LSBzdWIoIlpFViIsICIxNSIgLCBteWRhdGEzJFN0bmQpDQpteWRhdGEzJFN0bmQgPC0gc3RkX2NsZWFuMTUgDQpzdGRfY2xlYW4xNiA8LSBzdWIoIjgvMTIiICwgIjgiICwgbXlkYXRhMyRTdG5kKQ0KbXlkYXRhMyRTdG5kIDwtIHN0ZF9jbGVhbjE2DQpzdGRfY2xlYW4xNyA8LSBzdWIoIjZVTEVWMTI1IiAsICI3IiAsIG15ZGF0YTMkU3RuZCkNCm15ZGF0YTMkU3RuZCA8LSBzdGRfY2xlYW4xNw0KdmVoX2NsZWFuMSA8LSBzdWIoImxhcmdlIGNhciIgLCAiMSIgLCBteWRhdGEzJFZlaC5DbGFzcykNCm15ZGF0YTMkVmVoLkNsYXNzIDwtIHZlaF9jbGVhbjENCnZlaF9jbGVhbjIgPC0gc3ViKCJtaWRzaXplIGNhciIgLCAiMiIgLCBteWRhdGEzJFZlaC5DbGFzcykNCm15ZGF0YTMkVmVoLkNsYXNzIDwtIHZlaF9jbGVhbjIgDQp2ZWhfY2xlYW4zIDwtIHN1Yigic21hbGwgY2FyIiAsICIzIiAsIG15ZGF0YTMkVmVoLkNsYXNzKQ0KbXlkYXRhMyRWZWguQ2xhc3MgPC0gdmVoX2NsZWFuMyANCnZlaF9jbGVhbjQgPC0gc3ViKCJzbWFsbCBTVVYiICwgIjQiICwgbXlkYXRhMyRWZWguQ2xhc3MpDQpteWRhdGEzJFZlaC5DbGFzcyA8LSB2ZWhfY2xlYW40IA0KdmVoX2NsZWFuNSA8LSBzdWIoInN0YW5kYXJkIFNVViIgLCAiNSIgLCBteWRhdGEzJFZlaC5DbGFzcykNCm15ZGF0YTMkVmVoLkNsYXNzIDwtIHZlaF9jbGVhbjUgDQp2ZWhfY2xlYW42IDwtIHN1Yigic3RhdGlvbiB3YWdvbiIgLCAiNiIgLCBteWRhdGEzJFZlaC5DbGFzcykNCm15ZGF0YTMkVmVoLkNsYXNzIDwtIHZlaF9jbGVhbjYgDQpjbWJfY2xlYW4xIDwtIHN1YigiMzkvMTE3IiAsICI3OCIsIG15ZGF0YTMkQ21iLk1QRykNCm15ZGF0YTMkQ21iLk1QRyA8LSBjbWJfY2xlYW4xIA0KY21iX2NsZWFuMiA8LSBzdWIoIjI4Lzc2IiAsICI1MiIsIG15ZGF0YTMkQ21iLk1QRykNCm15ZGF0YTMkQ21iLk1QRyA8LSBjbWJfY2xlYW4yIA0KY21iX2NsZWFuMyA8LSBzdWIoIjMzLzgyIiAsICI1Ny41IiwgbXlkYXRhMyRDbWIuTVBHKQ0KbXlkYXRhMyRDbWIuTVBHIDwtIGNtYl9jbGVhbjMgDQpjbWJfY2xlYW40IDwtIHN1YigiMTgvMjYiICwgIjIyIiwgbXlkYXRhMyRDbWIuTVBHKQ0KbXlkYXRhMyRDbWIuTVBHIDwtIGNtYl9jbGVhbjQgDQpjbWJfY2xlYW41IDwtIHN1YigiMzcvOTgiICwgIjY3LjUiICwgbXlkYXRhMyRDbWIuTVBHKQ0KbXlkYXRhMyRDbWIuTVBHIDwtIGNtYl9jbGVhbjUgDQpjbWJfY2xlYW43IDwtIHN1YigiMTkvMjciICwgIjIzIiAsIG15ZGF0YTMkQ21iLk1QRykNCm15ZGF0YTMkQ21iLk1QRyA8LSBjbWJfY2xlYW43DQpjbWJfY2xlYW44IDwtIHN1YigiMzgvODgiICwgIjYzIiAsIG15ZGF0YTMkQ21iLk1QRykNCm15ZGF0YTMkQ21iLk1QRyA8LSBjbWJfY2xlYW44DQpjbWJfY2xlYW45IDwtIHN1YigiMjMvMzAiICwgICIyNi41IiAsIG15ZGF0YTMkQ21iLk1QRykNCm15ZGF0YTMkQ21iLk1QRyA8LSBjbWJfY2xlYW45DQpjbWJfY2xlYW4xMCA8LSBzdWIoIjIyLzMwIiAsICAiMjYiICwgbXlkYXRhMyRDbWIuTVBHKQ0KbXlkYXRhMyRDbWIuTVBHIDwtIGNtYl9jbGVhbjEwIA0KY21iX2NsZWFuMTEgPC0gc3ViKCIyMy8zMyIgLCAgIjI4IiAsIG15ZGF0YTMkQ21iLk1QRykNCm15ZGF0YTMkQ21iLk1QRyA8LSBjbWJfY2xlYW4xMQ0KY21iX2NsZWFuMTIgPC0gc3ViKCI0Ni8xMTUiLCI4MC41IiAsIG15ZGF0YTMkQ21iLk1QRykNCm15ZGF0YTMkQ21iLk1QRyA8LSBjbWJfY2xlYW4xMg0KY21iX2NsZWFuMTMgPC0gc3ViKCIyNS81MCIgLCAgIjM3LjUiICwgbXlkYXRhMyRDbWIuTVBHKQ0KbXlkYXRhMyRDbWIuTVBHIDwtIGNtYl9jbGVhbjEzIA0KY21iX2NsZWFuMTQgPC0gc3ViKCI1MC85NSIgLCAgIjcyLjUiICwgbXlkYXRhMyRDbWIuTVBHKQ0KbXlkYXRhMyRDbWIuTVBHIDwtIGNtYl9jbGVhbjE0IA0Kc21hX2NsZWFuMSA8LSBzdWIoIlllcyIgLCAgIjEiICwgbXlkYXRhMyRTbWFydFdheSkNCm15ZGF0YTMkU21hcnRXYXkgPC0gc21hX2NsZWFuMSANCnNtYV9jbGVhbjIgPC0gc3ViKCJFbGl0ZSIgLCAiMiIgLCBteWRhdGEzJFNtYXJ0V2F5KQ0KbXlkYXRhMyRTbWFydFdheSA8LSBzbWFfY2xlYW4yDQpUcmFuczIgPC0gYXMubnVtZXJpYyhteWRhdGEzJFRyYW5zKQ0KbXlkYXRhMyRUcmFucyA9IFRyYW5zMg0KRGlzcGwyIDwtIGFzLm51bWVyaWMobXlkYXRhMyREaXNwbCkNCm15ZGF0YTMkRGlzcGwgPSBEaXNwbDINCkN5bDIgPC0gYXMubnVtZXJpYyhteWRhdGEzJEN5bCkNCm15ZGF0YTMkQ3lsID0gQ3lsMg0KRHJpdmUyIDwtIGFzLm51bWVyaWMobXlkYXRhMyREcml2ZSkNCm15ZGF0YTMkRHJpdmUgPSBEcml2ZTINCkZ1ZWwyIDwtIGFzLm51bWVyaWMobXlkYXRhMyRGdWVsKQ0KbXlkYXRhMyRGdWVsID0gRnVlbDINClN0bmQyIDwtIGFzLm51bWVyaWMobXlkYXRhMyRTdG5kKQ0KbXlkYXRhMyRTdG5kID0gU3RuZDINClZlaC5DbGFzczIgPC0gYXMubnVtZXJpYyhteWRhdGEzJFZlaC5DbGFzcykNCm15ZGF0YTMkVmVoLkNsYXNzID0gVmVoLkNsYXNzMg0KU21vZy5SYXRpbmcyIDwtIGFzLm51bWVyaWMobXlkYXRhMyRTbW9nLlJhdGluZykNCm15ZGF0YTMkU21vZy5SYXRpbmcgPSBTbW9nLlJhdGluZzINCkNtYi5NUEcyIDwtIGFzLm51bWVyaWMobXlkYXRhMyRDbWIuTVBHKQ0KbXlkYXRhMyRDbWIuTVBHID0gQ21iLk1QRzINCkdyZWVuaG91c2UuR2FzLlJhdGluZzIgPC0gYXMubnVtZXJpYyhteWRhdGEzJEdyZWVuaG91c2UuR2FzLlJhdGluZykNCm15ZGF0YTMkR3JlZW5ob3VzZS5HYXMuUmF0aW5nID0gR3JlZW5ob3VzZS5HYXMuUmF0aW5nMg0KU21hcnRXYXkyIDwtIGFzLm51bWVyaWMobXlkYXRhMyRTbWFydFdheSkNCm15ZGF0YTMkU21hcnRXYXkgPSBTbWFydFdheTINCm15ZGF0YTQ9bXlkYXRhM1stYyg1OTg6MTg5OCksXQ0KYGBgDQoNCmxhcmdlIGNhcj0xDQptaWRzaXplIGNhcj0yDQpzbWFsbCBjYXI9IDMNCnNtYWxsIHN1dj00DQpzdGFuZGFyZCBzdXY9NQ0Kc3RhdGlvbiB3YWdvbj02DQoNCg0KIyMjIyBTYXZlIHRoZSBuZXcgY2xlYW4gZGF0YQ0KDQpgYGB7cn0NCg0KbmV3ZGF0YSA8LSB3cml0ZV9jc3YoIG15ZGF0YTQgLCAiY2xlYW5fZGF0YS5jc3YiKQ0KDQoNCmBgYA0KDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIERhdGEgQW5hbHlzaXM6IERlc2NyaXB0aXZlIFN0YXRpc3RpY3MsIENvcnJlbGF0aW9ucw0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyMjIEJhc2ljIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIGRhdGFzZXQgKHdyaXRlIGRvd24gYW55IG9ic2VydmF0aW9ucykNCg0KYGBge3J9DQpzdW1tYXJ5KG5ld2RhdGEpDQpgYGANCg0KYGBge3J9DQpoZWFkKG5ld2RhdGEpDQpgYGANCg0KIyMgRm9yIERpc3BsIHRoZSBtaW4gaXMgMCBhbmQgdGhlIG1heCBpcyAzLjUgRm9yIEN5bCB0aGUgbWluIGlzIDAgYW5kIG1heCBpcyA2LiBGb3IgdHJhbnMgdGhlIG1pbiBpcyAxLjYgYW5kIHRoZSBtYXggaXMgNy44LiBGb3IgRHJpdmUgdGhlIG1pbiBpcyAyIGFuZCB0aGUgbWF4IGlzIDQuIEZvciBmdWVsIHRoZSBtaW4gaXMgMSBhbmQgdGhlIG1heCBpcyA3LiBGb3IgU3RuZCB0aGUgbWluIGlzIDEgYW5kIHRoZSBtYXggaXMgMTUuIEZvciBWZWguQ2xhc3MgdGhlIG1pbiBpcyAxIGFuZCB0aGUgbWF4IGlzIDYuIEZvciBTbW9nLlJhdGluZyB0aGUgbWluIGlzIDIgYW5kIHRoZSBtYXggaXMgNy4gRm9yIENtYi5NUEcgdGhlIG1pbiBpcyAyMiBhbmQgdGhlIG1heiBpcyAxMjQuIEZvciBHcmVlbmhvdXNlLkdhcy5SYXRpbmcgdGhlIG1pbiBpcyAyIGFuZCB0aGUgbWF4IGlzIDUuIEZvciBTbWFydHdheSB0aGUgbWluIGlzIDEgYW5kIHRoZSBtYXggaXMgMi4gDQoNCg0KIyMjIyBDb3JyZWxhdGlvbiB0YWJsZSAoIG9ubHkgbnVtZXJpYyBkYXRhICkNCg0KYGBge3J9DQoNCmRhdGFfY29yciA8LSBjb3IobmV3ZGF0YSkNCmRhdGFfY29ycg0KDQpgYGANCiMjIERpc3BsIGFuZCBDeWwgaGF2ZSB0aGUgaGlnaGVzdCBjb3JyZWxhdGlvbiBhdCAuODU0NCBmb2xsb3dlZCBjbG9zZWx5IGJ5IFNtYXJ0V2F5IGFuZCBDbWIuTVBHIGF0IC44NTExLiBDeWwgYW5kIENtYi5NUEcgaGF2ZSB0aGUgbG93ZXN0IGNvcnJlbGF0aW9uIGF0IC0wLjgwMTIwMjUyLiANCg0KIyMjIyBDb3JyZWxhdGlvbiBQbG90ICggb25seSBudW1lcmljIGRhdGEgKQ0KDQpgYGB7cn0NCg0KY29ycnBsb3QoZGF0YV9jb3JyKQ0KDQpgYGANCiMjIEN5bCBhbmQgZGlzcGxhY2VtZW50IGhhdmUgYSBoaWdoIHBvc2l0aXZlIGNvcnJlbGF0aW9uIHByb2JhYmx5IGJlY2F1c2UgdGhlIGJpZ2dlciB0aGUgZGlzcGxhY2VtZW50IHRoZSBtb3JlIGN5bGluZGVycy4gQ21iLk1QRyBhbmQgQ3lsIGFyZSBoaWdobHkgbmVnZXRpdmVseSBjb3JyZWxhdGVkIGJlY2F1c2UgZW5naW5lcyB3aXRoIG1vcmUgY3lsaW5kZXJzIGJ1cm4gbW9yZSBnYXNvbGluZS4gDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIFZpc3VhbCBBbmFseXRpY3M6IFVzZSBUYWJsZSBvciBSIHRvIGNyZWF0ZSBwbG90cyANCg0KLS0tLS0tLS0tLS0tLS0NCg0KYGBge3J9DQpsaW5lYXJfbW9kZWwgPC0gbG0oQ21iLk1QRyB+IFZlaC5DbGFzcykNCmxpbmVhcl9tb2RlbA0KYGBgDQoNCg0KYGBge3J9DQpzdW1tYXJ5KGxpbmVhcl9tb2RlbCkNCmBgYA0KIyMgdGhlIHItc3F1YXJlZCBpcyAuMDA1NTA5IGFuZCB0aGUgYWRqdXN0ZWQgci1zcXVhcmVkIGlzIC4wMDM4MzguIFRoZXNlIHNjb3JlcyBsZWFkIHVzIHRvIGJlbGlldmUgdGhhdCBWZWhpY2xlIGNsYXNzIGRvZXNuJ3Qgc2hvdyBtdWNoIG9mIGEgY29ycmVsYXRpb24gd2l0aCBDbWIuTVBHIGFzIHdlIGh5cG90aGVzaXplZC4gDQoNCg0KYGBge3J9DQpsaW5lYXJfbW9kZWwyIDwtIGxtKENtYi5NUEcgfiBWZWguQ2xhc3MgKyBTbWFydFdheSkNCmxpbmVhcl9tb2RlbDINCmBgYA0KDQoNCg0KYGBge3J9DQpzdW1tYXJ5KGxpbmVhcl9tb2RlbDIpDQpgYGANCiMjIFRoZSByLXNxdWFyZWQgZm9yIHRoaXMgbW9kZWwgaXMgLjcyNSBhbmQgdGhlIGFkanVzdGVkIHItc3F1YXJlZCBpcyAuNzI0MS4gVGhpcyBzaG93cyB0aGF0IENtYi5NUEcgYWxvbmcgd2l0aCBWZWggU21hcnRXYXkgaGF2ZSBhIHZlcnkgaGlnaCBjb3JyZWxhdGlvbi4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlIGEgU21hcnRXYXkgY2FyIHdpdGggYSBoaWdoIHNjb3JlIG1lYW5zIHRoZXkncmUgZ29vZCBmb3IgdGhlIGVjb25vbXkgd2hpY2ggbWVhbnMgdGhleSdsbCBoYXZlIGEgaGlnaGVyIGNvbWJpbmVkIE1QRy4gDQoNCmBgYHtyfQ0KbGluZWFyX21vZGVsMyA8LSBsbSggQ21iLk1QRyB+IERpc3BsICtWZWguQ2xhc3MgKSANCmxpbmVhcl9tb2RlbDMNCmBgYA0KDQoNCg0KYGBge3J9DQpzdW1tYXJ5KGxpbmVhcl9tb2RlbDMpDQpgYGANCg0KIyMgVGhlIHItc3F1YXJlZCBmb3IgdGhpcyBtb2RlbCBpcyAuNDMzOSBhbmQgdGhlIGFkanVzdGVkIHItc3F1YXJlZCBpcyAuNDMyLiBCYXNlZCBvZmYgdGhlIGZhY3Qgb2YgaG93IG11Y2ggdGhlIHItc3F1YXJlZCB2YWx1ZSBjYW1lIHVwLCBDb21iaW5lZCBtcGcgYW5kIGRpc3BsYWNlbWVudCBhcmUgbW9yZSBoaWdobHkgY29ycmVsYXRlZCB0aGFuIGp1c3QgQ29tYmluZWQgTVBHIGFuZCB2ZWhpY2xlIGNsYXNzLiANCg0KIyMgVGhlc2UgbW9kZWxzIHNob3cgdGhhdCBvdXIgb3JpZ2luYWwgaHlwb3RoZXNpcyB3YXMgd3JvbmcuIFZlaGljbGUgY2xhc3MgYW5kIGNvbWJpbmVkIE1QRyBhcmUgbm90IHZlcnkgaGlnaGx5IGNvcnJlbGF0ZWQuIEhvd2V2ZXIsIG91ciBvdGhlciBtb2RlbHMgaGF2ZSBjYXVzZWQgdXMgdG8gdGhpbmsgYWJvdXQgb3RoZXIgZmFjdG9ycyB0aGF0IG1heSBjYXVzZSBjb21iaW5lZCBtcGcgdG8gYmUgaGlnaGVyIG9yIGxvd2VyIHN1Y2ggYXMgdGhlIGRpc3BsYWNlbWVudCBvciB0aGUgY3lsaW5kZXJzLg==