Section 1 - Loading the Data

1.1

How many rows of data (observations) are in this dataset?

mvt= mvtWeek1
nrow(mvt)
[1] 191641

1.2

How many variables are in this dataset?

str(mvt)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   191641 obs. of  11 variables:
 $ ID                 : int  8951354 8951141 8952745 8952223 8951608 8950793 8950760 8951611 8951802 8950706 ...
 $ Date               : chr  "12/31/12 23:15" "12/31/12 22:00" "12/31/12 22:00" "12/31/12 22:00" ...
 $ LocationDescription: chr  "STREET" "STREET" "RESIDENTIAL YARD (FRONT/BACK)" "STREET" ...
 $ Arrest             : logi  FALSE FALSE FALSE FALSE FALSE TRUE ...
 $ Domestic           : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Beat               : int  623 1213 1622 724 211 2521 423 231 1021 1215 ...
 $ District           : int  6 12 16 7 2 25 4 2 10 12 ...
 $ CommunityArea      : int  69 24 11 67 35 19 48 40 29 24 ...
 $ Year               : int  2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
 $ Latitude           : num  41.8 41.9 42 41.8 41.8 ...
 $ Longitude          : num  -87.6 -87.7 -87.8 -87.7 -87.6 ...
 - attr(*, "spec")=List of 2
  ..$ cols   :List of 11
  .. ..$ ID                 : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ Date               : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ LocationDescription: list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ Arrest             : list()
  .. .. ..- attr(*, "class")= chr  "collector_logical" "collector"
  .. ..$ Domestic           : list()
  .. .. ..- attr(*, "class")= chr  "collector_logical" "collector"
  .. ..$ Beat               : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ District           : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ CommunityArea      : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ Year               : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ Latitude           : list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  .. ..$ Longitude          : list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  ..$ default: list()
  .. ..- attr(*, "class")= chr  "collector_guess" "collector"
  ..- attr(*, "class")= chr "col_spec"
var=11

1.3

Using the “max” function, what is the maximum value of the variable “ID”?

max(mvt$ID)
[1] 9181151

1.4

What is the minimum value of the variable “Beat”?

min(mvt$Beat)
[1] 111

1.5

How many observations have value TRUE in the Arrest variable (this is the number of crimes for which an arrest was made)? 15536

summary(mvt) 
       ID              Date           LocationDescription   Arrest         Domestic      
 Min.   :1310022   Length:191641      Length:191641       Mode :logical   Mode :logical  
 1st Qu.:2832144   Class :character   Class :character    FALSE:176105    FALSE:191226   
 Median :4762956   Mode  :character   Mode  :character    TRUE :15536     TRUE :415      
 Mean   :4968629                                                                         
 3rd Qu.:7201878                                                                         
 Max.   :9181151                                                                         
                                                                                         
      Beat         District     CommunityArea        Year         Latitude    
 Min.   : 111   Min.   : 1.00   Min.   : 0      Min.   :2001   Min.   :41.64  
 1st Qu.: 722   1st Qu.: 6.00   1st Qu.:22      1st Qu.:2003   1st Qu.:41.77  
 Median :1121   Median :10.00   Median :32      Median :2006   Median :41.85  
 Mean   :1259   Mean   :11.82   Mean   :38      Mean   :2006   Mean   :41.84  
 3rd Qu.:1733   3rd Qu.:17.00   3rd Qu.:60      3rd Qu.:2009   3rd Qu.:41.92  
 Max.   :2535   Max.   :31.00   Max.   :77      Max.   :2012   Max.   :42.02  
                NA's   :43056   NA's   :24616                  NA's   :2276   
   Longitude     
 Min.   :-87.93  
 1st Qu.:-87.72  
 Median :-87.68  
 Mean   :-87.68  
 3rd Qu.:-87.64  
 Max.   :-87.52  
 NA's   :2276    

1.6

How many observations have a LocationDescription value of ALLEY? 2308

 table(mvt$LocationDescription)

                             ABANDONED BUILDING 
                                              4 
