Required packages

library(readr) # Useful for importing data
library(tidyr) # Useful for tidying up data
library(dplyr) # Useful for working with structured data
library(magrittr) # Useful for set of operations which promotes semantics
library(Hmisc) # Useful for data analysis and imputing missing valued
library(MVN) # Useful for analysing data
library(forecast) # Useful for normalizing graphs.

Executive Summary

Data

accident <- read_csv("C:/Users/Syed Hassan Afsar/Downloads/RMIT 1st Semester/Data Preprocessing/Assignment 3/fatalaccidentdata.csv")
Parsed with column specification:
cols(
  Fatal_Accident_Index = col_character(),
  Month_of_Accident = col_character(),
  Hour_of_Accident = col_character(),
  Longitude = col_double(),
  Latitude = col_double(),
  Pedestrian_Casualties = col_integer(),
  Pedal_Cycles = col_integer(),
  Motor_Cycles = col_integer(),
  Cars = col_integer(),
  Buses_or_Coaches = col_integer(),
  Vans = col_integer(),
  HGVs = col_integer(),
  Other_Vehicles = col_integer(),
  Total_Vehicles_Involved = col_integer(),
  Fatal_Casualties = col_integer(),
  Serious_Casualties = col_integer(),
  Slight_Casualties = col_integer(),
  Total_Number_of_Casualties = col_integer()
)
head(accident)
accident <- accident[-c(6:13,15:17)]
head(accident)
casualty <- read_csv("C:/Users/Syed Hassan Afsar/Downloads/RMIT 1st Semester/Data Preprocessing/Assignment 3/fatalcasualtydata.csv")
Parsed with column specification:
cols(
  Fatal_Accident_Index = col_character(),
  Fatal_Casualty_Type = col_character(),
  Fatal_Casualty_Sex = col_character(),
  Fatal_Casualty_Age = col_character()
)
head(casualty)
fatalaccident_casualty <- left_join(accident,casualty, by = "Fatal_Accident_Index")
head(fatalaccident_casualty)

Understand

attributes(fatalaccident_casualty)
$`row.names`
   [1]    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17
  [18]   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
  [35]   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51
  [52]   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
  [69]   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85
  [86]   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
 [103]  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119
 [120]  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136
 [137]  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153
 [154]  154  155  156  157  158  159  160  161  162  163  164  165  166  167  168  169  170
 [171]  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187
 [188]  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
 [205]  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221
 [222]  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238
 [239]  239  240  241  242  243  244  245  246  247  248  249  250  251  252  253  254  255
 [256]  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
 [273]  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289
 [290]  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
 [307]  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323
 [324]  324  325  326  327  328  329  330  331  332  333  334  335  336  337  338  339  340
 [341]  341  342  343  344  345  346  347  348  349  350  351  352  353  354  355  356  357
 [358]  358  359  360  361  362  363  364  365  366  367  368  369  370  371  372  373  374
 [375]  375  376  377  378  379  380  381  382  383  384  385  386  387  388  389  390  391
 [392]  392  393  394  395  396  397  398  399  400  401  402  403  404  405  406  407  408
 [409]  409  410  411  412  413  414  415  416  417  418  419  420  421  422  423  424  425
 [426]  426  427  428  429  430  431  432  433  434  435  436  437  438  439  440  441  442
 [443]  443  444  445  446  447  448  449  450  451  452  453  454  455  456  457  458  459
 [460]  460  461  462  463  464  465  466  467  468  469  470  471  472  473  474  475  476
 [477]  477  478  479  480  481  482  483  484  485  486  487  488  489  490  491  492  493
 [494]  494  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510
 [511]  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525  526  527
 [528]  528  529  530  531  532  533  534  535  536  537  538  539  540  541  542  543  544
 [545]  545  546  547  548  549  550  551  552  553  554  555  556  557  558  559  560  561
 [562]  562  563  564  565  566  567  568  569  570  571  572  573  574  575  576  577  578
 [579]  579  580  581  582  583  584  585  586  587  588  589  590  591  592  593  594  595
 [596]  596  597  598  599  600  601  602  603  604  605  606  607  608  609  610  611  612
 [613]  613  614  615  616  617  618  619  620  621  622  623  624  625  626  627  628  629
 [630]  630  631  632  633  634  635  636  637  638  639  640  641  642  643  644  645  646
 [647]  647  648  649  650  651  652  653  654  655  656  657  658  659  660  661  662  663
 [664]  664  665  666  667  668  669  670  671  672  673  674  675  676  677  678  679  680
 [681]  681  682  683  684  685  686  687  688  689  690  691  692  693  694  695  696  697
 [698]  698  699  700  701  702  703  704  705  706  707  708  709  710  711  712  713  714
 [715]  715  716  717  718  719  720  721  722  723  724  725  726  727  728  729  730  731
 [732]  732  733  734  735  736  737  738  739  740  741  742  743  744  745  746  747  748
 [749]  749  750  751  752  753  754  755  756  757  758  759  760  761  762  763  764  765
 [766]  766  767  768  769  770  771  772  773  774  775  776  777  778  779  780  781  782
 [783]  783  784  785  786  787  788  789  790  791  792  793  794  795  796  797  798  799
 [800]  800  801  802  803  804  805  806  807  808  809  810  811  812  813  814  815  816
 [817]  817  818  819  820  821  822  823  824  825  826  827  828  829  830  831  832  833
 [834]  834  835  836  837  838  839  840  841  842  843  844  845  846  847  848  849  850
 [851]  851  852  853  854  855  856  857  858  859  860  861  862  863  864  865  866  867
 [868]  868  869  870  871  872  873  874  875  876  877  878  879  880  881  882  883  884
 [885]  885  886  887  888  889  890  891  892  893  894  895  896  897  898  899  900  901
 [902]  902  903  904  905  906  907  908  909  910  911  912  913  914  915  916  917  918
 [919]  919  920  921  922  923  924  925  926  927  928  929  930  931  932  933  934  935
 [936]  936  937  938  939  940  941  942  943  944  945  946  947  948  949  950  951  952
 [953]  953  954  955  956  957  958  959  960  961  962  963  964  965  966  967  968  969
 [970]  970  971  972  973  974  975  976  977  978  979  980  981  982  983  984  985  986
 [987]  987  988  989  990  991  992  993  994  995  996  997  998  999 1000
 [ reached getOption("max.print") -- omitted 7656 entries ]