AIRPORT BUILDING NON-TERMINAL - NON-SECURE AREA 
                                              4 
    AIRPORT BUILDING NON-TERMINAL - SECURE AREA 
                                              1 
             AIRPORT EXTERIOR - NON-SECURE AREA 
                                             24 
                 AIRPORT EXTERIOR - SECURE AREA 
                                              1 
                            AIRPORT PARKING LOT 
                                             11 
 AIRPORT TERMINAL UPPER LEVEL - NON-SECURE AREA 
                                              5 
                  AIRPORT VENDING ESTABLISHMENT 
                                             10 
                               AIRPORT/AIRCRAFT 
                                            363 
                                          ALLEY 
                                           2308 
                                ANIMAL HOSPITAL 
                                              1 
                                      APARTMENT 
                                            184 
                                APPLIANCE STORE 
                                              1 
                                  ATHLETIC CLUB 
                                              9 
                                           BANK 
                                              7 
                                  BAR OR TAVERN 
                                             17 
                                     BARBERSHOP 
                                              4 
                                  BOWLING ALLEY 
                                              3 
                                         BRIDGE 
                                              2 
                                       CAR WASH 
                                             44 
                                  CHA APARTMENT 
                                              5 
                        CHA PARKING LOT/GROUNDS 
                                            405 
              CHURCH/SYNAGOGUE/PLACE OF WORSHIP 
                                             56 
                                 CLEANING STORE 
                                              3 
                     COLLEGE/UNIVERSITY GROUNDS 
                                             47 
              COLLEGE/UNIVERSITY RESIDENCE HALL 
                                              2 
                   COMMERCIAL / BUSINESS OFFICE 
                                            126 
                              CONSTRUCTION SITE 
                                             35 
                              CONVENIENCE STORE 
                                              7 
                    CTA GARAGE / OTHER PROPERTY 
                                            148 
                                      CTA TRAIN 
                                              1 
                              CURRENCY EXCHANGE 
                                              2 
                                DAY CARE CENTER 
                                              5 
                               DEPARTMENT STORE 
                                             22 
                         DRIVEWAY - RESIDENTIAL 
                                           1675 
                                     DRUG STORE 
                                              8 
                 FACTORY/MANUFACTURING BUILDING 
                                             16 
                                   FIRE STATION 
                                              5 
                                FOREST PRESERVE 
                                              6 
                                    GAS STATION 
                                           2111 
                   GOVERNMENT BUILDING/PROPERTY 
                                             48 
                             GROCERY FOOD STORE 
                                             80 
                             HIGHWAY/EXPRESSWAY 
                                             22 
                      HOSPITAL BUILDING/GROUNDS 
                                            101 
                                    HOTEL/MOTEL 
                                            124 
                        JAIL / LOCK-UP FACILITY 
                                              1 
                 LAKEFRONT/WATERFRONT/RIVERBANK 
                                              4 
                                        LIBRARY 
                                              4 
                          MEDICAL/DENTAL OFFICE 
                                              3 
                            MOVIE HOUSE/THEATER 
                                             18 
                                      NEWSSTAND 
                                              1 
                   NURSING HOME/RETIREMENT HOME 
                                             21 
                                          OTHER 
                                           4573 
                OTHER COMMERCIAL TRANSPORTATION 
                                              8 
              OTHER RAILROAD PROP / TRAIN DEPOT 
                                             28 
                                  PARK PROPERTY 
                                            255 
                 PARKING LOT/GARAGE(NON.RESID.) 
                                          14852 
                POLICE FACILITY/VEH PARKING LOT 
                                            266 
                                      RESIDENCE 
                                           1302 
                        RESIDENCE PORCH/HALLWAY 
                                             18 
                               RESIDENCE-GARAGE 
                                           1176 
                  RESIDENTIAL YARD (FRONT/BACK) 
                                           1536 
                                     RESTAURANT 
                                             49 
                               SAVINGS AND LOAN 
                                              4 
                      SCHOOL, PRIVATE, BUILDING 
                                             14 
                       SCHOOL, PRIVATE, GROUNDS 
                                             23 
                       SCHOOL, PUBLIC, BUILDING 
                                            114 
                        SCHOOL, PUBLIC, GROUNDS 
                                            206 
                                       SIDEWALK 
                                            462 
                             SMALL RETAIL STORE 
                                             33 
                           SPORTS ARENA/STADIUM 
                                            166 
                                         STREET 
                                         156564 
                            TAVERN/LIQUOR STORE 
                                             14 
                                        TAXICAB 
                                             21 
                                VACANT LOT/LAND 
                                            985 
                         VEHICLE NON-COMMERCIAL 
                                            817 
                             VEHICLE-COMMERCIAL 
                                             23 
                                      WAREHOUSE 
                                             17 

Section 2 - Understanding Dates in R

In many datasets, like this one, you have a date field. Unfortunately, R does not automatically recognize entries that look like dates. We need to use a function in R to extract the date and time. Take a look at the first entry of Date (remember to use square brackets when looking at a certain entry of a variable).

2.1

In what format are the entries in the variable Date?

  • Month/Day/Year Hour:Minute
  • Day/Month/Year Hour:Minute
  • Hour:Minute Month/Day/Year
  • Hour:Minute Day/Month/Year
 mvt$Date[1]
[1] "12/31/12 23:15"

2.2

Now, let’s convert these characters into a Date object in R. In your R console, type

DateConvert = as.Date(strptime(mvt$Date, "%m/%d/%y %H:%M"))

This converts the variable “Date” into a Date object in R. Take a look at the variable DateConvert using the summary function.

What is the month and year of the median date in our dataset? Enter your answer as “Month Year”, without the quotes. (Ex: if the answer was 2008-03-28, you would give the answer “March 2008”, without the quotes.) May2006

summary(DateConvert)
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
"2001-01-01" "2003-07-10" "2006-05-21" "2006-08-23" "2009-10-24" "2012-12-31" 

2.3

Now, let’s extract the month and the day of the week, and add these variables to our data frame mvt. We can do this with two simple functions. Type the following commands in R:

mvt$Month = months(DateConvert)

mvt$Weekday = weekdays(DateConvert)

This creates two new variables in our data frame, Month and Weekday, and sets them equal to the month and weekday values that we can extract from the Date object. Lastly, replace the old Date variable with DateConvert by typing:

mvt$Date = DateConvert

Using the table command, answer the following questions.

In which month did the fewest motor vehicle thefts occur? Feb

mvt$Month = months(DateConvert)
mvt$Weekday = weekdays(DateConvert)
mvt$Date = DateConvert
table(mvt$Month)

 10月  11月  12月   1月   2月   3月   4月   5月   6月   7月   8月   9月 
17086 16063 16426 16047 13511 15758 15280 16035 16002 16801 16572 16060 

2.4

On which weekday did the most motor vehicle thefts occur? Fri

table(mvt$Weekday)

 週二  週六  週日  週三  週四  週五  週一 
26791 27118 26316 27416 27319 29284 27397 

2.5

Each observation in the dataset represents a motor vehicle theft, and the Arrest variable indicates whether an arrest was later made for this theft. Which month has the largest number of motor vehicle thefts for which an arrest was made? January

table(mvt$Arrest,mvt$Month)
       
         10月  11月  12月   1月   2月   3月   4月   5月   6月   7月   8月   9月
  FALSE 15744 14807 15029 14612 12273 14460 14028 14848 14772 15477 15243 14812
  TRUE   1342  1256  1397  1435  1238  1298  1252  1187  1230  1324  1329  1248