$class
[1] "tbl_df"     "tbl"        "data.frame"

$names
 [1] "Fatal_Accident_Index"       "Month_of_Accident"          "Hour_of_Accident"          
 [4] "Longitude"                  "Latitude"                   "Total_Vehicles_Involved"   
 [7] "Total_Number_of_Casualties" "Fatal_Casualty_Type"        "Fatal_Casualty_Sex"        
[10] "Fatal_Casualty_Age"        
str(fatalaccident_casualty)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   8656 obs. of  10 variables:
 $ Fatal_Accident_Index      : chr  "200601CP00117" "200601TA00014" "200601TA00032" "200601TA00055" ...
 $ Month_of_Accident         : chr  "May" "January" "February" "January" ...
 $ Hour_of_Accident          : chr  "16" "22" "09" "16" ...
 $ Longitude                 : num  -0.0882 -0.1303 -0.0678 -0.0827 -0.1412 ...
 $ Latitude                  : num  51.5 51.5 51.6 51.6 51.5 ...
 $ Total_Vehicles_Involved   : int  2 1 1 2 2 1 1 1 1 3 ...
 $ Total_Number_of_Casualties: int  1 2 1 1 1 1 1 1 1 3 ...
 $ Fatal_Casualty_Type       : chr  "Pedestrian" "Pedestrian" "Pedestrian" "Motor_Cycle_Rider" ...
 $ Fatal_Casualty_Sex        : chr  "Male" "Male" "Male" "Male" ...
 $ Fatal_Casualty_Age        : chr  "33" "64" "2" "41" ...