LS0tCnRpdGxlOiAiQVMxLTEgQW4gQW5hbHl0aWNhbCBEZXRlY3RpdmUiCmF1dGhvcjogIjxuYW1lPiA8c3R1ZGVudCBJRD4iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCi0gLSAtIAoKIyMjIFNlY3Rpb24gMSAtIExvYWRpbmcgdGhlIERhdGEKCiMjIyMgMS4xIApIb3cgbWFueSByb3dzIG9mIGRhdGEgKG9ic2VydmF0aW9ucykgYXJlIGluIHRoaXMgZGF0YXNldD8KCmBgYHtyfQptdnQ9IG12dFdlZWsxCm5yb3cobXZ0KQpgYGAKCgojIyMjIDEuMiAKSG93IG1hbnkgdmFyaWFibGVzIGFyZSBpbiB0aGlzIGRhdGFzZXQ/CmBgYHtyfQpzdHIobXZ0KQoKYGBgCgoKIyMjIyAxLjMgClVzaW5nIHRoZSAibWF4IiBmdW5jdGlvbiwgd2hhdCBpcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgIklEIj8KCmBgYHtyfQptYXgobXZ0JElEKQpgYGAKCiMjIyMgMS40IApXaGF0IGlzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAiQmVhdCI/CmBgYHtyfQptaW4obXZ0JEJlYXQpCmBgYAoKCiMjIyMgMS41IApIb3cgbWFueSBvYnNlcnZhdGlvbnMgaGF2ZSB2YWx1ZSBUUlVFIGluIHRoZSBBcnJlc3QgdmFyaWFibGUgKHRoaXMgaXMgdGhlIG51bWJlciBvZiBjcmltZXMgZm9yIHdoaWNoIGFuIGFycmVzdCB3YXMgbWFkZSk/CjE1NTM2CmBgYHtyfQpzdW1tYXJ5KG12dCkgCmBgYAoKIyMjIyAxLjYgCkhvdyBtYW55IG9ic2VydmF0aW9ucyBoYXZlIGEgTG9jYXRpb25EZXNjcmlwdGlvbiB2YWx1ZSBvZiBBTExFWT8KMjMwOAoKYGBge3J9CiB0YWJsZShtdnQkTG9jYXRpb25EZXNjcmlwdGlvbikKCmBgYAoKIyMjIFNlY3Rpb24gMiAtIFVuZGVyc3RhbmRpbmcgRGF0ZXMgaW4gUgoKCkluIG1hbnkgZGF0YXNldHMsIGxpa2UgdGhpcyBvbmUsIHlvdSBoYXZlIGEgZGF0ZSBmaWVsZC4gVW5mb3J0dW5hdGVseSwgUiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBlbnRyaWVzIHRoYXQgbG9vayBsaWtlIGRhdGVzLiBXZSBuZWVkIHRvIHVzZSBhIGZ1bmN0aW9uIGluIFIgdG8gZXh0cmFjdCB0aGUgZGF0ZSBhbmQgdGltZS4gVGFrZSBhIGxvb2sgYXQgdGhlIGZpcnN0IGVudHJ5IG9mIERhdGUgKHJlbWVtYmVyIHRvIHVzZSBzcXVhcmUgYnJhY2tldHMgd2hlbiBsb29raW5nIGF0IGEgY2VydGFpbiBlbnRyeSBvZiBhIHZhcmlhYmxlKS4KCiMjIyMgMi4xIApJbiB3aGF0IGZvcm1hdCBhcmUgdGhlIGVudHJpZXMgaW4gdGhlIHZhcmlhYmxlIERhdGU/CgorIE1vbnRoL0RheS9ZZWFyIEhvdXI6TWludXRlCisgRGF5L01vbnRoL1llYXIgSG91cjpNaW51dGUKKyBIb3VyOk1pbnV0ZSBNb250aC9EYXkvWWVhcgorIEhvdXI6TWludXRlIERheS9Nb250aC9ZZWFyCgpgYGB7cn0KIG12dCREYXRlWzFdCmBgYAoKIyMjIyAyLjIgCgpOb3csIGxldCdzIGNvbnZlcnQgdGhlc2UgY2hhcmFjdGVycyBpbnRvIGEgRGF0ZSBvYmplY3QgaW4gUi4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGUKCiAgICBEYXRlQ29udmVydCA9IGFzLkRhdGUoc3RycHRpbWUobXZ0JERhdGUsICIlbS8lZC8leSAlSDolTSIpKQoKVGhpcyBjb252ZXJ0cyB0aGUgdmFyaWFibGUgIkRhdGUiIGludG8gYSBEYXRlIG9iamVjdCBpbiBSLiBUYWtlIGEgbG9vayBhdCB0aGUgdmFyaWFibGUgRGF0ZUNvbnZlcnQgdXNpbmcgdGhlIHN1bW1hcnkgZnVuY3Rpb24uCgpXaGF0IGlzIHRoZSBtb250aCBhbmQgeWVhciBvZiB0aGUgbWVkaWFuIGRhdGUgaW4gb3VyIGRhdGFzZXQ/IEVudGVyIHlvdXIgYW5zd2VyIGFzICJNb250aCBZZWFyIiwgd2l0aG91dCB0aGUgcXVvdGVzLiAoRXg6IGlmIHRoZSBhbnN3ZXIgd2FzIDIwMDgtMDMtMjgsIHlvdSB3b3VsZCBnaXZlIHRoZSBhbnN3ZXIgIk1hcmNoIDIwMDgiLCB3aXRob3V0IHRoZSBxdW90ZXMuKSBNYXkyMDA2CgpgYGB7cn0KRGF0ZUNvbnZlcnQgPSBhcy5EYXRlKHN0cnB0aW1lKG12dCREYXRlLCAiJW0vJWQvJXkgJUg6JU0iKSkKc3VtbWFyeShEYXRlQ29udmVydCkKYGBgCgojIyMjIDIuMwpOb3csIGxldCdzIGV4dHJhY3QgdGhlIG1vbnRoIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrLCBhbmQgYWRkIHRoZXNlIHZhcmlhYmxlcyB0byBvdXIgZGF0YSBmcmFtZSBtdnQuIFdlIGNhbiBkbyB0aGlzIHdpdGggdHdvIHNpbXBsZSBmdW5jdGlvbnMuIFR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBpbiBSOgoKICAgIG12dCRNb250aCA9IG1vbnRocyhEYXRlQ29udmVydCkKCiAgICBtdnQkV2Vla2RheSA9IHdlZWtkYXlzKERhdGVDb252ZXJ0KQoKVGhpcyBjcmVhdGVzIHR3byBuZXcgdmFyaWFibGVzIGluIG91ciBkYXRhIGZyYW1lLCBNb250aCBhbmQgV2Vla2RheSwgYW5kIHNldHMgdGhlbSBlcXVhbCB0byB0aGUgbW9udGggYW5kIHdlZWtkYXkgdmFsdWVzIHRoYXQgd2UgY2FuIGV4dHJhY3QgZnJvbSB0aGUgRGF0ZSBvYmplY3QuIExhc3RseSwgcmVwbGFjZSB0aGUgb2xkIERhdGUgdmFyaWFibGUgd2l0aCBEYXRlQ29udmVydCBieSB0eXBpbmc6CgogICAgbXZ0JERhdGUgPSBEYXRlQ29udmVydAoKVXNpbmcgdGhlIHRhYmxlIGNvbW1hbmQsIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KCkluIHdoaWNoIG1vbnRoIGRpZCB0aGUgZmV3ZXN0IG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyPwpGZWIKCmBgYHtyfQptdnQkTW9udGggPSBtb250aHMoRGF0ZUNvbnZlcnQpCgptdnQkV2Vla2RheSA9IHdlZWtkYXlzKERhdGVDb252ZXJ0KQptdnQkRGF0ZSA9IERhdGVDb252ZXJ0CnRhYmxlKG12dCRNb250aCkKYGBgCgojIyMjIDIuNCAKT24gd2hpY2ggd2Vla2RheSBkaWQgdGhlIG1vc3QgbW90b3IgdmVoaWNsZSB0aGVmdHMgb2NjdXI/CkZyaQpgYGB7cn0KdGFibGUobXZ0JFdlZWtkYXkpCmBgYAoKIyMjIyAyLjUgCkVhY2ggb2JzZXJ2YXRpb24gaW4gdGhlIGRhdGFzZXQgcmVwcmVzZW50cyBhIG1vdG9yIHZlaGljbGUgdGhlZnQsIGFuZCB0aGUgQXJyZXN0IHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIGFuIGFycmVzdCB3YXMgbGF0ZXIgbWFkZSBmb3IgdGhpcyB0aGVmdC4gV2hpY2ggbW9udGggaGFzIHRoZSBsYXJnZXN0IG51bWJlciBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBmb3Igd2hpY2ggYW4gYXJyZXN0IHdhcyBtYWRlPwpKYW51YXJ5CmBgYHtyfQp0YWJsZShtdnQkQXJyZXN0LG12dCRNb250aCkKCmBgYAoKIyMjIFNlY3Rpb24gMyAtIFZpc3VhbGl6aW5nIENyaW1lIFRyZW5kcwoKIyMjIyAzLjEKCk5vdywgbGV0J3MgbWFrZSBzb21lIHBsb3RzIHRvIGhlbHAgdXMgYmV0dGVyIHVuZGVyc3RhbmQgaG93IGNyaW1lIGhhcyBjaGFuZ2VkIG92ZXIgdGltZSBpbiBDaGljYWdvLiBUaHJvdWdob3V0IHRoaXMgcHJvYmxlbSwgYW5kIGluIGdlbmVyYWwsIHlvdSBjYW4gc2F2ZSB5b3VyIHBsb3QgdG8gYSBmaWxlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdGhpcyB3ZWJzaXRlIHZlcnkgY2xlYXJseSBleHBsYWlucyB0aGUgcHJvY2Vzcy4KCkZpcnN0LCBsZXQncyBtYWtlIGEgaGlzdG9ncmFtIG9mIHRoZSB2YXJpYWJsZSBEYXRlLiBXZSdsbCBhZGQgYW4gZXh0cmEgYXJndW1lbnQsIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBiYXJzIHdlIHdhbnQgaW4gb3VyIGhpc3RvZ3JhbS4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGUKCmhpc3QobXZ0JERhdGUsIGJyZWFrcz0xMDApCgpgYGB7cn0KaGlzdChtdnQkRGF0ZSwgYnJlYWtzPTEwMCkKCmBgYAoKTG9va2luZyBhdCB0aGUgaGlzdG9ncmFtLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCgpJbiBnZW5lcmFsLCBkb2VzIGl0IGxvb2sgbGlrZSBjcmltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGZyb20gMjAwMiAtIDIwMTI/CkRlY3JlYXNlcworIEluY3JlYXNlcyAKKyBEZWNyZWFzZXMKCmBgYHtyfQoKYGBgCgpJbiBnZW5lcmFsLCBkb2VzIGl0IGxvb2sgbGlrZSBjcmltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGZyb20gMjAwNSAtIDIwMDg/CkRlY3JlYXNlcworIEluY3JlYXNlcworIERlY3JlYXNlcwoKYGBge3J9CgpgYGAKCiMjIyMgMy4yCk5vdywgbGV0J3Mgc2VlIGhvdyBhcnJlc3RzIGhhdmUgY2hhbmdlZCBvdmVyIHRpbWUuIENyZWF0ZSBhIGJveHBsb3Qgb2YgdGhlIHZhcmlhYmxlICJEYXRlIiwgc29ydGVkIGJ5IHRoZSB2YXJpYWJsZSAiQXJyZXN0IiAoaWYgeW91IGFyZSBub3QgZmFtaWxpYXIgd2l0aCBib3hwbG90cyBhbmQgd291bGQgbGlrZSB0byBsZWFybiBtb3JlLCBjaGVjayBvdXQgdGhpcyB0dXRvcmlhbCkuIEluIGEgYm94cGxvdCwgdGhlIGJvbGQgaG9yaXpvbnRhbCBsaW5lIGlzIHRoZSBtZWRpYW4gdmFsdWUgb2YgdGhlIGRhdGEsIHRoZSBib3ggc2hvd3MgdGhlIHJhbmdlIG9mIHZhbHVlcyBiZXR3ZWVuIHRoZSBmaXJzdCBxdWFydGlsZSBhbmQgdGhpcmQgcXVhcnRpbGUsIGFuZCB0aGUgd2hpc2tlcnMgKHRoZSBkb3R0ZWQgbGluZXMgZXh0ZW5kaW5nIG91dHNpZGUgdGhlIGJveCkgc2hvdyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMsIGV4Y2x1ZGluZyBhbnkgb3V0bGllcnMgKHdoaWNoIGFyZSBwbG90dGVkIGFzIGNpcmNsZXMpLiBPdXRsaWVycyBhcmUgZGVmaW5lZCBieSBmaXJzdCBjb21wdXRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoaXJkIHF1YXJ0aWxlIHZhbHVlcywgb3IgdGhlIGhlaWdodCBvZiB0aGUgYm94LiBUaGlzIG51bWJlciBpcyBjYWxsZWQgdGhlIEludGVyLVF1YXJ0aWxlIFJhbmdlIChJUVIpLiBBbnkgcG9pbnQgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhlIHRoaXJkIHF1YXJ0aWxlIHBsdXMgdGhlIElRUiBvciBsZXNzIHRoYW4gdGhlIGZpcnN0IHF1YXJ0aWxlIG1pbnVzIHRoZSBJUVIgaXMgY29uc2lkZXJlZCBhbiBvdXRsaWVyLgoKRG9lcyBpdCBsb29rIGxpa2UgdGhlcmUgd2VyZSBtb3JlIGNyaW1lcyBmb3Igd2hpY2ggYXJyZXN0cyB3ZXJlIG1hZGUgaW4gdGhlIGZpcnN0IGhhbGYgb2YgdGhlIHRpbWUgcGVyaW9kIG9yIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgdGltZSBwZXJpb2Q/IChOb3RlIHRoYXQgdGhlIHRpbWUgcGVyaW9kIGlzIGZyb20gMjAwMSB0byAyMDEyLCBzbyB0aGUgbWlkZGxlIG9mIHRoZSB0aW1lIHBlcmlvZCBpcyB0aGUgYmVnaW5uaW5nIG9mIDIwMDcuKQpGaXJzdCBoYWxmCisgRmlyc3QgaGFsZgorIFNlY29uZCBoYWxmCgpgYGB7cn0KYm94cGxvdChtdnQkRGF0ZX5tdnQkQXJyZXN0KQoKYGBgCgoKIyMjIyAzLjMKTGV0J3MgaW52ZXN0aWdhdGUgdGhpcyBmdXJ0aGVyLiBVc2UgdGhlIHRhYmxlIGZ1bmN0aW9uIGZvciB0aGUgbmV4dCBmZXcgcXVlc3Rpb25zLgoKRm9yIHdoYXQgcHJvcG9ydGlvbiBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiAyMDAxIHdhcyBhbiBhcnJlc3QgbWFkZT8KCk5vdGU6IGluIHRoaXMgcXVlc3Rpb24gYW5kIG1hbnkgb3RoZXJzIGluIHRoZSBjb3Vyc2UsIHdlIGFyZSBhc2tpbmcgZm9yIGFuIGFuc3dlciBhcyBhIHByb3BvcnRpb24uIFRoZXJlZm9yZSwgeW91ciBhbnN3ZXIgc2hvdWxkIHRha2UgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuCgpgYGB7cn0KdGFibGUobXZ0JEFycmVzdCwgbXZ0JFllYXIpCjIxNTIvKDE4NTE3KzIxNTIpCgpgYGAKCiMjIyMgMy40CkZvciB3aGF0IHByb3BvcnRpb24gb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gMjAwNyB3YXMgYW4gYXJyZXN0IG1hZGU/CgpgYGB7cn0KdGFibGUobXZ0JEFycmVzdCwgbXZ0JFllYXIpCjEyMTIvKDEyMTIrMTMwNjgpCmBgYAoKIyMjIyAzLjUKRm9yIHdoYXQgcHJvcG9ydGlvbiBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiAyMDEyIHdhcyBhbiBhcnJlc3QgbWFkZT8KCmBgYHtyfQo1NTAvKDU1MCsxMzU0MikKYGBgCgpTaW5jZSB0aGVyZSBtYXkgc3RpbGwgYmUgb3BlbiBpbnZlc3RpZ2F0aW9ucyBmb3IgcmVjZW50IGNyaW1lcywgdGhpcyBjb3VsZCBleHBsYWluIHRoZSB0cmVuZCB3ZSBhcmUgc2VlaW5nIGluIHRoZSBkYXRhLiBUaGVyZSBjb3VsZCBhbHNvIGJlIG90aGVyIGZhY3RvcnMgYXQgcGxheSwgYW5kIHRoaXMgdHJlbmQgc2hvdWxkIGJlIGludmVzdGlnYXRlZCBmdXJ0aGVyLiBIb3dldmVyLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoZW4gdGhlIGFycmVzdHMgd2VyZSBhY3R1YWxseSBtYWRlLCBvdXIgZGV0ZWN0aXZlIHdvcmsgaW4gdGhpcyBhcmVhIGhhcyByZWFjaGVkIGEgZGVhZCBlbmQuCgojIyMgU2VjdGlvbiA0IC0gUG9wdWxhciBMb2NhdGlvbnMKCiMjIyMgNC4xCkFuYWx5emluZyB0aGlzIGRhdGEgY291bGQgYmUgdXNlZnVsIHRvIHRoZSBDaGljYWdvIFBvbGljZSBEZXBhcnRtZW50IHdoZW4gZGVjaWRpbmcgd2hlcmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzLiBJZiB0aGV5IHdhbnQgdG8gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBhcnJlc3RzIHRoYXQgYXJlIG1hZGUgZm9yIG1vdG9yIHZlaGljbGUgdGhlZnRzLCB3aGVyZSBzaG91bGQgdGhleSBmb2N1cyB0aGVpciBlZmZvcnRzPwoKV2Ugd2FudCB0byBmaW5kIHRoZSB0b3AgZml2ZSBsb2NhdGlvbnMgd2hlcmUgbW90b3IgdmVoaWNsZSB0aGVmdHMgb2NjdXIuIElmIHlvdSBjcmVhdGUgYSB0YWJsZSBvZiB0aGUgTG9jYXRpb25EZXNjcmlwdGlvbiB2YXJpYWJsZSwgaXQgaXMgdW5mb3J0dW5hdGVseSB2ZXJ5IGhhcmQgdG8gcmVhZCBzaW5jZSB0aGVyZSBhcmUgNzggZGlmZmVyZW50IGxvY2F0aW9ucyBpbiB0aGUgZGF0YSBzZXQuIEJ5IHVzaW5nIHRoZSBzb3J0IGZ1bmN0aW9uLCB3ZSBjYW4gdmlldyB0aGlzIHNhbWUgdGFibGUsIGJ1dCBzb3J0ZWQgYnkgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgaW4gZWFjaCBjYXRlZ29yeS4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGU6CgogICAgc29ydCh0YWJsZShtdnQkTG9jYXRpb25EZXNjcmlwdGlvbikpCgpXaGljaCBsb2NhdGlvbnMgYXJlIHRoZSB0b3AgZml2ZSBsb2NhdGlvbnMgZm9yIG1vdG9yIHZlaGljbGUgdGhlZnRzLCBleGNsdWRpbmcgdGhlICJPdGhlciIgY2F0ZWdvcnk/IFlvdSBzaG91bGQgc2VsZWN0IDUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zLgoKKyBCYW5rCisgR2FzIFN0YXRpb24KKyBIb3RlbC9Nb3RlbAorIFN0cmVldAorIENhciBXYXNoCisgUmVzdGF1cmFudAorIFBhcmtpbmcgTG90L0dhcmFnZSAoTm9uLVJlc2lkZW50aWFsKQorIEFsbGV5CisgRHJpdmV3YXkgKFJlc2lkZW50aWFsKQorIFZhY2FudCBMb3QvTGFuZAoKYGBge3J9CnNvcnQodGFibGUobXZ0JExvY2F0aW9uRGVzY3JpcHRpb24pKQpgYGAKCiMjIyMgNC4yIApDcmVhdGUgYSBzdWJzZXQgb2YgeW91ciBkYXRhLCBvbmx5IHRha2luZyBvYnNlcnZhdGlvbnMgZm9yIHdoaWNoIHRoZSB0aGVmdCBoYXBwZW5lZCBpbiBvbmUgb2YgdGhlc2UgZml2ZSBsb2NhdGlvbnMsIGFuZCBjYWxsIHRoaXMgbmV3IGRhdGEgc2V0ICJUb3A1Ii4gVG8gZG8gdGhpcywgeW91IGNhbiB1c2UgdGhlIHwgc3ltYm9sLiBJbiBsZWN0dXJlLCB3ZSB1c2VkIHRoZSAmIHN5bWJvbCB0byB1c2UgdHdvIGNyaXRlcmlhIHRvIG1ha2UgYSBzdWJzZXQgb2YgdGhlIGRhdGEuIFRvIG9ubHkgdGFrZSBvYnNlcnZhdGlvbnMgdGhhdCBoYXZlIGEgY2VydGFpbiB2YWx1ZSBpbiBvbmUgdmFyaWFibGUgb3IgdGhlIG90aGVyLCB0aGUgfCBjaGFyYWN0ZXIgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlICYgc3ltYm9sLiBUaGlzIGlzIGFsc28gY2FsbGVkIGEgbG9naWNhbCAib3IiIG9wZXJhdGlvbi4KCkFsdGVybmF0ZWx5LCB5b3UgY291bGQgY3JlYXRlIGZpdmUgZGlmZmVyZW50IHN1YnNldHMsIGFuZCB0aGVuIG1lcmdlIHRoZW0gdG9nZXRoZXIgaW50byBvbmUgZGF0YSBmcmFtZSB1c2luZyByYmluZC4KCkhvdyBtYW55IG9ic2VydmF0aW9ucyBhcmUgaW4gVG9wNT8KCmBgYHtyfQpUb3A1PXN1YnNldChtdnQsTG9jYXRpb25EZXNjcmlwdGlvbj09IlNUUkVFVCIgfCBMb2NhdGlvbkRlc2NyaXB0aW9uPT0iUEFSS0lORyBMT1QvR0FSQUdFKE5PTi5SRVNJRC4pIiB8IExvY2F0aW9uRGVzY3JpcHRpb249PSJBTExFWSIgfCBMb2NhdGlvbkRlc2NyaXB0aW9uPT0iR0FTIFNUQVRJT04iIHwgTG9jYXRpb25EZXNjcmlwdGlvbj09IkRSSVZFV0FZIC0gUkVTSURFTlRJQUwiKQpzdHIoVG9wNSkKYGBgCgojIyMjIDQuMwpSIHdpbGwgcmVtZW1iZXIgdGhlIG90aGVyIGNhdGVnb3JpZXMgb2YgdGhlIExvY2F0aW9uRGVzY3JpcHRpb24gdmFyaWFibGUgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YXNldCwgc28gcnVubmluZyB0YWJsZShUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24pIHdpbGwgaGF2ZSBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBvdXRwdXQuIFRvIG1ha2Ugb3VyIHRhYmxlcyBhIGJpdCBuaWNlciB0byByZWFkLCB3ZSBjYW4gcmVmcmVzaCB0aGlzIGZhY3RvciB2YXJpYWJsZS4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGU6CgogICAgVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uID0gZmFjdG9yKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbikKCklmIHlvdSBydW4gdGhlIHN0ciBvciB0YWJsZSBmdW5jdGlvbiBvbiBUb3A1IG5vdywgeW91IHNob3VsZCBzZWUgdGhhdCBMb2NhdGlvbkRlc2NyaXB0aW9uIG5vdyBvbmx5IGhhcyA1IHZhbHVlcywgYXMgd2UgZXhwZWN0LgoKVXNlIHRoZSBUb3A1IGRhdGEgZnJhbWUgdG8gYW5zd2VyIHRoZSByZW1haW5pbmcgcXVlc3Rpb25zLgoKT25lIG9mIHRoZSBsb2NhdGlvbnMgaGFzIGEgbXVjaCBoaWdoZXIgYXJyZXN0IHJhdGUgdGhhbiB0aGUgb3RoZXIgbG9jYXRpb25zLiBXaGljaCBpcyBpdD8gUGxlYXNlIGVudGVyIHRoZSB0ZXh0IGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGhvdyBpdCBsb29rcyBpbiB0aGUgYW5zd2VyIG9wdGlvbnMgZm9yIFByb2JsZW0gNC4xLgoKYGBge3J9ClRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbiA9IGZhY3RvcihUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24pCnN0cihUb3A1KQogdGFibGUoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uLCBUb3A1JEFycmVzdCkgCmBgYAoKCiMjIyMgNC40IApPbiB3aGljaCBkYXkgb2YgdGhlIHdlZWsgZG8gdGhlIG1vc3QgbW90b3IgdmVoaWNsZSB0aGVmdHMgYXQgZ2FzIHN0YXRpb25zIGhhcHBlbj8KKE1vbmRheX5TdW5kYXkpClNhdHVyZGF5CmBgYHtyfQp0YWJsZShUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24sIFRvcDUkV2Vla2RheSkKYGBgCgojIyMjIDQuNQpPbiB3aGljaCBkYXkgb2YgdGhlIHdlZWsgZG8gdGhlIGZld2VzdCBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiByZXNpZGVudGlhbCBkcml2ZXdheXMgaGFwcGVuPyhNb25kYXl+U3VuZGF5KQpTYXR1cmRheQpgYGB7cn0KdGFibGUoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uLCBUb3A1JFdlZWtkYXkpCmBgYAoKCgoKCg==