fatalaccident_casualty$Month_of_Accident <- fatalaccident_casualty$Month_of_Accident %>% factor(levels = c("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), ordered = TRUE)
fatalaccident_casualty$Fatal_Casualty_Sex <- fatalaccident_casualty$Fatal_Casualty_Sex %>% factor(levels = c("Male", "Female", "Not_Reported"), labels = c("Male", "Female","Not_Reported"))
str(fatalaccident_casualty)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   8656 obs. of  10 variables:
 $ Fatal_Accident_Index      : chr  "200601CP00117" "200601TA00014" "200601TA00032" "200601TA00055" ...
 $ Month_of_Accident         : Ord.factor w/ 12 levels "Jan"<"Feb"<"Mar"<..: 5 1 2 1 4 4 4 5 5 5 ...
 $ Hour_of_Accident          : chr  "16" "22" "09" "16" ...
 $ Longitude                 : num  -0.0882 -0.1303 -0.0678 -0.0827 -0.1412 ...
 $ Latitude                  : num  51.5 51.5 51.6 51.6 51.5 ...
 $ Total_Vehicles_Involved   : int  2 1 1 2 2 1 1 1 1 3 ...
 $ Total_Number_of_Casualties: int  1 2 1 1 1 1 1 1 1 3 ...
 $ Fatal_Casualty_Type       : chr  "Pedestrian" "Pedestrian" "Pedestrian" "Motor_Cycle_Rider" ...
 $ Fatal_Casualty_Sex        : Factor w/ 3 levels "Male","Female",..: 1 1 1 1 1 1 1 2 2 1 ...
 $ Fatal_Casualty_Age        : chr  "33" "64" "2" "41" ...

Tidy & Manipulate Data I

fatalaccident_casualty <- fatalaccident_casualty %>% separate(Fatal_Accident_Index, c("Year","Index"), sep = 4)
fatalaccident_casualty
fatalaccident_casualty$Year <- fatalaccident_casualty$Year %>% factor(levels = c("2006", "2007", "2008"), labels = c("2006", "2007","2008"), ordered = TRUE)

Tidy & Manipulate Data II

fatalaccident_casualty <- mutate(fatalaccident_casualty,
       Casualty_Per_Car = Total_Number_of_Casualties / Total_Vehicles_Involved)
fatalaccident_casualty

Scan I

sum(is.na(fatalaccident_casualty))
[1] 0
colSums(is.na(fatalaccident_casualty))
                      Year                      Index          Month_of_Accident 
                         0                          0                          0 
          Hour_of_Accident                  Longitude                   Latitude 
                         0                          0                          0 
   Total_Vehicles_Involved Total_Number_of_Casualties        Fatal_Casualty_Type 
                         0                          0                          0 
        Fatal_Casualty_Sex         Fatal_Casualty_Age           Casualty_Per_Car 
                         0                          0                          0 

Scan II

boxplot(fatalaccident_casualty$Casualty_Per_Car ~ fatalaccident_casualty$Year)

length_outliers_filter <- fatalaccident_casualty %>% filter(Casualty_Per_Car < 10)
boxplot(length_outliers_filter$Casualty_Per_Car ~ length_outliers_filter$Year)

Transform

hist(fatalaccident_casualty$Casualty_Per_Car, main = "Casualty per Car")

boxcox <- BoxCox(fatalaccident_casualty$Casualty_Per_Car, lambda = "auto")
hist(boxcox, main = "Casualty per Car")



LS0tDQp0aXRsZTogIkNhc3VhbHR5IEJ5IEFjY2lkZW50IGluIFVLIGZyb20gMjAwNiB0byAyMDA4Ig0KYXV0aG9yOiAiU3llZCBIYXNzYW4gQWZzYXIgKHMzNzM0MDg5KSBTaWRkaGFydGggU2hhcm1hIChzMzczODAxOSkiDQpzdWJ0aXRsZTogQXNzaWdubWVudCAzDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KIyMgUmVxdWlyZWQgcGFja2FnZXMgDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KHJlYWRyKSAjIFVzZWZ1bCBmb3IgaW1wb3J0aW5nIGRhdGENCmxpYnJhcnkodGlkeXIpICMgVXNlZnVsIGZvciB0aWR5aW5nIHVwIGRhdGENCmxpYnJhcnkoZHBseXIpICMgVXNlZnVsIGZvciB3b3JraW5nIHdpdGggc3RydWN0dXJlZCBkYXRhDQpsaWJyYXJ5KG1hZ3JpdHRyKSAjIFVzZWZ1bCBmb3Igc2V0IG9mIG9wZXJhdGlvbnMgd2hpY2ggcHJvbW90ZXMgc2VtYW50aWNzDQpsaWJyYXJ5KEhtaXNjKSAjIFVzZWZ1bCBmb3IgZGF0YSBhbmFseXNpcyBhbmQgaW1wdXRpbmcgbWlzc2luZyB2YWx1ZWQNCmxpYnJhcnkoTVZOKSAjIFVzZWZ1bCBmb3IgYW5hbHlzaW5nIGRhdGENCmxpYnJhcnkoZm9yZWNhc3QpICMgVXNlZnVsIGZvciBub3JtYWxpemluZyBncmFwaHMuDQoNCmBgYA0KDQojIyBFeGVjdXRpdmUgU3VtbWFyeSANCg0KKiBBaW06IFRvIGRlbW9uc3RyYXRlIGFsbCB0aGUgbmVjZXNzYXJ5IHNraWxscyBlc3NlbnRpYWwgaW4gdGhlIGRhdGEgcHJlcHJvY2Vzc2luZyBzdGFnZSBvZiBkYXRhIGFuYWx5c2lzLg0KDQoqIERhdGEgQ29sbGVjdGlvbjogVGhlIGRhdGEgdXNlZCBpbiB0aGlzIHJlcG9ydCB3YXMgYW4gT3BlbiBHb3Zlcm5tZW50IExpY2Vuc2UgZGF0YSBvcHRlZCBmcm9tIHRoZSBnb3Zlcm5tZW50IHdlYnNpdGUgb2YgVUsuIFRoZSBkYXRhIHVzZWQgaXMgYWJvdXQgdGhlIGluanVyaWVzIGFuZCBjYXN1YWx0eSB0aGF0IHBlb3BsZSBnb3QgaW4gYW4gYWNjaWRlbnQgZnJvbSB0aGUgeWVhciAyMDA2IHRvIDIwMDguDQoNCiogQXBwcm9hY2ggb24gU29sdmluZzogRmlyc3Qgd2UgaW1wb3J0ZWQgdGhlIGRhdGEgdXNpbmcgdGhlIHJlYWRyIGZ1bmN0aW9uLCBhcyB0aGVyZSB3ZXJlIHR3byBkYXRhc2V0cyBzbyB0aGVuIGJ5IHVzaW5nIHRoZSB0aWR5ciBmdW5jdGlvbiB3ZSBqb2luIHRob3NlIHR3byBkYXRhc2V0cy4gQWZ0ZXIgdGhhdCB3ZSBjaGVja2VkIHRoZSBhdHRyaWJ1dGVzIGFuZCB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhIGFuZCBmYWN0b3JpemUgdGhlIHZhcmlhYmxlcyB3aGVyZSBuZWNlc3NhcnkuIFRoZW4gd2UgYWdhaW4gY2hlY2sgaWYgb3VyIGRhdGEgaXMgY29tcGxldGVseSB0aWR5IHVwLCBhcyB0aGVyZSB3YXMgb25lIHByb2JsZW0gd2UgdGlkeSB0aGF0IHVwIGFuZCB0aGVuIGJ5IHVzaW5nIHRoZSBzYW1lIHRpZHlyIHBhY2thZ2Ugd2UgbWFrZSBhIG5ldyB2YXJpYWJsZSB1c2luZyBtdXRhdGUgZnVuY3Rpb24uIFRoZW4gd2UgZGlkIHRoZSBzY2FubmluZyBwcm9jZXNzIHRvIGZpbmQgb3V0IGlmIHRoZXJlIGFyZSBhbnkgTkEgdmFsdWVzIHByZXNlbnQgaW4gb3VyIGRhdGEuIEFmdGVyIHRoYXQgd2UgY2hlY2sgZm9yIHRoZSBvdXRsaWVycyBhbmQgYXMgd2UgZm91bmQgc29tZSB3ZSBmaWx0ZXIgdGhlbSBvdXQgYW5kIHRoZW4gYWdhaW4gcGxvdCB0aGUgYm94cGxvdCB3aXRob3V0IG91dGxpZXJzLiBBdCBsYXN0IHdoZXJlIHdlIGhhdmUgdG8gcGVyZm9ybSB0cmFuc2Zvcm1hdGlvbiB3ZSB0YWtlIG9uZSB2YXJpYWJsZSBhbmQgZmlyc3QgcGxvdCBpdHMgaGlzdG9ncmFtIGFzIGl0IHdhcyByaWdodC1za2V3ZWQgd2UgYXBwbHkgbG9nMTAoKSBmdW5jdGlvbiBvbiBpdCB0byBtYWtlIGl0IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFuZCB0aGVuIGZpbmFsbHkgcGxvdCB0aGUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgZ3JhcGguDQoNCiogQ29uY2x1c2lvbjogV2Ugd2VyZSBhYmxlIHRvIGNvbXBsZXRlIGFsbCB0aGUgdGFza3MgZ2l2ZW4gaW4gdGhpcyBhc3NpZ25tZW50IGFuZCB0cmllZCBvdXIgbGV2ZWwgYmVzdCB0byBzaG93Y2FzZSBvdXIgc2tpbGxzIHByb3Blcmx5LiBBdCBsYXN0IGJ5IGxvb2tpbmcgYXQgdGhlIGNvbWJpbmUgYm94cGxvdCB3ZSBjYW4gc2F5IHRoYXQgdGhlIG51bWJlciBvZiBhY2NpZGVudHMgYW5kIHRoZSBudW1iZXIgb2YgY2FzdWFsdGllcyBpbiBhbGwgdGhlIHRocmVlIHllYXJzIGFyZSBhbG1vc3QgdGhlIHNhbWUuDQoNCiMjIERhdGEgDQoNCiogVGhlIGZvbGxvd2luZyBkYXRhIGlzIGFuIG9wZW4gc291cmNlIGRhdGEgd2l0aCBPcGVuIEdvdmVybm1lbnQgTGljZW5zZSBvcHRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToNCiogaHR0cHM6Ly9kYXRhLmdvdi51ay9kYXRhc2V0LzczZjRjZDNlLTkyZWQtNGNmOC1hZDBiLTBmZTMwMDQyYjYyNi9yZXBvcnRlZC1mYXRhbC1wZXJzb25hbC1pbmp1cnktcm9hZC1hY2NpZGVudC1hbmQtY2FzdWFsdHktZGF0YS1nYi0yMDA2LTIwMDgNCiogaHR0cHM6Ly93d3cubmF0aW9uYWxhcmNoaXZlcy5nb3YudWsvZG9jL29wZW4tZ292ZXJubWVudC1saWNlbmNlL3ZlcnNpb24vMy8NCiogVGhlIGZvbGxvd2luZyBkYXRhIHByb3ZpZGVzIHRoZSBkZXRhaWwgb2YgZXZlcnlvbmUgcmVwb3J0ZWQgZmF0YWwgaW5qdXJ5IGJ5IHJvYWQgYWNjaWRlbnQgaW4gRW5nbGFuZCBmcm9tIDIwMDYgdG8gMjAwOCBhbHNvIGluY2x1ZGluZyB0aGUgbGF0aXR1ZGVzIGFuZCBsb25naXR1ZGVzIG9mIHRoZSBhY2NpZGVudC4NCiogVGhpcyBkYXRhIHdhcyBsYXN0IHVwZGF0ZWQgb24gMTkgTWF5IDIwMTAuDQoqIFRoZXJlIGFyZSB0d28gZGF0YSBzZXRzIG9uIGNvbnRhaW5zIHRoZSBkZXRhaWwgaW5mb3JtYXRpb24gb2Ygd2hpY2ggY2FyIHdhcyBpbnZvbHZlZCBpbiBhY2NpZGVudCBhbmQgaG93IG1hbnkgY2FzdWFsdGllcy4NCiogVGhlIHNlY29uZCBkYXRhIGhvbGQgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSB0eXBlLCBzZXggYW5kIGFnZSBvZiBjYXN1YWx0eS4NCiogVGhlcmUgYXJlIGFyb3VuZCAxOCB2YXJpYWJsZXMgaW4gdGhlIGZpcnN0IGRhdGFzZXQgd2hpbGUgNCB2YXJpYWJsZXMgaW4gdGhlIHNlY29uZCBvbmUuDQoqIFdlIGltcG9ydGVkIGJvdGggb2YgdGhlIGRhdGFzZXRzIHVzaW5nIHRoZSByZWFkX2NzdigpIGZ1bmN0aW9uIGFuZCB0aGVuIHNob3dlZCB0aGUgaGVhZGVyIG9mIHRob3NlIGRhdGFzZXRzLg0KKiBUaGVuIGluIHRoZSBmaXJzdCBkYXRhc2V0IHRoZXJlIHdlcmUgc29tZSB2YXJpYWJsZXMgd2hpY2ggd2VyZSBvZiBubyB1c2Ugc28gd2UgZHJvcCB0aGVtIGFuZCBrZWVwIGFsbCB2YXJpYWJsZXMgd2hpY2ggd2VyZSBuZWNlc3NhcnkgZm9yIHVzIHNvIG5vdyBvdXQgb2YgMTggdmFyaWFibGVzIG9ubHkgNyB2YXJpYWJsZXMgaW4gdGhlIGZpcnN0IGRhdGFzZXQgd2VyZSBvZiB1c2UuDQoqIFRoZW4gd2Ugam9pbiBib3RoIHRoZSBkYXRhc2V0cyBhcyB0aGV5IGhhdmUgb25lIHZhcmlhYmxlIGluIGNvbW1vbiB3aGljaCB3YXMgRmF0YWxfQWNjaWRlbnRfSW5kZXggc28gd2l0aCB0aGUgaGVscCBvZiBmdW5jdGlvbiBsZWZ0X2pvaW4oKSB3byBjb21iaW5lIHRoZW0gYW5kIG1ha2Ugb25lIHRhYmxlIGNhbGxlZCBmYXRhbGFjY2lkZW50X2Nhc3VhbHR5Lg0KDQpgYGB7cn0NCg0KYWNjaWRlbnQgPC0gcmVhZF9jc3YoIkM6L1VzZXJzL1N5ZWQgSGFzc2FuIEFmc2FyL0Rvd25sb2Fkcy9STUlUIDFzdCBTZW1lc3Rlci9EYXRhIFByZXByb2Nlc3NpbmcvQXNzaWdubWVudCAzL2ZhdGFsYWNjaWRlbnRkYXRhLmNzdiIpDQpoZWFkKGFjY2lkZW50KQ0KDQphY2NpZGVudCA8LSBhY2NpZGVudFstYyg2OjEzLDE1OjE3KV0NCmhlYWQoYWNjaWRlbnQpDQoNCmNhc3VhbHR5IDwtIHJlYWRfY3N2KCJDOi9Vc2Vycy9TeWVkIEhhc3NhbiBBZnNhci9Eb3dubG9hZHMvUk1JVCAxc3QgU2VtZXN0ZXIvRGF0YSBQcmVwcm9jZXNzaW5nL0Fzc2lnbm1lbnQgMy9mYXRhbGNhc3VhbHR5ZGF0YS5jc3YiKQ0KaGVhZChjYXN1YWx0eSkNCg0KZmF0YWxhY2NpZGVudF9jYXN1YWx0eSA8LSBsZWZ0X2pvaW4oYWNjaWRlbnQsY2FzdWFsdHksIGJ5ID0gIkZhdGFsX0FjY2lkZW50X0luZGV4IikNCmhlYWQoZmF0YWxhY2NpZGVudF9jYXN1YWx0eSkNCg0KYGBgDQoNCiMjIFVuZGVyc3RhbmQgDQoNCiogRmlyc3QsIHdlIGNoZWNrZWQgdGhlIGF0dHJpYnV0ZXMgb2Ygb3VyIGRhdGFzZXQuDQoqIFRoZW4gZmlyc3Qgd2UgY2hlY2sgdGhlIHN0cnVjdHVyZSBvZiBvdXIgbmV3IGRhdGEgd2hpY2ggZ2l2ZXMgdGhlIGRhdGEgdHlwZSBvZiBlYWNoIHZhcmlhYmxlLg0KKiBUaGVuIHdlIGNoYW5nZSB0aGUgZGF0YSB0eXBlIG9mIE1vbnRoc19vZl9BY2NpZGVudCBmcm9tIGNoYXJhY3RlciB0byBmYWN0b3IuDQoqIFdlIGFsc28gY2hhbmdlIHRoZSBkYXRhIHR5cGUgb2YgRmF0YWxfQ2FzdWFsdHlfU2V4IGZyb20gY2hhcmFjdGVyIHRvIGZhY3Rvci4NCiogVGhlbiB3ZSBhZ2FpbiBjaGVjayB0aGUgc3RydWN0dXJlIG9mIG91ciBkYXRhLg0KDQpgYGB7cn0NCg0KYXR0cmlidXRlcyhmYXRhbGFjY2lkZW50X2Nhc3VhbHR5KQ0KDQpzdHIoZmF0YWxhY2NpZGVudF9jYXN1YWx0eSkNCg0KZmF0YWxhY2NpZGVudF9jYXN1YWx0eSRNb250aF9vZl9BY2NpZGVudCA8LSBmYXRhbGFjY2lkZW50X2Nhc3VhbHR5JE1vbnRoX29mX0FjY2lkZW50ICU+JSBmYWN0b3IobGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciIpLCBsYWJlbHMgPSBjKCJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIpLCBvcmRlcmVkID0gVFJVRSkNCg0KZmF0YWxhY2NpZGVudF9jYXN1YWx0eSRGYXRhbF9DYXN1YWx0eV9TZXggPC0gZmF0YWxhY2NpZGVudF9jYXN1YWx0eSRGYXRhbF9DYXN1YWx0eV9TZXggJT4lIGZhY3RvcihsZXZlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIsICJOb3RfUmVwb3J0ZWQiKSwgbGFiZWxzID0gYygiTWFsZSIsICJGZW1hbGUiLCJOb3RfUmVwb3J0ZWQiKSkNCg0Kc3RyKGZhdGFsYWNjaWRlbnRfY2FzdWFsdHkpDQoNCmBgYA0KDQojIwlUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIEkgDQoNCiogVGhlIGZpcnN0IHZhcmlhYmxlIHdpdGggRmF0YWxfQWNjaWRlbnRfSW5kZXggYWxzbyBoYXZlIFllYXIgb2YgYWNjaWRlbnQgaW4gaXQgc28gbXkgZGF0YSB3YXMgbm90IGluIGEgdGlkeSBmb3JtYXQgc28gd2UgaGF2ZSB0byBzZXBhcmF0ZSBZZWFyIGZyb20gRmF0YWxfQWNjaWRlbnRfSW5kZXggYnkgdXNpbmcgdGhlIGZ1bmN0aW9uIHNlcGFyYXRlKCkuDQoqIE5vdyBteSBkYXRhIGlzIGluIHRpZHkgZm9ybWF0Lg0KKiBUaGVuIHNob3dlZCB0aGUgb3V0cHV0IG9mIGhvdyBteSBkYXRhIGxvb2tzLg0KKiBUaGVuIHdlIGZhY3Rvcml6ZSB0aGUgbmV3IHZhcmlhYmxlIFllYXIuDQoNCmBgYHtyfQ0KDQpmYXRhbGFjY2lkZW50X2Nhc3VhbHR5IDwtIGZhdGFsYWNjaWRlbnRfY2FzdWFsdHkgJT4lIHNlcGFyYXRlKEZhdGFsX0FjY2lkZW50X0luZGV4LCBjKCJZZWFyIiwiSW5kZXgiKSwgc2VwID0gNCkNCg0KZmF0YWxhY2NpZGVudF9jYXN1YWx0eQ0KDQpmYXRhbGFjY2lkZW50X2Nhc3VhbHR5JFllYXIgPC0gZmF0YWxhY2NpZGVudF9jYXN1YWx0eSRZZWFyICU+JSBmYWN0b3IobGV2ZWxzID0gYygiMjAwNiIsICIyMDA3IiwgIjIwMDgiKSwgbGFiZWxzID0gYygiMjAwNiIsICIyMDA3IiwiMjAwOCIpLCBvcmRlcmVkID0gVFJVRSkNCg0KYGBgDQoNCiMjCVRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSUkgDQoNCiogV2UgY3JlYXRlZCBhIG5ldyB2YXJpYWJsZSBuYW1lZCBDYXN1YWx0eV9QZXJfQ2FyIHdpdGggdGhlIGhlbHAgb2YgbXV0YXRlKCkgZnVuY3Rpb24gYW5kIHdlIHN0b3JlZCB0aGUgcmF0aW8gb2YgVG90bGFfTnVtYmVyX29mX0Nhc3VhbHRpZXMgYW5kIFRvdGVsX1ZlaGljbGVzX0ludm9sdmVkLg0KKiBUaGVuIHNob3dlZCB0aGUgb3V0cHV0IG9mIHRoZSBuZXcgZGF0YXNldC4NCiogTm93IG91ciBkYXRhIGlzIGNvbXBsZXRlbHkgdGlkeXVwLg0KDQpgYGB7cn0NCg0KZmF0YWxhY2NpZGVudF9jYXN1YWx0eSA8LSBtdXRhdGUoZmF0YWxhY2NpZGVudF9jYXN1YWx0eSwNCiAgICAgICBDYXN1YWx0eV9QZXJfQ2FyID0gVG90YWxfTnVtYmVyX29mX0Nhc3VhbHRpZXMgLyBUb3RhbF9WZWhpY2xlc19JbnZvbHZlZCkNCg0KZmF0YWxhY2NpZGVudF9jYXN1YWx0eQ0KDQpgYGANCg0KIyMJU2NhbiBJIA0KDQoqIFdlIGNoZWNrIHRoZSB0b3RhbCBzdW0gb2YgTmEgdmFsdWVzIGluIG91ciBkYXRhIHdpdGggc3VtKCkgZnVuY3Rpb24gd2l0aCBpcy5uYSgpIGluc2lkZSBpdC4NCiogQW5kYSB0aGVuICB3ZSBjaGVjayB0aGUgY29sdW1uIHN1bSBvZiBlYWNoIHZhcmlhYmxlIHNvIHNlZSBhbnkgcG9zc2libGUgTkEgcHJlc2VudCBpbiBhbnkgb2YgdGhlIHZhcmlhYmxlIHVzaW5nIHRoZSBmdW5jdGlvbiBjb2xTdW1zKCkgd2l0aCBpcy5uYSgpIGluc2lkZSBpdC4NCiogQXMgd2Ugc2F3IHRoYXQgdGhlcmUgd2VyZSBubyBOQSB2YWx1ZXMgcHJlc2VudCBpbiBvdXIgZGF0YXNldCBzbyAgbm8gbmVlZCBvZiBmdXJ0aGVyIGludmVzdGlnYXRpb24gb3IgcHJvY2Vzc2luZyBhdCB0aGlzIHN0YWdlLg0KDQpgYGB7cn0NCg0Kc3VtKGlzLm5hKGZhdGFsYWNjaWRlbnRfY2FzdWFsdHkpKQ0KY29sU3Vtcyhpcy5uYShmYXRhbGFjY2lkZW50X2Nhc3VhbHR5KSkNCg0KYGBgDQoNCiMjCVNjYW4gSUkNCg0KKiBJbiBvdXIgZGF0YSB0aGVyZSBhcmUgdHdvIG1haW4gbnVtZXJpY2FsIHZhbHVlcyBUb3RsYV9WZWhpY2xlX0ludm9sdmVkIGFuZCBUb3RhbF9OdW1iZXJfb2ZfQ2FzdWFsdHkgc28gaW5zdGVhZCBvZiBtYWtpbmcgc2VwYXJhdGUgYm94cGxvdHMgd2UgbWFkZSBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgYXMgQ2FzdWFsdHlfUGVyX0NhciBpbiB0aGUgVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSBUYXNrLCBhbmQgbm93IHdlIHVzZSB0aGlzIHZhcmlhYmxlIHdpdGggdGhlIFllYXIgdmFyaWFibGUgdG8gc2hvdyB0aGUgY29tcGFyaXNvbiBvZiB0aGUgQ2FzdWFsdHlfUGVyX0NhciBpbiBhbGwgdGhyZWUgeWVhcnMuDQoqIEZpcnN0LCB3ZSBwbG90IHRoZSBib3hwbG90IG9mIENhc3VhbHR5X1Blcl9DYXIgdnMgWWVhciBpbiB3aGljaCB3ZSBzYXcgdGhhdCB0aGVyZSB3ZXJlIHNvbWUgb3V0bGllcnMuDQoqIFNvLCB0byByZW1vdmUgdGhvc2Ugb3V0bGllcnMgd2UgZmlsdGVyIG91dCB0aG9zZSB2YWx1ZXMuDQoqIEFuZCB0aGVuIGFnYWluIHBsb3QgdGhlIGJveHBsb3Qgd2l0aG91dCBhbnkgcG9zc2libGUgb3V0bGllcnMuDQoqIE91dGxpZXJzIHdoaWNoIHdlcmUgZmFyIGF3YXkgZnJvbSB0aGUgbWF4IHZhbHVlIHdlcmUgcmVtb3ZlZCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIHNvbWUgZXJyb3Igd2hpbGUgZW50ZXJpbmcgZGF0YSBzbyBnaXZpbmcgaXQgYSBiZW5lZml0IG9mIGRvdWJ0IHRoZSBtb3N0IG1heGltdW0gdmFsdWVzIHdlcmUgcmVtb3ZlZCBvdGhlciB2YWx1ZXMgd2VyZSBrZXB0IGFzIGl0IGlzIGJlY2F1c2UgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBpZiBhbiBhY2NpZGVudCBvY2N1cnMgYmV0d2VlbiB0d28gY2FycyA2IHRvIDcgcGVvcGxlIGNhbiBkaWUgb3IgY2FuIGdldCBzZXJpb3VzIGluanVyaWVzLg0KDQpgYGB7cn0NCg0KYm94cGxvdChmYXRhbGFjY2lkZW50X2Nhc3VhbHR5JENhc3VhbHR5X1Blcl9DYXIgfiBmYXRhbGFjY2lkZW50X2Nhc3VhbHR5JFllYXIpDQpsZW5ndGhfb3V0bGllcnNfZmlsdGVyIDwtIGZhdGFsYWNjaWRlbnRfY2FzdWFsdHkgJT4lIGZpbHRlcihDYXN1YWx0eV9QZXJfQ2FyIDwgMTApDQpib3hwbG90KGxlbmd0aF9vdXRsaWVyc19maWx0ZXIkQ2FzdWFsdHlfUGVyX0NhciB+IGxlbmd0aF9vdXRsaWVyc19maWx0ZXIkWWVhcikNCg0KYGBgDQoNCg0KIyMJVHJhbnNmb3JtDQoNCiogRmlyc3QsIHdlIHBsb3QgdGhlIGhpc3RvZ3JhbSBvZiBDYXN1YWx0eV9QZXJfQ2FyIGFuZCBzYXcgdGhlIG91dHB1dCwgaXQgd2FzIHJpZ2h0IHNrZXdlZC4NCiogU28sIHRvIGRlYWwgd2l0aCBpdCB3ZSBhcHBseSBzb21lIHRyYW5zZm9ybWF0aW9uIG9uIGl0IGJ5IHVzaW5nIEJveENveCgpIGZ1bmN0aW9uIG9uIHRoYXQgdmFyaWFibGUgYW5kIHRoZW4gc3RvcmUgdGhhdCB2YWx1ZXMgaW4gYm94Y294Lg0KKiBUaGVuIHdlIHBsb3QgdGhlIGhpc3RvZ3JhbSBvZiB0aGF0IG5ldyBsaXN0IGJveGNveCB3aGljaCBzZWVtcyB0byBiZSBhbG1vc3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCmBgYHtyfQ0KDQpoaXN0KGZhdGFsYWNjaWRlbnRfY2FzdWFsdHkkQ2FzdWFsdHlfUGVyX0NhciwgbWFpbiA9ICJDYXN1YWx0eSBwZXIgQ2FyIikNCmJveGNveCA8LSBCb3hDb3goZmF0YWxhY2NpZGVudF9jYXN1YWx0eSRDYXN1YWx0eV9QZXJfQ2FyLCBsYW1iZGEgPSAiYXV0byIpDQpoaXN0KGJveGNveCwgbWFpbiA9ICJDYXN1YWx0eSBwZXIgQ2FyIikNCg0KYGBgDQoNCjxicj4NCjxicj4NCg==