Abstract

In a landscape shaped by the explosion of digital content and shifting audience preferences, This report embarks on a journey through the Movies dataset from Kaggle to unravel the secrets of cinematic success. Armed with meticulous data cleaning and advanced statistical techniques, we uncover the critical ingredients that define the modern blockbuster. These insights guide strategic decisions for our production company as we navigate the ever-changing currents of audience taste, ensuring our films resonate deeply and soar at the box office.

Introduction & Objectives

The film industry stands as a dynamic and ever-evolving landscape, characterized by its ability to captivate global audiences and shape cultural narratives. Within this realm of creativity and commerce, understanding the intricacies of what makes a movie successful is paramount for filmmakers, producers, and industry stakeholders alike. This report digs into the world of film analysis, aiming to uncover the underlying factors driving box office success.

As the context for our investigation, we recognize the increasing importance of data-driven decision-making in an industry traditionally driven by intuition and creativity. In today’s competitive marketplace, filmmakers and production companies face mounting pressures to deliver commercially successful films while balancing artistic integrity and audience preferences. Against this context, our research seeks to illuminate the key determinants of movie revenue, providing insights for the industry.

With a focus on revenue as the primary metric of success, our analysis spans various dimensions, including genre preferences, production budgets, release timing, and geographical considerations. By dissecting these factors, we aim to uncover patterns and trends that offer valuable guidance for the film production company executives seeking to optimize their strategies and maximize returns on investment.

Through a systematic examination of revenue data and industry trends, this report strives to empower stakeholders with actionable intelligence, fostering informed decision-making and strategic innovation in the realm of film production and distribution. By explaining the underlying drivers of box office success, we aim to contribute to the ongoing dialogue surrounding the art and business of filmmaking, ultimately shaping a more prosperous and vibrant future for our production company.

Data Description & Cleaning

The analysis in this report draws upon the Movies dataset obtained from Kaggle, encompassing various attributes of movies such as budgets, revenues, genres, release dates, production countries, and production companies. This dataset offers a comprehensive view of the global film industry, spanning diverse genres, languages, and production contexts. Prior to analysis, rigorous preprocessing and cleaning were conducted to ensure data integrity and reliability. This involved addressing missing values through imputation or exclusion, removing duplicates to prevent redundancy, and standardizing data formats for consistency. The goal of these cleaning procedures was to enhance the dataset’s quality and usability, providing a solid foundation for robust analysis of film revenue trends and patterns.

Data types

Searching for errors and areas of improvement

Observations:

  • adult column data type could be logical

  • belongs_to_collection column must be cleaned for better understanding of data

  • budget column data type should be integer or numeric

  • genres column must be cleaned for better understanding of data

  • original_language column could be factor

  • popularity column must be numeric

  • production_companies column must be cleaned to show the relevant information

  • production_countries column must be cleaned to avoid redundant and irrelevant information

  • release_date column data type should be Date

  • spoken_languages column must be cleaned to avoid redundant and irrelevant information

  • status column data type could be factor

  • video column is not necessary for analysis purposes

Converting Data Types

Variables to be converted:
* adult (logical)
* budget (numeric)
* original_language (factor)
* popularity (numeric)
* release_date (Date)
* status (factor)

Tidying the dataset

Variables the must be cleaned,each part of the variable should be separated erasing tags.
* belongs_to_collection: Contains “id”,“name”,“poster_part”,“backdrop_part”
* genres: Contains “id”,“name”
* production_companies: Contains “name”,“id”
* production_countries: Contains “abbreviated_name”,“name”
* spoken_languages: Contains “abbreviated_name”,“name”

belongs_to_collection

# Divide string in columns delimiting by ":"
collection <- str_split_fixed(movies$belongs_to_collection, ":", n = Inf)
# Choose index 1-5
collection <- collection[,1:5]
# Choose index 2-5
collection <- collection[, c(2,3,4,5)]
summary(collection)
##       V1                 V2                 V3                 V4           
##  Length:45466       Length:45466       Length:45466       Length:45466      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character
# Convert to a data frame
collection <- as.data.frame(collection)
#Eliminate punctuation signs except "." and "/"
collection <- collection %>% 
  mutate(id_collection = str_replace_all(collection$V1, "[[:punct:]&&[^./]]", " "))
collection <- collection %>% 
  mutate(name_collection = str_replace_all(collection$V2, "[[:punct:]&&[^./]]", " "))
collection <- collection %>% 
  mutate(poster_path_collection = str_replace_all(collection$V3, "[[:punct:]&&[^./]]", " "))
collection <- collection %>% 
  mutate(backdrop_path_collection = str_replace_all(collection$V4, "[[:punct:]&&[^./]]", " "))
# Remove specfic words from data frame
collection$id_collection <- str_remove(collection$id_collection,"name")
collection$name_collection <- str_remove(collection$name_collection,"poster path")
collection$poster_path_collection <- str_remove(collection$poster_path_collection,"backdrop path")
# Choose specific columns
collection <- collection[,5:8]
summary(collection)
##  id_collection      name_collection    poster_path_collection
##  Length:45466       Length:45466       Length:45466          
##  Class :character   Class :character   Class :character      
##  Mode  :character   Mode  :character   Mode  :character      
##  backdrop_path_collection
##  Length:45466            
##  Class :character        
##  Mode  :character
# Remove whitespace
collection$id_collection <- str_trim(collection$id_collection, "right")
collection$name_collection <- str_trim(collection$name_collection, "right")
collection$poster_path_collection <- str_trim(collection$poster_path_collection, "right")
collection$backdrop_path_collection <- str_trim(collection$backdrop_path_collection, "right")
summary(collection)
##  id_collection      name_collection    poster_path_collection
##  Length:45466       Length:45466       Length:45466          
##  Class :character   Class :character   Class :character      
##  Mode  :character   Mode  :character   Mode  :character      
##  backdrop_path_collection
##  Length:45466            
##  Class :character        
##  Mode  :character
# Add separated collection to movies data frame
movies <- cbind(movies, collection)
# Remove the 'belongs_to_collection' column from the 'movies' data frame
movies <- movies %>% 
  select(-belongs_to_collection)

genres

new_genres <- str_split_fixed(movies$genres, ":", n = Inf)
new_genres <- new_genres[,1:7]
new_genres <- new_genres[, c(3,5,7)]
new_genres <- as.data.frame(new_genres)
new_genres <- new_genres %>% 
  mutate(genre1 = str_replace_all(new_genres$V1, "[[:punct:]]", " "))
new_genres <- new_genres %>% 
  mutate(genre2 = str_replace_all(new_genres$V2, "[[:punct:]]", " "))
new_genres <- new_genres %>% 
  mutate(genre3 = str_replace_all(new_genres$V3, "[[:punct:]]", " "))
new_genres$genre1 <- str_remove(new_genres$genre1,"id")
new_genres$genre2 <- str_remove(new_genres$genre2,"id")
new_genres$genre3 <- str_remove(new_genres$genre3,"id")
new_genres <- new_genres[,4:6]
# Trim leading and trailing spaces in genre columns
new_genres <- new_genres %>% 
  mutate(genre1 = str_trim(genre1),
         genre2 = str_trim(genre2),
         genre3 = str_trim(genre3))
new_genres$genre1 <- as.factor(new_genres$genre1)
new_genres$genre2 <- as.factor(new_genres$genre2)
new_genres$genre3 <- as.factor(new_genres$genre3)
summary(new_genres)
##          genre1           genre2                  genre3     
##  Drama      :11966           :17001                  :31481  
##  Comedy     : 8820   Drama   : 6308   Thriller       : 2235  
##  Action     : 4489   Comedy  : 3265   Romance        : 2045  
##  Documentary: 3415   Romance : 2859   Drama          : 1677  
##  Horror     : 2619   Thriller: 2523   Comedy         :  911  
##             : 2442   Action  : 1546   Science Fiction:  873  
##  (Other)    :11715   (Other) :11964   (Other)        : 6244
movies <- cbind(movies, new_genres)
# Remove the original 'genres' column from the 'movies' data frame
movies <- movies %>% 
  select(-genres)

production_countries

new_production_countries <- str_split_fixed(movies$production_countries, ":", n = Inf)
new_production_countries <- new_production_countries[,2:7]
new_production_countries <- new_production_countries[, c(2,4,6)]
new_production_countries <- as.data.frame(new_production_countries)
new_production_countries <- new_production_countries %>% 
  mutate(country1 = str_replace_all(new_production_countries$V1, "[[:punct:]]", " "))
new_production_countries <- new_production_countries %>% 
  mutate(country2 = str_replace_all(new_production_countries$V2, "[[:punct:]]", " "))
new_production_countries <- new_production_countries %>% 
  mutate(country3 = str_replace_all(new_production_countries$V3, "[[:punct:]]", " "))
new_production_countries$country1 <- str_remove(new_production_countries$country1,"iso 3166 1")
new_production_countries$country2 <- str_remove(new_production_countries$country2,"iso 3166 1")
new_production_countries$country3 <- str_remove(new_production_countries$country3,"iso 3166 1")
new_production_countries <- new_production_countries[,4:6]
# Trim leading and trailing spaces in country columns
new_production_countries <- new_production_countries %>% 
  mutate(country1 = str_trim(country1),
         country2 = str_trim(country2),
         country3 = str_trim(country3))
new_production_countries$country1 <- as.factor(new_production_countries$country1)
new_production_countries$country2 <- as.factor(new_production_countries$country2)
new_production_countries$country3 <- as.factor(new_production_countries$country3)
summary(new_production_countries)
##                      country1                         country2    
##  United States of America:18425                           :38439  
##                          : 6288   United States of America: 2131  
##  United Kingdom          : 3070   France                  :  917  
##  France                  : 2705   United Kingdom          :  659  
##  Canada                  : 1498   Germany                 :  528  
##  Japan                   : 1493   Italy                   :  482  
##  (Other)                 :11987   (Other)                 : 2310  
##                      country3    
##                          :43314  
##  United States of America:  410  
##  France                  :  247  
##  Germany                 :  232  
##  United Kingdom          :  231  
##  Italy                   :  153  
##  (Other)                 :  879
movies <- cbind(movies, new_production_countries)
# Remove the original 'production_countries' column from the 'movies' data frame
movies <- movies %>% 
  select(-production_countries)

spoken_languages

new_spoken_languages <- str_split_fixed(movies$spoken_languages, ":", n = Inf)
new_spoken_languages <- new_spoken_languages[,2:7]
new_spoken_languages <- new_spoken_languages[, c(2,4,6)]
new_spoken_languages <- as.data.frame(new_spoken_languages)
new_spoken_languages <- new_spoken_languages %>% 
  mutate(country1_language = str_replace_all(new_spoken_languages$V1, "[[:punct:]]", " "))
new_spoken_languages <- new_spoken_languages %>% 
  mutate(country2_language = str_replace_all(new_spoken_languages$V2, "[[:punct:]]", " "))
new_spoken_languages <- new_spoken_languages %>% 
  mutate(country3_language = str_replace_all(new_spoken_languages$V3, "[[:punct:]]", " "))
new_spoken_languages$country1_language <- str_remove(new_spoken_languages$country1_language,"iso 639 1")
new_spoken_languages$country2_language <- str_remove(new_spoken_languages$country2_language,"iso 639 1")
new_spoken_languages$country3_language <- str_remove(new_spoken_languages$country3_language,"iso 639 1")
new_spoken_languages <- new_spoken_languages[,4:6]
# Trim leading and trailing spaces in language columns
new_spoken_languages <- new_spoken_languages %>% 
  mutate(country1_language = str_trim(country1_language),
         country2_language = str_trim(country2_language),
         country3_language = str_trim(country3_language))
new_spoken_languages$country1_language <- as.factor(new_spoken_languages$country1_language)
new_spoken_languages$country2_language <- as.factor(new_spoken_languages$country2_language)
new_spoken_languages$country3_language <- as.factor(new_spoken_languages$country3_language)
summary(new_spoken_languages)
##  country1_language country2_language country3_language
##  English :26840            :37707            :43018   
##          : 4062    English : 1593    Deutsch :  328   
##  Français: 2428    Français: 1477    Español :  308   
##  Italiano: 1411    Deutsch :  919    Français:  234   
##  日本語  : 1388    Español :  782    English :  232   
##  Deutsch : 1301    Italiano:  616    Italiano:  225   
##  (Other) : 8036    (Other) : 2372    (Other) : 1121
movies <- cbind(movies, new_spoken_languages)
# Remove the original 'spoken_languages' column from the 'movies' data frame
movies <- movies %>% 
  select(-spoken_languages)

production_companies

new_production_companies <- str_split_fixed(movies$production_companies, ":", n = Inf)
new_production_companies <- new_production_companies[,1:6]
new_production_companies <- new_production_companies[, c(2,4,6)]
new_production_companies <- as.data.frame(new_production_companies)
new_production_companies <- new_production_companies %>% 
  mutate(company1 = str_replace_all(new_production_companies$V1, "[[:punct:]]", " "))
new_production_companies <- new_production_companies %>% 
  mutate(company2 = str_replace_all(new_production_companies$V2, "[[:punct:]]", " "))
new_production_companies <- new_production_companies %>% 
  mutate(company3 = str_replace_all(new_production_companies$V3, "[[:punct:]]", " "))
new_production_companies$company1 <- str_remove(new_production_companies$company1,"id")
new_production_companies$company2 <- str_remove(new_production_companies$company2,"id")
new_production_companies$company3 <- str_remove(new_production_companies$company3,"id")
new_production_companies <- new_production_companies[,4:6]
# Trim leading and trailing spaces in company columns
new_production_companies <- new_production_companies %>% 
  mutate(company1 = str_trim(company1),
         company2 = str_trim(company2),
         company3 = str_trim(company3))
new_production_companies$company1 <- as.factor(new_production_companies$company1)
new_production_companies$company2 <- as.factor(new_production_companies$company2)
new_production_companies$company3 <- as.factor(new_production_companies$company3)
summary(new_production_companies)
##                                    company1    
##                                        :11881  
##  Paramount Pictures                    :  998  
##  Metro Goldwyn Mayer  MGM              :  852  
##  Twentieth Century Fox Film Corporation:  780  
##  Warner Bros                           :  757  
##  Universal Pictures                    :  754  
##  (Other)                               :29444  
##                      company2                         company3    
##                          :28458                           :36419  
##  Warner Bros             :  270   Warner Bros             :  130  
##  Metro Goldwyn Mayer  MGM:  150   Canal+                  :  109  
##  Canal+                  :  124   Metro Goldwyn Mayer  MGM:   44  
##  Touchstone Pictures     :   75   Relativity Media        :   42  
##  Universal Pictures      :   71   TF1 Films Production    :   29  
##  (Other)                 :16318   (Other)                 : 8693
movies <- cbind(movies, new_production_companies)
# Remove the original 'production_companies' column from the 'movies' data frame
movies <- movies %>% 
  select(-production_companies)

Out of Range Values

Variables that require to be checked.

  • budget: Does not have a range, but could be important to detect outliers for further analysis
  • popularity: Has a range from 0 to 100
  • runtime: Does not have a range, but could be important to detect outliers for further analysis
  • vote_average: Has a range from 0 to 10
  • vote_count: Does not have a range, but could be important to detect outliers for further analysis
  • revenue: too many movies with 0 revenue, could be better to imputate or remove those values

budget

# Generate an histogram
ggplot(movies,aes(budget))+geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_bin()`).

# Sort and obtain highest 10 and lowest 10 rows by budget
sorted_budget <- sort(movies$budget)
tail(sorted_budget,10) %>% format(scientific = FALSE)
##  [1] "250000000" "255000000" "258000000" "260000000" "260000000" "260000000"
##  [7] "270000000" "280000000" "300000000" "380000000"
head(sorted_budget,10)
##  [1] 0 0 0 0 0 0 0 0 0 0
# Count zeroes
movies %>% count(budget == 0)
##   budget == 0     n
## 1       FALSE  8890
## 2        TRUE 36573
## 3          NA     3
summary(movies$budget)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
##         0         0         0   4224579         0 380000000         3

It is highly unlikely that a movie has a cost of 0 dollars to produce, and due to the high amount of movies that have this budget it could mean the budget information was not available. An imputation method must be applied in this case.

revenue

# Generate an histogram
ggplot(movies,aes(revenue))+geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 6 rows containing non-finite outside the scale range
## (`stat_bin()`).

# Sort and obtain highest 10 and lowest 10 rows by budget
sorted_revenue <- sort(movies$revenue)
tail(sorted_revenue,10) %>% format(scientific = FALSE)
##  [1] "1262886337" "1274219009" "1342000000" "1405403694" "1506249360"
##  [6] "1513528810" "1519557910" "1845034188" "2068223624" "2787965087"
head(sorted_revenue,10)
##  [1] 0 0 0 0 0 0 0 0 0 0
# Count zeroes
movies %>% count(revenue == 0)
##   revenue == 0     n
## 1        FALSE  7408
## 2         TRUE 38052
## 3           NA     6
summary(movies$revenue)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
## 0.000e+00 0.000e+00 0.000e+00 1.121e+07 0.000e+00 2.788e+09         6

Because an imputation will be done for budget, the same has to be done to revenue to balance out the data and get rid of it’s volatility.

popularity

# Generate an histogram
ggplot(movies,aes(popularity))+geom_histogram(bins=10) + xlim(0,100)
## Warning: Removed 22 rows containing non-finite outside the scale range
## (`stat_bin()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_bar()`).

# Sort and obtain highest 10 and lowest 10 rows by popularity
sorted_popularity <- sort(movies$popularity)
tail(sorted_popularity,10)
##  [1] 154.8010 183.8704 185.0709 185.3310 187.8605 213.8499 228.0327 287.2537
##  [9] 294.3370 547.4883
head(sorted_popularity,10)
##  [1] 0 0 0 0 0 0 0 0 0 0
# Count zeroes
movies %>% count(popularity == 0)
##   popularity == 0     n
## 1           FALSE 45394
## 2            TRUE    66
## 3              NA     6
summary(movies$popularity)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
##   0.0000   0.3859   1.1277   2.9215   3.6789 547.4883        6

There are some movies that exceed the 100 points limit, the variable must be imputated for a better analysis of the data.

runtime

# Generate an histogram
ggplot(movies,aes(runtime))+geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_bin()`).

# Sort and obtain highest 10 and lowest 10 rows by runtime
sorted_runtime <- sort(movies$runtime)
tail(sorted_runtime,10)
##  [1]  840  840  874  877  900  925  931 1140 1140 1256
head(sorted_runtime,10)
##  [1] 0 0 0 0 0 0 0 0 0 0
# Count zeroes
movies %>% count(runtime == 0)
##   runtime == 0     n
## 1        FALSE 43645
## 2         TRUE  1558
## 3           NA   263
summary(movies$runtime)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00   85.00   95.00   94.13  107.00 1256.00     263

Some movies last 0 minutes, a movie cannot have that duration, an imputation must be done to fix it.

vote_average

# Generate an histogram
ggplot(movies,aes(vote_average))+geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 6 rows containing non-finite outside the scale range
## (`stat_bin()`).

# Sort and obtain highest 10 and lowest 10 rows by vote_average
sorted_vote_average <- sort(movies$vote_average)
tail(sorted_vote_average,10)
##  [1] 10 10 10 10 10 10 10 10 10 10
head(sorted_vote_average,10)
##  [1] 0 0 0 0 0 0 0 0 0 0
summary(movies$vote_average)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   5.000   6.000   5.618   6.800  10.000       6

Vote averages are in order, there is no need for applying an imputation method.

vote_count

# Generate an histogram
ggplot(movies,aes(vote_count))+geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 6 rows containing non-finite outside the scale range
## (`stat_bin()`).

# Sort and obtain highest 10 and lowest 10 rows by vote_count
sorted_vote_count <- sort(movies$vote_count)
tail(sorted_vote_count,10)
##  [1]  9634  9678 10014 10297 11187 11444 12000 12114 12269 14075
head(sorted_vote_count,10)
##  [1] 0 0 0 0 0 0 0 0 0 0
# Count zeroes
movies %>% count(vote_count == 0)
##   vote_count == 0     n
## 1           FALSE 42561
## 2            TRUE  2899
## 3              NA     6
summary(movies$vote_count)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     3.0    10.0   109.9    34.0 14075.0       6

Vote counts are in order, there is no need to apply imputation methods to this variable.

Imputation

Only 4 variables must be imputated based on the search of out of range values done before which are the following:

  • budget: Values are going to be replaced with the mean to avoid the multiple zeroes from distorting statistical descriptors.
  • revenue: The same case as in budget
  • popularity: Out of range values are going to be replaced with the range limit of 100 to avoid eliminating them from the dataset.
  • runtime: Values are going to be replaced with the mean to avoid the multiple zeroes from distorting statistical descriptors.

It seems that there is very few data that was left as NA in the database after the cleaning process done during the deliverable of the progress setup, however there are some missing data in revenue, runtime and votes which could be adressed with mice.

Advanced Imputation using MICE

For imputation we will be using the MICE package along with the variables detected before which are revenue, runtime, vote_count and vote_average.

Note

I encountered technical difficulties while attempting to use the MICE library for multiple imputation. Despite efforts to resolve these issues using alternative platforms such as posit and Google Colab, I was unable to overcome the challenges. As a result, I acknowledge that not using the MICE library limited my ability to perform multiple imputation and address missing data comprehensively. Instead, I employed alternative approaches to handle missing data. However, it’s important to acknowledge that these methods may introduce additional uncertainty and potential biases into my analysis, impacting the validity of the results.

# Specifies the characteristics of the imputation
#movies_mice <- mice(movies2,m=1,maxit=50,meth='pmm',seed=500)

# Summarizes the the imputation characteristics defined before
#summary(movies_mice)

# Allows to see the result MICE assigned to missing values
#movies_mice$imp$runtime

# Fill the dataset with results from first option
# movies_clean <- complete(movies_mice,1)

# Serves as a way to check if imputation was done sucessfully
#sum(is.na(movies_clean))

# Generates a density plot
#densityplot(movies_clean)

Density plot can help to determine the effectiveness of the imputation in the dataset, it is possible that imputation is less precise once it get past certain values, therefore it is important to check and use other methods if necessary.

budget

summary(movies$budget)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
##         0         0         0   4224579         0 380000000         3

The average budget is 4,224,579

# Replace zeroes with the budget mean
movies$budget_original <- movies$budget  # Create a copy of the original column
movies$budget <- ifelse(movies$budget == 0, mean(movies$budget, na.rm = TRUE), movies$budget)
summary(movies$budget)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
##         1   4224579   4224579   7623068   4224579 380000000         3

revenue

summary(movies$revenue)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
## 0.000e+00 0.000e+00 0.000e+00 1.121e+07 0.000e+00 2.788e+09         6

The average revenue is 11,210,000

# Replace zeroes with the revenue mean
movies$revenue_original <- movies$revenue  # Create a copy of the original column
movies$revenue <- ifelse(movies$revenue == 0, mean(movies$revenue, na.rm = TRUE), movies$revenue)
summary(movies$revenue)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
## 1.000e+00 1.121e+07 1.121e+07 2.059e+07 1.121e+07 2.788e+09         6

popularity

summary(movies$popularity)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
##   0.0000   0.3859   1.1277   2.9215   3.6789 547.4883        6
movies <- movies %>%
  mutate(popularity_max = pmin(pmax(popularity, 0), 100))
summary(movies$popularity_max)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   0.386   1.128   2.884   3.679 100.000       6

runtime

summary(movies$runtime)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00   85.00   95.00   94.13  107.00 1256.00     263

A movie average runtime is 94.13 minutes

# Replace zeroes and NA values in the 'runtime' column with the average runtime (94)
movies <- movies %>%
  mutate(runtime = ifelse(runtime == 0 | is.na(runtime), 94, runtime))
summary(movies$runtime)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00   87.00   95.00   97.35  107.00 1256.00

Since multiple values were NA’s the values were also replaced with the average

Duplicates

Most of the variables in these dataset does not require to check for duplicates as for example it is completely normal that movies share the same genres, spoken language, company, etc. However there are three variables that must be checked for partial duplicates which are the following.

  • id
  • imdb_id
  • original_title

Full Duplicates

# Counting the total amount of full duplicates
sum(duplicated(movies))
## [1] 17
# Creating a data frame for full duplicates visualization
duplicated_rows <- movies[duplicated(movies), ]
duplicated_rows
##       adult  budget                               homepage     id   imdb_id
## 1466  FALSE 4224579                                        105045 tt0111613
## 9166  FALSE 4224579                                          5511 tt0062229
## 9328  FALSE 4224579                                         23305 tt0295682
## 13376 FALSE 4224579                                        141971 tt1180333
## 16765 FALSE 4224579                                        141971 tt1180333
## 21166 FALSE 4224579                                        119916 tt0080000
## 21855 FALSE 4224579                                        152795 tt1821641
## 22152 FALSE 4224579 http://www.daysofdarknessthemovie.com/  18440 tt0499456
## 23045 FALSE 4224579                                         25541 tt1327820
## 24845 FALSE 4224579           http://www.dealthemovie.com/  11115 tt0446676
## 28861 FALSE 4224579                                        168538 tt0084387
## 29375 FALSE 4224579                                         42495 tt0067306
## 35799 FALSE 4224579                                        159849 tt0173769
## 38872 FALSE 4224579                                         99080 tt0022537
## 40041 FALSE  980000                                        298721 tt2818654
## 40277 FALSE 4224579                                         97995 tt0127834
## 45266 FALSE 4224579                                        265189 tt2121382
##       original_language                   original_title
## 1466                 de                  Das Versprechen
## 9166                 fr                      Le Samouraï
## 9328                 en                      The Warrior
## 13376                fi                         Blackout
## 16765                fi                         Blackout
## 21166                en                      The Tempest
## 21855                en                     The Congress
## 22152                en                 Days of Darkness
## 23045                da                       Broderskab
## 24845                en                             Deal
## 28861                en                             Nana
## 29375                en                        King Lear
## 35799                en Why We Fight: Divide and Conquer
## 38872                en                       The Viking
## 40041                th                        รักที่ขอนแก่น
## 40277                en             Seven Years Bad Luck
## 45266                sv                           Turist
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   overview
## 1466                                                   East-Berlin, 1961, shortly after the erection of the Wall. Konrad, Sophie and three of their friends plan a daring escape to Western Germany. The attempt is successful, except for Konrad, who remains behind. From then on, and for the next 28 years, Konrad and Sophie will attempt to meet again, in spite of the Iron Curtain. Konrad, who has become a reputed Astrophysicist, tries to take advantage of scientific congresses outside Eastern Germany to arrange encounters with Sophie. But in a country where the political police, the Stasi, monitors the moves of all suspicious people (such as Konrad's sister Barbara and her husband Harald), preserving one's privacy, ideals and self-respect becomes an exhausting fight, even as the Eastern block begins its long process of disintegration.
## 9166                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              Hitman Jef Costello is a perfectionist who always carefully plans his murders and who never gets caught.
## 9328                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               In feudal India, a warrior (Khan) who renounces his role as the longtime enforcer to a local lord becomes the prey in a murderous hunt through the Himalayan mountains.
## 13376                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               Recovering from a nail gun shot to the head and 13 months of coma, doctor Pekka Valinta starts to unravel the mystery of his past, still suffering from total amnesia.
## 16765                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               Recovering from a nail gun shot to the head and 13 months of coma, doctor Pekka Valinta starts to unravel the mystery of his past, still suffering from total amnesia.
## 21166                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Prospero, the true Duke of Milan is now living on an enchanted island with his daughter Miranda, the savage Caliban and Ariel, a spirit of the air. Raising a sorm to bring his brother - the usurper of his dukedom - along with his royal entourage. to the island. Prospero contrives his revenge.
## 21855 More than two decades after catapulting to stardom with The Princess Bride, an aging actress (Robin Wright, playing a version of herself) decides to take her final job: preserving her digital likeness for a future Hollywood. Through a deal brokered by her loyal, longtime agent and the head of Miramount Studios, her alias will be controlled by the studio, and will star in any film they want with no restrictions. In return, she receives healthy compensation so she can care for her ailing son and her digitized character will stay forever young. Twenty years later, under the creative vision of the studio’s head animator, Wright’s digital double rises to immortal stardom. With her contract expiring, she is invited to take part in “The Congress” convention as she makes her comeback straight into the world of future fantasy cinema.
## 22152                                                                                                                                                                                                                                                                                                                                                                                                              When a comet strikes Earth and kicks up a cloud of toxic dust, hundreds of humans join the ranks of the living dead. But there's bad news for the survivors: The newly minted zombies are hell-bent on eradicating every last person from the planet. For the few human beings who remain, going head to head with the flesh-eating fiends is their only chance for long-term survival. Yet their battle will be dark and cold, with overwhelming odds.
## 23045                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Former Danish servicemen Lars and Jimmy are thrown together while training in a neo-Nazi group. Moving from hostility through grudging admiration to friendship and finally passion, events take a darker turn when their illicit relationship is uncovered.
## 24845                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              As an ex-gambler teaches a hot-shot college kid some things about playing cards, he finds himself pulled into the world series of poker, where his protégé is his toughest competition.
## 28861                                                                                                                                                                                                                                                                                                                             In Zola's Paris, an ingenue arrives at a tony bordello: she's Nana, guileless, but quickly learning to use her erotic innocence to get what she wants. She's an actress for a soft-core filmmaker and soon is the most popular courtesan in Paris, parlaying this into a house, bought for her by a wealthy banker. She tosses him and takes up with her neighbor, a count of impeccable rectitude, and with the count's impressionable son. The count is soon fetching sticks like a dog and mortgaging his lands to satisfy her whims.
## 29375                                                                                                                                                                                                                                                                       King Lear, old and tired, divides his kingdom among his daughters, giving great importance to their protestations of love for him. When Cordelia, youngest and most honest, refuses to idly flatter the old man in return for favor, he banishes her and turns for support to his remaining daughters. But Goneril and Regan have no love for him and instead plot to take all his power from him. In a parallel, Lear's loyal courtier Gloucester favors his illegitimate son Edmund after being told lies about his faithful son Edgar. Madness and tragedy befall both ill-starred fathers.
## 35799                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     The third film of Frank Capra's 'Why We Fight" propaganda film series, dealing with the Nazi conquest of Western Europe in 1940.
## 38872                                                                                                                                                                                                                           Originally called White Thunder, American producer Varick Frissell's 1931 film was inspired by his love for the Canadian Arctic Circle. Set in a beautifully black-and-white filmed Newfoundland, it is the story of a rivalry between two seal hunters that plays out on the ice floes during a hunt. Unsatisfied with the first cut, Frissell arranged for the crew to accompany an actual Newfoundland seal hunt on The SS Viking, on which an explosion of dynamite (carried regularly at the time on Arctic ships to combat ice jams) killed many members of the crew, including Frissell. The film was renamed in honor of the dead.
## 40041                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       In a hospital, ten soldiers are being treated for a mysterious sleeping sickness. In a story in which dreams can be experienced by others, and in which goddesses can sit casually with mortals, a nurse learns the reason why the patients will never be cured, and forms a telepathic bond with one of them.
## 40277                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               After breaking a mirror in his home, superstitious Max tries to avoid situations which could bring bad luck but in doing so, causes himself the worst luck imaginable.
## 45266                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    While holidaying in the French Alps, a Swedish family deals with acts of cowardliness as an avalanche breaks out.
##       popularity                      poster_path release_date  revenue runtime
## 1466    0.122178 /5WFIrBhOOgc0jGmoLxMZwWqCctO.jpg   1995-02-16 11209349     115
## 9166    9.091288 /cvNW8IXigbaMNo4gKEIps0NGnhA.jpg   1967-10-25    39481     105
## 9328    1.967992 /9GlrmbZO7VGyqhaSR1utinRJz3L.jpg   2001-09-23 11209349      86
## 13376   0.411949 /8VSZ9coCzxOCW2wE2Qene1H1fKO.jpg   2008-12-26 11209349     108
## 16765   0.411949 /8VSZ9coCzxOCW2wE2Qene1H1fKO.jpg   2008-12-26 11209349     108
## 21166   0.000018 /gLVRTxaLtUDkfscFKPyYrCtRnTk.jpg   1980-02-27 11209349     123
## 21855   8.534039 /nnKX3ahYoT7P3au92dNgLf4pKwA.jpg   2013-05-16   455815     122
## 22152   1.436085 /tWCyKXHuSrQdLAvNeeVJBnhf1Yv.jpg   2007-01-01 11209349      89
## 23045   2.587911 /q19Q5BRZpMXoNCA4OYodVozfjUh.jpg   2009-10-21 11209349      90
## 24845   6.880365 /kHaBqrrozaG7rj6GJg3sUCiM29B.jpg   2008-01-29 11209349      85
## 28861   1.276602 /pg4PUHRFrgNfACHSh5MITQ2gYch.jpg   1983-06-13 11209349      92
## 29375   0.187901 /xuE1IlUCohbxMY0fiqKTT6d013n.jpg   1971-02-04 11209349     137
## 35799   0.473322 /g21ruZZ3BZeUDuKMb82kejjtufk.jpg   1943-01-01 11209349      57
## 38872   0.002362 /qenjwRvW9itR5pVp4CBkYfhVAOp.jpg   1931-06-21 11209349      70
## 40041   2.535419 /5GasjPRAy5rlEyDOH7MeOyxyQGX.jpg   2015-09-02 11209349     122
## 40277   0.141558 /4J6Ai4C5YRgfRUTlirrJ7QsmJKU.jpg   1921-02-06 11209349      62
## 45266  12.165685 /rGMtc9AtZsnWSSL5VnLaGvx1PI6.jpg   2014-08-15  1359497     118
##         status
## 1466  Released
## 9166  Released
## 9328  Released
## 13376 Released
## 16765 Released
## 21166 Released
## 21855 Released
## 22152 Released
## 23045 Released
## 24845 Released
## 28861 Released
## 29375  Rumored
## 35799 Released
## 38872 Released
## 40041 Released
## 40277 Released
## 45266 Released
##                                                                                    tagline
## 1466                                                               A love, a hope, a wall.
## 9166                                 There is no solitude greater than that of the Samurai
## 9328                                                                                      
## 13376                           Which one is the first to return - memory or the murderer?
## 16765                           Which one is the first to return - memory or the murderer?
## 21166                                                                                     
## 21855                                                                                     
## 22152                                                                                     
## 23045                                                                                     
## 24845                                                                                     
## 28861                                                                                     
## 29375                                                                                     
## 35799                                                                                     
## 38872 Actually produced during the Great Newfoundland Seal Hunt and You see the REAL thing
## 40041                                                                                     
## 40277                                                                                     
## 45266                                                                                     
##                                  title video vote_average vote_count
## 1466                       The Promise False          5.0          1
## 9166                       Le Samouraï False          7.9        187
## 9328                       The Warrior False          6.3         15
## 13376                         Blackout False          6.7          3
## 16765                         Blackout False          6.7          3
## 21166                      The Tempest False          0.0          0
## 21855                     The Congress False          6.4        165
## 22152                 Days of Darkness False          5.0          5
## 23045                      Brotherhood False          7.1         21
## 24845                             Deal False          5.2         22
## 28861   Nana, the True Key of Pleasure False          4.7          3
## 29375                        King Lear False          8.0          3
## 35799 Why We Fight: Divide and Conquer False          5.0          1
## 38872                       The Viking False          0.0          0
## 40041            Cemetery of Splendour False          4.4         50
## 40277             Seven Years Bad Luck False          5.6          4
## 45266                    Force Majeure False          6.8        255
##       id_collection name_collection             poster_path_collection
## 1466                                                                  
## 9166                                                                  
## 9328                                                                  
## 13376                                                                 
## 16765                                                                 
## 21166                                                                 
## 21855                                                                 
## 22152                                                                 
## 23045                                                                 
## 24845                                                                 
## 28861                                                                 
## 29375                                                                 
## 35799        158365    Why We Fight   /fFYBLu2Hnx27CWLOMd425ExDkgK.jpg
## 38872                                                                 
## 40041                                                                 
## 40277                                                                 
## 45266                                                                 
##       backdrop_path_collection      genre1          genre2          genre3
## 1466                                 Drama         Romance                
## 9166                                 Crime           Drama        Thriller
## 9328                             Adventure       Animation           Drama
## 13376                             Thriller         Mystery                
## 16765                             Thriller         Mystery                
## 21166                              Fantasy           Drama Science Fiction
## 21855                                Drama Science Fiction       Animation
## 22152                               Action          Horror Science Fiction
## 23045                                Drama                                
## 24845                               Comedy           Drama                
## 28861                                Drama          Comedy                
## 29375                                Drama         Foreign                
## 35799                     None Documentary                                
## 38872                               Action           Drama         Romance
## 40041                                Drama         Fantasy                
## 40277                               Comedy                                
## 45266                               Comedy           Drama                
##                       country1                 country2 country3
## 1466                   Germany                                  
## 9166                    France                    Italy         
## 9328                    France                  Germany    India
## 13376                  Finland                                  
## 16765                  Finland                                  
## 21166                                                           
## 21855                  Belgium                   France  Germany
## 22152 United States of America                                  
## 23045                   Sweden                  Denmark         
## 24845 United States of America                                  
## 28861                                                           
## 29375                  Denmark           United Kingdom         
## 35799 United States of America                                  
## 38872                                                           
## 40041           United Kingdom United States of America   France
## 40277 United States of America                                  
## 45266                   Norway                   Sweden   France
##       country1_language country2_language country3_language
## 1466            Deutsch                                    
## 9166           Français                                    
## 9328              हिन्दी                                    
## 13376             suomi                                    
## 16765             suomi                                    
## 21166                                                      
## 21855           English                                    
## 22152           English                                    
## 23045             Dansk                                    
## 24845           English                                    
## 28861                                                      
## 29375           English                                    
## 35799           English                                    
## 38872           English                                    
## 40041           English           ภาษาไทย                  
## 40277           English                                    
## 45266          Français             Norsk           svenska
##                        company1
## 1466          Studio Babelsberg
## 9166   Fa cinematografica    id
## 9328                   Filmfour
## 13376      Filmiteollisuus Fine
## 16765      Filmiteollisuus Fine
## 21166                          
## 21855    Pandora Filmproduktion
## 22152                          
## 23045                          
## 24845       Andertainment Group
## 28861              Cannon Group
## 29375 Royal Shakespeare Company
## 35799                          
## 38872                          
## 40041        Match Factory  The
## 40277    Max Linder Productions
## 45266                    Motlys
##                                                            company2
## 1466                          Centre National de la Cinématographie
## 9166  Compagnie Industrielle et Commerciale Cinématographique  CICC
## 9328                                                               
## 13376                                                              
## 16765                                                              
## 21166                                                              
## 21855                                           Entre Chien et Loup
## 22152                                                              
## 23045                                                              
## 24845                                        Crescent City Pictures
## 28861                                      Metro Goldwyn Mayer  MGM
## 29375                                                  Laterna Film
## 35799                                                              
## 38872                                                              
## 40041                                              Louverture Films
## 40277                                                              
## 45266                                           Coproduction Office
##                company3 budget_original revenue_original popularity_max
## 1466       Odessa Films               0                0       0.122178
## 9166     TC Productions               0            39481       9.091288
## 9328                                  0                0       1.967992
## 13376                                 0                0       0.411949
## 16765                                 0                0       0.411949
## 21166                                 0                0       0.000018
## 21855         Opus Film               0           455815       8.534039
## 22152                                 0                0       1.436085
## 23045                                 0                0       2.587911
## 24845 Tag Entertainment               0                0       6.880365
## 28861                                 0                0       1.276602
## 29375   Athena Film A S               0                0       0.187901
## 35799                                 0                0       0.473322
## 38872                                 0                0       0.002362
## 40041     Tordenfilm AS          980000                0       2.535419
## 40277                                 0                0       0.141558
## 45266       Film i Väst               0          1359497      12.165685
# Remove full duplicates
movies <- distinct(movies)
# Verify whether full duplicates remain on the data set
sum(duplicated(movies))
## [1] 0

Full Duplicates were eliminated from the dataset.

Partial Duplicates

# Check for partial duplicates
movies %>% 
  count(id) %>% 
  filter(n > 1)
##        id n
## 1   10991 2
## 2  109962 2
## 3  110428 2
## 4   12600 2
## 5   13209 2
## 6  132641 2
## 7   14788 2
## 8   15028 2
## 9   22649 2
## 10   4912 2
## 11  69234 2
## 12  77221 2
## 13  84198 2
movies %>% 
  count(imdb_id) %>% 
  filter(n > 1)
##      imdb_id  n
## 1            17
## 2          0  3
## 3  tt0022879  2
## 4  tt0046468  2
## 5  tt0082992  2
## 6  tt0100361  2
## 7  tt0157472  2
## 8  tt0235679  2
## 9  tt0270288  2
## 10 tt0287635  2
## 11 tt0454792  2
## 12 tt0499537  2
## 13 tt1701210  2
## 14 tt1736049  2
## 15 tt2018086  2
movies %>% 
  count(original_title) %>% 
  filter(n > 1)
##                                                  original_title n
## 1                                                  12 Angry Men 2
## 2                                  20,000 Leagues Under the Sea 4
## 3                                                          2:22 2
## 4                                                  3:10 to Yuma 2
## 5                                                             8 3
## 6                                                             9 2
## 7                                             A Bucket of Blood 2
## 8                                             A Christmas Carol 7
## 9                                             A Dangerous Place 2
## 10                                           A Farewell to Arms 2
## 11                                             A Foreign Affair 2
## 12                                         A Girl in Every Port 2
## 13                                           A Hole in the Head 2
## 14                                          A Kiss Before Dying 2
## 15                                      A Letter to Three Wives 2
## 16                                            A Little Princess 2
## 17                                            A Madea Christmas 2
## 18                                    A Midsummer Night's Dream 4
## 19                                          A Night to Remember 2
## 20                                    A Nightmare on Elm Street 2
## 21                                         A Place at the Table 2
## 22                                          A Raisin in the Sun 2
## 23                                               A Star Is Born 3
## 24                                     A Streetcar Named Desire 3
## 25                                         A Tale of Two Cities 3
## 26                                                      Aakrosh 2
## 27                                                      Aankhen 2
## 28                                                    Abduction 2
## 29                                                         Abel 2
## 30                                                    Abendland 2
## 31                                              Above Suspicion 2
## 32                                                   Absolution 2
## 33                                                         Adam 3
## 34                                    Adventures in Babysitting 2
## 35                                                        After 2
## 36                                               After Midnight 2
## 37                                                    Aftermath 4
## 38                                                     Airborne 2
## 39                                                       Aladin 2
## 40                                                        Alfie 2
## 41                                                        Alice 3
## 42                              Alice Through the Looking Glass 2
## 43                                          Alice in Wonderland 8
## 44                                               All Night Long 2
## 45                               All Quiet on the Western Front 2
## 46                                                    All of Me 2
## 47                                           All the King's Men 2
## 48                                             All the Way Home 2
## 49                                            Alone in the Dark 2
## 50                                                     Altitude 2
## 51                                                       Always 2
## 52                                                  Amber Alert 2
## 53                                                      America 2
## 54                                                 American Gun 2
## 55                                              American Virgin 2
## 56                                                    Americano 2
## 57                                                          Amy 2
## 58                                       An Enemy of the People 2
## 59                                             An Ideal Husband 2
## 60                                           An Inspector Calls 2
## 61                                                    Anastasia 2
## 62                                        And Soon the Darkness 2
## 63                                     And Then There Were None 2
## 64                                                        Angel 4
## 65                                                   Angel Baby 2
## 66                                       Angels in the Outfield 2
## 67                                                        Angst 2
## 68                                                       Animal 2
## 69                                                  Animal Farm 2
## 70                                                      Animals 3
## 71                                                        Anita 3
## 72                                                Anna Karenina 4
## 73                                         Anne of Green Gables 3
## 74                                                        Annie 3
## 75                                                 Annie Oakley 2
## 76                                                Another World 2
## 77                                             April Fool's Day 2
## 78                                               Arabian Nights 2
## 79                                                    Archangel 2
## 80                                                        Arena 3
## 81                                  Around the World in 80 Days 2
## 82                                                    Arrowhead 2
## 83                                                 Arsène Lupin 2
## 84                                                       Arthur 2
## 85                                               As You Like It 2
## 86                                                 Aschenputtel 4
## 87                                       Assault on Precinct 13 2
## 88                                                       Asylum 4
## 89                                                       Attila 3
## 90                                                       August 3
## 91                                                       Aurora 3
## 92                                                       Avalon 3
## 93                                                       Awaken 2
## 94                                             Babes in Toyland 3
## 95                                                  Back Street 2
## 96                                              Back in the Day 2
## 97                                                     Backfire 2
## 98                                                    Backstage 2
## 99                                                     Bad Boys 3
## 100                                                 Bad Company 3
## 101                                                    Bad Girl 2
## 102                                                   Bad Karma 3
## 103                                                        Bait 2
## 104                                                   Ballerina 2
## 105                                                    Bandidos 2
## 106                                                     Bandits 2
## 107                                                    Barabbas 3
## 108                                                     Barbara 2
## 109                                               Bare Knuckles 2
## 110                                                Barely Legal 2
## 111                                               Barnacle Bill 2
## 112                                                   Barricade 2
## 113                                                    Bartleby 2
## 114                                                      Batman 2
## 115                                                Battleground 2
## 116                                                  Beau Geste 2
## 117                                                   Beautiful 2
## 118                                         Beautiful Creatures 2
## 119                                        Beauty and the Beast 5
## 120                                                Bed of Roses 2
## 121                                                   Bedazzled 2
## 122                                          Behind Enemy Lines 2
## 123                                                 Belle Starr 2
## 124                                                     Ben-Hur 2
## 125                                                     Beneath 2
## 126                                                       Benji 2
## 127                                                     Beowulf 2
## 128                                                      Bernie 2
## 129                                                Best Friends 2
## 130                                                    Betrayal 2
## 131                                                    Betrayed 2
## 132                                                  Between Us 2
## 133                                                   Bewitched 2
## 134                                                      Beyond 3
## 135                                   Beyond a Reasonable Doubt 2
## 136                                                    Big Game 2
## 137                                                 Big Trouble 2
## 138                                                     Bigfoot 3
## 139                                               Billy the Kid 2
## 140                                                       Bingo 2
## 141                                              Bird on a Wire 2
## 142                                                       Black 2
## 143                                                 Black Angel 2
## 144                                                Black Beauty 2
## 145                                             Black Christmas 2
## 146                                                Black Friday 2
## 147                                                  Black Gold 2
## 148                                                 Black Magic 2
## 149                                                  Black Moon 2
## 150                                                 Black Sheep 2
## 151                                                 Black Widow 3
## 152                                                   Blackbird 3
## 153                                                    Blackout 4
## 154                                                       Blast 2
## 155                                                       Blind 4
## 156                                                  Blind Date 4
## 157                                                       Bliss 2
## 158                                                  Blood Moon 2
## 159                                                  Blood Ties 2
## 160                                              Blood and Sand 2
## 161                                     Blood: The Last Vampire 2
## 162                                                   Bloodline 2
## 163                                                  Blown Away 2
## 164                                                        Blue 3
## 165                                                  Blue Steel 2
## 166                                                   Bluebeard 2
## 167                                                    Bluebird 2
## 168                                               Body and Soul 3
## 169                                                      Bomber 2
## 170                                                Book of Love 2
## 171                                                  Borderline 4
## 172                                                  Bordertown 2
## 173                                               Born Reckless 3
## 174                                              Born Yesterday 2
## 175                                              Born to Be Bad 2
## 176                                             Born to Be Wild 2
## 177                                               Borrowed Time 2
## 178                                                   Boulevard 3
## 179                                                       Bound 2
## 180                                                         Boy 3
## 181                                              Boy Meets Girl 4
## 182                                                  Brainstorm 2
## 183                                                     Branded 2
## 184                                                       Brave 2
## 185                                              Breaking Point 4
## 186                                       Breaking and Entering 2
## 187                                                    Breakout 3
## 188                                              Breathing Room 2
## 189                                                  Breathless 2
## 190                                         Brewster's Millions 2
## 191                                               Bright Lights 2
## 192                                               Brighton Rock 2
## 193                                                      Broken 2
## 194                                                Broken Arrow 2
## 195                                             Broken Blossoms 2
## 196                                              Broken English 2
## 197                                            Brother's Keeper 2
## 198                                                      Brutal 2
## 199                                                      Bubble 2
## 200                                                       Buddy 2
## 201                                                         Bug 2
## 202                                                      Bullet 2
## 203                                                 Bulletproof 2
## 204                                                       Bully 2
## 205                                                Buried Alive 2
## 206                                       By Dawn's Early Light 2
## 207                                                  By the Sea 3
## 208                                                        Ca$h 2
## 209                                                 Cabin Fever 2
## 210                                                        Cake 2
## 211                                                  California 2
## 212                                                     Camille 3
## 213                                        Camille Claudel 1915 2
## 214                                                      Camino 2
## 215                                                        Camp 2
## 216                                                       Candy 2
## 217                                                   Cape Fear 2
## 218                                                     Caprice 2
## 219                                             Captain America 3
## 220                                             Captain January 2
## 221                                                     Captive 3
## 222                                                  Caravaggio 2
## 223                                                       Cargo 4
## 224                                                      Carmen 4
## 225                                           Carnival of Souls 2
## 226                                                       Carny 2
## 227                                                      Carrie 4
## 228                                                    Casanova 2
## 229                                               Casino Royale 2
## 230                                                  Cat People 2
## 231                                                   Catacombs 2
## 232                                         Catch Me If You Can 2
## 233                                                      Caught 4
## 234                                              Chain Reaction 2
## 235                                            Chain of Command 3
## 236                                                     Chained 2
## 237                                                    Champion 2
## 238                                                       Chaos 3
## 239                                             Charlotte's Web 2
## 240                                                      Charly 2
## 241                                        Cheaper by the Dozen 2
## 242                                                     Chicago 2
## 243                                                Child's Play 2
## 244                                        Children of the Corn 2
## 245                                                  China Gate 2
## 246                                                    Chocolat 3
## 247                                                   Christine 3
## 248                                               Christmas Eve 2
## 249                                    Christmas in Connecticut 2
## 250                                                   Chrysalis 2
## 251                                                       Ciało 2
## 252                                                    Cimarron 2
## 253                                                  Cinderella 7
## 254                                              City of Ghosts 2
## 255                                         Clash of the Titans 2
## 256                                                   Cleopatra 5
## 257                                               Clockstoppers 2
## 258                                                     Cloud 9 2
## 259                                                       Cobra 2
## 260                                                    Cocktail 2
## 261                                                  Cold Sweat 2
## 262                                                     Colegas 2
## 263                                                     College 2
## 264                                                 Coming Soon 2
## 265                                                   Committed 3
## 266                                                     Company 2
## 267                                                  Compulsion 2
## 268                                         Conan the Barbarian 2
## 269                                                  Concussion 2
## 270                                                Coney Island 2
## 271                             Confessions of a Dangerous Mind 2
## 272                                                  Conspiracy 2
## 273                                                   Contagion 2
## 274                                                  Contraband 2
## 275                                                     Control 2
## 276                                                      Cosmos 2
## 277                                                   Countdown 2
## 278                                                 Crackerjack 2
## 279                                                       Crash 2
## 280                                                  Crash Dive 2
## 281                                                  Crawlspace 3
## 282                                                       Crazy 2
## 283                                                 Crazy Horse 2
## 284                                                  Crazy Love 2
## 285                                                    Creature 4
## 286                                                       Creep 2
## 287                                                  Crime Wave 2
## 288                                        Crime and Punishment 2
## 289                                                    Criminal 2
## 290                                                  Crossroads 3
## 291                                                       Crush 4
## 292                                    Cry, the Beloved Country 2
## 293                                                  Cyberbully 2
## 294                                          Cyrano de Bergerac 2
## 295                                                      D.O.A. 3
## 296                                                  Dad's Army 2
## 297                                             Dante's Inferno 2
## 298                                                   Dark City 2
## 299                                                  Dark Horse 3
## 300                                                  Dark House 2
## 301                                              Darkness Falls 2
## 302                                                     Darling 4
## 303                                             Das Versprechen 2
## 304                                           David Copperfield 2
## 305                                              David and Lisa 2
## 306                                            Dawn of the Dead 2
## 307                                                     Day One 2
## 308                                             Day of the Dead 2
## 309                                                    Daylight 2
## 310                                                  Dead Awake 3
## 311                                                  Dead Birds 2
## 312                                                    Dead End 3
## 313                                                   Dead Heat 2
## 314                                                Dead Silence 2
## 315                                               Dead of Night 2
## 316                                                    Deadfall 3
## 317                                                    Deadline 4
## 318                                                        Deal 2
## 319                                              Death Sentence 2
## 320                                                Death Valley 2
## 321                                          Death at a Funeral 2
## 322                                         Death of a Salesman 4
## 323                                                   Deception 2
## 324                                              Deck the Halls 2
## 325                                                    Defiance 2
## 326                                                   Delirious 2
## 327                                                    Delirium 2
## 328                                        Deliver Us from Evil 3
## 329                                                    Dementia 2
## 330                                                Demon Hunter 2
## 331                                                  Der Tunnel 2
## 332                                              Der var engang 2
## 333                                                    Derailed 2
## 334                                                    Deranged 2
## 335                                                   Destroyer 2
## 336                                                   Detention 2
## 337                                                      Detour 4
## 338                                          Devil's Playground 2
## 339                                                  Die Brücke 2
## 340                                            Die goldene Gans 2
## 341                                                   Dillinger 2
## 342                                             Dinosaur Island 2
## 343                                               Dirty Dancing 2
## 344                                                 Dirty Deeds 2
## 345                                                      Django 2
## 346                                              Do Not Disturb 3
## 347                                             Doctor Dolittle 2
## 348                                              Doctor Strange 2
## 349                                                    Dog Tags 2
## 350                                                    Don Juan 2
## 351                                                 Don Quixote 2
## 352                                 Don't Be Afraid of the Dark 2
## 353                                       Don't Drink the Water 2
## 354                                               Don't Hang Up 2
## 355                                            Double Indemnity 2
## 356                                                 Double Take 2
## 357                                              Double Trouble 2
## 358                                              Double Wedding 2
## 359                                                    Downhill 2
## 360                                     Dr. Jekyll and Mr. Hyde 4
## 361                                                     Dracula 3
## 362                                                   Dragonfly 2
## 363                                                Dragonslayer 2
## 364                                                Dreamcatcher 2
## 365                                                   Dreamland 3
## 366                                             Dressed to Kill 3
## 367                                                       Drive 2
## 368                                            Driving Me Crazy 2
## 369                                                       Drone 2
## 370                                                     Dunkirk 2
## 371                                                     Déjà Vu 2
## 372                                        Earth vs. the Spider 2
## 373                                                 Easy Living 2
## 374                                                 Easy Virtue 2
## 375                                                         Eat 3
## 376                                                        Eden 5
## 377                                            Edge of Darkness 2
## 378                                                   El Dorado 2
## 379                                               El Estudiante 2
## 380                                                    El Greco 2
## 381                                                       Elegy 2
## 382                                                    Elephant 2
## 383                                                    Elevator 2
## 384                                                      Elokuu 2
## 385                                      Embrace of the Vampire 2
## 386                                                        Emma 5
## 387                                                      Empire 2
## 388                                       Employee of the Month 2
## 389                                             Enchanted April 2
## 390                                                 Enchantment 2
## 391                                                      Encore 2
## 392                                             End of the Line 2
## 393                                            End of the World 2
## 394                                          Endangered Species 2
## 395                                                     Endgame 3
## 396                                                Endless Love 2
## 397                                                      Enigma 3
## 398                                                     Equinox 2
## 399                                                    Erotikon 2
## 400                                                      Escape 2
## 401                                    Escape to Witch Mountain 2
## 402                                                         Eva 2
## 403                                                     Everest 2
## 404                                                   Evergreen 2
## 405                                                    Evidence 3
## 406                                                        Exit 3
## 407                                                     Exposed 2
## 408                                                  Extraction 2
## 409                                                    FC Venus 2
## 410                                                        Face 2
## 411                                               Fade to Black 3
## 412                                                   Fair Game 3
## 413                                                      Fallen 4
## 414                                                        Fame 2
## 415                                                       Fanny 3
## 416                                                  Fanny Hill 2
## 417                                              Fantastic Four 2
## 418                                  Far from the Madding Crowd 2
## 419                                         Father of the Bride 2
## 420                                                  Fatherland 2
## 421                                                       Fatso 2
## 422                                                       Faust 3
## 423                                                        Fear 2
## 424                                           Fear in the Night 2
## 425                                                       Feast 2
## 426                                                        Feed 2
## 427                                                       Fever 2
## 428                                                 Fever Pitch 2
## 429                                               Final Justice 2
## 430                                             Finders Keepers 2
## 431                                             Fire Down Below 2
## 432                                              Fire with Fire 2
## 433                                              First Daughter 2
## 434                                                        Five 4
## 435                                                Flash Gordon 2
## 436                                                   Flashback 2
## 437                                                    Flawless 2
## 438                                                     Flipper 2
## 439                                        Flowers in the Attic 2
## 440                                                       Focus 2
## 441                                                   Footloose 2
## 442                                           For Love or Money 2
## 443                                                   Forbidden 3
## 444                                                     Forever 2
## 445                                               Forget Me Not 2
## 446                                                    Forsaken 2
## 447                                                    Fortress 3
## 448                                                    Fotograf 2
## 449                                                   Four Sons 2
## 450                                                     Foxfire 2
## 451                                                    Fracture 2
## 452                                                      Framed 2
## 453                                                Frankenstein 6
## 454                                               Frankenweenie 2
## 455                                          Frankie and Johnny 2
## 456                                               Freaky Friday 3
## 457                                                     Freedom 2
## 458                                                    Freeheld 2
## 459                                                     Freeway 2
## 460                                                       Fresh 2
## 461                                             Friday the 13th 2
## 462                                                Fright Night 2
## 463                                  From the Earth to the Moon 2
## 464                                                      Frozen 3
## 465                                      Fun with Dick and Jane 2
## 466                                                  Funny Farm 2
## 467                                                 Funny Games 2
## 468                                                        Fury 2
## 469                                                     Gabriel 2
## 470                                                   Gabrielle 2
## 471                                                      Gambit 2
## 472                                                   Game Over 2
## 473                                                       Gamer 2
## 474                                                    Gaslight 2
## 475                                                      Genius 2
## 476                                                    Geronimo 2
## 477                                                  Get Carter 2
## 478                                                     Get Out 2
## 479                                                     Ghajini 2
## 480                                                       Ghost 2
## 481                                                Ghostbusters 2
## 482                                                       Ghoul 2
## 483                                                        Gigi 2
## 484                                                  Girls Town 2
## 485                                                      Gloria 4
## 486                                                     Go West 2
## 487                                                    Godzilla 2
## 488                                              Going in Style 2
## 489                                          Going the Distance 2
## 490                                                        Gold 4
## 491                                                        Gone 2
## 492                                          Goodbye, Mr. Chips 2
## 493                                                      Gossip 2
## 494                                                       Grace 3
## 495                                                 Grand Hotel 2
## 496                                               Grandma's Boy 2
## 497                                             Graveyard Shift 2
## 498                                          Great Expectations 5
## 499                                                Grey Gardens 2
## 500                                          Gulliver's Travels 4
## 501                                                         Gus 2
## 502                                              Guys and Dolls 2
## 503                                                       Gypsy 2
## 504                                                   Hairspray 2
## 505                                                   Halloween 3
## 506                                                Halloween II 2
## 507                                                      Hamlet 8
## 508                                             Hansel & Gretel 2
## 509                                           Hansel and Gretel 2
## 510                                                   Happiness 2
## 511                                                       Happy 2
## 512                                                   Happy End 2
## 513                                              Happy New Year 2
## 514                                                   Hard Luck 2
## 515                                                    Hardcore 2
## 516                                                     Harvest 2
## 517                                                      Harvey 2
## 518                                                      Hawaii 2
## 519                                                     Hawking 2
## 520                                             Head Over Heels 2
## 521                                            Heartbreak Hotel 2
## 522                                               Heartbreakers 2
## 523                                            Hearts and Minds 2
## 524                                                        Heat 3
## 525                                                      Heaven 2
## 526                                             Heaven Can Wait 2
## 527                                               Heavy Petting 2
## 528                                                      Hector 2
## 529                                                       Heidi 6
## 530                                                       Heist 2
## 531                                                     Held Up 2
## 532                                                       Helen 2
## 533                                                    Hellgate 2
## 534                                              Helter Skelter 2
## 535                                                    Hercules 4
## 536                                                        Hero 2
## 537                                               Hidden Agenda 2
## 538                                               Hide and Seek 2
## 539                                                   High Noon 2
## 540                                                 High School 2
## 541                                                High Society 2
## 542                                                 High Strung 2
## 543                                                   Hiroshima 2
## 544                                                     Holiday 2
## 545                                              Holy Matrimony 2
## 546                                                        Home 5
## 547                                                  Home Movie 2
## 548                                             Home Sweet Home 2
## 549                                       Home for the Holidays 2
## 550                                           Home of the Brave 4
## 551                                                   Honeymoon 2
## 552                                                Hope Springs 2
## 553                                         Horton Hears a Who! 2
## 554                                                 Hot Pursuit 2
## 555                                                       Hotel 3
## 556                                                     Houdini 2
## 557                                                       House 2
## 558                                              House of Cards 2
## 559                                              House of Usher 2
## 560                                                House of Wax 2
## 561                                       House on Haunted Hill 2
## 562                                                Housekeeping 2
## 563                                       How to Make a Monster 2
## 564                                                        Howl 2
## 565                                                      Hunger 3
## 566                                                   Hurricane 2
## 567                                                        Hush 3
## 568                                              I Love Trouble 2
## 569                                    I'll Sleep When I'm Dead 2
## 570                                                 Ice Castles 2
## 571                                           Imitation of Life 2
## 572                                                      Impact 2
## 573                                                     Impulse 3
## 574                                               In Cold Blood 2
## 575                                                In the Blood 2
## 576                                                     Incubus 3
## 577                                               Indian Summer 2
## 578                                                     Inferno 4
## 579                                            Inherit the Wind 2
## 580                                                   Innocence 2
## 581                                                      Inside 2
## 582                                                  Inside Out 3
## 583                                                    Insomnia 2
## 584                                              Into the Storm 2
## 585                                                Into the Sun 2
## 586                                               Into the West 2
## 587                                              Into the Woods 3
## 588                                                    Intruder 2
## 589                                                   Intruders 3
## 590                                          Invaders from Mars 2
## 591                              Invasion of the Body Snatchers 2
## 592                                                  Invincible 2
## 593                                                        Iris 3
## 594                                                    Iron Man 3
## 595                                                   Isolation 2
## 596                                                It Takes Two 2
## 597                                                  It's Alive 2
## 598                                   It's Such a Beautiful Day 2
## 599                                                     Ivanhoe 2
## 600                                                        Jack 3
## 601                                                  Jack Frost 3
## 602                                      Jack and the Beanstalk 4
## 603                                       Jack the Giant Killer 2
## 604                                             Jack the Ripper 2
## 605                                                    Jailbait 2
## 606                                                   Jane Eyre 6
## 607                                     Jason and the Argonauts 2
## 608                                                 Jersey Girl 2
## 609                                                   Jerusalem 2
## 610                                                       Jesus 2
## 611                                      Jesus Christ Superstar 2
## 612                                                      Jigsaw 3
## 613                                                 Joan of Arc 3
## 614                                                      Joanna 2
## 615                                                         Joe 2
## 616                                                        Joey 2
## 617                                                      Joshua 2
## 618                                           Journey Into Fear 2
## 619                          Journey to the Center of the Earth 4
## 620                                                         Joy 2
## 621                                                  Judas Kiss 2
## 622                                                       Judex 2
## 623                                                        Juha 2
## 624                                                       Julia 3
## 625                                                       Julie 2
## 626                                               Julius Caesar 3
## 627                                                      Junior 2
## 628                                                Just My Luck 2
## 629                                              Just for Kicks 2
## 630                                                    Kamikaze 2
## 631                                                 Kid Galahad 2
## 632                                                   Kidnapped 2
## 633                                                        Kiki 3
## 634                                                Kill 'em All 2
## 635                                                 Kill Switch 2
## 636                                          Kill Your Darlings 2
## 637                                                     Killjoy 2
## 638                                                   Kind Lady 2
## 639                                                  King Cobra 2
## 640                                                   King Kong 3
## 641                                                   King Lear 5
## 642                                        King Solomon's Mines 4
## 643                                                Kingdom Come 2
## 644                                                      Kismet 2
## 645                                             Kiss Me Goodbye 2
## 646                                               Kiss of Death 2
## 647                                                 Knock Knock 2
## 648                                                    Knockout 2
## 649                                                    Kon-Tiki 2
## 650                                                  L'Attentat 2
## 651                                             L'Auberge rouge 2
## 652                                                     L'Enfer 2
## 653                                                 L'amour fou 2
## 654                                                         LOL 2
## 655                                     La maschera del demonio 2
## 656                                               La religieuse 2
## 657                                                   Labyrinth 2
## 658                                                    Ladrones 2
## 659                                                    Lamerica 2
## 660                                                      Lassie 2
## 661                                                Last Holiday 2
## 662                                           Last Man Standing 2
## 663                                                  Last Night 2
## 664                                                 Last Resort 2
## 665                                                 Last Summer 2
## 666                                               Late Bloomers 2
## 667                                               Law and Order 2
## 668                                    Le Comte de Monte-Cristo 2
## 669                                                     Le fils 2
## 670                                                 Left Behind 2
## 671                                                      Legacy 3
## 672                                                      Legend 2
## 673                                                      Legion 2
## 674                                              Les Misérables 7
## 675                                    Les liaisons dangereuses 2
## 676                                                   Leviathan 2
## 677                                                        Life 4
## 678                                                      Lifted 2
## 679                                                  Lights Out 2
## 680                                                      Liliom 2
## 681                                                   Limelight 2
## 682                                                   Lionheart 2
## 683                                               Little Dorrit 2
## 684                                      Little Lord Fauntleroy 2
## 685                                                  Little Men 2
## 686                                          Little Miss Marker 2
## 687                                             Little Monsters 2
## 688                                               Little Sister 2
## 689                                                Little Women 3
## 690                                                      Lizzie 2
## 691                                                      Loaded 3
## 692                                                 Local Color 2
## 693                                                        Loft 2
## 694                                                       Logan 2
## 695                                                        Lola 3
## 696                                                      Lolita 2
## 697                                                      London 2
## 698                                       London After Midnight 2
## 699                               Long Day's Journey Into Night 2
## 700                                                Long Weekend 2
## 701                                           Lord of the Flies 2
## 702                                                Lost & Found 2
## 703                                                Lost Horizon 2
## 704                                                        Love 4
## 705                                                 Love Affair 2
## 706                                                    Loverboy 3
## 707                                                    Lovesick 2
## 708                                                      Loving 2
## 709                                                       Lucky 3
## 710                                                  Lucky Luke 2
## 711                                                        Lucy 2
## 712                                                     Lullaby 2
## 713                                                      Luther 2
## 714                                                           M 2
## 715                                                     Macbeth 7
## 716                                                    Mad Love 2
## 717                                                  Madagascar 2
## 718                                               Madame Bovary 4
## 719                                                Mademoiselle 2
## 720                                                    Madhouse 3
## 721                                       Magnificent Obsession 2
## 722                                                      Magnus 2
## 723                                            Mail Order Bride 2
## 724                                                   Malcolm X 2
## 725                                                        Mama 2
## 726                                                     Mammoth 2
## 727                                            Man of the House 2
## 728                                           Man of the Moment 2
## 729                                             Man of the Year 2
## 730                                                 Man on Fire 2
## 731                                                      Maniac 4
## 732                                                   Mannequin 2
## 733                                              Mansfield Park 2
## 734                                                    Margaret 2
## 735                                            Marie Antoinette 2
## 736                                                      Marius 2
## 737                                                        Mars 2
## 738                                                     Martyrs 2
## 739                                                 Masterminds 2
## 740                                                   Mata Hari 2
## 741                                                     Matilda 2
## 742                                                         Max 3
## 743                                                   Mayerling 2
## 744                                                       Medea 2
## 745                                                      Melody 2
## 746                                                Memorial Day 2
## 747                                                 Memory Lane 2
## 748                                               Men with Guns 2
## 749                                                 Mercenaries 2
## 750                                                       Mercy 4
## 751                                                      Meteor 2
## 752                                                  Metropolis 2
## 753                                                     Michael 3
## 754                                                      Mickey 2
## 755                                           Middle of Nowhere 2
## 756                                                    Midnight 3
## 757                                                Midnight Man 2
## 758                                            Mighty Joe Young 2
## 759                                              Mildred Pierce 2
## 760                                                        Milk 2
## 761                                                        Mine 2
## 762                                      Miracle on 34th Street 2
## 763                                                      Mirage 2
## 764                                                     Miranda 3
## 765                                               Mirror Mirror 2
## 766                                              Mischief Night 2
## 767                                                  Miss Julie 2
## 768                                                       Moana 2
## 769                                                     Molière 2
## 770                                                    Momentum 2
## 771                                                       Mommy 2
## 772                                             Monkey Business 2
## 773                                                     Monster 2
## 774                                                     Montana 2
## 775                                                 Monte Carlo 2
## 776                                                        More 2
## 777                                                      Morgan 2
## 778                                               Morning Glory 2
## 779                                                    Mortuary 2
## 780                                                      Mosaic 2
## 781                                                Mother's Day 3
## 782                                               Moving Target 2
## 783                                            Mr. & Mrs. Smith 2
## 784                                                   Mr. Jones 2
## 785                                                   Mr. Right 3
## 786                                      Much Ado About Nothing 2
## 787                                Murder on the Orient Express 2
## 788                                                     Mutants 2
## 789                                        Mutiny on the Bounty 2
## 790                                         My Bloody Valentine 2
## 791                                              My Blue Heaven 2
## 792                                            My Cousin Rachel 2
## 793                                              My Man Godfrey 2
## 794                                            My Sister Eileen 2
## 795                                           Mysterious Island 2
## 796                                          Mädchen in Uniform 2
## 797                                                       Naked 2
## 798                                                        Nana 3
## 799                                                  Nancy Drew 2
## 800                                           Natural Selection 2
## 801                                         Nature of the Beast 2
## 802                                                   Ned Kelly 2
## 803                                                   Neighbors 3
## 804                                         Never a Dull Moment 2
## 805                                                 Next of Kin 3
## 806                                                 Night Moves 2
## 807                                          Night and the City 2
## 808                                          Night of the Demon 2
## 809                                         Night of the Demons 2
## 810                                    Night of the Living Dead 2
## 811                                                   Nightmare 3
## 812                                                  Nightmares 2
## 813                                                        Nina 2
## 814                                                  Nine Lives 3
## 815                                                   No Escape 2
## 816                                                No Good Deed 2
## 817                                           No Man of Her Own 2
## 818                                               No Man's Land 4
## 819                                                  No Smoking 2
## 820                                                  No Way Out 2
## 821                                                        Noah 2
## 822                                                  Noah's Ark 2
## 823                                               Nobody's Fool 2
## 824                                            Nobody's Perfect 2
## 825                                                    Nocturna 2
## 826                                                       Noise 2
## 827                                                    Non-Stop 2
## 828                                                      Normal 2
## 829                                            Nothing Personal 2
## 830                                             Nothing to Lose 2
## 831                                                   Notorious 2
## 832                                                    Oblivion 2
## 833                                                    Obsessed 3
## 834                                                   Obsession 2
## 835                                              Ocean's Eleven 2
## 836                                             Of Mice and Men 2
## 837                                                     Offside 2
## 838                                                   Oklahoma! 2
## 839                                                Oliver Twist 4
## 840                                                On the Beach 2
## 841                                                Once a Thief 2
## 842                                               One More Time 2
## 843                                                    One Week 2
## 844                                                 Open Season 2
## 845                                               Opening Night 2
## 846                                                    Operator 2
## 847                                                       Oscar 2
## 848                                                     Othello 4
## 849                                                    Our Town 2
## 850                                                    Out Cold 2
## 851                                                Out of Reach 2
## 852                                                 Out of Time 2
## 853                                             Out of the Blue 3
## 854                                               Out on a Limb 2
## 855                                                     Outrage 3
## 856                                                Paid in Full 2
## 857                                                         Pan 2
## 858                                                Panic Button 2
## 859                                                   Paparazzi 2
## 860                                                    Paradise 3
## 861                                                     Paradox 2
## 862                                                    Paranoia 2
## 863                                                   Parineeta 2
## 864                                                  Party Girl 3
## 865                                               Party Monster 2
## 866                                                  Passengers 2
## 867                                                     Passion 2
## 868                                                     Patrick 2
## 869                                                    Penelope 2
## 870                                         Pennies from Heaven 3
## 871                                                    Penumbra 2
## 872                                                  Persuasion 3
## 873                                               Pete's Dragon 2
## 874                                                   Peter Pan 5
## 875                                                     Phantom 3
## 876                                                     Phoenix 3
## 877                                              Pie in the Sky 2
## 878                                                  Pilgrimage 2
## 879                                                   Pinocchio 4
## 880                                                     Piranha 2
## 881                                                      Pixels 2
## 882                                                       Pizza 2
## 883                                          Planet of the Apes 2
## 884                                           Playing for Keeps 2
## 885                                             Poil de carotte 2
## 886                                                 Point Break 2
## 887                                                      Poison 2
## 888                                                  Poison Ivy 2
## 889                                        Pokémon 3: The Movie 2
## 890                                                      Police 2
## 891                                                   Pollyanna 2
## 892                                                 Poltergeist 2
## 893                                                     Popcorn 2
## 894                                                       Posse 2
## 895                                                   Possessed 3
## 896                                                  Possession 3
## 897                                                 Pretty Baby 2
## 898                                                       Pride 2
## 899                                         Pride and Prejudice 2
## 900                                                      Priest 2
## 901                                     Priklyucheniya Buratino 2
## 902                                              Prince Valiant 2
## 903                                                    Princess 2
## 904                                                   Prinsessa 2
## 905                                               Private Parts 2
## 906                                                   Project X 3
## 907                                                  Prom Night 2
## 908                                               Promised Land 2
## 909                                                       Proof 2
## 910                                                     Proteus 2
## 911                                                  Providence 2
## 912                                                      Psycho 2
## 913                                              Public Enemies 3
## 914                                                       Pulse 2
## 915                                                      Pusher 2
## 916                                         Pünktchen und Anton 2
## 917                                                           Q 2
## 918                                                     Quartet 3
## 919                                                   Quo Vadis 2
## 920                                                        Race 2
## 921                                                     Raffles 2
## 922                                                        Rage 3
## 923                                                        Rain 2
## 924                                                     Rampage 2
## 925                                                      Ransom 2
## 926                                                  Rapid Fire 2
## 927                                                         Rat 2
## 928                                                    Raw Deal 2
## 929                                                 Rear Window 2
## 930                                                     Rebirth 2
## 931                                                    Reckless 2
## 932                                                    Red Dawn 2
## 933                                                    Red Dust 2
## 934                                                    Red Heat 2
## 935                                             Red Riding Hood 2
## 936                                                      Refuge 2
## 937                                                Regeneration 2
## 938                                                   Rembrandt 3
## 939                                              Remote Control 2
## 940                                                     Requiem 2
## 941                                                  Resistance 2
## 942                                                     Respire 2
## 943                                                    Restless 2
## 944                                                 Restoration 2
## 945                                            Return to Sender 2
## 946                                                  Revolution 2
## 947                                             Rich and Famous 2
## 948                                                 Richard III 3
## 949                                                    Ricochet 2
## 950                                                        Ride 2
## 951                                                   Riff-Raff 2
## 952                                                       Rings 2
## 953                                                         Rio 2
## 954                                                        Riot 2
## 955                                                      Ritual 2
## 956                                                       River 2
## 957                                                  Riverworld 2
## 958                                                        Road 2
## 959                                                  Road House 2
## 960                                                      Roadie 2
## 961                                                  Robin Hood 4
## 962                                             Robinson Crusoe 3
## 963                                                     RoboCop 2
## 964                                                  Rollerball 2
## 965                                                        Roma 2
## 966                                                     Romance 3
## 967                                            Romeo and Juliet 2
## 968                                                        Room 2
## 969                                             Rosemary's Baby 2
## 970                                                        Ruby 2
## 971                                                         Run 3
## 972                                                     Runaway 3
## 973                                              Running Scared 3
## 974                                                        Rush 2
## 975                                                    Sabotage 2
## 976                                                     Sabrina 2
## 977                                                   Sacrifice 3
## 978                                                        Safe 2
## 979                                                  Safe House 2
## 980                                                      Sahara 4
## 981                                                 Salem's Lot 2
## 982                                                      Salomé 3
## 983                                                     Salvage 2
## 984                                                     Samsara 2
## 985                                          Samson and Delilah 3
## 986                                                 San Quentin 2
## 987                                                 Santa Claus 2
## 988                                                 Santa Claws 2
## 989                                                     Savages 2
## 990                                                     Save Me 2
## 991                                                 Saving Face 2
## 992                                                         Saw 2
## 993                                                 Scaramouche 2
## 994                                                   Scarecrow 2
## 995                                                    Scarface 2
## 996                                       School for Scoundrels 2
## 997                                                     Scorned 2
## 998                                                   Screamers 2
## 999                                                     Screwed 2
## 1000                                                    Scrooge 3
## 1001                                                Second Skin 2
## 1002                                             Secret Défense 2
## 1003                                                See No Evil 2
## 1004                                                    Seizure 2
## 1005                                      Sense and Sensibility 4
## 1006                                                  Senseless 2
## 1007                                                  September 2
## 1008                                                    Sequoia 2
## 1009                                                     Serena 2
## 1010                                              Shadow People 2
## 1011                                                      Shaft 2
## 1012                                                  Shakedown 3
## 1013                                                      Shank 2
## 1014                                                        She 3
## 1015                                                    Shelter 3
## 1016                                             Shelter Island 2
## 1017                                                 Shenandoah 2
## 1018                                            Sherlock Holmes 4
## 1019                                                      Shiva 2
## 1020                                            Shock Treatment 2
## 1021                                              Shoot to Kill 2
## 1022                                                  Show Boat 2
## 1023                                                    Sicario 2
## 1024                                               Side Effects 2
## 1025                                      Sidewalks of New York 2
## 1026                                                      Signs 2
## 1027                                             Silent Retreat 2
## 1028                                                       Silk 2
## 1029                                                      Simon 2
## 1030                                               Sink or Swim 2
## 1031                                                      Siren 2
## 1032                                                    Sisters 3
## 1033                                                 Ski Patrol 2
## 1034                                                       Skin 2
## 1035                                                Skinwalkers 2
## 1036                                                    Skylark 2
## 1037                                            Sleeping Beauty 4
## 1038                                                     Sleuth 2
## 1039                                                 Slipstream 2
## 1040                                                    Slither 2
## 1041                                                  Slow Burn 3
## 1042                                                      Smile 2
## 1043                                                   Snatched 2
## 1044                                                 Snow White 4
## 1045                                                    Soldier 2
## 1046                                                       Solo 3
## 1047                                 Somebody Up There Likes Me 2
## 1048                                             Something Wild 2
## 1049                                    Something to Sing About 2
## 1050                                             Son of Dracula 2
## 1051                                                  Sonny Boy 2
## 1052                                                  Sorceress 2
## 1053                                                    Sounder 2
## 1054                                                Sour Grapes 2
## 1055                                           Southern Comfort 2
## 1056                                                    Sparkle 2
## 1057                                                  Spartacus 2
## 1058                                                   Speedway 2
## 1059                                                 Spellbound 2
## 1060                                                     Spider 2
## 1061                                                    Spiders 2
## 1062                                                       Spin 3
## 1063                                                   Splendor 2
## 1064                                               Split Second 2
## 1065                                               Stage Fright 2
## 1066                                               Stage Struck 3
## 1067                                                 Stagecoach 2
## 1068                                                   Standoff 2
## 1069                                                   Stardust 2
## 1070                                                 State Fair 3
## 1071                                                       Stay 2
## 1072                                                      Steel 2
## 1073                                                     Stella 3
## 1074                                                     Stereo 2
## 1075                                                     Stevie 2
## 1076                                                 Still Life 2
## 1077                                                   Stitches 2
## 1078                                                 Stone Cold 2
## 1079                                                  Stonewall 2
## 1080                                                      Storm 2
## 1081                                              Storm Warning 2
## 1082                                             Stormy Weather 2
## 1083                                                   Stranded 3
## 1084                                           Strange Invaders 2
## 1085                                                   Strapped 2
## 1086                                                 Straw Dogs 2
## 1087                                                      Stuck 2
## 1088                                                  Submarine 2
## 1089                                                  Submerged 2
## 1090                                                   Suddenly 2
## 1091                                                      Sugar 3
## 1092                                                 Sugar Hill 2
## 1093                                                     Sultan 2
## 1094                                                Summer Camp 2
## 1095                                             Summer Holiday 2
## 1096                                              Summer School 3
## 1097                                                    Sundown 2
## 1098                                               Sunset Strip 2
## 1099                                                   Sunshine 2
## 1100                                                   Superman 2
## 1101                                                  Supernova 2
## 1102                                                  Superstar 2
## 1103                                                        Sur 2
## 1104                                                   Survivor 3
## 1105                                                    Suspect 3
## 1106                                       Swallows and Amazons 2
## 1107             Sweeney Todd: The Demon Barber of Fleet Street 3
## 1108                                             Sweet November 2
## 1109                                              Sweet Revenge 2
## 1110                                              Sweet Sixteen 2
## 1111                                                   Swingers 2
## 1112                                                     Switch 3
## 1113                                                      Sybil 2
## 1114                                                     Sylvia 2
## 1115                                                       Tabu 2
## 1116                                       Take Me to the River 2
## 1117                                                      Taken 2
## 1118                                                  Tangerine 2
## 1119                                                    Tangled 2
## 1120                                                      Tango 2
## 1121                                                Taras Bulba 2
## 1122                                                     Target 2
## 1123                                                     Tarzan 2
## 1124                                                       Taxi 2
## 1125                                              Teacher's Pet 3
## 1126                               Teenage Mutant Ninja Turtles 2
## 1127                                                    Tempest 2
## 1128                                                   Terminus 2
## 1129                                  Tess of the D'Urbervilles 2
## 1130                                               The 39 Steps 3
## 1131                                              The Abandoned 2
## 1132                                                The Accused 2
## 1133                         The Adventures of Huckleberry Finn 2
## 1134                               The Adventures of Mark Twain 2
## 1135                                       The Age of Innocence 2
## 1136                                                  The Alamo 2
## 1137                                      The Amityville Horror 2
## 1138                                       The Andromeda Strain 2
## 1139                                              The Architect 2
## 1140                                       The Art of the Steal 2
## 1141                                             The Assignment 2
## 1142                                               The Avengers 2
## 1143                                                The Aviator 2
## 1144                                              The Awakening 2
## 1145                                            The Awful Truth 2
## 1146                                               The Bachelor 2
## 1147                                               The Bad Seed 2
## 1148                                                   The Bank 2
## 1149                                                 The Barber 2
## 1150                                                    The Bat 2
## 1151                                               The Beguiled 2
## 1152                                               The Best Man 2
## 1153                                                The Big Fix 2
## 1154                                              The Big Sleep 2
## 1155                                              The Big Steal 2
## 1156                                      The Birth of a Nation 2
## 1157                                          The Biscuit Eater 2
## 1158                                              The Black Cat 3
## 1159                                             The Black Hole 4
## 1160                                             The Black Room 2
## 1161                                             The Bling Ring 2
## 1162                                                   The Blob 2
## 1163                                              The Blue Bird 2
## 1164                                            The Blue Lagoon 2
## 1165                                           The Book of Life 2
## 1166                                              The Borrowers 3
## 1167                                                   The Boss 2
## 1168                                        The Bourne Identity 2
## 1169                                                    The Box 2
## 1170                                                  The Boxer 2
## 1171                                                    The Boy 2
## 1172                                          The Boy Next Door 2
## 1173                                                   The Boys 2
## 1174                                              The Brave One 2
## 1175                                                  The Breed 2
## 1176                                                 The Bridge 2
## 1177                                       The Browning Version 2
## 1178                                              The Buccaneer 2
## 1179                                       The Call of the Wild 3
## 1180                                                 The Caller 2
## 1181                                      The Canterville Ghost 2
## 1182                                                The Captive 2
## 1183                                              The Caretaker 2
## 1184                                        The Case for Christ 2
## 1185                                     The Cat and the Canary 3
## 1186                                         The Cat in the Hat 2
## 1187                                              The Challenge 3
## 1188                                                  The Champ 2
## 1189                            The Charge of the Light Brigade 2
## 1190                                                  The Chase 3
## 1191                                                  The Child 2
## 1192                                                 The Chosen 2
## 1193                                                 The Circle 3
## 1194                                                   The Club 2
## 1195                                      The Cold Light of Day 2
## 1196                                             The Collection 2
## 1197                                              The Collector 2
## 1198                                               The Comedian 3
## 1199                                              The Condemned 2
## 1200                                             The Confession 3
## 1201                                             The Connection 2
## 1202                                                The Cottage 2
## 1203                                  The Count of Monte Cristo 2
## 1204                                               The Covenant 2
## 1205                                                The Crazies 2
## 1206                                                   The Crew 3
## 1207                                                   The Cure 2
## 1208                                                 The Damned 2
## 1209                                                   The Dark 2
## 1210                                             The Dark Horse 2
## 1211                                            The Dark Knight 2
## 1212                                             The Dark Tower 2
## 1213                                            The Dawn Patrol 2
## 1214                                    The Day of the Triffids 2
## 1215                              The Day the Earth Stood Still 2
## 1216                                                   The Dead 2
## 1217                                              The Dead Zone 2
## 1218                                                   The Deal 2
## 1219                                          The Deep Blue Sea 2
## 1220                                           The Defiant Ones 2
## 1221                                                The Dentist 2
## 1222                                            The Desert Song 3
## 1223                                    The Diary of Anne Frank 3
## 1224                                            The Disappeared 2
## 1225                                                 The Double 2
## 1226                                             The Dream Team 2
## 1227                                                The Dresser 2
## 1228                                         The Dunwich Horror 2
## 1229                                                   The Edge 2
## 1230                                           The Elephant Man 2
## 1231                                  The Emperor's New Clothes 2
## 1232                                              The Encounter 2
## 1233                                                    The End 2
## 1234                                      The End of the Affair 2
## 1235                                               The Enforcer 2
## 1236                                               The Escapist 2
## 1237                                                  The Falls 2
## 1238                                                    The Fan 2
## 1239                                   The Fast and the Furious 2
## 1240                                              The Final Cut 2
## 1241                                                   The Firm 2
## 1242                                             The First Time 2
## 1243                                                    The Fly 2
## 1244                                                    The Fog 2
## 1245                                              The Foreigner 2
## 1246                                                 The Forest 2
## 1247                                                 The Forger 2
## 1248                                              The Forgotten 2
## 1249                                                The Formula 2
## 1250                                          The Four Feathers 4
## 1251                        The Four Horsemen of the Apocalypse 2
## 1252                                               The Freshman 2
## 1253                                                  The Front 2
## 1254                                             The Front Page 2
## 1255                                           The Frozen North 2
## 1256                                               The Fugitive 2
## 1257                                                The Gambler 3
## 1258                                                 The Garden 2
## 1259                                        The Gathering Storm 2
## 1260                                               The Gauntlet 2
## 1261                                                The General 2
## 1262                                                The Getaway 2
## 1263                                            The Ghost Train 2
## 1264                                                  The Ghoul 2
## 1265                                                   The Gift 3
## 1266                                                   The Girl 2
## 1267                                         The Girl Next Door 3
## 1268                                           The Girl Said No 2
## 1269                                      The Girl on the Train 2
## 1270                                            The Glass House 2
## 1271                                        The Glass Menagerie 3
## 1272                                         The Good Humor Man 2
## 1273                                               The Good Lie 2
## 1274                                          The Good Shepherd 2
## 1275                                           The Goodbye Girl 2
## 1276                                           The Great Gatsby 4
## 1277                                            The Great Waltz 2
## 1278                                               The Greatest 2
## 1279                                           The Green Hornet 3
## 1280                                               The Guardian 2
## 1281                                             The Gunfighter 2
## 1282                                              The Happening 2
## 1283                                               The Hard Way 2
## 1284                                          The Haunted House 2
## 1285                                               The Haunting 2
## 1286                                         The Heartbreak Kid 2
## 1287                                        The Hills Have Eyes 2
## 1288                                                The Hitcher 2
## 1289                                                   The Hive 2
## 1290                                                   The Hole 2
## 1291                                                 The Hollow 3
## 1292                                                The Hoodlum 2
## 1293                              The Hound of the Baskervilles 6
## 1294                                The Hunchback of Notre Dame 3
## 1295                                                 The Hunted 2
## 1296                                                 The Hunter 2
## 1297                                                The Hunters 4
## 1298                                          The Hunting Party 2
## 1299                                              The Hurricane 2
## 1300                                              The Immigrant 2
## 1301                            The Importance of Being Earnest 3
## 1302                                               The In Crowd 2
## 1303                                                The In-Laws 2
## 1304                                               The Incident 3
## 1305                                    The Initiation of Sarah 2
## 1306                                              The Institute 2
## 1307                                                 The Intern 2
## 1308                                              The Interview 2
## 1309                                               The Intruder 2
## 1310                                        The Invisible Woman 2
## 1311                                             The Invitation 2
## 1312                                                 The Island 2
## 1313                                   The Island of Dr. Moreau 2
## 1314                                            The Italian Job 2
## 1315                                            The Jazz Singer 2
## 1316                                                The Journey 4
## 1317                                            The Jungle Book 3
## 1318                                             The Karate Kid 2
## 1319                                                 The Keeper 3
## 1320                                                    The Key 2
## 1321                                                    The Kid 2
## 1322                                                The Killers 2
## 1323                                             The King and I 2
## 1324                                                   The Kiss 4
## 1325                                             The Ladies Man 2
## 1326                                          The Lady Vanishes 3
## 1327                                            The Ladykillers 2
## 1328                                                   The Land 2
## 1329                                 The Last House on the Left 2
## 1330                                      The Last Man on Earth 2
## 1331                                            The Last Patrol 2
## 1332                                               The Last Run 2
## 1333                                              The Last Word 2
## 1334                                   The Last of the Mohicans 3
## 1335                                The Legend of Sleepy Hollow 3
## 1336                                                 The Letter 3
## 1337                       The Life & Adventures of Santa Claus 2
## 1338                                          The Little Prince 2
## 1339                                                 The Lodger 2
## 1340                                            The Lone Ranger 3
## 1341                                           The Longest Yard 2
## 1342                                                  The Lorax 2
## 1343                                                   The Lost 2
## 1344                                             The Lost World 3
## 1345                                                The Lottery 2
## 1346                                               The Love Bug 2
## 1347                                            The Love Letter 2
## 1348                                                 The Lovers 2
## 1349                                      The Luck of the Irish 2
## 1350                                               The Magician 2
## 1351                                      The Magnificent Seven 2
## 1352                                                  The Maker 2
## 1353                                         The Maltese Falcon 2
## 1354                                                    The Man 2
## 1355                                  The Man Who Knew Too Much 2
## 1356                                   The Man Who Wasn't There 2
## 1357                                   The Man in the Iron Mask 3
## 1358                                   The Manchurian Candidate 2
## 1359                                                   The Mark 2
## 1360                                           The Mark of Cain 2
## 1361                                          The Mark of Zorro 2
## 1362                                                   The Mask 2
## 1363                                                 The Master 2
## 1364                                                The Matador 2
## 1365                                             The Matchmaker 2
## 1366                                                   The Maze 2
## 1367                                               The Mechanic 2
## 1368                                     The Merchant of Venice 2
## 1369                                            The Merry Widow 3
## 1370                                         The Miracle Worker 3
## 1371                                                The Monster 2
## 1372                                          The Morning After 2
## 1373                                                  The Mummy 4
## 1374                                              The Music Man 2
## 1375                                               The Neighbor 3
## 1376                                           The Night Before 2
## 1377                                          The Night Stalker 2
## 1378                                        The Nutty Professor 2
## 1379                                         The Old Dark House 2
## 1380                                    The Old Man and the Sea 2
## 1381                                                   The Omen 2
## 1382                                                    The One 2
## 1383                                              The Open Road 2
## 1384                                                  The Order 2
## 1385                                            The Other Woman 2
## 1386                                               The Outsider 2
## 1387                                                   The Pack 2
## 1388                                                The Package 2
## 1389                                           The Painted Veil 2
## 1390                                               The Paleface 2
## 1391                                            The Parent Trap 2
## 1392                                                The Patriot 2
## 1393                                                  The Patsy 2
## 1394                                                The Penalty 2
## 1395                                      The Perils of Pauline 3
## 1396                                                The Phantom 3
## 1397                                   The Phantom of the Opera 4
## 1398                                The Philadelphia Experiment 2
## 1399                                             The Pied Piper 2
## 1400                                           The Pink Panther 2
## 1401                                    The Pirates of Penzance 2
## 1402                                                    The Pit 2
## 1403                                   The Pit and the Pendulum 3
## 1404                                              The Plainsman 2
## 1405                                     The Poseidon Adventure 2
## 1406                             The Postman Always Rings Twice 2
## 1407                                    The Power and the Glory 2
## 1408                                  The Prince and the Pauper 4
## 1409                                      The Prisoner of Zenda 3
## 1410                                              The Producers 2
## 1411                                                The Program 2
## 1412                                                The Promise 2
## 1413                                            The Proposition 2
## 1414                                                The Prowler 2
## 1415                                               The Punisher 2
## 1416                                                  The Queen 2
## 1417                                     The Quick and the Dead 2
## 1418                                         The Quiet American 2
## 1419                                                 The Racket 2
## 1420                                              The Rainmaker 2
## 1421                                                  The Raven 4
## 1422                                           The Razor's Edge 2
## 1423                                             The Real McCoy 2
## 1424                                              The Reckoning 3
## 1425                                                 The Return 2
## 1426                                               The Revenant 2
## 1427                                                   The Rift 2
## 1428                                                   The Ring 3
## 1429                                                  The River 2
## 1430                                                   The Road 2
## 1431                             The Roman Spring of Mrs. Stone 2
## 1432                                                 The Rookie 2
## 1433                                                  The Saint 2
## 1434                                              The Scapegoat 2
## 1435                                              The Scarecrow 2
## 1436                                         The Scarlet Letter 3
## 1437                                      The Scarlet Pimpernel 2
## 1438                                               The Sea Hawk 2
## 1439                                                 The Search 2
## 1440                                          The Secret Garden 3
## 1441                            The Secret Life of Walter Mitty 2
## 1442                                               The Sentinel 2
## 1443                                             The Shaggy Dog 2
## 1444                                                  The Sheik 2
## 1445                                                   The Show 2
## 1446                                                 The Signal 2
## 1447                                                 The Sitter 2
## 1448                                                The Snowman 2
## 1449                                     The Sound and the Fury 2
## 1450                                       The Spiral Staircase 2
## 1451                                    The Spirit of Christmas 3
## 1452                                                 The Square 2
## 1453                                                The Squeeze 3
## 1454                                             The Stepfather 2
## 1455                                         The Stepford Wives 2
## 1456                                               The Stranger 4
## 1457                                             The Substitute 2
## 1458                                          The Sunshine Boys 2
## 1459                                                The Suspect 2
## 1460                                                   The Take 3
## 1461                                    The Taming of the Shrew 3
## 1462                                                The Tempest 2
## 1463                                       The Ten Commandments 2
## 1464                                   The Theory of Everything 2
## 1465                                        The Thief of Bagdad 2
## 1466                                                  The Thing 2
## 1467                                    The Thomas Crown Affair 2
## 1468                                       The Three Musketeers 7
## 1469                                          The Three Stooges 2
## 1470                                           The Time Machine 2
## 1471                                      The Time of Your Life 2
## 1472                                        The Toolbox Murders 2
## 1473                                                The Tracker 2
## 1474                                                   The Trap 2
## 1475                                                   The Trip 3
## 1476                                      The Trip to Bountiful 2
## 1477                                                 The Tunnel 2
## 1478                                          The Turning Point 2
## 1479                                             The Undefeated 2
## 1480                                             The Underneath 2
## 1481                                           The Unholy Three 2
## 1482                                              The Uninvited 3
## 1483                                                 The Unseen 2
## 1484                                                    The Van 2
## 1485                                                The Verdict 2
## 1486                                           The Violent Kind 2
## 1487                                              The Virginian 2
## 1488                                                  The Visit 4
## 1489                                                   The Void 3
## 1490                                           The Waiting Room 2
## 1491                                           The Walking Dead 2
## 1492                                                    The War 2
## 1493                                            The War at Home 2
## 1494                                          The Wedding March 2
## 1495                                                   The Well 2
## 1496                                             The Wicker Man 2
## 1497                                             The Wild Party 3
## 1498                                    The Wind in the Willows 3
## 1499                                            The Winslow Boy 2
## 1500                                                The Witches 2
## 1501                                         The Wizard of Gore 2
## 1502                                           The Wizard of Oz 2
## 1503                                         The Woman in Black 2
## 1504                                                  The Women 2
## 1505                                          The Wrecking Crew 2
## 1506                                             The Wrong Girl 2
## 1507                                              The Wrong Man 2
## 1508                                               The Yearling 2
## 1509                                           Thick as Thieves 2
## 1510                                                      Thief 3
## 1511                                                   Thin Ice 2
## 1512                                                     Thirst 3
## 1513                                          This Land Is Mine 2
## 1514                                        Three Men in a Boat 2
## 1515                                              Thunderstruck 2
## 1516                                                   Timecode 2
## 1517                                  Tinker Tailor Soldier Spy 2
## 1518                                                    Titanic 3
## 1519                                         To Be or Not to Be 2
## 1520                                   To the Ends of the Earth 2
## 1521                                                     Tobruk 2
## 1522                                                 Tom Sawyer 3
## 1523                                                     Tomboy 2
## 1524                                          Too Hot to Handle 2
## 1525                                                     Topaze 2
## 1526                                                  Tormented 2
## 1527                                               Total Recall 2
## 1528                                               Toy Soldiers 2
## 1529                                                     Tracks 3
## 1530                                                     Trance 2
## 1531                                                    Trapped 4
## 1532                                                      Trash 2
## 1533                                                     Trauma 2
## 1534                                             Treading Water 2
## 1535                                            Treasure Island 6
## 1536                                                   Trespass 2
## 1537                                                      Trick 2
## 1538                                             Trick or Treat 2
## 1539                                             Triple Trouble 2
## 1540                                                  True Blue 2
## 1541                                                 True Crime 2
## 1542                                                  True Grit 2
## 1543                                                     Trumbo 2
## 1544                                                      Trust 2
## 1545                                                      Truth 2
## 1546                                                      Tsuma 2
## 1547                                                 Tumbledown 3
## 1548                                         Tuntematon sotilas 2
## 1549                                               Turkey Shoot 2
## 1550                                                       Tusk 2
## 1551                                                   Twilight 2
## 1552                                                      Twist 2
## 1553                                             Twist of Faith 2
## 1554                                                    Twisted 3
## 1555                                                    Twister 2
## 1556                                              Two of a Kind 2
## 1557                                                      Tyson 2
## 1558                                            Under Suspicion 2
## 1559                                              Under the Gun 3
## 1560                                             Under the Skin 2
## 1561                                                Underground 2
## 1562                                                   Undertow 2
## 1563                                                 Underworld 3
## 1564                                         Unfaithfully Yours 2
## 1565                                              Unforgettable 2
## 1566                                                     United 2
## 1567                                          Universal Soldier 2
## 1568                                                    Unknown 2
## 1569                                                Unmade Beds 2
## 1570                                                Unstoppable 2
## 1571                                                  Valentino 2
## 1572                                                    Valerie 2
## 1573                                                   Vampires 2
## 1574                                                   Vendetta 2
## 1575                                                      Venom 2
## 1576                                                       Vice 2
## 1577                                                 Vice Squad 2
## 1578                                                     Victim 3
## 1579                                                   Victoria 2
## 1580                                      Village of the Damned 2
## 1581                                                      Virus 2
## 1582                                                       Viva 2
## 1583                                                     Walker 2
## 1584                                               Walking Tall 2
## 1585                                                     Walter 2
## 1586                                                 Wanderlust 2
## 1587                                                     Wanted 2
## 1588                                              War and Peace 3
## 1589                                                    Warlock 2
## 1590                                                      Water 2
## 1591                                            Waterloo Bridge 2
## 1592                                            We're No Angels 2
## 1593                                      Weekend of a Champion 2
## 1594                                                    Welcome 2
## 1595                                      Welcome to the Jungle 2
## 1596                                                    Western 2
## 1597                                           What Price Glory 2
## 1598                                           When Ladies Meet 2
## 1599                                      When a Stranger Calls 2
## 1600                                               When in Rome 2
## 1601                                      When the Bough Breaks 2
## 1602                                         Where the Heart Is 2
## 1603                                      While the City Sleeps 2
## 1604                                                   Whiplash 3
## 1605                               Whistle and I'll Come to You 2
## 1606                                                       Wild 2
## 1607                                                  Wild Bill 2
## 1608                                                    Willard 2
## 1609                                                     Wilson 2
## 1610                                                       Wind 2
## 1611                                         Wish You Were Here 2
## 1612                                                 Witch Hunt 2
## 1613                                                 Witchcraft 2
## 1614                                            Without Warning 2
## 1615                                                       Wolf 2
## 1616                                                     Wolves 3
## 1617                                              Women in Love 2
## 1618                                               Wonder Woman 3
## 1619                                                 Wonderland 3
## 1620                                          World Without End 2
## 1621                                                    Woyzeck 2
## 1622                                          Wuthering Heights 6
## 1623                                                  Xue di zi 2
## 1624                                                 Youngblood 2
## 1625                                                       Zero 2
## 1626                                                    Zig Zag 2
## 1627                                                     Zodiac 2
## 1628                                                   Zolushka 2
## 1629                                                       Zoom 2
## 1630                                                       Zulu 2
## 1631                   [{'iso_639_1': 'en', 'name': 'English'}] 2
## 1632                                    Долгая счастливая жизнь 2
## 1633                                         Мастер и Маргарита 2
## 1634                                          Обыкновенное чудо 2
## 1635                                                    Окраина 2
## 1636                                                    Русалка 2
## 1637                                           Снежная королева 2
## 1638                                                    Солярис 2
## 1639                                                 Сталинград 2
## 1640                                                   修羅雪姫 2
## 1641                                                   倩女幽魂 2
## 1642 劇場版ポケットモンスター セレビィ 時を越えた遭遇(であい) 2
## 1643                                               十三人の刺客 2
## 1644                                                     座頭市 2
## 1645                                                       怪談 2
## 1646                                       日本のいちばん長い日 2
## 1647                                             時をかける少女 3
## 1648                                                   楢山節考 2
## 1649                                                       野火 2
## 1650                                               魔女の宅急便 2
## 1651                                                       하녀 2

There are partial duplicates where movies have the same id, imdb_id or original_title however they have variation in 1 or more columns, in the case of original title it was found that some movies had the same name, however their producer, runtime, year and overview were completely different meaning that those movies are different from each other.

In the case of id and imdb_id after filtering the cases in the movies data frame it was found all the columns matched with the exception of popularity, this could be caused if the same movie was registered twice by accident but on a different time, causing the popularity shift. In order to solve this problem the maximum popularity will used to merge the duplicates. Further action will be made depending of the result.

imdb_id and id

# Keeps the maximum popularity value of a variable and delete its duplicate
movies <- movies %>% group_by(imdb_id) %>% slice_max(popularity_max) %>% ungroup()
# Check how many partial duplicates remain on the dataset.
movies %>% 
  count(id) %>% 
  filter(n > 1)
## # A tibble: 0 × 2
## # ℹ 2 variables: id <chr>, n <int>
movies %>% 
  count(imdb_id) %>% 
  filter(n > 1)
## # A tibble: 1 × 2
##   imdb_id     n
##   <chr>   <int>
## 1 0           3
movies %>% 
  count(original_title) %>% 
  filter(n > 1)
## # A tibble: 1,638 × 2
##    original_title                   n
##    <chr>                        <int>
##  1 12 Angry Men                     2
##  2 20,000 Leagues Under the Sea     4
##  3 2:22                             2
##  4 3:10 to Yuma                     2
##  5 8                                2
##  6 9                                2
##  7 A Bucket of Blood                2
##  8 A Christmas Carol                7
##  9 A Dangerous Place                2
## 10 A Foreign Affair                 2
## # ℹ 1,628 more rows

Most of the partial duplicates for the id columns have been eliminated, there are only three instances where an imdb_id is duplicated and this value is likely invalid.

# See remaining partial imdb_id duplicates
movies %>% filter(imdb_id %in% c("0"))
## # A tibble: 3 × 38
##   adult budget homepage  id    imdb_id original_language original_title overview
##   <lgl>  <dbl> <chr>     <chr> <chr>   <fct>             <chr>          <chr>   
## 1 NA        NA [{'iso_3… 1997… 0       104.0             [{'iso_639_1'… Released
## 2 NA        NA [{'iso_3… 2012… 0       68.0              [{'iso_639_1'… Released
## 3 NA        NA [{'iso_3… 2014… 0       82.0              [{'iso_639_1'… Released
## # ℹ 30 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, country3 <fct>,
## #   country1_language <fct>, country2_language <fct>, …

Looking at the remaining duplicates it seems most of the information is missing while the rest is out of place, due to this a proper adjustment in the dataset could be difficult to do, and with their imdb_id missing it could be hard to manually enter the information, therefore these aspects in combination to the low amount of data the duplicates represent to the dataset, the three rows are going to be deleted on their entirety.

# Remove rows with an imdb_id of 0 
movies <- filter(movies,imdb_id != 0)
# Ensure the rows with an imdb_id of 0 were eliminated
movies %>% 
  count(imdb_id) %>% 
  filter(n > 1)
## # A tibble: 0 × 2
## # ℹ 2 variables: imdb_id <chr>, n <int>

Although partial duplicates remain for the original_title this are going to be kept in the dataset, when checking the dataset the were significant differences in all the columns, also given each of those duplicates has its own id and imdb_id even if the title suggest they are the same movie, in reality they are completely different in all aspects, therefore these rows must be seen as different movies and not duplicates.

Managing Factor Levels

Eligible variables were converted to factors on the previous steps and once the columns were properly cleaned.

# Check data type for each variable
glimpse(movies)
## Rows: 45,417
## Columns: 38
## $ adult                    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…
## $ budget                   <dbl> 4224579, 4224579, 4224579, 4224579, 4224579, …
## $ homepage                 <chr> "", "", "", "", "", "", "", "", "", "", "", "…
## $ id                       <chr> "15257", "16612", "88013", "16624", "105158",…
## $ imdb_id                  <chr> "", "tt0000001", "tt0000003", "tt0000005", "t…
## $ original_language        <fct> en, en, fr, xx, en, fr, es, fr, fr, fr, fr, f…
## $ original_title           <chr> "Hulk vs. Wolverine", "Carmencita", "Pauvre P…
## $ overview                 <chr> "Department H sends in Wolverine to track dow…
## $ popularity               <dbl> 5.539197, 1.273072, 0.673164, 1.061591, 0.312…
## $ poster_path              <chr> "/dXjbsjVkpykJECOO0kgThsipSYP.jpg", "/6QJowxF…
## $ release_date             <date> 2009-01-27, 1894-03-14, 1892-10-28, 1893-05-…
## $ revenue                  <dbl> 11209349, 11209349, 11209349, 11209349, 11209…
## $ runtime                  <dbl> 38, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1,…
## $ status                   <fct> Released, Released, Released, Released, Relea…
## $ tagline                  <chr> "", "", "", "", "", "", "", "", "", "", "", "…
## $ title                    <chr> "Hulk vs. Wolverine", "Carmencita", "Poor Pie…
## $ video                    <chr> "False", "False", "False", "False", "False", …
## $ vote_average             <dbl> 6.8, 4.9, 6.1, 5.8, 4.7, 6.2, 6.9, 7.0, 5.3, …
## $ vote_count               <int> 48, 18, 19, 19, 12, 52, 87, 44, 12, 22, 17, 2…
## $ id_collection            <chr> "", "", "", "", "", "", "", "", "", "", "", "…
## $ name_collection          <chr> "", "", "", "", "", "", "", "", "", "", "", "…
## $ poster_path_collection   <chr> "", "", "", "", "", "", "", "", "", "", "", "…
## $ backdrop_path_collection <chr> "", "", "", "", "", "", "", "", "", "", "", "…
## $ genre1                   <fct> Animation, Documentary, Comedy, Drama, Docume…
## $ genre2                   <fct> Action, , Animation, , , , , , , , , , Horror…
## $ genre3                   <fct> Science Fiction, , , , , , , , , , , , , , , …
## $ country1                 <fct> United States of America, United States of Am…
## $ country2                 <fct> , , , , , , , , , , , , , , , , , , , , , , ,…
## $ country3                 <fct> , , , , , , , , , , , , , , , , , , , , , , ,…
## $ country1_language        <fct> English, No Language, No Language, No Languag…
## $ country2_language        <fct> , , , , , , , , , , , , , , , , , , , , , , ,…
## $ country3_language        <fct> , , , , , , , , , , , , , , , , , , , , , , ,…
## $ company1                 <fct> Marvel Studios, Edison Manufacturing Company,…
## $ company2                 <fct> , , , , , , , , , , , , , , Star Film Company…
## $ company3                 <fct> , , , , , , , , , , , , , , , , , , , , , , ,…
## $ budget_original          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ revenue_original         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ popularity_max           <dbl> 5.539197, 1.273072, 0.673164, 1.061591, 0.312…

The following variables will be considered as factors:
* original_language
* status
* genre1-3
* company1-3
* country1-3
* country1-3_language

In this stage factor levels for each variable will be explored in order to find inconsistencies or errors in the available categories for a variable.

original_language

# Looking for the levels of a factor, droplevels will ensure that the factor only takes into account the levels that still exist in the dataset.
levels(droplevels(movies$original_language))
##  [1] ""   "ab" "af" "am" "ar" "ay" "bg" "bm" "bn" "bo" "bs" "ca" "cn" "cs" "cy"
## [16] "da" "de" "el" "en" "eo" "es" "et" "eu" "fa" "fi" "fr" "fy" "gl" "he" "hi"
## [31] "hr" "hu" "hy" "id" "is" "it" "iu" "ja" "jv" "ka" "kk" "kn" "ko" "ku" "ky"
## [46] "la" "lb" "lo" "lt" "lv" "mk" "ml" "mn" "mr" "ms" "mt" "nb" "ne" "nl" "no"
## [61] "pa" "pl" "ps" "pt" "qu" "ro" "ru" "rw" "sh" "si" "sk" "sl" "sm" "sq" "sr"
## [76] "sv" "ta" "te" "tg" "th" "tl" "tr" "uk" "ur" "uz" "vi" "wo" "xx" "zh" "zu"

By examining the levels of the original language only the level in blank must be further investigated, other than that all remaining factor levels are valid and have the same formatting.

# Count the number of elements within a level
movies %>% count(original_language)
## # A tibble: 90 × 2
##    original_language     n
##    <fct>             <int>
##  1 ""                   11
##  2 "ab"                 10
##  3 "af"                  2
##  4 "am"                  2
##  5 "ar"                 39
##  6 "ay"                  1
##  7 "bg"                 10
##  8 "bm"                  3
##  9 "bn"                 29
## 10 "bo"                  2
## # ℹ 80 more rows

There are 11 movies in which the column original_language does not contain information.

# See which movies does not contain original_language
movies %>% filter(original_language == "")
## # A tibble: 11 × 38
##    adult budget homepage id    imdb_id original_language original_title overview
##    <lgl>  <dbl> <chr>    <chr> <chr>   <fct>             <chr>          <chr>   
##  1 FALSE 4.22e6 ""       3591… tt0053… ""                13 Fighting M… "A grou…
##  2 FALSE 4.22e6 ""       1470… tt0122… ""                Lambchops      "George…
##  3 FALSE 4.22e6 ""       1444… tt0154… ""                Annabelle Ser… "Two da…
##  4 FALSE 4.22e6 ""       1044… tt0223… ""                La prise de T… "Three …
##  5 FALSE 4.22e6 ""       2570… tt0225… ""                Bajaja         "The fi…
##  6 FALSE 4.22e6 ""       3804… tt0298… ""                Lettre d'une … ""      
##  7 FALSE 4.22e6 ""       2831… tt0429… ""                Shadowing the… "Docume…
##  8 FALSE 4.22e6 ""       1039… tt0838… ""                Unfinished Sky "An Out…
##  9 FALSE 4.22e6 ""       3327… tt4432… ""                Song of Lahore "Until …
## 10 FALSE 4.22e6 ""       3810… tt5333… ""                Garn           "The tr…
## 11 FALSE 4.22e6 ""       3815… tt5376… ""                WiNWiN         "Americ…
## # ℹ 30 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, country3 <fct>,
## #   country1_language <fct>, country2_language <fct>, …

status

# Looking for the levels of a factor, droplevels will ensure that the factor only takes into account the levels that still exist in the dataset.
levels(droplevels(movies$status))
## [1] ""                "Canceled"        "In Production"   "Planned"        
## [5] "Post Production" "Released"        "Rumored"

The same issue is present on the original_language for these variable, with no other inconsistencies encountered.

# Count the number of elements within a level
movies %>% count(status)
## # A tibble: 7 × 2
##   status                n
##   <fct>             <int>
## 1 ""                   84
## 2 "Canceled"            2
## 3 "In Production"      20
## 4 "Planned"            15
## 5 "Post Production"    98
## 6 "Released"        44971
## 7 "Rumored"           227

In total 84 rows contains a blank status.

# See which movies does not contain a status
movies %>% filter(status == "")
## # A tibble: 84 × 38
##    adult budget homepage id    imdb_id original_language original_title overview
##    <lgl>  <dbl> <chr>    <chr> <chr>   <fct>             <chr>          <chr>   
##  1 FALSE 4.22e6 ""       42496 tt0067… en                Millhouse      "Emile …
##  2 FALSE 4.22e6 ""       57868 tt0071… en                The Autobiogr… "In Feb…
##  3 FALSE 4.22e6 ""       46770 tt0094… en                Sur            " "     
##  4 FALSE 4.22e6 ""       41934 tt0095… en                Heavy Petting  "HEAVY …
##  5 FALSE 4.22e6 ""       41932 tt0097… en                Easy Wheels    "A grou…
##  6 FALSE 4.22e6 ""       41811 tt0099… en                Eating         "At a s…
##  7 FALSE 4.22e6 ""       77314 tt0101… fr                The Cabinet o… ""      
##  8 FALSE 4.22e6 ""       1236… tt0104… en                Dream Deceive… "A chil…
##  9 FALSE 4.22e6 ""       1242… tt0106… en                Anna: Ot shes… "Direct…
## 10 FALSE 4.22e6 ""       71687 tt0107… en                My Life's in … "No gir…
## # ℹ 74 more rows
## # ℹ 30 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, …

genre variables

# Looking for the levels of a factor, droplevels will ensure that the factor only takes into account the levels that still exist in the dataset.
levels(droplevels(movies$genre1))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
levels(droplevels(movies$genre2))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
levels(droplevels(movies$genre3))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"

Genres are properly described on the factors, the only observations are the blank values and also that there is a 2 letter white space in each factor, probably due to the column separation process that was made to the columns in JSON format.

# Count the number of elements within a level
movies %>% count(genre1)
## # A tibble: 21 × 2
##    genre1            n
##    <fct>         <int>
##  1 ""             2437
##  2 "Action"       4487
##  3 "Adventure"    1508
##  4 "Animation"    1123
##  5 "Comedy"       8815
##  6 "Crime"        1683
##  7 "Documentary"  3412
##  8 "Drama"       11952
##  9 "Family"        524
## 10 "Fantasy"       702
## # ℹ 11 more rows
movies %>% count(genre2)
## # A tibble: 21 × 2
##    genre2            n
##    <fct>         <int>
##  1 ""            16988
##  2 "Action"       1544
##  3 "Adventure"    1412
##  4 "Animation"     617
##  5 "Comedy"       3262
##  6 "Crime"        1428
##  7 "Documentary"   469
##  8 "Drama"        6301
##  9 "Family"       1109
## 10 "Fantasy"       764
## # ℹ 11 more rows
movies %>% count(genre3)
## # A tibble: 21 × 2
##    genre3            n
##    <fct>         <int>
##  1 ""            31454
##  2 "Action"        451
##  3 "Adventure"     422
##  4 "Animation"     171
##  5 "Comedy"        911
##  6 "Crime"         852
##  7 "Documentary"    38
##  8 "Drama"        1673
##  9 "Family"        756
## 10 "Fantasy"       538
## # ℹ 11 more rows

There are 2437 rows in the dataset where movies does not have a defined genre, for the other two variables the number increases, however we will only focus on the genre1 undefined genres as it is not necessary for a movie to have more than one genre.

company variables

# Looking for the levels of a factor, droplevels will ensure that the factor only takes into account the levels that still exist in the dataset. We will only use the first 50 levels for demostration purposes.
levels(droplevels(movies$company1)) %>% head(50)
##  [1] ""                                    "01 Distribution"                    
##  [3] "1 85 Films"                          "100  Halal"                         
##  [5] "100 Bares"                           "101st Street Films"                 
##  [7] "10dB Inc"                            "10th Hole Productions"              
##  [9] "11"                                  "1201"                               
## [11] "120dB Films"                         "13 All Stars LLC"                   
## [13] "14 Luglio Cinematografica"           "14 Reels Entertainment"             
## [15] "1492 Pictures"                       "1818"                               
## [17] "1821 Pictures"                       "185 Trax"                           
## [19] "185º Equator"                        "19 Entertainment"                   
## [21] "1984 Private Defense Contractors"    "2 4 7  Films"                       
## [23] "2 Man Production"                    "2 Player Productions"               
## [25] "2 Smooth Film Productions"           "2 Team Productions"                 
## [27] "20 Steps Productions"                "20ten Media"                        
## [29] "20th Century Fox"                    "20th Century Fox Film Corporation"  
## [31] "20th Century Fox Home Entertainment" "20th Century Fox Russia"            
## [33] "20th Century Fox Television"         "20th Century Pictures"              
## [35] "21 Laps Entertainment"               "21 One Productions"                 
## [37] "21st Century Film Corporation"       "22 Dicembre"                        
## [39] "23 5 Filmproduktion"                 "23 Giugno"                          
## [41] "24 7 Films"                          "2425 PRODUCTION"                    
## [43] "26 Films"                            "27 Films Production"                
## [45] "27 Productions"                      "29 fevralya"                        
## [47] "2929 Productions"                    "2afilm"                             
## [49] "2B Films"                            "2DS Productions"
#The other variables won't be show for presentation purposes but this is the code that would show their levels
#levels(droplevels(movies$company2))
#levels(droplevels(movies$company3))

Looking at the factor levels for this categories, it is clear there are a lot of companies involved and therefore a lot of levels within the factors.

movies %>% count(company1) %>% arrange(desc(n))
## # A tibble: 10,590 × 2
##    company1                                     n
##    <fct>                                    <int>
##  1 ""                                       11861
##  2 "Paramount Pictures"                       996
##  3 "Metro Goldwyn Mayer  MGM"                 851
##  4 "Twentieth Century Fox Film Corporation"   780
##  5 "Warner Bros"                              757
##  6 "Universal Pictures"                       754
##  7 "Columbia Pictures"                        429
##  8 "Columbia Pictures Corporation"            401
##  9 "RKO Radio Pictures"                       290
## 10 "United Artists"                           272
## # ℹ 10,580 more rows
movies %>% count(company2) %>% arrange(desc(n))
## # A tibble: 9,040 × 2
##    company2                                     n
##    <fct>                                    <int>
##  1 ""                                       28428
##  2 "Warner Bros"                              270
##  3 "Metro Goldwyn Mayer  MGM"                 149
##  4 "Canal+"                                   124
##  5 "Touchstone Pictures"                       75
##  6 "Universal Pictures"                        71
##  7 "TF1 Films Production"                      52
##  8 "StudioCanal"                               47
##  9 "Twentieth Century Fox Film Corporation"    45
## 10 "Amblin Entertainment"                      43
## # ℹ 9,030 more rows
movies %>% count(company3) %>% arrange(desc(n))
## # A tibble: 5,980 × 2
##    company3                                         n
##    <fct>                                        <int>
##  1 ""                                           36385
##  2 "Warner Bros"                                  130
##  3 "Canal+"                                       109
##  4 "Metro Goldwyn Mayer  MGM"                      44
##  5 "Relativity Media"                              42
##  6 "TF1 Films Production"                          29
##  7 "Touchstone Pictures"                           27
##  8 "Working Title Films"                           24
##  9 "Centre National de la Cinématographie  CNC"    20
## 10 "Film4"                                         20
## # ℹ 5,970 more rows

There are two ways to proceed with this issue, a first solution could be to only consider companies which have the most amount of movies produced as a levels and smaller companies consider them as others, the other solution would be to drop this variable as a factor and replace it’s data type as a string. We consider the first solution is the way to go as it would allow us to still make an analysis of the companies.

Other issues are the rows that contain a blank and also that there is a 2 space white space before each company name, which also should be corrected.

country_languages variables

# Looking for the levels of a factor, droplevels will ensure that the factor only takes into account the levels that still exist in the dataset.
levels(droplevels(movies$country1_language))
##  [1] ""                 "Afrikaans"        "Azərbaycan"       "Bahasa indonesia"
##  [5] "Bahasa melayu"    "Bamanankan"       "Bokmål"           "Bosanski"        
##  [9] "Català"           "Český"            "Cymraeg"          "Dansk"           
## [13] "Deutsch"          "Eesti"            "English"          "Español"         
## [17] "Esperanto"        "euskera"          "Français"         "Fulfulde"        
## [21] "Gaeilge"          "Galego"           "Hausa"            "Hrvatski"        
## [25] "isiZulu"          "Íslenska"         "Italiano"         "Kinyarwanda"     
## [29] "Kiswahili"        "Latin"            "Latviešu"         "Lietuvi x9akai"  
## [33] "Magyar"           "Nederlands"       "No Language"      "Norsk"           
## [37] "Polski"           "Português"        "Pусский"          "Română"          
## [41] "shqip"            "Slovenčina"       "Slovenščina"      "Somali"          
## [45] "Srpski"           "suomi"            "svenska"          "Tiếng Việt"      
## [49] "Türkçe"           "Wolof"            "ελληνικά"         "беларуская мова" 
## [53] "български език"   "қазақ"            "Український"      "ქართული"         
## [57] "עִבְרִית"            "اردو"             "العربية"          "پښتو"            
## [61] "فارسی"            "हिन्दी"            "বাংলা"            "ਪੰਜਾਬੀ"           
## [65] "தமிழ்"             "తెలుగు"            "ภาษาไทย"          "한국어 조선말"   
## [69] "广州话   廣州話"  "日本語"           "普通话"
levels(droplevels(movies$country2_language))
##  [1] ""                 "Afrikaans"        "Bahasa indonesia" "Bahasa melayu"   
##  [5] "Bamanankan"       "Bosanski"         "Català"           "Český"           
##  [9] "Cymraeg"          "Dansk"            "Deutsch"          "Eesti"           
## [13] "English"          "Español"          "Esperanto"        "Français"        
## [17] "Fulfulde"         "Gaeilge"          "Galego"           "Hrvatski"        
## [21] "isiZulu"          "Íslenska"         "Italiano"         "Kinyarwanda"     
## [25] "Kiswahili"        "Latin"            "Latviešu"         "Lietuvi x9akai"  
## [29] "Magyar"           "Malti"            "Nederlands"       "No Language"     
## [33] "Norsk"            "ozbek"            "Polski"           "Português"       
## [37] "Pусский"          "Română"           "shqip"            "Slovenčina"      
## [41] "Slovenščina"      "Somali"           "Srpski"           "suomi"           
## [45] "svenska"          "Tiếng Việt"       "Türkçe"           "Wolof"           
## [49] "ελληνικά"         "български език"   "қазақ"            "Український"     
## [53] "ქართული"          "עִבְרִית"            "اردو"             "العربية"         
## [57] "پښتو"             "فارسی"            "हिन्दी"            "বাংলা"           
## [61] "ਪੰਜਾਬੀ"            "தமிழ்"             "తెలుగు"            "ภาษาไทย"         
## [65] "한국어 조선말"    "广州话   廣州話"  "日本語"           "普通话"
levels(droplevels(movies$country3_language))
##  [1] ""                 "Afrikaans"        "Bahasa indonesia" "Bahasa melayu"   
##  [5] "Bamanankan"       "Bosanski"         "Český"            "Cymraeg"         
##  [9] "Dansk"            "Deutsch"          "Eesti"            "English"         
## [13] "Español"          "Esperanto"        "euskera"          "Français"        
## [17] "Gaeilge"          "Hrvatski"         "isiZulu"          "Íslenska"        
## [21] "Italiano"         "Kiswahili"        "Latin"            "Latviešu"        
## [25] "Lietuvi x9akai"   "Magyar"           "Nederlands"       "Norsk"           
## [29] "Polski"           "Português"        "Pусский"          "Română"          
## [33] "shqip"            "Slovenčina"       "Slovenščina"      "Somali"          
## [37] "Srpski"           "suomi"            "svenska"          "Tiếng Việt"      
## [41] "Türkçe"           "Wolof"            "ελληνικά"         "български език"  
## [45] "қазақ"            "Український"      "ქართული"          "עִבְרִית"           
## [49] "اردو"             "العربية"          "پښتو"             "فارسی"           
## [53] "हिन्दी"            "ਪੰਜਾਬੀ"            "தமிழ்"             "తెలుగు"           
## [57] "ภาษาไทย"          "한국어 조선말"    "广州话   廣州話"  "日本語"          
## [61] "普通话"

Factor levels have the first 2 characters in blank in a similar way to other variables plus a level without characters, however the biggest issue is that the languages are written in their original language with may complicate our efforts to analyze variables related to language, so a solution could be to translate the language names to English.

# Count the number of elements within a level
movies %>% count(country1_language)
## # A tibble: 71 × 2
##    country1_language      n
##    <fct>              <int>
##  1 ""                  4050
##  2 "Afrikaans"           22
##  3 "Azərbaycan"           4
##  4 "Bahasa indonesia"    26
##  5 "Bahasa melayu"        5
##  6 "Bamanankan"           4
##  7 "Bokmål"               3
##  8 "Bosanski"            25
##  9 "Català"              31
## 10 "Český"              263
## # ℹ 61 more rows
movies %>% count(country2_language)
## # A tibble: 68 × 2
##    country2_language      n
##    <fct>              <int>
##  1 ""                 37667
##  2 "Afrikaans"            4
##  3 "Bahasa indonesia"     9
##  4 "Bahasa melayu"        4
##  5 "Bamanankan"           1
##  6 "Bosanski"             3
##  7 "Català"               5
##  8 "Český"               14
##  9 "Cymraeg"              4
## 10 "Dansk"               18
## # ℹ 58 more rows
movies %>% count(country3_language)
## # A tibble: 61 × 2
##    country3_language      n
##    <fct>              <int>
##  1 ""                 42970
##  2 "Afrikaans"            2
##  3 "Bahasa indonesia"     2
##  4 "Bahasa melayu"        6
##  5 "Bamanankan"           1
##  6 "Bosanski"             2
##  7 "Český"                2
##  8 "Cymraeg"              1
##  9 "Dansk"                5
## 10 "Deutsch"            328
## # ℹ 51 more rows

Only the first country_language variable with a blank level must be fixed, as it is not necessary for a movie to have more than 1 language available.

Fixing categorical data problems

By using functions on factors we were able to detect inconsistencies, errors and opportunities to improve the data legibility by making adjustments to the factor levels. In this sections we will be fixing all related categorical data issues that were detected previously.

original_language

  • Detected Issues: A level does not contain any information
  • Affected Rows: 11 blank & 33 xx
  • Proposed Solution: After checking some movies that don´t contain information, I have dediced to change blank to “xx” values and classify them as silent movies.
levels(droplevels(movies$original_language))
##  [1] ""   "ab" "af" "am" "ar" "ay" "bg" "bm" "bn" "bo" "bs" "ca" "cn" "cs" "cy"
## [16] "da" "de" "el" "en" "eo" "es" "et" "eu" "fa" "fi" "fr" "fy" "gl" "he" "hi"
## [31] "hr" "hu" "hy" "id" "is" "it" "iu" "ja" "jv" "ka" "kk" "kn" "ko" "ku" "ky"
## [46] "la" "lb" "lo" "lt" "lv" "mk" "ml" "mn" "mr" "ms" "mt" "nb" "ne" "nl" "no"
## [61] "pa" "pl" "ps" "pt" "qu" "ro" "ru" "rw" "sh" "si" "sk" "sl" "sm" "sq" "sr"
## [76] "sv" "ta" "te" "tg" "th" "tl" "tr" "uk" "ur" "uz" "vi" "wo" "xx" "zh" "zu"
# See movies without original_language
movies %>% filter(original_language == "")
## # A tibble: 11 × 38
##    adult budget homepage id    imdb_id original_language original_title overview
##    <lgl>  <dbl> <chr>    <chr> <chr>   <fct>             <chr>          <chr>   
##  1 FALSE 4.22e6 ""       3591… tt0053… ""                13 Fighting M… "A grou…
##  2 FALSE 4.22e6 ""       1470… tt0122… ""                Lambchops      "George…
##  3 FALSE 4.22e6 ""       1444… tt0154… ""                Annabelle Ser… "Two da…
##  4 FALSE 4.22e6 ""       1044… tt0223… ""                La prise de T… "Three …
##  5 FALSE 4.22e6 ""       2570… tt0225… ""                Bajaja         "The fi…
##  6 FALSE 4.22e6 ""       3804… tt0298… ""                Lettre d'une … ""      
##  7 FALSE 4.22e6 ""       2831… tt0429… ""                Shadowing the… "Docume…
##  8 FALSE 4.22e6 ""       1039… tt0838… ""                Unfinished Sky "An Out…
##  9 FALSE 4.22e6 ""       3327… tt4432… ""                Song of Lahore "Until …
## 10 FALSE 4.22e6 ""       3810… tt5333… ""                Garn           "The tr…
## 11 FALSE 4.22e6 ""       3815… tt5376… ""                WiNWiN         "Americ…
## # ℹ 30 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, country3 <fct>,
## #   country1_language <fct>, country2_language <fct>, …

There are only 11 rows in which the original language is not present

# Add rows without original language to the category "xx"
movies <- movies %>% mutate(original_language = fct_collapse(original_language, xx = c("xx","")))
# See movies if changes were applied 
movies %>% filter(original_language == "")
## # A tibble: 0 × 38
## # ℹ 38 variables: adult <lgl>, budget <dbl>, homepage <chr>, id <chr>,
## #   imdb_id <chr>, original_language <fct>, original_title <chr>,
## #   overview <chr>, popularity <dbl>, poster_path <chr>, release_date <date>,
## #   revenue <dbl>, runtime <dbl>, status <fct>, tagline <chr>, title <chr>,
## #   video <chr>, vote_average <dbl>, vote_count <int>, id_collection <chr>,
## #   name_collection <chr>, poster_path_collection <chr>,
## #   backdrop_path_collection <chr>, genre1 <fct>, genre2 <fct>, genre3 <fct>, …
# See movies without original_language
movies %>% filter(original_language == "xx")
## # A tibble: 44 × 38
##    adult budget homepage id    imdb_id original_language original_title overview
##    <lgl>  <dbl> <chr>    <chr> <chr>   <fct>             <chr>          <chr>   
##  1 FALSE 4.22e6 ""       16624 tt0000… xx                Blacksmith Sc… "Three …
##  2 FALSE 4.22e6 ""       1330… tt0000… xx                Le manoir du … "A bat …
##  3 FALSE 4.22e6 ""       1323… tt0000… xx                The '?' Motor… "A magi…
##  4 FALSE 4.22e6 ""       36208 tt0009… xx                A Dog's Life   "Poor C…
##  5 FALSE 4.22e6 ""       70804 tt0010… xx                J'accuse!      "The st…
##  6 FALSE 4.22e6 ""       47703 tt0013… xx                Дневник Глумо… "Filmic…
##  7 FALSE 4.22e6 ""       42565 tt0018… xx                Underworld     "Boiste…
##  8 FALSE 4.22e6 ""       3591… tt0053… xx                13 Fighting M… "A grou…
##  9 FALSE 1.20e7 ""       62204 tt0082… xx                La Guerre du … "A colo…
## 10 FALSE 4.22e6 ""       1237… tt0082… xx                Junkopia       "A shor…
## # ℹ 34 more rows
## # ℹ 30 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, …

status

  • Detected Issues: A level does not contain any information
  • Affected Rows: 84
  • Proposed Solution: Use the release_date variable to know which status give to movies without one
levels(movies$status)
## [1] ""                "Canceled"        "In Production"   "Planned"        
## [5] "Post Production" "Released"        "Rumored"
# See movies without status
movies %>% filter(status == "")
## # A tibble: 84 × 38
##    adult budget homepage id    imdb_id original_language original_title overview
##    <lgl>  <dbl> <chr>    <chr> <chr>   <fct>             <chr>          <chr>   
##  1 FALSE 4.22e6 ""       42496 tt0067… en                Millhouse      "Emile …
##  2 FALSE 4.22e6 ""       57868 tt0071… en                The Autobiogr… "In Feb…
##  3 FALSE 4.22e6 ""       46770 tt0094… en                Sur            " "     
##  4 FALSE 4.22e6 ""       41934 tt0095… en                Heavy Petting  "HEAVY …
##  5 FALSE 4.22e6 ""       41932 tt0097… en                Easy Wheels    "A grou…
##  6 FALSE 4.22e6 ""       41811 tt0099… en                Eating         "At a s…
##  7 FALSE 4.22e6 ""       77314 tt0101… fr                The Cabinet o… ""      
##  8 FALSE 4.22e6 ""       1236… tt0104… en                Dream Deceive… "A chil…
##  9 FALSE 4.22e6 ""       1242… tt0106… en                Anna: Ot shes… "Direct…
## 10 FALSE 4.22e6 ""       71687 tt0107… en                My Life's in … "No gir…
## # ℹ 74 more rows
## # ℹ 30 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, …

Most movies do contain a release date which has already happened, so for those cases where the movies have a release date before 2017 their status will be considered as “Released”.

# Assign movies with a release date to the level "Released"
movies <- movies %>%
  mutate(status = if_else(!is.na(release_date),fct_collapse(status, Released = c("Released","")),status))
# Check if the movies without status and a release date now form part of "Released"
movies %>% count(status)
## # A tibble: 7 × 2
##   status                n
##   <fct>             <int>
## 1 "Released"        45051
## 2 "Canceled"            2
## 3 "In Production"      20
## 4 "Planned"            15
## 5 "Post Production"    98
## 6 "Rumored"           227
## 7 ""                    4
# See remaining variables
movies %>% filter(status == "")
## # A tibble: 4 × 38
##   adult  budget homepage id    imdb_id original_language original_title overview
##   <lgl>   <dbl> <chr>    <chr> <chr>   <fct>             <chr>          <chr>   
## 1 FALSE  4.22e6 ""       82663 tt0113… en                Midnight Man   British…
## 2 FALSE  4.22e6 ""       94214 tt0210… en                Jails, Hospit… Jails, …
## 3 FALSE  4.22e6 "http:/… 1226… tt2423… ja                マルドゥック…  Third f…
## 4 FALSE  4.22e6 ""       2492… tt2622… en                Avalanche Sha… A group…
## # ℹ 30 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, country3 <fct>,
## #   country1_language <fct>, country2_language <fct>, …

Due to the fact only a few rows without status remain, their imdb_id’s were directly searched for in order to find their status. It seems all the remaining movies were also released, so we are adding these movies to the “Released” category.

# Add remaining movies to category "Released"
movies <- movies %>% mutate(status = fct_collapse(status, Released = c("Released","")))
# Check if any movie remains without status.
movies %>% count(status)
## # A tibble: 6 × 2
##   status              n
##   <fct>           <int>
## 1 Released        45055
## 2 Canceled            2
## 3 In Production      20
## 4 Planned            15
## 5 Post Production    98
## 6 Rumored           227
levels(droplevels(movies$status))
## [1] "Released"        "Canceled"        "In Production"   "Planned"        
## [5] "Post Production" "Rumored"

“status” column now contains the proper categories and does not need any additional fixes.

genre variables

  • Detected Issues: There are movies which does not specify at least one genre, all levels have a 2 character blank space at the start.
  • Affected Rows: 2437 (No genre), ALL (blank spaces at start)
  • Proposed Solution: Rename level without a genre to “Unspecified”, remove all levels blank spaces at start.
# See levels for a variable
levels(droplevels(movies$genre1))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
levels(droplevels(movies$genre2))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
levels(droplevels(movies$genre3))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
# See how much rows does not have a genre
movies %>% count(genre1)
## # A tibble: 21 × 2
##    genre1            n
##    <fct>         <int>
##  1 ""             2437
##  2 "Action"       4487
##  3 "Adventure"    1508
##  4 "Animation"    1123
##  5 "Comedy"       8815
##  6 "Crime"        1683
##  7 "Documentary"  3412
##  8 "Drama"       11952
##  9 "Family"        524
## 10 "Fantasy"       702
## # ℹ 11 more rows

Due to the amount of rows without a genre data cannot be manually added without taking a long amount of time and we do not have a way to extract large amounts of data from imdb, therefore we are going to put the rows without a genre in a category called “Unspecified” for genre2 and genre3 when it is not necessary a movie has more than 1 genre, we are going to use the term “NA” as the category name.

# Create the category "Unspecified"
movies <- movies %>% mutate(genre1 = fct_collapse(genre1, Unspecified = ""))
# See if the new category was created
levels(droplevels(movies$genre1))
##  [1] "Unspecified"     "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
movies %>% count(genre1)
## # A tibble: 21 × 2
##    genre1          n
##    <fct>       <int>
##  1 Unspecified  2437
##  2 Action       4487
##  3 Adventure    1508
##  4 Animation    1123
##  5 Comedy       8815
##  6 Crime        1683
##  7 Documentary  3412
##  8 Drama       11952
##  9 Family        524
## 10 Fantasy       702
## # ℹ 11 more rows
# Eliminate white space inconsistency
movies <- movies %>% mutate(genre1 = str_trim(genre1)) 
movies <- movies %>% mutate(genre2 = str_trim(genre2))
movies <- movies %>% mutate(genre3 = str_trim(genre3))
# Reconvert variables to factor data type
movies <- movies %>% mutate(genre1 = as.factor(movies$genre1))
movies <- movies %>% mutate(genre2 = as.factor(movies$genre2))
movies <- movies %>% mutate(genre3 = as.factor(movies$genre3))
# Levels should now have their white space removed
levels(droplevels(movies$genre1))
##  [1] "Action"          "Adventure"       "Animation"       "Comedy"         
##  [5] "Crime"           "Documentary"     "Drama"           "Family"         
##  [9] "Fantasy"         "Foreign"         "History"         "Horror"         
## [13] "Music"           "Mystery"         "Romance"         "Science Fiction"
## [17] "Thriller"        "TV Movie"        "Unspecified"     "War"            
## [21] "Western"
levels(droplevels(movies$genre2))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
levels(droplevels(movies$genre3))
##  [1] ""                "Action"          "Adventure"       "Animation"      
##  [5] "Comedy"          "Crime"           "Documentary"     "Drama"          
##  [9] "Family"          "Fantasy"         "Foreign"         "History"        
## [13] "Horror"          "Music"           "Mystery"         "Romance"        
## [17] "Science Fiction" "Thriller"        "TV Movie"        "War"            
## [21] "Western"
# Create a new column 'genre_count' to count the number of genres for each row
movies$genre_count <- rowSums(movies[, c("genre1", "genre2", "genre3")] != "")

I left columns genre2 and genre3 blank to make a count of those movies with 1 or more genres for later use. Genre variables are now clean and ready for use in analysis.

company variables

  • Detected Issues: 2 character blank space, lack of a company in certain cases and there are a lot of levels within the factor, which may make the analysis of companies inconvenient.
  • Affected Rows: 11862 (No company), ALL (blank spaces at start and excessive amount of levels.
  • Proposed Solution: Empty rows will be put into a category called “No Company”, blank spaces will be removed and in the case of the categories amount, they are going to be reduced, only the first 50 companies will have a category while the rest will be put into a category named “Other”
# See levels for a variable
levels(droplevels(movies$company1)) %>% head(25)
##  [1] ""                                 "01 Distribution"                 
##  [3] "1 85 Films"                       "100  Halal"                      
##  [5] "100 Bares"                        "101st Street Films"              
##  [7] "10dB Inc"                         "10th Hole Productions"           
##  [9] "11"                               "1201"                            
## [11] "120dB Films"                      "13 All Stars LLC"                
## [13] "14 Luglio Cinematografica"        "14 Reels Entertainment"          
## [15] "1492 Pictures"                    "1818"                            
## [17] "1821 Pictures"                    "185 Trax"                        
## [19] "185º Equator"                     "19 Entertainment"                
## [21] "1984 Private Defense Contractors" "2 4 7  Films"                    
## [23] "2 Man Production"                 "2 Player Productions"            
## [25] "2 Smooth Film Productions"
# Sort companies by amount of movies produced
company1_sort <- movies %>% count(company1) %>% arrange(desc(n))
company2_sort <- movies %>% count(company2) %>% arrange(desc(n))
company3_sort <- movies %>% count(company3) %>% arrange(desc(n))
# Get main companies and the cases where the company is not specified
top_50_company1 <- company1_sort$company1[1:51]
top_50_company2 <- company2_sort$company2[1:51]
top_50_company3 <- company3_sort$company3[1:51]
# Move all the companies that does not form part of the 50 biggest companies or are blank in the category "Other"
movies <- movies %>% mutate(company1 = fct_collapse(company1, "Other" = company1[!company1 %in% top_50_company1]))
movies <- movies %>% mutate(company2 = fct_collapse(company2, "Other" = company2[!company2 %in% top_50_company2]))
movies <- movies %>% mutate(company3 = fct_collapse(company3, "Other" = company3[!company3 %in% top_50_company2]))
# Check if the change was made sucessfully
levels(droplevels(movies$company1)) 
##  [1] ""                                      
##  [2] "Other"                                 
##  [3] "American International Pictures  AIP"  
##  [4] "BBC Films"                             
##  [5] "British Broadcasting Corporation  BBC" 
##  [6] "Canal+"                                
##  [7] "Channel Four Films"                    
##  [8] "CJ Entertainment"                      
##  [9] "Columbia Pictures"                     
## [10] "Columbia Pictures Corporation"         
## [11] "DC Comics"                             
## [12] "DreamWorks SKG"                        
## [13] "First National Pictures"               
## [14] "Fox Film Corporation"                  
## [15] "Fox Searchlight Pictures"              
## [16] "France 2 Cinéma"                       
## [17] "Gaumont"                               
## [18] "Hammer Film Productions"               
## [19] "Hollywood Pictures"                    
## [20] "Imagine Entertainment"                 
## [21] "Lions Gate Films"                      
## [22] "Lionsgate"                             
## [23] "Metro Goldwyn Mayer  MGM"              
## [24] "Miramax Films"                         
## [25] "Monogram Pictures"                     
## [26] "Mosfilm"                               
## [27] "New Line Cinema"                       
## [28] "New World Pictures"                    
## [29] "Nikkatsu"                              
## [30] "Nordisk Film"                          
## [31] "Orion Pictures"                        
## [32] "Paramount Pictures"                    
## [33] "Rai Cinema"                            
## [34] "Regency Enterprises"                   
## [35] "RKO Radio Pictures"                    
## [36] "Shaw Brothers"                         
## [37] "Shôchiku Eiga"                         
## [38] "StudioCanal"                           
## [39] "Summit Entertainment"                  
## [40] "The Rank Organisation"                 
## [41] "TLA Releasing"                         
## [42] "Toho Company"                          
## [43] "Touchstone Pictures"                   
## [44] "TriStar Pictures"                      
## [45] "Twentieth Century Fox Film Corporation"
## [46] "United Artists"                        
## [47] "Universal International Pictures  UI"  
## [48] "Universal Pictures"                    
## [49] "Village Roadshow Pictures"             
## [50] "Walt Disney Pictures"                  
## [51] "Walt Disney Productions"               
## [52] "Warner Bros"
movies %>% count(company1) %>% arrange(desc(n))
## # A tibble: 52 × 2
##    company1                                     n
##    <fct>                                    <int>
##  1 "Other"                                  24274
##  2 ""                                       11861
##  3 "Paramount Pictures"                       996
##  4 "Metro Goldwyn Mayer  MGM"                 851
##  5 "Twentieth Century Fox Film Corporation"   780
##  6 "Warner Bros"                              757
##  7 "Universal Pictures"                       754
##  8 "Columbia Pictures"                        429
##  9 "Columbia Pictures Corporation"            401
## 10 "RKO Radio Pictures"                       290
## # ℹ 42 more rows
levels(droplevels(movies$company2)) 
##  [1] ""                                      
##  [2] "Other"                                 
##  [3] "Amblin Entertainment"                  
##  [4] "American International Pictures  AIP"  
##  [5] "BBC Films"                             
##  [6] "Blumhouse Productions"                 
##  [7] "British Broadcasting Corporation  BBC" 
##  [8] "Canal+"                                
##  [9] "Carolco Pictures"                      
## [10] "Castle Rock Entertainment"             
## [11] "Columbia Pictures Corporation"         
## [12] "Dimension Films"                       
## [13] "DreamWorks SKG"                        
## [14] "Dune Entertainment"                    
## [15] "Film i Väst"                           
## [16] "Film4"                                 
## [17] "Focus Features"                        
## [18] "Globo Filmes"                          
## [19] "Happy Madison Productions"             
## [20] "HBO Films"                             
## [21] "Hollywood Pictures"                    
## [22] "Lionsgate"                             
## [23] "M6 Films"                              
## [24] "Metro Goldwyn Mayer  MGM"              
## [25] "Millennium Films"                      
## [26] "Morgan Creek Productions"              
## [27] "Nickelodeon Movies"                    
## [28] "Original Film"                         
## [29] "Pixar Animation Studios"               
## [30] "PolyGram Filmed Entertainment"         
## [31] "Rai Cinema"                            
## [32] "Regency Enterprises"                   
## [33] "Relativity Media"                      
## [34] "Revolution Studios"                    
## [35] "Scott Rudin Productions"               
## [36] "Spyglass Entertainment"                
## [37] "StudioCanal"                           
## [38] "Svensk Filmindustri  SF"               
## [39] "TF1 Films Production"                  
## [40] "The Vitaphone Corporation"             
## [41] "Touchstone Pictures"                   
## [42] "TriStar Pictures"                      
## [43] "Twentieth Century Fox Film Corporation"
## [44] "UK Film Council"                       
## [45] "United Artists Pictures"               
## [46] "Universal Pictures"                    
## [47] "Walt Disney Animation Studios"         
## [48] "Walt Disney Productions"               
## [49] "Warner Bros"                           
## [50] "Warner Bros  Animation"                
## [51] "Wild Bunch"                            
## [52] "Zweites Deutsches Fernsehen  ZDF"
movies %>% count(company2) %>% arrange(desc(n))
## # A tibble: 52 × 2
##    company2                                     n
##    <fct>                                    <int>
##  1 ""                                       28428
##  2 "Other"                                  15072
##  3 "Warner Bros"                              270
##  4 "Metro Goldwyn Mayer  MGM"                 149
##  5 "Canal+"                                   124
##  6 "Touchstone Pictures"                       75
##  7 "Universal Pictures"                        71
##  8 "TF1 Films Production"                      52
##  9 "StudioCanal"                               47
## 10 "Twentieth Century Fox Film Corporation"    45
## # ℹ 42 more rows
levels(droplevels(movies$company3)) 
##  [1] ""                                      
##  [2] "Other"                                 
##  [3] "Amblin Entertainment"                  
##  [4] "BBC Films"                             
##  [5] "Blumhouse Productions"                 
##  [6] "British Broadcasting Corporation  BBC" 
##  [7] "Canal+"                                
##  [8] "Carolco Pictures"                      
##  [9] "Castle Rock Entertainment"             
## [10] "Columbia Pictures Corporation"         
## [11] "Dimension Films"                       
## [12] "Dune Entertainment"                    
## [13] "Film i Väst"                           
## [14] "Film4"                                 
## [15] "Focus Features"                        
## [16] "Globo Filmes"                          
## [17] "Happy Madison Productions"             
## [18] "HBO Films"                             
## [19] "Hollywood Pictures"                    
## [20] "Lionsgate"                             
## [21] "M6 Films"                              
## [22] "Metro Goldwyn Mayer  MGM"              
## [23] "Millennium Films"                      
## [24] "Morgan Creek Productions"              
## [25] "Nickelodeon Movies"                    
## [26] "Original Film"                         
## [27] "PolyGram Filmed Entertainment"         
## [28] "Rai Cinema"                            
## [29] "Regency Enterprises"                   
## [30] "Relativity Media"                      
## [31] "Revolution Studios"                    
## [32] "Scott Rudin Productions"               
## [33] "Spyglass Entertainment"                
## [34] "StudioCanal"                           
## [35] "Svensk Filmindustri  SF"               
## [36] "TF1 Films Production"                  
## [37] "The Vitaphone Corporation"             
## [38] "Touchstone Pictures"                   
## [39] "TriStar Pictures"                      
## [40] "Twentieth Century Fox Film Corporation"
## [41] "UK Film Council"                       
## [42] "Universal Pictures"                    
## [43] "Warner Bros"                           
## [44] "Warner Bros  Animation"                
## [45] "Wild Bunch"                            
## [46] "Zweites Deutsches Fernsehen  ZDF"
movies %>% count(company3) %>% arrange(desc(n))
## # A tibble: 46 × 2
##    company3                       n
##    <fct>                      <int>
##  1 ""                         36385
##  2 "Other"                     8332
##  3 "Warner Bros"                130
##  4 "Canal+"                     109
##  5 "Metro Goldwyn Mayer  MGM"    44
##  6 "Relativity Media"            42
##  7 "TF1 Films Production"        29
##  8 "Touchstone Pictures"         27
##  9 "Film4"                       20
## 10 "Millennium Films"            19
## # ℹ 36 more rows

The next step is to replace the blank category with a new category name “No Company” for company1, this because it is not important to call “No Company” for the other variables. To make use of this I will add a variable called company_count for later analysis.

movies <- movies %>% mutate(company1 = fct_collapse(company1, "No Company" = ""))
# Create a new column 'genre_count' to count the number of genres for each row
movies$company_count <- rowSums(movies[, c("company1", "company2", "company3")] != "")
# Check if the change was done correctly
levels(droplevels(movies$company1)) 
##  [1] "No Company"                            
##  [2] "Other"                                 
##  [3] "American International Pictures  AIP"  
##  [4] "BBC Films"                             
##  [5] "British Broadcasting Corporation  BBC" 
##  [6] "Canal+"                                
##  [7] "Channel Four Films"                    
##  [8] "CJ Entertainment"                      
##  [9] "Columbia Pictures"                     
## [10] "Columbia Pictures Corporation"         
## [11] "DC Comics"                             
## [12] "DreamWorks SKG"                        
## [13] "First National Pictures"               
## [14] "Fox Film Corporation"                  
## [15] "Fox Searchlight Pictures"              
## [16] "France 2 Cinéma"                       
## [17] "Gaumont"                               
## [18] "Hammer Film Productions"               
## [19] "Hollywood Pictures"                    
## [20] "Imagine Entertainment"                 
## [21] "Lions Gate Films"                      
## [22] "Lionsgate"                             
## [23] "Metro Goldwyn Mayer  MGM"              
## [24] "Miramax Films"                         
## [25] "Monogram Pictures"                     
## [26] "Mosfilm"                               
## [27] "New Line Cinema"                       
## [28] "New World Pictures"                    
## [29] "Nikkatsu"                              
## [30] "Nordisk Film"                          
## [31] "Orion Pictures"                        
## [32] "Paramount Pictures"                    
## [33] "Rai Cinema"                            
## [34] "Regency Enterprises"                   
## [35] "RKO Radio Pictures"                    
## [36] "Shaw Brothers"                         
## [37] "Shôchiku Eiga"                         
## [38] "StudioCanal"                           
## [39] "Summit Entertainment"                  
## [40] "The Rank Organisation"                 
## [41] "TLA Releasing"                         
## [42] "Toho Company"                          
## [43] "Touchstone Pictures"                   
## [44] "TriStar Pictures"                      
## [45] "Twentieth Century Fox Film Corporation"
## [46] "United Artists"                        
## [47] "Universal International Pictures  UI"  
## [48] "Universal Pictures"                    
## [49] "Village Roadshow Pictures"             
## [50] "Walt Disney Pictures"                  
## [51] "Walt Disney Productions"               
## [52] "Warner Bros"
movies %>% count(company1) %>% arrange(desc(n))
## # A tibble: 52 × 2
##    company1                                   n
##    <fct>                                  <int>
##  1 Other                                  24274
##  2 No Company                             11861
##  3 Paramount Pictures                       996
##  4 Metro Goldwyn Mayer  MGM                 851
##  5 Twentieth Century Fox Film Corporation   780
##  6 Warner Bros                              757
##  7 Universal Pictures                       754
##  8 Columbia Pictures                        429
##  9 Columbia Pictures Corporation            401
## 10 RKO Radio Pictures                       290
## # ℹ 42 more rows
levels(droplevels(movies$company2)) 
##  [1] ""                                      
##  [2] "Other"                                 
##  [3] "Amblin Entertainment"                  
##  [4] "American International Pictures  AIP"  
##  [5] "BBC Films"                             
##  [6] "Blumhouse Productions"                 
##  [7] "British Broadcasting Corporation  BBC" 
##  [8] "Canal+"                                
##  [9] "Carolco Pictures"                      
## [10] "Castle Rock Entertainment"             
## [11] "Columbia Pictures Corporation"         
## [12] "Dimension Films"                       
## [13] "DreamWorks SKG"                        
## [14] "Dune Entertainment"                    
## [15] "Film i Väst"                           
## [16] "Film4"                                 
## [17] "Focus Features"                        
## [18] "Globo Filmes"                          
## [19] "Happy Madison Productions"             
## [20] "HBO Films"                             
## [21] "Hollywood Pictures"                    
## [22] "Lionsgate"                             
## [23] "M6 Films"                              
## [24] "Metro Goldwyn Mayer  MGM"              
## [25] "Millennium Films"                      
## [26] "Morgan Creek Productions"              
## [27] "Nickelodeon Movies"                    
## [28] "Original Film"                         
## [29] "Pixar Animation Studios"               
## [30] "PolyGram Filmed Entertainment"         
## [31] "Rai Cinema"                            
## [32] "Regency Enterprises"                   
## [33] "Relativity Media"                      
## [34] "Revolution Studios"                    
## [35] "Scott Rudin Productions"               
## [36] "Spyglass Entertainment"                
## [37] "StudioCanal"                           
## [38] "Svensk Filmindustri  SF"               
## [39] "TF1 Films Production"                  
## [40] "The Vitaphone Corporation"             
## [41] "Touchstone Pictures"                   
## [42] "TriStar Pictures"                      
## [43] "Twentieth Century Fox Film Corporation"
## [44] "UK Film Council"                       
## [45] "United Artists Pictures"               
## [46] "Universal Pictures"                    
## [47] "Walt Disney Animation Studios"         
## [48] "Walt Disney Productions"               
## [49] "Warner Bros"                           
## [50] "Warner Bros  Animation"                
## [51] "Wild Bunch"                            
## [52] "Zweites Deutsches Fernsehen  ZDF"
movies %>% count(company2) %>% arrange(desc(n))
## # A tibble: 52 × 2
##    company2                                     n
##    <fct>                                    <int>
##  1 ""                                       28428
##  2 "Other"                                  15072
##  3 "Warner Bros"                              270
##  4 "Metro Goldwyn Mayer  MGM"                 149
##  5 "Canal+"                                   124
##  6 "Touchstone Pictures"                       75
##  7 "Universal Pictures"                        71
##  8 "TF1 Films Production"                      52
##  9 "StudioCanal"                               47
## 10 "Twentieth Century Fox Film Corporation"    45
## # ℹ 42 more rows
levels(droplevels(movies$company3)) 
##  [1] ""                                      
##  [2] "Other"                                 
##  [3] "Amblin Entertainment"                  
##  [4] "BBC Films"                             
##  [5] "Blumhouse Productions"                 
##  [6] "British Broadcasting Corporation  BBC" 
##  [7] "Canal+"                                
##  [8] "Carolco Pictures"                      
##  [9] "Castle Rock Entertainment"             
## [10] "Columbia Pictures Corporation"         
## [11] "Dimension Films"                       
## [12] "Dune Entertainment"                    
## [13] "Film i Väst"                           
## [14] "Film4"                                 
## [15] "Focus Features"                        
## [16] "Globo Filmes"                          
## [17] "Happy Madison Productions"             
## [18] "HBO Films"                             
## [19] "Hollywood Pictures"                    
## [20] "Lionsgate"                             
## [21] "M6 Films"                              
## [22] "Metro Goldwyn Mayer  MGM"              
## [23] "Millennium Films"                      
## [24] "Morgan Creek Productions"              
## [25] "Nickelodeon Movies"                    
## [26] "Original Film"                         
## [27] "PolyGram Filmed Entertainment"         
## [28] "Rai Cinema"                            
## [29] "Regency Enterprises"                   
## [30] "Relativity Media"                      
## [31] "Revolution Studios"                    
## [32] "Scott Rudin Productions"               
## [33] "Spyglass Entertainment"                
## [34] "StudioCanal"                           
## [35] "Svensk Filmindustri  SF"               
## [36] "TF1 Films Production"                  
## [37] "The Vitaphone Corporation"             
## [38] "Touchstone Pictures"                   
## [39] "TriStar Pictures"                      
## [40] "Twentieth Century Fox Film Corporation"
## [41] "UK Film Council"                       
## [42] "Universal Pictures"                    
## [43] "Warner Bros"                           
## [44] "Warner Bros  Animation"                
## [45] "Wild Bunch"                            
## [46] "Zweites Deutsches Fernsehen  ZDF"
movies %>% count(company3) %>% arrange(desc(n))
## # A tibble: 46 × 2
##    company3                       n
##    <fct>                      <int>
##  1 ""                         36385
##  2 "Other"                     8332
##  3 "Warner Bros"                130
##  4 "Canal+"                     109
##  5 "Metro Goldwyn Mayer  MGM"    44
##  6 "Relativity Media"            42
##  7 "TF1 Films Production"        29
##  8 "Touchstone Pictures"         27
##  9 "Film4"                       20
## 10 "Millennium Films"            19
## # ℹ 36 more rows

Finally the blank spaces are going to be removed from each row.

# Eliminate white space inconsistency
movies <- movies %>% mutate(company1 = str_trim(company1)) 
movies <- movies %>% mutate(company2 = str_trim(company2))
movies <- movies %>% mutate(company3 = str_trim(company3))
# Reconvert variables to factor data type
movies <- movies %>% mutate(company1 = as.factor(movies$company1))
movies <- movies %>% mutate(company2 = as.factor(movies$company2))
movies <- movies %>% mutate(company3 = as.factor(movies$company3))
# Levels should now have their white space removed
levels(droplevels(movies$company1))
##  [1] "American International Pictures  AIP"  
##  [2] "BBC Films"                             
##  [3] "British Broadcasting Corporation  BBC" 
##  [4] "Canal+"                                
##  [5] "Channel Four Films"                    
##  [6] "CJ Entertainment"                      
##  [7] "Columbia Pictures"                     
##  [8] "Columbia Pictures Corporation"         
##  [9] "DC Comics"                             
## [10] "DreamWorks SKG"                        
## [11] "First National Pictures"               
## [12] "Fox Film Corporation"                  
## [13] "Fox Searchlight Pictures"              
## [14] "France 2 Cinéma"                       
## [15] "Gaumont"                               
## [16] "Hammer Film Productions"               
## [17] "Hollywood Pictures"                    
## [18] "Imagine Entertainment"                 
## [19] "Lions Gate Films"                      
## [20] "Lionsgate"                             
## [21] "Metro Goldwyn Mayer  MGM"              
## [22] "Miramax Films"                         
## [23] "Monogram Pictures"                     
## [24] "Mosfilm"                               
## [25] "New Line Cinema"                       
## [26] "New World Pictures"                    
## [27] "Nikkatsu"                              
## [28] "No Company"                            
## [29] "Nordisk Film"                          
## [30] "Orion Pictures"                        
## [31] "Other"                                 
## [32] "Paramount Pictures"                    
## [33] "Rai Cinema"                            
## [34] "Regency Enterprises"                   
## [35] "RKO Radio Pictures"                    
## [36] "Shaw Brothers"                         
## [37] "Shôchiku Eiga"                         
## [38] "StudioCanal"                           
## [39] "Summit Entertainment"                  
## [40] "The Rank Organisation"                 
## [41] "TLA Releasing"                         
## [42] "Toho Company"                          
## [43] "Touchstone Pictures"                   
## [44] "TriStar Pictures"                      
## [45] "Twentieth Century Fox Film Corporation"
## [46] "United Artists"                        
## [47] "Universal International Pictures  UI"  
## [48] "Universal Pictures"                    
## [49] "Village Roadshow Pictures"             
## [50] "Walt Disney Pictures"                  
## [51] "Walt Disney Productions"               
## [52] "Warner Bros"
levels(droplevels(movies$company2))
##  [1] ""                                      
##  [2] "Amblin Entertainment"                  
##  [3] "American International Pictures  AIP"  
##  [4] "BBC Films"                             
##  [5] "Blumhouse Productions"                 
##  [6] "British Broadcasting Corporation  BBC" 
##  [7] "Canal+"                                
##  [8] "Carolco Pictures"                      
##  [9] "Castle Rock Entertainment"             
## [10] "Columbia Pictures Corporation"         
## [11] "Dimension Films"                       
## [12] "DreamWorks SKG"                        
## [13] "Dune Entertainment"                    
## [14] "Film i Väst"                           
## [15] "Film4"                                 
## [16] "Focus Features"                        
## [17] "Globo Filmes"                          
## [18] "Happy Madison Productions"             
## [19] "HBO Films"                             
## [20] "Hollywood Pictures"                    
## [21] "Lionsgate"                             
## [22] "M6 Films"                              
## [23] "Metro Goldwyn Mayer  MGM"              
## [24] "Millennium Films"                      
## [25] "Morgan Creek Productions"              
## [26] "Nickelodeon Movies"                    
## [27] "Original Film"                         
## [28] "Other"                                 
## [29] "Pixar Animation Studios"               
## [30] "PolyGram Filmed Entertainment"         
## [31] "Rai Cinema"                            
## [32] "Regency Enterprises"                   
## [33] "Relativity Media"                      
## [34] "Revolution Studios"                    
## [35] "Scott Rudin Productions"               
## [36] "Spyglass Entertainment"                
## [37] "StudioCanal"                           
## [38] "Svensk Filmindustri  SF"               
## [39] "TF1 Films Production"                  
## [40] "The Vitaphone Corporation"             
## [41] "Touchstone Pictures"                   
## [42] "TriStar Pictures"                      
## [43] "Twentieth Century Fox Film Corporation"
## [44] "UK Film Council"                       
## [45] "United Artists Pictures"               
## [46] "Universal Pictures"                    
## [47] "Walt Disney Animation Studios"         
## [48] "Walt Disney Productions"               
## [49] "Warner Bros"                           
## [50] "Warner Bros  Animation"                
## [51] "Wild Bunch"                            
## [52] "Zweites Deutsches Fernsehen  ZDF"
levels(droplevels(movies$company3))
##  [1] ""                                      
##  [2] "Amblin Entertainment"                  
##  [3] "BBC Films"                             
##  [4] "Blumhouse Productions"                 
##  [5] "British Broadcasting Corporation  BBC" 
##  [6] "Canal+"                                
##  [7] "Carolco Pictures"                      
##  [8] "Castle Rock Entertainment"             
##  [9] "Columbia Pictures Corporation"         
## [10] "Dimension Films"                       
## [11] "Dune Entertainment"                    
## [12] "Film i Väst"                           
## [13] "Film4"                                 
## [14] "Focus Features"                        
## [15] "Globo Filmes"                          
## [16] "Happy Madison Productions"             
## [17] "HBO Films"                             
## [18] "Hollywood Pictures"                    
## [19] "Lionsgate"                             
## [20] "M6 Films"                              
## [21] "Metro Goldwyn Mayer  MGM"              
## [22] "Millennium Films"                      
## [23] "Morgan Creek Productions"              
## [24] "Nickelodeon Movies"                    
## [25] "Original Film"                         
## [26] "Other"                                 
## [27] "PolyGram Filmed Entertainment"         
## [28] "Rai Cinema"                            
## [29] "Regency Enterprises"                   
## [30] "Relativity Media"                      
## [31] "Revolution Studios"                    
## [32] "Scott Rudin Productions"               
## [33] "Spyglass Entertainment"                
## [34] "StudioCanal"                           
## [35] "Svensk Filmindustri  SF"               
## [36] "TF1 Films Production"                  
## [37] "The Vitaphone Corporation"             
## [38] "Touchstone Pictures"                   
## [39] "TriStar Pictures"                      
## [40] "Twentieth Century Fox Film Corporation"
## [41] "UK Film Council"                       
## [42] "Universal Pictures"                    
## [43] "Warner Bros"                           
## [44] "Warner Bros  Animation"                
## [45] "Wild Bunch"                            
## [46] "Zweites Deutsches Fernsehen  ZDF"

Company column is now clean with proper categorization and its ready for use in analysis.

country_language variables

  • Detected Issues: 2 character blank space, lack of language and language names in their original language, this is an issue as it could complicate our efforts to understand the dataset.
  • Affected Rows: 4050 (No language), ALL (blank space and levels in original language)
  • Proposed Solution: Remove blank spaces, create a category for movies without a language called “Unspecified Language” and translate to English the language for all levels.
# See levels for a variable
levels(droplevels(movies$country1_language))
##  [1] ""                 "Afrikaans"        "Azərbaycan"       "Bahasa indonesia"
##  [5] "Bahasa melayu"    "Bamanankan"       "Bokmål"           "Bosanski"        
##  [9] "Català"           "Český"            "Cymraeg"          "Dansk"           
## [13] "Deutsch"          "Eesti"            "English"          "Español"         
## [17] "Esperanto"        "euskera"          "Français"         "Fulfulde"        
## [21] "Gaeilge"          "Galego"           "Hausa"            "Hrvatski"        
## [25] "isiZulu"          "Íslenska"         "Italiano"         "Kinyarwanda"     
## [29] "Kiswahili"        "Latin"            "Latviešu"         "Lietuvi x9akai"  
## [33] "Magyar"           "Nederlands"       "No Language"      "Norsk"           
## [37] "Polski"           "Português"        "Pусский"          "Română"          
## [41] "shqip"            "Slovenčina"       "Slovenščina"      "Somali"          
## [45] "Srpski"           "suomi"            "svenska"          "Tiếng Việt"      
## [49] "Türkçe"           "Wolof"            "ελληνικά"         "беларуская мова" 
## [53] "български език"   "қазақ"            "Український"      "ქართული"         
## [57] "עִבְרִית"            "اردو"             "العربية"          "پښتو"            
## [61] "فارسی"            "हिन्दी"            "বাংলা"            "ਪੰਜਾਬੀ"           
## [65] "தமிழ்"             "తెలుగు"            "ภาษาไทย"          "한국어 조선말"   
## [69] "广州话   廣州話"  "日本語"           "普通话"
levels(droplevels(movies$country2_language))
##  [1] ""                 "Afrikaans"        "Bahasa indonesia" "Bahasa melayu"   
##  [5] "Bamanankan"       "Bosanski"         "Català"           "Český"           
##  [9] "Cymraeg"          "Dansk"            "Deutsch"          "Eesti"           
## [13] "English"          "Español"          "Esperanto"        "Français"        
## [17] "Fulfulde"         "Gaeilge"          "Galego"           "Hrvatski"        
## [21] "isiZulu"          "Íslenska"         "Italiano"         "Kinyarwanda"     
## [25] "Kiswahili"        "Latin"            "Latviešu"         "Lietuvi x9akai"  
## [29] "Magyar"           "Malti"            "Nederlands"       "No Language"     
## [33] "Norsk"            "ozbek"            "Polski"           "Português"       
## [37] "Pусский"          "Română"           "shqip"            "Slovenčina"      
## [41] "Slovenščina"      "Somali"           "Srpski"           "suomi"           
## [45] "svenska"          "Tiếng Việt"       "Türkçe"           "Wolof"           
## [49] "ελληνικά"         "български език"   "қазақ"            "Український"     
## [53] "ქართული"          "עִבְרִית"            "اردو"             "العربية"         
## [57] "پښتو"             "فارسی"            "हिन्दी"            "বাংলা"           
## [61] "ਪੰਜਾਬੀ"            "தமிழ்"             "తెలుగు"            "ภาษาไทย"         
## [65] "한국어 조선말"    "广州话   廣州話"  "日本語"           "普通话"
levels(droplevels(movies$country3_language))
##  [1] ""                 "Afrikaans"        "Bahasa indonesia" "Bahasa melayu"   
##  [5] "Bamanankan"       "Bosanski"         "Český"            "Cymraeg"         
##  [9] "Dansk"            "Deutsch"          "Eesti"            "English"         
## [13] "Español"          "Esperanto"        "euskera"          "Français"        
## [17] "Gaeilge"          "Hrvatski"         "isiZulu"          "Íslenska"        
## [21] "Italiano"         "Kiswahili"        "Latin"            "Latviešu"        
## [25] "Lietuvi x9akai"   "Magyar"           "Nederlands"       "Norsk"           
## [29] "Polski"           "Português"        "Pусский"          "Română"          
## [33] "shqip"            "Slovenčina"       "Slovenščina"      "Somali"          
## [37] "Srpski"           "suomi"            "svenska"          "Tiếng Việt"      
## [41] "Türkçe"           "Wolof"            "ελληνικά"         "български език"  
## [45] "қазақ"            "Український"      "ქართული"          "עִבְרִית"           
## [49] "اردو"             "العربية"          "پښتو"             "فارسی"           
## [53] "हिन्दी"            "ਪੰਜਾਬੀ"            "தமிழ்"             "తెలుగు"           
## [57] "ภาษาไทย"          "한국어 조선말"    "广州话   廣州話"  "日本語"          
## [61] "普通话"

The fisrt step to clean the columns will be to remove the whitespace on each of the variables.

# Eliminate white space inconsistency
movies <- movies %>% mutate(country1_language = str_trim(country1_language)) 
movies <- movies %>% mutate(country2_language = str_trim(country2_language))
movies <- movies %>% mutate(country3_language = str_trim(country3_language))
# Reconvert variables to factor data type
movies <- movies %>% mutate(country1_language = as.factor(movies$country1_language))
movies <- movies %>% mutate(country2_language = as.factor(movies$country2_language))
movies <- movies %>% mutate(country3_language = as.factor(movies$country3_language))
# See levels for a variable
levels(droplevels(movies$country1_language))
##  [1] ""                 "Afrikaans"        "Azərbaycan"       "Bahasa indonesia"
##  [5] "Bahasa melayu"    "Bamanankan"       "Bokmål"           "Bosanski"        
##  [9] "Català"           "Český"            "Cymraeg"          "Dansk"           
## [13] "Deutsch"          "Eesti"            "English"          "Español"         
## [17] "Esperanto"        "euskera"          "Français"         "Fulfulde"        
## [21] "Gaeilge"          "Galego"           "Hausa"            "Hrvatski"        
## [25] "isiZulu"          "Íslenska"         "Italiano"         "Kinyarwanda"     
## [29] "Kiswahili"        "Latin"            "Latviešu"         "Lietuvi x9akai"  
## [33] "Magyar"           "Nederlands"       "No Language"      "Norsk"           
## [37] "Polski"           "Português"        "Pусский"          "Română"          
## [41] "shqip"            "Slovenčina"       "Slovenščina"      "Somali"          
## [45] "Srpski"           "suomi"            "svenska"          "Tiếng Việt"      
## [49] "Türkçe"           "Wolof"            "ελληνικά"         "беларуская мова" 
## [53] "български език"   "қазақ"            "Український"      "ქართული"         
## [57] "עִבְרִית"            "اردو"             "العربية"          "پښتو"            
## [61] "فارسی"            "हिन्दी"            "বাংলা"            "ਪੰਜਾਬੀ"           
## [65] "தமிழ்"             "తెలుగు"            "ภาษาไทย"          "한국어 조선말"   
## [69] "广州话   廣州話"  "日本語"           "普通话"
levels(droplevels(movies$country2_language))
##  [1] ""                 "Afrikaans"        "Bahasa indonesia" "Bahasa melayu"   
##  [5] "Bamanankan"       "Bosanski"         "Català"           "Český"           
##  [9] "Cymraeg"          "Dansk"            "Deutsch"          "Eesti"           
## [13] "English"          "Español"          "Esperanto"        "Français"        
## [17] "Fulfulde"         "Gaeilge"          "Galego"           "Hrvatski"        
## [21] "isiZulu"          "Íslenska"         "Italiano"         "Kinyarwanda"     
## [25] "Kiswahili"        "Latin"            "Latviešu"         "Lietuvi x9akai"  
## [29] "Magyar"           "Malti"            "Nederlands"       "No Language"     
## [33] "Norsk"            "ozbek"            "Polski"           "Português"       
## [37] "Pусский"          "Română"           "shqip"            "Slovenčina"      
## [41] "Slovenščina"      "Somali"           "Srpski"           "suomi"           
## [45] "svenska"          "Tiếng Việt"       "Türkçe"           "Wolof"           
## [49] "ελληνικά"         "български език"   "қазақ"            "Український"     
## [53] "ქართული"          "עִבְרִית"            "اردو"             "العربية"         
## [57] "پښتو"             "فارسی"            "हिन्दी"            "বাংলা"           
## [61] "ਪੰਜਾਬੀ"            "தமிழ்"             "తెలుగు"            "ภาษาไทย"         
## [65] "한국어 조선말"    "广州话   廣州話"  "日本語"           "普通话"
levels(droplevels(movies$country3_language))
##  [1] ""                 "Afrikaans"        "Bahasa indonesia" "Bahasa melayu"   
##  [5] "Bamanankan"       "Bosanski"         "Český"            "Cymraeg"         
##  [9] "Dansk"            "Deutsch"          "Eesti"            "English"         
## [13] "Español"          "Esperanto"        "euskera"          "Français"        
## [17] "Gaeilge"          "Hrvatski"         "isiZulu"          "Íslenska"        
## [21] "Italiano"         "Kiswahili"        "Latin"            "Latviešu"        
## [25] "Lietuvi x9akai"   "Magyar"           "Nederlands"       "Norsk"           
## [29] "Polski"           "Português"        "Pусский"          "Română"          
## [33] "shqip"            "Slovenčina"       "Slovenščina"      "Somali"          
## [37] "Srpski"           "suomi"            "svenska"          "Tiếng Việt"      
## [41] "Türkçe"           "Wolof"            "ελληνικά"         "български език"  
## [45] "қазақ"            "Український"      "ქართული"          "עִבְרִית"           
## [49] "اردو"             "العربية"          "پښتو"             "فارسی"           
## [53] "हिन्दी"            "ਪੰਜਾਬੀ"            "தமிழ்"             "తెలుగు"           
## [57] "ภาษาไทย"          "한국어 조선말"    "广州话   廣州話"  "日本語"          
## [61] "普通话"

The second step to clean this column will be assing a name to the level that does not contain information in order to identify it faster.

# Create the category "Unspecified Language"
movies <- movies %>% mutate(country1_language = fct_collapse(country1_language, "Unspecified Language" = ""))
movies <- movies %>% mutate(country2_language = fct_collapse(country2_language, "Unspecified Language" = ""))
movies <- movies %>% mutate(country3_language = fct_collapse(country3_language, "Unspecified Language" = ""))
# See levels for a variable
levels(droplevels(movies$country1_language))
##  [1] "Unspecified Language" "Afrikaans"            "Azərbaycan"          
##  [4] "Bahasa indonesia"     "Bahasa melayu"        "Bamanankan"          
##  [7] "Bokmål"               "Bosanski"             "Català"              
## [10] "Český"                "Cymraeg"              "Dansk"               
## [13] "Deutsch"              "Eesti"                "English"             
## [16] "Español"              "Esperanto"            "euskera"             
## [19] "Français"             "Fulfulde"             "Gaeilge"             
## [22] "Galego"               "Hausa"                "Hrvatski"            
## [25] "isiZulu"              "Íslenska"             "Italiano"            
## [28] "Kinyarwanda"          "Kiswahili"            "Latin"               
## [31] "Latviešu"             "Lietuvi x9akai"       "Magyar"              
## [34] "Nederlands"           "No Language"          "Norsk"               
## [37] "Polski"               "Português"            "Pусский"             
## [40] "Română"               "shqip"                "Slovenčina"          
## [43] "Slovenščina"          "Somali"               "Srpski"              
## [46] "suomi"                "svenska"              "Tiếng Việt"          
## [49] "Türkçe"               "Wolof"                "ελληνικά"            
## [52] "беларуская мова"      "български език"       "қазақ"               
## [55] "Український"          "ქართული"              "עִבְרִית"               
## [58] "اردو"                 "العربية"              "پښتو"                
## [61] "فارسی"                "हिन्दी"                "বাংলা"               
## [64] "ਪੰਜਾਬੀ"                "தமிழ்"                 "తెలుగు"               
## [67] "ภาษาไทย"              "한국어 조선말"        "广州话   廣州話"     
## [70] "日本語"               "普通话"
levels(droplevels(movies$country2_language))
##  [1] "Unspecified Language" "Afrikaans"            "Bahasa indonesia"    
##  [4] "Bahasa melayu"        "Bamanankan"           "Bosanski"            
##  [7] "Català"               "Český"                "Cymraeg"             
## [10] "Dansk"                "Deutsch"              "Eesti"               
## [13] "English"              "Español"              "Esperanto"           
## [16] "Français"             "Fulfulde"             "Gaeilge"             
## [19] "Galego"               "Hrvatski"             "isiZulu"             
## [22] "Íslenska"             "Italiano"             "Kinyarwanda"         
## [25] "Kiswahili"            "Latin"                "Latviešu"            
## [28] "Lietuvi x9akai"       "Magyar"               "Malti"               
## [31] "Nederlands"           "No Language"          "Norsk"               
## [34] "ozbek"                "Polski"               "Português"           
## [37] "Pусский"              "Română"               "shqip"               
## [40] "Slovenčina"           "Slovenščina"          "Somali"              
## [43] "Srpski"               "suomi"                "svenska"             
## [46] "Tiếng Việt"           "Türkçe"               "Wolof"               
## [49] "ελληνικά"             "български език"       "қазақ"               
## [52] "Український"          "ქართული"              "עִבְרִית"               
## [55] "اردو"                 "العربية"              "پښتو"                
## [58] "فارسی"                "हिन्दी"                "বাংলা"               
## [61] "ਪੰਜਾਬੀ"                "தமிழ்"                 "తెలుగు"               
## [64] "ภาษาไทย"              "한국어 조선말"        "广州话   廣州話"     
## [67] "日本語"               "普通话"
levels(droplevels(movies$country3_language))
##  [1] "Unspecified Language" "Afrikaans"            "Bahasa indonesia"    
##  [4] "Bahasa melayu"        "Bamanankan"           "Bosanski"            
##  [7] "Český"                "Cymraeg"              "Dansk"               
## [10] "Deutsch"              "Eesti"                "English"             
## [13] "Español"              "Esperanto"            "euskera"             
## [16] "Français"             "Gaeilge"              "Hrvatski"            
## [19] "isiZulu"              "Íslenska"             "Italiano"            
## [22] "Kiswahili"            "Latin"                "Latviešu"            
## [25] "Lietuvi x9akai"       "Magyar"               "Nederlands"          
## [28] "Norsk"                "Polski"               "Português"           
## [31] "Pусский"              "Română"               "shqip"               
## [34] "Slovenčina"           "Slovenščina"          "Somali"              
## [37] "Srpski"               "suomi"                "svenska"             
## [40] "Tiếng Việt"           "Türkçe"               "Wolof"               
## [43] "ελληνικά"             "български език"       "қазақ"               
## [46] "Український"          "ქართული"              "עִבְרִית"               
## [49] "اردو"                 "العربية"              "پښتو"                
## [52] "فارسی"                "हिन्दी"                "ਪੰਜਾਬੀ"               
## [55] "தமிழ்"                 "తెలుగు"                "ภาษาไทย"             
## [58] "한국어 조선말"        "广州话   廣州話"      "日本語"              
## [61] "普通话"

For the mean time translation will not be made at this stage, however it is something that could further improve the overall cleanliness in the data set, but it is possible to analyze information in the current state of the three columns.

Finding invalid imdb_id

A imdb id should have the same character length regardless of the format, this is an example of how it should look “tt7158814”. In total it contains 9 characters therefore, any imdb_id that contains less than that should be changed.

# Find out the lenght of an imdb_id
str_length(movies$imdb_id) %>% head(10)
##  [1] 0 9 9 9 9 9 9 9 9 9

an error was encountered within the first 10 rows, however we need to see if there are more errors aside from that one.

# Search for invalid id's
movies %>%
filter(str_length(imdb_id) != 9)
## # A tibble: 1 × 40
##   adult  budget homepage id    imdb_id original_language original_title overview
##   <lgl>   <dbl> <chr>    <chr> <chr>   <fct>             <chr>          <chr>   
## 1 FALSE  4.22e6 ""       15257 ""      en                Hulk vs. Wolv… Departm…
## # ℹ 32 more variables: popularity <dbl>, poster_path <chr>,
## #   release_date <date>, revenue <dbl>, runtime <dbl>, status <fct>,
## #   tagline <chr>, title <chr>, video <chr>, vote_average <dbl>,
## #   vote_count <int>, id_collection <chr>, name_collection <chr>,
## #   poster_path_collection <chr>, backdrop_path_collection <chr>, genre1 <fct>,
## #   genre2 <fct>, genre3 <fct>, country1 <fct>, country2 <fct>, country3 <fct>,
## #   country1_language <fct>, country2_language <fct>, …

By running the code we can find that the only invalid id is the same we have detected previously, searching on imdb the title of the movie, the id for this movie was found, which is the following “tt1308622”

# Replace the invalid id with the correct one
movies <- movies %>% mutate(imdb_id = case_when(imdb_id == "" ~ str_replace(imdb_id, "^$", "tt1308622"),TRUE ~ imdb_id))
# See if invalid id's remain
movies %>% filter(str_length(imdb_id) != 9)
## # A tibble: 0 × 40
## # ℹ 40 variables: adult <lgl>, budget <dbl>, homepage <chr>, id <chr>,
## #   imdb_id <chr>, original_language <fct>, original_title <chr>,
## #   overview <chr>, popularity <dbl>, poster_path <chr>, release_date <date>,
## #   revenue <dbl>, runtime <dbl>, status <fct>, tagline <chr>, title <chr>,
## #   video <chr>, vote_average <dbl>, vote_count <int>, id_collection <chr>,
## #   name_collection <chr>, poster_path_collection <chr>,
## #   backdrop_path_collection <chr>, genre1 <fct>, genre2 <fct>, genre3 <fct>, …

Merging Datasets

Until this point, I have only focused on the movies_metadata csv files, however it is not the only file available that is related to this data set. There is other file that could be relevant to add to this data set in order to further expand our analysis possibilities. In order to do this we are going to use merge functions to successfully include the other information in this data set.

The file we are going to merge, are the keywords file which groups by id the keywords that identify a movie.

Importing and merging

Text Data and Distance

In order to fix any orthographic errors in the country columns we are going to use stringdist and fuzzyjoin packages, this will help us to correct any typo in the countries column

# Get the unique languages 
unique_languages <- table(movies$country1_language)
write.csv(unique_languages,"languages.csv")
# Read list with correct names 
languages_corrected <- read.csv("D:\\Business Analytics\\languages_corrected.csv")
# Join both datasets using string distance as the criteria
  movies <- movies %>%
    stringdist_left_join(languages_corrected, by = c("country1_language" = "Language"), method = "dl") %>%
    stringdist_left_join(languages_corrected, by = c("country2_language" = "Language"), method = "dl") %>%
    stringdist_left_join(languages_corrected, by = c("country3_language" = "Language"), method = "dl")
# Count the values
summary(movies$country1_language)
## Unspecified Language            Afrikaans           Azərbaycan 
##                 4051                   22                    4 
##     Bahasa indonesia        Bahasa melayu           Bamanankan 
##                   26                    5                    4 
##               Bokmål             Bosanski               Català 
##                    3                   26                   31 
##                Český              Cymraeg                Dansk 
##                  270                    2                  300 
##              Deutsch                Eesti              English 
##                 1321                   41                26890 
##              Español            Esperanto              euskera 
##                 1144                    3                   14 
##             Français             Fulfulde              Gaeilge 
##                 2430                    1                    6 
##               Galego                Hausa             Hrvatski 
##                    3                    1                   34 
##              isiZulu             Íslenska             Italiano 
##                    4                   32                 1416 
##          Kinyarwanda            Kiswahili                Latin 
##                    1                    2                   24 
##             Latviešu       Lietuvi x9akai               Magyar 
##                   17                   15                  144 
##           Nederlands          No Language                Norsk 
##                  297                  306                  112 
##               Polski            Português              Pусский 
##                  246                  330                  909 
##               Română                shqip           Slovenčina 
##                   75                   24                   18 
##          Slovenščina               Somali               Srpski 
##                   24                    1                   47 
##                suomi              svenska           Tiếng Việt 
##                  345                  676                   15 
##               Türkçe                Wolof             ελληνικά 
##                  149                    3                  133 
##      беларуская мова       български език                қазақ 
##                    2                   25                    8 
##          Український              ქართული                עִבְרִית 
##                   16                   21                   76 
##                 اردو              العربية                 پښتو 
##                   15                  269                    2 
##                فارسی                हिन्दी                বাংলা 
##                  102                  546                   43 
##                ਪੰਜਾਬੀ                 தமிழ்                తెలుగు 
##                    4                   81                   43 
##              ภาษาไทย        한국어 조선말      广州话   廣州話 
##                   72                  446                  405 
##               日本語               普通话 
##                 1385                  414
summary(movies$country2_language)
## Unspecified Language            Afrikaans     Bahasa indonesia 
##                37996                    4                    9 
##        Bahasa melayu           Bamanankan             Bosanski 
##                    4                    1                    3 
##               Català                Český              Cymraeg 
##                    5                   14                    4 
##                Dansk              Deutsch                Eesti 
##                   19                  924                   10 
##              English              Español            Esperanto 
##                 1617                  786                    3 
##             Français             Fulfulde              Gaeilge 
##                 1488                    1                   11 
##               Galego             Hrvatski              isiZulu 
##                    1                   14                    5 
##             Íslenska             Italiano          Kinyarwanda 
##                   22                  623                    2 
##            Kiswahili                Latin             Latviešu 
##                    7                   48                    2 
##       Lietuvi x9akai               Magyar                Malti 
##                    7                  138                    2 
##           Nederlands          No Language                Norsk 
##                   29                   13                   49 
##                ozbek               Polski            Português 
##                    2                  162                  160 
##              Pусский               Română                shqip 
##                  332                   27                    1 
##           Slovenčina          Slovenščina               Somali 
##                   18                   10                    4 
##               Srpski                suomi              svenska 
##                   27                   40                  244 
##           Tiếng Việt               Türkçe                Wolof 
##                   29                   51                    7 
##             ελληνικά       български език                қазақ 
##                   44                    4                    2 
##          Український              ქართული                עִבְרִית 
##                   17                    8                   74 
##                 اردو              العربية                 پښتو 
##                   19                   28                    2 
##                فارسی                हिन्दी                বাংলা 
##                   26                  126                    2 
##                ਪੰਜਾਬੀ                 தமிழ்                తెలుగు 
##                    6                   21                   16 
##              ภาษาไทย        한국어 조선말      广州话   廣州話 
##                   42                   54                   44 
##               日本語               普通话 
##                  240                  222
summary(movies$country3_language)
## Unspecified Language            Afrikaans     Bahasa indonesia 
##                43438                    2                    2 
##        Bahasa melayu           Bamanankan             Bosanski 
##                    6                    1                    2 
##                Český              Cymraeg                Dansk 
##                    2                    1                    5 
##              Deutsch                Eesti              English 
##                  330                    1                  243 
##              Español            Esperanto              euskera 
##                  309                    1                    1 
##             Français              Gaeilge             Hrvatski 
##                  237                    4                    3 
##              isiZulu             Íslenska             Italiano 
##                    6                    8                  225 
##            Kiswahili                Latin             Latviešu 
##                    9                   41                    2 
##       Lietuvi x9akai               Magyar           Nederlands 
##                    2                   60                    7 
##                Norsk               Polski            Português 
##                   24                   82                   65 
##              Pусский               Română                shqip 
##                  212                   18                    3 
##           Slovenčina          Slovenščina               Somali 
##                    4                    4                    4 
##               Srpski                suomi              svenska 
##                   21                    8                  112 
##           Tiếng Việt               Türkçe                Wolof 
##                    8                   29                    2 
##             ελληνικά       български език                қазақ 
##                   28                    2                    1 
##          Український              ქართული                עִבְרִית 
##                    8                    4                   37 
##                 اردو              العربية                 پښتو 
##                   15                   31                    1 
##                فارسی                हिन्दी                ਪੰਜਾਬੀ 
##                    8                   28                    7 
##                 தமிழ்                తెలుగు              ภาษาไทย 
##                    4                    8                   31 
##        한국어 조선말      广州话   廣州話               日本語 
##                   28                   12                   87 
##               普通话 
##                   88

The language values are imported and corrected in case there was a typo within the dataset. With this we ensure that the same language stays in one category only.

Now we import keywords.

# Importing files
keywords <- read.csv("D:\\Business Analytics\\keywords.csv")
# Remove duplicates from keywords and links
keywords <- distinct(keywords)
# Merging movies df with keywords df only maintaining coincidences with movies.
movies <- merge(movies,keywords,all.x =TRUE)

Now the movies contain their corresponding keywords when applicable, however the keywords are in JSON format which for analysis purposes is not adequate, therefore we are going to create three new columns for registering the first three keywords a movies uses.

Cleaning merged dataset

# Separate into columns by :
new_keywords <- str_split_fixed(movies$keywords, ":", n = Inf)
# Choose until the third keyword
new_keywords <- new_keywords[, 2:7]
# Only select columns with the keywords
new_keywords <- new_keywords[, c(2,4,6)]
summary(new_keywords)
##       V1                 V2                 V3           
##  Length:45972       Length:45972       Length:45972      
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character
# Convert to data frame
new_keywords <- as.data.frame(new_keywords)
# Cleaning and trimming spaces
new_keywords <- new_keywords %>% 
  mutate(
    keyword1 = str_replace_all(V1, "[[:punct:]]", " "),
    keyword2 = str_replace_all(V2, "[[:punct:]]", " "),
    keyword3 = str_replace_all(V3, "[[:punct:]]", " ")
  ) %>% 
  mutate(
    keyword1 = str_remove_all(keyword1, "\\bid\\b"),
    keyword2 = str_remove_all(keyword2, "\\bid\\b"),
    keyword3 = str_remove_all(keyword3, "\\bid\\b")
  )
# Remove the original columns V1, V2, V3
new_keywords <- select(new_keywords, keyword1, keyword2, keyword3)
# Trim all leading and trailing white spaces
new_keywords <- new_keywords %>% 
  mutate(
    keyword1 = str_trim(keyword1),
    keyword2 = str_trim(keyword2),
    keyword3 = str_trim(keyword3)
  )
# Convert to factor
new_keywords$keyword1 <- as.factor(new_keywords$keyword1)
new_keywords$keyword2 <- as.factor(new_keywords$keyword2)
new_keywords$keyword3 <- as.factor(new_keywords$keyword3)
# Display the summary to check the clean data
summary(new_keywords)
##              keyword1                 keyword2                 keyword3    
##                  :14520                   :21056                   :25845  
##  woman director  : 1344   woman director  :  387   woman director  :  248  
##  independent film:  700   independent film:  234   independent film:  210  
##  based on novel  :  446   sex             :  212   murder          :  175  
##  musical         :  386   based on novel  :  210   nudity          :  133  
##  female nudity   :  376   murder          :  196   sex             :  105  
##  (Other)         :28200   (Other)         :23677   (Other)         :19256
movies <- cbind(movies, new_keywords)
movies <- movies %>% 
  select(-keywords) 

By using the merge function we are now able to see which are the most popular keywords on the whole dataset and also search for any specific movie for their keywords, which could be important to consider when doing data analysis.

Removing unnessesary variables

# Check for missing values in the 'titles' variable
missing_title <- sum(is.na(movies$title))

# Display the number of missing values
missing_title
## [1] 0
tail(movies$title)
## [1] "The Great Mouse Detective" "Exit Smiling"             
## [3] "Turn It Up"                "Gabriel"                  
## [5] "Hot Stuff"                 "The Free Will"

Eventhough i checked for missing values with code, I looked manually and see missing values in title and original_title remains intact.

# Remove unnecessary rows
movies <- select(movies, -video, -title)

Visualizing missing values

# Split the dataset to obtain a better visualization when using visdat
moviesp1 <- select(movies,1:10)
moviesp2 <- select(movies,11:20)
moviesp3 <- select(movies,21:30)
moviesp4 <- select(movies,31:41)
# Visualize missing values
vis_miss(moviesp1,warn_large_data = FALSE)

vis_miss(moviesp2,warn_large_data = FALSE)

vis_miss(moviesp3,warn_large_data = FALSE)

vis_miss(moviesp4,warn_large_data = FALSE)

Exploring and visualizing categorical and numerical data

Data Explorer

Now that we have merged and cleaned the new dataset, we can create a report in with the data explorer library to obtain insights about our dataset. But first it is necessary to remove unnecessary rows in order to obtain a better report. For the report we will only include one of each variable in cases where there is more than 1.

# Creating a shorter data set
movies_short <- select(movies,adult,original_title,revenue,budget,runtime,release_date,status,vote_average,vote_count,popularity_max,genre1,genre_count,company1,company_count,country1,country1_language,keyword1)

Know that we have the simplified dataset to movies_short we will create the report using the revenue as our main focus for analysis.

# For the report we are going to use revenue as our dependent variable
#create_report(movies_short,y= "revenue")

A report was created with Data Explorer to see missing values and other data. I will keep this as a comment for loading purposes for it is not important that it opens up every time I run the code.

tables

## 
##          Action       Adventure       Animation          Comedy           Crime 
##            4518            1525            1133            8929            1705 
##     Documentary           Drama          Family         Fantasy         Foreign 
##            3447           12156             539             708             118 
##         History          Horror           Music         Mystery         Romance 
##             283            2634             493             560            1201 
## Science Fiction        Thriller        TV Movie     Unspecified             War 
##             647            1692             391            2458             384 
##         Western 
##             451
## 
##          Action       Adventure       Animation          Comedy           Crime 
##     0.098277212     0.033172366     0.024645436     0.194226921     0.037087793 
##     Documentary           Drama          Family         Fantasy         Foreign 
##     0.074980423     0.264421822     0.011724528     0.015400679     0.002566780 
##         History          Horror           Music         Mystery         Romance 
##     0.006155921     0.057295745     0.010723919     0.012181328     0.026124598 
## Science Fiction        Thriller        TV Movie     Unspecified             War 
##     0.014073784     0.036805012     0.008505177     0.053467328     0.008352910 
##         Western 
##     0.009810319

By a large margin, the most movies in the dataset are drama movies.

## 
##    xx 104.0  68.0  82.0    ab    af    am    ar    ay    bg    bm    bn    bo 
##    45     0     0     0    10     2     2    39     1    10     3    29     2 
##    bs    ca    cn    cs    cy    da    de    el    en    eo    es    et    eu 
##    14    12   313   135     1   241  1081   113 32365     1   995    24     3 
##    fa    fi    fr    fy    gl    he    hi    hr    hu    hy    id    is    it 
##   100   308  2438     1     1    67   508    30   102     1    20    24  1532 
##    iu    ja    jv    ka    kk    kn    ko    ku    ky    la    lb    lo    lt 
##     2  1347     1    18     3     3   444     3     3     1     1     2     9 
##    lv    mk    ml    mn    mr    ms    mt    nb    ne    nl    no    pa    pl 
##    18     5    36     2    25     5     1     6     2   248   119     2   218 
##    ps    pt    qu    ro    ru    rw    sh    si    sk    sl    sm    sq    sr 
##     2   316     1    57   826     1     5     1    18    33     1     5    63 
##    sv    ta    te    tg    th    tl    tr    uk    ur    uz    vi    wo    zh 
##   724    78    45     1    75    23   150    16     8     1    10     5   409 
##    zu 
##     1

As expected, most movies are in english.

##                  
##                        Afghanistan Albania Algeria Angola Argentina Armenia
##   Action           296           0       0       0      0        11       0
##   Adventure         72           0       0       1      0         5       0
##   Animation        131           0       0       0      0         5       1
##   Comedy           871           0       1       0      0        26       2
##   Crime             78           0       0       0      0         8       0
##   Documentary     1157           0       0       0      0         7       1
##   Drama           1129           3       1       5      2        99       3
##   Family            74           0       0       0      0         1       0
##   Fantasy           47           0       0       0      0         3       0
##   Foreign           17           0       0       0      0         1       0
##   History           28           0       0       1      0         0       0
##   Horror           204           0       0       0      0         5       0
##   Music            101           0       0       0      0         1       0
##   Mystery           41           0       0       0      0         3       0
##   Romance          110           0       0       0      0         5       0
##   Science Fiction   62           0       0       0      0         5       0
##   Thriller         149           0       1       0      0         6       0
##   TV Movie          85           0       0       0      0         1       0
##   Unspecified     1600           0       0       0      0        16       0
##   War               29           1       0       1      0         1       0
##   Western           33           0       0       0      0         3       0
##                  
##                   Aruba Australia Austria Azerbaijan Bahamas Bangladesh Belarus
##   Action              3        63       5          0       0          0       1
##   Adventure           1        28       2          0       2          0       0
##   Animation           0        12       0          0       0          0       0
##   Comedy              0        78      26          0       1          0       2
##   Crime               0        24       5          0       0          0       0
##   Documentary         0        16      26          0       0          0       0
##   Drama               0       131      54          1       0          1       1
##   Family              0        13       1          0       0          1       0
##   Fantasy             0        11       1          0       0          0       0
##   Foreign             0         3       0          0       0          0       0
##   History             0         3       0          0       0          0       0
##   Horror              0        38       5          0       0          0       0
##   Music               0         4       2          0       0          0       0
##   Mystery             0        13       1          0       0          0       0
##   Romance             0        13       2          0       0          0       0
##   Science Fiction     0        11       3          0       0          0       0
##   Thriller            0        32       5          0       1          0       0
##   TV Movie            0         0       0          0       0          0       0
##   Unspecified         0         5      11          0       0          0       0
##   War                 0         7       0          0       0          0       1
##   Western             0         1       2          0       0          0       0
##                  
##                   Belgium Bermuda Bhutan Bolivia Bosnia and Herzegovina
##   Action               10       0      1       0                      1
##   Adventure             9       0      1       1                      0
##   Animation            10       0      0       0                      0
##   Comedy               53       0      1       0                      3
##   Crime                 9       0      0       0                      0
##   Documentary           7       1      0       1                      0
##   Drama               117       0      0       4                     15
##   Family                6       0      0       0                      0
##   Fantasy               5       0      0       0                      0
##   Foreign               0       0      0       0                      0
##   History               5       0      0       0                      0
##   Horror               14       0      0       0                      0
##   Music                 2       0      0       0                      0
##   Mystery               5       0      0       0                      0
##   Romance              19       0      0       0                      0
##   Science Fiction       4       0      0       0                      0
##   Thriller              9       0      0       1                      0
##   TV Movie              1       0      0       0                      0
##   Unspecified          12       0      0       1                      0
##   War                   2       0      0       0                      3
##   Western               0       0      0       0                      0
##                  
##                   Botswana Brazil Brunei Darussalam Bulgaria Burkina Faso
##   Action                 1      7                 1        7            0
##   Adventure              0     11                 0        3            0
##   Animation              0      3                 0        0            0
##   Comedy                 0     54                 0        5            0
##   Crime                  0      7                 0        0            0
##   Documentary            1     30                 0        1            0
##   Drama                  0    113                 0       14            5
##   Family                 0      3                 0        0            0
##   Fantasy                0      0                 0        0            0
##   Foreign                0      1                 0        0            0
##   History                0      1                 0        0            1
##   Horror                 0      6                 0        2            0
##   Music                  0      2                 0        0            0
##   Mystery                0      2                 0        0            0
##   Romance                0      8                 0        0            1
##   Science Fiction        0      1                 0        2            0
##   Thriller               0      4                 0        2            0
##   TV Movie               0      0                 0        0            0
##   Unspecified            0      9                 0        0            0
##   War                    0      0                 0        0            1
##   Western                0      0                 0        0            0
##                  
##                   Cambodia Cameroon Canada Chad Chile China Colombia Congo
##   Action                 0        0    166    1     1    67        1     1
##   Adventure              0        0     56    0     0    15        1     1
##   Animation              0        0     43    0     1     5        1     0
##   Comedy                 1        0    202    0    11    25        1     0
##   Crime                  0        0     49    0     1     4        2     0
##   Documentary            4        1    118    0     6     8        3     1
##   Drama                  1        2    381    0    20   122        8     0
##   Family                 0        0     20    0     0     0        0     0
##   Fantasy                0        0     22    0     1     9        0     0
##   Foreign                0        0      0    0     1     0        0     0
##   History                0        0      4    0     0     3        0     0
##   Horror                 0        0    167    0     1     0        0     0
##   Music                  0        0      9    0     0     0        0     0
##   Mystery                0        0     23    0     0     4        0     0
##   Romance                0        0     35    0     1    17        0     0
##   Science Fiction        0        1     33    0     0     0        0     0
##   Thriller               0        0     93    0     1    10        1     0
##   TV Movie               0        0     40    0     0     0        0     0
##   Unspecified            0        0     29    0     5    10        1     0
##   War                    0        0      5    1     0     2        0     0
##   Western                0        0      6    0     0     0        0     0
##                  
##                   Costa Rica Cote D Ivoire Croatia Cuba Cyprus Czech Republic
##   Action                   0             0       1    0      0              5
##   Adventure                0             0       1    0      0             11
##   Animation                0             0       0    0      0             17
##   Comedy                   1             0       7    3      1             37
##   Crime                    0             0       1    0      0              4
##   Documentary              0             0       0    4      0              2
##   Drama                    3             2      16    6      1             42
##   Family                   0             0       0    0      0              9
##   Fantasy                  0             0       1    1      0              6
##   Foreign                  0             0       0    0      0              0
##   History                  0             0       1    0      0              5
##   Horror                   0             0       1    1      0              4
##   Music                    0             0       0    0      0              4
##   Mystery                  0             0       0    0      0              3
##   Romance                  0             0       1    1      0              4
##   Science Fiction          0             0       1    0      0              2
##   Thriller                 0             0       1    0      0              6
##   TV Movie                 0             0       0    0      0              0
##   Unspecified              0             0       0    0      0              4
##   War                      0             0       0    0      0              4
##   Western                  0             0       0    0      0              0
##                  
##                   Czechoslovakia Denmark Dominican Republic East Germany
##   Action                       0      13                  1            0
##   Adventure                    0      12                  0            0
##   Animation                    0       5                  0            0
##   Comedy                       3      50                  1            0
##   Crime                        0      16                  2            0
##   Documentary                  0      24                  0            0
##   Drama                        1     132                  2            1
##   Family                       0      13                  0            0
##   Fantasy                      0       1                  0            1
##   Foreign                      0       1                  0            0
##   History                      0       2                  0            1
##   Horror                       0      16                  0            0
##   Music                        0       1                  0            1
##   Mystery                      0       3                  0            0
##   Romance                      0       6                  0            0
##   Science Fiction              0       1                  0            1
##   Thriller                     0      22                  0            0
##   TV Movie                     0       0                  0            0
##   Unspecified                  0      10                  0            0
##   War                          0       2                  0            0
##   Western                      0       0                  0            0
##                  
##                   Ecuador Egypt El Salvador Estonia Ethiopia Finland France
##   Action                0     2           0       0        0      13    147
##   Adventure             0     0           0       4        0       3     85
##   Animation             0     0           0       3        0       2     42
##   Comedy                0     1           0       9        0      83    643
##   Crime                 1     0           0       3        0      12    117
##   Documentary           2     0           0       4        0      28    129
##   Drama                 1    10           1      14        3     110   1001
##   Family                0     0           0       1        0       5     22
##   Fantasy               0     0           0       0        0       4     57
##   Foreign               0     0           0       0        0       3      4
##   History               0     0           0       1        0       4     27
##   Horror                0     1           0       2        0       2     60
##   Music                 0     0           0       0        0       6     18
##   Mystery               0     1           0       1        0       1     28
##   Romance               1     1           0       0        0      12    105
##   Science Fiction       0     0           0       0        0       4     18
##   Thriller              0     2           0       1        0      12     96
##   TV Movie              0     0           0       1        0       2      4
##   Unspecified           0     1           0       3        0      30     60
##   War                   0     0           0       1        0       6     33
##   Western               0     0           0       0        0       0     10
##                  
##                   Georgia Germany Ghana Greece Guatemala Hong Kong Hungary
##   Action                1      93     0      3         0       246       2
##   Adventure             0      63     0      1         0        13       8
##   Animation             0      34     0      0         0         3       6
##   Comedy                4     283     0     33         0        35      15
##   Crime                 0      41     0      3         0        21       7
##   Documentary           2     113     0      3         0         3       2
##   Drama                 9     515     0     57         1        69      54
##   Family                0      24     0      0         0         0       1
##   Fantasy               0      32     0      3         0        14       0
##   Foreign               1       1     0      1         0         3       1
##   History               0      11     0      0         0         0       2
##   Horror                1      47     0      2         0        16       0
##   Music                 0      11     0      1         0         2       1
##   Mystery               0      20     0      1         0         0       1
##   Romance               3      40     1      6         0        11       4
##   Science Fiction       0      13     0      2         0         4       0
##   Thriller              0      42     1      6         0        18       5
##   TV Movie              0       8     0      0         0         0       0
##   Unspecified           0      28     0      8         0         7       9
##   War                   0      11     0      1         0         3       3
##   Western               0       5     0      0         0         0       0
##                  
##                   Iceland India Indonesia Iran Iraq Ireland Israel Italy
##   Action                1   141         6    2    0       6      7   119
##   Adventure             2    13         0    1    0       5      1    47
##   Animation             0     8         0    0    0       2      0     6
##   Comedy                7   120         3    4    0      29     18   360
##   Crime                 0    31         1    1    0       1      1    61
##   Documentary           4    10         0    7    1       4      5    28
##   Drama                21   257        11   68    1      60     48   361
##   Family                2     7         0    3    0       3      0     4
##   Fantasy               0     7         0    0    0       3      0    17
##   Foreign               0    15         2    0    0       0      0     9
##   History               1     4         0    0    0       1      2    18
##   Horror                2    19         3    0    0       9      4   123
##   Music                 1    12         0    0    0       1      0     1
##   Mystery               0     6         0    0    0       0      1    25
##   Romance               0    50         0    2    0       5      2    49
##   Science Fiction       1     2         0    0    0       2      1    21
##   Thriller              0    50         1    1    0       2      0    55
##   TV Movie              0     0         0    0    0       0      0     0
##   Unspecified           0    29         1    2    0       1      3    89
##   War                   0     2         0    0    0       2      3    17
##   Western               0     0         0    0    0       0      0    68
##                  
##                   Jamaica Japan Jordan Kazakhstan Kyrgyz Republic
##   Action                2   267      0          4               0
##   Adventure             0    72      1          0               0
##   Animation             0   180      0          0               0
##   Comedy                0   118      2          1               1
##   Crime                 0    42      0          1               0
##   Documentary           0    26      0          0               0
##   Drama                 1   378      1          4               4
##   Family                0     5      0          0               0
##   Fantasy               0    53      0          0               0
##   Foreign               0    23      0          0               0
##   History               0    14      0          0               0
##   Horror                0    92      0          0               0
##   Music                 1     7      0          0               0
##   Mystery               0    16      0          0               0
##   Romance               0    39      0          0               0
##   Science Fiction       0    50      0          0               0
##   Thriller              0    37      0          1               0
##   TV Movie              0     0      0          0               0
##   Unspecified           0    60      0          1               0
##   War                   0    11      0          0               0
##   Western               0     0      0          0               0
##                  
##                   Lao People s Democratic Republic Latvia Lebanon Liberia
##   Action                                         0      1       0       0
##   Adventure                                      0      0       1       0
##   Animation                                      0      0       0       0
##   Comedy                                         0      2       2       0
##   Crime                                          0      0       0       0
##   Documentary                                    0      5       1       1
##   Drama                                          1      9       1       1
##   Family                                         0      0       0       0
##   Fantasy                                        0      0       0       0
##   Foreign                                        0      0       0       0
##   History                                        0      0       0       0
##   Horror                                         0      0       0       0
##   Music                                          0      0       0       0
##   Mystery                                        0      0       0       0
##   Romance                                        0      1       1       0
##   Science Fiction                                0      0       0       0
##   Thriller                                       0      0       0       0
##   TV Movie                                       0      0       0       0
##   Unspecified                                    0      2       0       0
##   War                                            0      0       0       0
##   Western                                        0      0       0       0
##                  
##                   Libyan Arab Jamahiriya Liechtenstein Lithuania Luxembourg
##   Action                               1             0         3          4
##   Adventure                            2             0         0          1
##   Animation                            0             0         0          1
##   Comedy                               0             0         1          2
##   Crime                                0             0         1          1
##   Documentary                          0             0         0          0
##   Drama                                0             0         7          5
##   Family                               0             0         0          0
##   Fantasy                              0             0         0          1
##   Foreign                              0             0         0          0
##   History                              0             0         1          0
##   Horror                               0             1         1          3
##   Music                                0             0         0          0
##   Mystery                              0             0         0          2
##   Romance                              0             0         0          2
##   Science Fiction                      0             0         0          2
##   Thriller                             0             0         0          1
##   TV Movie                             0             0         0          0
##   Unspecified                          0             0         2          1
##   War                                  0             0         1          1
##   Western                              0             0         0          0
##                  
##                   Macedonia Malaysia Mali Malta Martinique Mauritania Mexico
##   Action                  1        1    0     1          0          0     18
##   Adventure               1        0    0     0          0          0     10
##   Animation               0        0    0     0          0          0      1
##   Comedy                  0        1    0     0          0          0     43
##   Crime                   0        0    0     0          0          0      9
##   Documentary             0        1    0     0          0          0     11
##   Drama                   4        1    1     1          1          3     91
##   Family                  0        0    0     0          0          0      1
##   Fantasy                 0        0    0     0          0          0      3
##   Foreign                 0        0    0     0          0          0      2
##   History                 0        0    0     0          0          0      2
##   Horror                  0        0    0     0          0          0     10
##   Music                   0        0    0     0          0          0      2
##   Mystery                 1        0    0     0          0          0      1
##   Romance                 0        0    0     0          0          0      8
##   Science Fiction         0        0    0     0          0          0      4
##   Thriller                0        2    0     0          0          0     10
##   TV Movie                0        0    0     0          0          0      1
##   Unspecified             0        0    0     0          0          0      4
##   War                     0        0    0     0          0          0      1
##   Western                 0        0    0     0          0          0      4
##                  
##                   Monaco Mongolia Montenegro Morocco Myanmar Namibia Nepal
##   Action               0        0          0       3       0       1     0
##   Adventure            0        0          0       0       0       0     1
##   Animation            0        0          0       0       0       0     0
##   Comedy               0        0          0       1       0       0     0
##   Crime                0        0          0       0       0       0     0
##   Documentary          0        2          0       1       0       0     0
##   Drama                0        0          1       6       0       0     1
##   Family               0        1          0       0       0       0     0
##   Fantasy              0        0          0       0       0       0     0
##   Foreign              0        0          0       0       0       0     0
##   History              0        0          0       1       0       0     0
##   Horror               1        0          0       0       0       0     0
##   Music                0        0          0       0       0       0     0
##   Mystery              0        0          0       0       0       0     0
##   Romance              0        0          0       0       0       0     0
##   Science Fiction      0        0          0       0       0       0     0
##   Thriller             0        0          0       0       0       0     0
##   TV Movie             0        0          0       0       0       0     0
##   Unspecified          0        0          0       2       1       0     0
##   War                  0        0          0       0       0       0     0
##   Western              0        0          0       0       0       0     0
##                  
##                   Netherlands New Zealand Nicaragua Nigeria North Korea Norway
##   Action                    7          17         0       0           0     13
##   Adventure                 9          10         0       0           0      7
##   Animation                 5           0         0       0           0      1
##   Comedy                   35          13         0       0           0     30
##   Crime                     4           0         0       0           0      5
##   Documentary              23           8         1       0           1      6
##   Drama                    87          22         0       2           0     46
##   Family                    5           0         0       0           0      3
##   Fantasy                   4           5         0       0           0      3
##   Foreign                   7           1         0       0           0      0
##   History                   4           0         0       0           0      0
##   Horror                    5           9         0       0           0      6
##   Music                     2           1         0       0           0      0
##   Mystery                   1           0         0       0           0      3
##   Romance                   7           4         0       1           0      3
##   Science Fiction           2           1         0       0           0      0
##   Thriller                  8           2         0       1           0      8
##   TV Movie                  0           0         0       0           0      0
##   Unspecified               8           0         0       0           0      4
##   War                       4           1         0       0           0      1
##   Western                   0           0         0       0           0      0
##                  
##                   Pakistan Palestinian Territory Panama Papua New Guinea
##   Action                 2                     0      0                0
##   Adventure              0                     0      0                0
##   Animation              0                     0      0                0
##   Comedy                 0                     0      0                1
##   Crime                  1                     0      0                0
##   Documentary            2                     1      1                0
##   Drama                  4                     4      1                0
##   Family                 2                     0      0                0
##   Fantasy                0                     0      0                0
##   Foreign                0                     0      0                0
##   History                1                     0      0                0
##   Horror                 1                     0      0                0
##   Music                  0                     0      0                0
##   Mystery                0                     0      0                0
##   Romance                0                     0      0                0
##   Science Fiction        0                     0      0                0
##   Thriller               0                     2      0                0
##   TV Movie               0                     0      0                0
##   Unspecified            1                     0      1                0
##   War                    0                     0      0                0
##   Western                0                     0      0                0
##                  
##                   Paraguay Peru Philippines Poland Portugal Puerto Rico Qatar
##   Action                 1    2          17     13        0           0     0
##   Adventure              0    0           1      3        1           0     0
##   Animation              0    0           0      5        1           0     0
##   Comedy                 0    2          12     53       12           0     0
##   Crime                  0    0           2      6        3           0     1
##   Documentary            0    1           0      9        5           1     1
##   Drama                  0    7          20    100       36           0     5
##   Family                 0    0           0      0        0           0     0
##   Fantasy                0    0           0      3        0           0     0
##   Foreign                0    0           2      0        0           0     0
##   History                0    0           0      2        2           0     0
##   Horror                 0    2          10      6        2           0     0
##   Music                  0    0           0      1        2           0     0
##   Mystery                0    1           0      4        2           0     0
##   Romance                0    0           2      4        2           2     0
##   Science Fiction        0    0           0      8        1           0     0
##   Thriller               0    0           1      9        0           0     1
##   TV Movie               0    0           0      0        0           0     0
##   Unspecified            0    0           2     13        4           1     0
##   War                    0    0           1      7        1           0     0
##   Western                0    0           0      0        0           0     0
##                  
##                   Romania Russia Rwanda Samoa Saudi Arabia Senegal Serbia
##   Action               10     59      0     0            0       0      4
##   Adventure             0     49      0     0            0       0      4
##   Animation             1     49      0     0            0       0      1
##   Comedy               16    179      0     0            0       2     20
##   Crime                 2     19      0     0            0       0      1
##   Documentary           2     26      0     0            0       0      2
##   Drama                29    227      2     1            1       8     20
##   Family                0     27      0     0            0       0      0
##   Fantasy               0     14      0     0            0       0      0
##   Foreign               0      0      0     0            0       0      0
##   History               3     11      0     0            0       0      0
##   Horror               11      7      0     0            0       0      2
##   Music                 0      2      0     0            0       0      1
##   Mystery               0     13      0     0            0       0      0
##   Romance               0     42      0     0            0       0      3
##   Science Fiction       1     10      0     0            0       0      0
##   Thriller              4     17      0     0            0       0      1
##   TV Movie              0      4      0     0            0       0      0
##   Unspecified           6     23      0     0            0       0      0
##   War                   2     22      0     0            0       0      6
##   Western               0      0      0     0            0       0      0
##                  
##                   Singapore Slovakia Slovenia South Africa South Korea
##   Action                  4        0        0           15          88
##   Adventure               1        0        0            4           7
##   Animation               1        1        0            1          10
##   Comedy                  2        0        2           13          38
##   Crime                   0        0        2            2          25
##   Documentary             1        2        2            3           5
##   Drama                   5        4       18           10         135
##   Family                  1        0        0            1           7
##   Fantasy                 0        0        0            0           7
##   Foreign                 0        0        0            0           6
##   History                 0        0        0            0           4
##   Horror                  0        0        0            1          32
##   Music                   0        0        2            1           1
##   Mystery                 1        0        2            0           9
##   Romance                 0        2        2            0          24
##   Science Fiction         0        0        0            4           4
##   Thriller                1        0        0            7          41
##   TV Movie                0        0        0            0           0
##   Unspecified             0        0        0            0          11
##   War                     0        2        0            2           3
##   Western                 0        0        0            1           0
##                  
##                   Soviet Union Spain Sri Lanka Sweden Switzerland
##   Action                     0    30         1     46           6
##   Adventure                  2    16         0     17           1
##   Animation                  0    11         0      5           3
##   Comedy                     1   123         0    163          17
##   Crime                      0    19         0     30           0
##   Documentary                3    25         1     45          18
##   Drama                      7   177         1    288          33
##   Family                     0     2         0     15           2
##   Fantasy                    0     8         0      7           0
##   Foreign                    0     4         0      0           0
##   History                    0     6         0      4           1
##   Horror                     0    64         0     22           3
##   Music                      0     1         0      6           3
##   Mystery                    0    15         0      8           0
##   Romance                    1    14         0     12           2
##   Science Fiction            1     5         0      2           0
##   Thriller                   0    39         0     36           4
##   TV Movie                   0     0         0      1           0
##   Unspecified                2    25         0     16           4
##   War                        0     5         0      5           2
##   Western                    0    12         0      0           0
##                  
##                   Syrian Arab Republic Taiwan Tajikistan Tanzania Thailand
##   Action                             0      9          0        0       21
##   Adventure                          0      0          0        0        3
##   Animation                          0      0          0        0        0
##   Comedy                             0     15          0        0       14
##   Crime                              0      4          0        0        1
##   Documentary                        0      1          0        1        2
##   Drama                              1     43          2        0       22
##   Family                             0      0          0        0        1
##   Fantasy                            0      0          0        0        2
##   Foreign                            0      1          0        0        1
##   History                            0      0          0        0        1
##   Horror                             0      1          0        0        8
##   Music                              0      1          0        0        1
##   Mystery                            0      1          0        0        1
##   Romance                            0      4          0        0        4
##   Science Fiction                    0      0          0        0        1
##   Thriller                           0      2          0        0        6
##   TV Movie                           0      0          0        0        0
##   Unspecified                        0      6          0        0        1
##   War                                0      0          0        0        0
##   Western                            0      0          0        0        0
##                  
##                   Trinidad and Tobago Tunisia Turkey Uganda Ukraine
##   Action                            0       0      7      1       2
##   Adventure                         1       0      5      0       1
##   Animation                         0       0      0      0       0
##   Comedy                            0       0     33      0       6
##   Crime                             0       0      4      0       0
##   Documentary                       0       0      1      1       1
##   Drama                             0       3     40      0      17
##   Family                            0       0      1      0       1
##   Fantasy                           0       0      2      0       0
##   Foreign                           0       0      0      0       0
##   History                           0       0      1      0       2
##   Horror                            0       0      5      0       0
##   Music                             0       0      2      0       0
##   Mystery                           0       0      3      0       0
##   Romance                           1       0      9      0       0
##   Science Fiction                   0       0      1      0       1
##   Thriller                          0       0      0      0       1
##   TV Movie                          0       0      0      0       0
##   Unspecified                       0       0     20      0       1
##   War                               0       0      0      0       0
##   Western                           0       0      0      0       0
##                  
##                   United Arab Emirates United Kingdom
##   Action                             1            227
##   Adventure                          0            129
##   Animation                          0             41
##   Comedy                             2            523
##   Crime                              1            154
##   Documentary                        2            228
##   Drama                              5            899
##   Family                             0             27
##   Fantasy                            0             56
##   Foreign                            1              3
##   History                            0             24
##   Horror                             1            250
##   Music                              0             41
##   Mystery                            0             48
##   Romance                            0             80
##   Science Fiction                    0             48
##   Thriller                           0            170
##   TV Movie                           0             31
##   Unspecified                        0             38
##   War                                0             50
##   Western                            0              6
##                  
##                   United States Minor Outlying Islands United States of America
##   Action                                             0                     2152
##   Adventure                                          0                      685
##   Animation                                          0                      474
##   Comedy                                             0                     4313
##   Crime                                              0                      852
##   Documentary                                        1                     1201
##   Drama                                              0                     4170
##   Family                                             0                      224
##   Fantasy                                            0                      294
##   Foreign                                            0                        2
##   History                                            0                       73
##   Horror                                             0                     1322
##   Music                                              0                      234
##   Mystery                                            0                      245
##   Romance                                            0                      410
##   Science Fiction                                    0                      306
##   Thriller                                           0                      644
##   TV Movie                                           0                      212
##   Unspecified                                        0                      213
##   War                                                0                      113
##   Western                                            0                      300
##                  
##                   Uruguay Uzbekistan Venezuela Vietnam Yugoslavia
##   Action                1          0         0       1          1
##   Adventure             0          1         0       0          0
##   Animation             0          1         0       0          0
##   Comedy                1          0         1       0          0
##   Crime                 0          0         1       1          0
##   Documentary           0          0         1       0          0
##   Drama                 6          2         6       6          2
##   Family                0          0         0       0          0
##   Fantasy               0          0         0       0          0
##   Foreign               0          0         1       0          0
##   History               0          0         0       0          0
##   Horror                0          0         1       0          0
##   Music                 0          0         0       0          0
##   Mystery               0          0         0       0          0
##   Romance               0          0         0       0          0
##   Science Fiction       0          0         0       0          0
##   Thriller              0          0         0       0          0
##   TV Movie              0          0         0       0          0
##   Unspecified           1          0         0       0          0
##   War                   0          0         0       0          1
##   Western               0          0         0       0          0

With this cross tabulation we can know what country makes the most amount of movies based on genre, United States, being the major producer, makes comedy movies the most. Would those be the movies that make the most revenue?

Interactive Visualization with Esquisse

For the following charts and graphs I used the package Esquisse in order to obtain more complex visualizations, yet the function is going to remain as a comment in order for it not to load every time I run the code.

graphs and charts

budget vs. revenue

## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).

We can see that if there is a higher budget there probably will be a higher revenue, yet it seems that there could be a limit because if you exceed a certain budget then it could be too high to make a profit out of it.

## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).

genre

By far, adventure movies make the most revenue.

With this past anayisis we now know 3 things:

  • United States is the biggest movie producer and mostly does comedy movies.
  • From all movies, drama is the genre that is used the most.
  • Adventure is the most popular genre as well as the one that makes more revenue in average.

With that, we can conclude that an adventure movie is the most likely to be a success.

runtime

The histogram visualizes the distribution of movie runtimes across different revenue ranges. If it is in very high it means that the movie made a lot of revenue. We can see that most movies made medium revenue which is around 10,000,000.

## [1] "Mean runtime (filtered): 96.48"
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).

# Calculate the mean runtime of filtered movies
mean_runtime_filtered <- mean(filtered_movies$runtime, na.rm = TRUE)
print(paste("Mean runtime (filtered):", round(mean_runtime_filtered, 2)))
## [1] "Mean runtime (filtered): 96.48"

With this past runtime analysis, we can conlude that for a movie to be a success or in other words, have a higher revenue, it should last between 96 and 150 minutes. A good sweet spot for the best movie would be two hours.

release date

It was to be expected yet this clarifies the theory that movies that come out on peoples vacations are the most profitable. We can see that movies have more success when released in summer (june & july) and aslo in winter (november & december). I would not say holidays are the best but vacation time for sure.

## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 84 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Failed to fit group 1.
## Caused by error in `smooth.construct.cr.smooth.spec()`:
## ! x has insufficient unique values to support 10 knots: reduce k.
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 84 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Failed to fit group 1.

We can see that in past years, the audience was not too amused by movies yet the quality of them were still great. Nowadays people are way more interested.

companies

Here we can see that “Other” and “No company” are very high in comparison with the rest of the categories, that is because these categories make up for a set of companies that either are not available in the dataset or are too small to even bother measuring. When put together they are great but it cannot be considered as one. Individually, Paramount Pictures is the most successfull company.

NOTE:

This does not mean other production companies are not important, a collaboration between big and small production companies could result a better match.

## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_bar()`).

In the analysis for production companies, It was found that movies made in collaboration between three companies are more likely to make the most revenue. This way we can determine that:

  • Collaboration is key in production
  • American movies make the best movies

titles

## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).

## [1] "Correlation coefficient: NA"
## [1] "Mean title length: 16.33"

For movie titles, the analysis made was done to determine the right amount of characters a movie title hast to have in order to increase the probability of it being a success. It was found that titles with around 16 characters make the best length for a movie title.

Word clouds

## Warning in tm_map.SimpleCorpus(corpus, tm::removePunctuation): transformation
## drops documents
## Warning in tm_map.SimpleCorpus(corpus, function(x) tm::removeWords(x,
## tm::stopwords())): transformation drops documents

In these word clouds we can see the most repeated words throughout all movies. In the second wordcloud, it shows us the words that are repeated the most with revenue-based weighting, meaning these words were repeated the most in movies with higher revenue. We can see that movies with more revenues mention the words: based on novel, woman director and saving the world, also big cities like paris, new york, london, etc. but that could be the location where the movie was made, the setting or another factor.

Statistical measures

# Convert budget and revenue as numeric
movies$budget_original <- as.numeric(as.character(movies$budget_original))
movies$revenue_original <- as.numeric(as.character(movies$revenue_original))
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##         0         0         0   4194725         0 380000000
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
## 0.000e+00 0.000e+00 0.000e+00 1.114e+07 0.000e+00 2.788e+09         3
## Budget - Mode: 0 , Mean: 4194725 , Median: 0 , Standard Deviation: 17363925 , Minimum: 0 , Maximum: 3.8e+08
## Revenue - Mode: 0 , Mean: 11139954 , Median: 0 , Standard Deviation: 64127446 , Minimum: 0 , Maximum: 2787965087

We could have worked with the data as it was, but we decided to conduct a different analysis by comparing the categories of budget and revenue after excluding zero values. This is because there are many zeros in the data, and we want to have a clearer vision of the cases that do contain complete information.

## Budget (Filtrado) - Media:  21565635 , Mediana:  8e+06 , Desviación Estándar:  34286508 , Mínimo:  1 , Máximo:  3.8e+08
## Revenue (Filtrado) - Media:  68829646 , Mediana:  16801877 , Desviación Estándar:  146424469 , Mínimo:  1 , Máximo:  2787965087

Statistic analysis

## # A tibble: 2 × 3
##   USA   mean_revenue median_revenue
##   <lgl>        <dbl>          <dbl>
## 1 FALSE    73431073.       18800000
## 2 TRUE    100046323.       37170057
##             Statistic             Value
## 1                Mean  90440189.5394444
## 2              Median          29911946
## 3                Mode           1.2e+07
## 4  Standard Deviation  166189478.816842
## 5            Variance 27618942869413484
## 6                 IQR          92990947
## 7                 Min                 1
## 8                 Max        2787965087
## 9                Diff        2787965086
## 10              Range   1 to 2787965087

Removing outliers

# Filter out outliers
movies_filtered_no_outliers <- movies_filtered_both %>%
  filter(!is_outlier)

# Plot density distributions of log-transformed revenue without outliers
ggplot(movies_filtered_no_outliers, aes(x = log(revenue_original), fill = factor(USA))) +
  geom_density(alpha = 0.3) +
  labs(title = "Density Distribution of Log-transformed Revenue (Excluding Outliers)",
       x = "Log Revenue",
       y = "Density",
       fill = "United States of America") +
  scale_fill_manual(values = c("TRUE" = "red", "FALSE" = "blue")) +
  theme_minimal()

# Calculating correlations between numerical variables
correlation_matrix <- cor(movies_filtered_no_outliers[, c("budget_original", "revenue_original", "popularity_max", "vote_average", "vote_count")])

# Scatterplot of budget vs revenue
ggplot(data = movies_filtered_no_outliers, aes(x = budget_original, y = revenue_original)) +
  geom_point(alpha = 0.5) +  
  labs(title = "Budget vs Revenue",
       x = "Budget",
       y = "Revenue") +
  theme_minimal()

# Analysis of the relationship between budget and revenue
budget_revenue_lm <- lm(revenue_original ~ budget_original, data = movies_filtered_no_outliers)
summary(budget_revenue_lm)
## 
## Call:
## lm(formula = revenue_original ~ budget_original, data = movies_filtered_no_outliers)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -677974787  -40715382   -5447567   15288916 2075081200 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -3.130e+06  2.044e+06  -1.531    0.126    
## budget_original  3.021e+00  3.951e-02  76.469   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 115500000 on 5197 degrees of freedom
## Multiple R-squared:  0.5294, Adjusted R-squared:  0.5294 
## F-statistic:  5847 on 1 and 5197 DF,  p-value: < 2.2e-16
# Get the top 15 countries by revenue
top_countries <- movies_filtered_no_outliers %>%
  group_by(country1) %>%
  summarize(total_revenue = sum(revenue_original, na.rm = TRUE)) %>%
  top_n(15, total_revenue) %>%
  arrange(desc(total_revenue)) %>%
  pull(country1)

# Filter data for the top 15 countries
movies_filtered_top_countries <- movies_filtered_no_outliers %>%
  filter(country1 %in% top_countries)

# Scatterplot of revenue by country for top 15 countries
ggplot(data = movies_filtered_top_countries, aes(x = country1, y = revenue_original, fill = country1)) +
  geom_boxplot() +
  labs(title = "Revenue by Country of Origin (Top 15 Countries)",
       x = "Country",
       y = "Revenue") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

shape

# Summary Statistics
summary_stats <- function(data, col) {
  cat("\n--- Summary Statistics for", col, "---\n")
  mean_val <- mean(data[[col]], na.rm = TRUE)
  median_val <- median(data[[col]], na.rm = TRUE)
  mode_val <- get_mode(data[[col]])
  sd_val <- sd(data[[col]], na.rm = TRUE)
  range_val <- range(data[[col]], na.rm = TRUE)
  iqr_val <- IQR(data[[col]], na.rm = TRUE)
  skewness_val <- skewness(data[[col]], na.rm = TRUE)
  kurtosis_val <- kurtosis(data[[col]], na.rm = TRUE)

  cat("Mean:", mean_val, "\nMedian:", median_val, "\nMode:", mode_val, 
      "\nStandard Deviation:", sd_val, "\nVariance:", sd_val^2,
      "\nRange: [", range_val[1], ",", range_val[2], "]",
      "\nInterquartile Range:", iqr_val,
      "\nSkewness:", skewness_val, "\nKurtosis:", kurtosis_val, "\n")
}

# Run the summary statistics function for 'budget_original' and 'revenue_original'
summary_stats(movies, "budget_original")
## 
## --- Summary Statistics for budget_original ---
## Mean: 4194725 
## Median: 0 
## Mode: 0 
## Standard Deviation: 17363925 
## Variance: 3.015059e+14 
## Range: [ 0 , 3.8e+08 ] 
## Interquartile Range: 0 
## Skewness: 7.146398 
## Kurtosis: 67.14456
summary_stats(movies, "revenue_original")
## 
## --- Summary Statistics for revenue_original ---
## Mean: 11139954 
## Median: 0 
## Mode: 0 
## Standard Deviation: 64127446 
## Variance: 4.112329e+15 
## Range: [ 0 , 2787965087 ] 
## Interquartile Range: 0 
## Skewness: 12.28317 
## Kurtosis: 238.2217

Results/findings

Almost all findings are based on revenue, as I chose it as my independent variable. Based on that, we can find many interesting and useful insights.

Recepie for a successful movie:

  • Primary language: English
  • Main theme/genre: Adventure
  • Sub-genre: Action/Fantasy/Science Fiction/Family
  • Duration of the movie: Around 2 hours long
  • Release time: Summer (June & July)
  • Companies: Collaborate with other companies (2 other companies). Best companies to work with are Paramount, Universal and Disney. Collaboration with smaller production companies would also benefit greatly as long as they are american.
  • Title: The movie name has to be 16 character long.
  • Plot: The movie must be “based on a novel” or “saving the world”.
  • Setting: Best places for the movie setting would be England, London, Paris or New york.
  • Director When looking at keywords in the database, one of the most repeated words among high revenue movies is “woman director”. However, based on internet search of highest grossing movies, most film directors of those movies are men.

Here are some visualizations used to confirm this movie recepie.

## 
##    xx 104.0  68.0  82.0    ab    af    am    ar    ay    bg    bm    bn    bo 
##    45     0     0     0    10     2     2    39     1    10     3    29     2 
##    bs    ca    cn    cs    cy    da    de    el    en    eo    es    et    eu 
##    14    12   313   135     1   241  1081   113 32365     1   995    24     3 
##    fa    fi    fr    fy    gl    he    hi    hr    hu    hy    id    is    it 
##   100   308  2438     1     1    67   508    30   102     1    20    24  1532 
##    iu    ja    jv    ka    kk    kn    ko    ku    ky    la    lb    lo    lt 
##     2  1347     1    18     3     3   444     3     3     1     1     2     9 
##    lv    mk    ml    mn    mr    ms    mt    nb    ne    nl    no    pa    pl 
##    18     5    36     2    25     5     1     6     2   248   119     2   218 
##    ps    pt    qu    ro    ru    rw    sh    si    sk    sl    sm    sq    sr 
##     2   316     1    57   826     1     5     1    18    33     1     5    63 
##    sv    ta    te    tg    th    tl    tr    uk    ur    uz    vi    wo    zh 
##   724    78    45     1    75    23   150    16     8     1    10     5   409 
##    zu 
##     1

## [1] "Mean runtime (filtered): 96.48"
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).

## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_bar()`).

## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).

## [1] "Correlation coefficient: NA"

Conclusions

In conclusion, the analysis of revenue data in the film industry reveals a refined understanding of the factors influencing movie success. English-language films, particularly within the adventure genre, dominate the box office, suggesting a clear preference among audiences. Strategic elements such as runtime, release timing, and collaborative partnerships with renowned production companies significantly impact revenue outcomes. Moreover, the presence of female directors emerges as a potentially lucrative path for enhancing film profitability. These findings reinforce the importance of strategic decision-making and audience-centric content creation in driving revenue growth in the film industry. By leveraging these insights, stakeholders can navigate market dynamics more effectively, ultimately fostering sustained success and innovation in movie production.

Business Recommendations:

  1. Strategic Partnerships: Establish partnerships with leading production companies like Paramount, Universal, and Disney to leverage their expertise and resources. Additionally, explore collaborations with emerging American production houses to diversify content offerings.

  2. Content Development: Focus on producing English-language adventure films with compelling storylines centered on themes like action, fantasy, science fiction, or family-oriented narratives. Consider adapting popular novels for cinematic adaptations to capitalize on existing fan bases.

  3. Release Strategy: Plan movie releases during the summer season, particularly in June and July, to maximize box office performance. Utilize data-driven insights to identify optimal release dates and avoid clashes with major blockbuster releases.

  4. Directorial Diversity: Encourage diversity in directorial roles by actively seeking opportunities to collaborate with talented female directors. Embrace inclusivity and promote gender diversity in creative decision-making processes.

  5. Market Expansion: Explore opportunities to expand into international markets while maintaining a focus on English-speaking audiences. Tailor marketing strategies and localization efforts to resonate with diverse cultural preferences and sensibilities.

Implementing these recommendations can enhance the overall success and profitability of movie productions, driving sustained growth in the dynamic entertainment industry landscape.

References

In the data cleaning process, I searched for various movies that were possibly silent and found that they in fact were. For example: Blacksmith Scene and Le manoir du diable. I also searched for movies that had zero in runtime to verify if they in fact did to determine if i had to imputate those values, here is an example of the movies: Torno a vivere da solo, The Black Waters of Echo’s Pond and star Force: Fugitive Alien II runtime. Lastly, I consulted searches of the most profitable movies to see if the director was a man or woman, Box Office Mojo is a website that listed the highest grossing movies and displays their information.

LS0tDQp0aXRsZTogIkV2aWRlbmNlIEJ1c2luZXNzIEFuYWx5dGljcyINCmF1dGhvcjogIkFkcmlhbiBNb3JhbGVzIC0gQTAxNzIyNTMyIg0KZGF0ZTogIk1heSAzLCAyMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRSANCiAgICBkZXBodDogMyANCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCi0tLQ0KDQoqKkFic3RyYWN0KiogDQoNCkluIGEgbGFuZHNjYXBlIHNoYXBlZCBieSB0aGUgZXhwbG9zaW9uIG9mIGRpZ2l0YWwgY29udGVudCBhbmQgc2hpZnRpbmcgYXVkaWVuY2UgcHJlZmVyZW5jZXMsIFRoaXMgcmVwb3J0IGVtYmFya3Mgb24gYSBqb3VybmV5IHRocm91Z2ggdGhlIGBNb3ZpZXNgIGRhdGFzZXQgZnJvbSBbS2FnZ2xlXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL3JvdW5ha2JhbmlrL3RoZS1tb3ZpZXMtZGF0YXNldCkgdG8gdW5yYXZlbCB0aGUgc2VjcmV0cyBvZiBjaW5lbWF0aWMgc3VjY2Vzcy4gQXJtZWQgd2l0aCBtZXRpY3Vsb3VzIGRhdGEgY2xlYW5pbmcgYW5kIGFkdmFuY2VkIHN0YXRpc3RpY2FsIHRlY2huaXF1ZXMsIHdlIHVuY292ZXIgdGhlIGNyaXRpY2FsIGluZ3JlZGllbnRzIHRoYXQgZGVmaW5lIHRoZSBtb2Rlcm4gYmxvY2tidXN0ZXIuIFRoZXNlIGluc2lnaHRzIGd1aWRlIHN0cmF0ZWdpYyBkZWNpc2lvbnMgZm9yIG91ciBwcm9kdWN0aW9uIGNvbXBhbnkgYXMgd2UgbmF2aWdhdGUgdGhlIGV2ZXItY2hhbmdpbmcgY3VycmVudHMgb2YgYXVkaWVuY2UgdGFzdGUsIGVuc3VyaW5nIG91ciBmaWxtcyByZXNvbmF0ZSBkZWVwbHkgYW5kIHNvYXIgYXQgdGhlIGJveCBvZmZpY2UuDQoNCg0KIVtdKEM6XFxVc2Vyc1xcYWRyaWFcXE9uZURyaXZlXFxJbcOhZ2VuZXNcXGphY2stcmVhY2hlci1zdGFyLXdhcnMtaW50ZXJzdGVsbGFyLW1vdmllLWpvaG4td2ljay13YWxscGFwZXItcHJldmlldy5qcGcpDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCm1vdmllcyA8LSByZWFkLmNzdigiRDpcXEJ1c2luZXNzIEFuYWx5dGljc1xcYXJjaGl2ZVxcbW92aWVzX21ldGFkYXRhLmNzdiIpDQpgYGANCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShEYXRhRXhwbG9yZXIpDQpsaWJyYXJ5KHZpc2RhdCkNCmxpYnJhcnkobWljZSkNCmxpYnJhcnkoc3RyaW5nZGlzdCkNCmxpYnJhcnkoZnV6enlqb2luKQ0KbGlicmFyeShlc3F1aXNzZSkNCmxpYnJhcnkod29yZGNsb3VkKQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShlMTA3MSkNCg0KYGBgDQoNCiMgSW50cm9kdWN0aW9uICYgT2JqZWN0aXZlcw0KDQpUaGUgZmlsbSBpbmR1c3RyeSBzdGFuZHMgYXMgYSBkeW5hbWljIGFuZCBldmVyLWV2b2x2aW5nIGxhbmRzY2FwZSwgY2hhcmFjdGVyaXplZCBieSBpdHMgYWJpbGl0eSB0byBjYXB0aXZhdGUgZ2xvYmFsIGF1ZGllbmNlcyBhbmQgc2hhcGUgY3VsdHVyYWwgbmFycmF0aXZlcy4gV2l0aGluIHRoaXMgcmVhbG0gb2YgY3JlYXRpdml0eSBhbmQgY29tbWVyY2UsIHVuZGVyc3RhbmRpbmcgdGhlIGludHJpY2FjaWVzIG9mIHdoYXQgbWFrZXMgYSBtb3ZpZSBzdWNjZXNzZnVsIGlzIHBhcmFtb3VudCBmb3IgZmlsbW1ha2VycywgcHJvZHVjZXJzLCBhbmQgaW5kdXN0cnkgc3Rha2Vob2xkZXJzIGFsaWtlLiBUaGlzIHJlcG9ydCBkaWdzIGludG8gdGhlIHdvcmxkIG9mIGZpbG0gYW5hbHlzaXMsIGFpbWluZyB0byB1bmNvdmVyIHRoZSB1bmRlcmx5aW5nIGZhY3RvcnMgZHJpdmluZyBib3ggb2ZmaWNlIHN1Y2Nlc3MuIA0KDQpBcyB0aGUgY29udGV4dCBmb3Igb3VyIGludmVzdGlnYXRpb24sIHdlIHJlY29nbml6ZSB0aGUgaW5jcmVhc2luZyBpbXBvcnRhbmNlIG9mIGRhdGEtZHJpdmVuIGRlY2lzaW9uLW1ha2luZyBpbiBhbiBpbmR1c3RyeSB0cmFkaXRpb25hbGx5IGRyaXZlbiBieSBpbnR1aXRpb24gYW5kIGNyZWF0aXZpdHkuIEluIHRvZGF5J3MgY29tcGV0aXRpdmUgbWFya2V0cGxhY2UsIGZpbG1tYWtlcnMgYW5kIHByb2R1Y3Rpb24gY29tcGFuaWVzIGZhY2UgbW91bnRpbmcgcHJlc3N1cmVzIHRvIGRlbGl2ZXIgY29tbWVyY2lhbGx5IHN1Y2Nlc3NmdWwgZmlsbXMgd2hpbGUgYmFsYW5jaW5nIGFydGlzdGljIGludGVncml0eSBhbmQgYXVkaWVuY2UgcHJlZmVyZW5jZXMuIEFnYWluc3QgdGhpcyBjb250ZXh0LCBvdXIgcmVzZWFyY2ggc2Vla3MgdG8gaWxsdW1pbmF0ZSB0aGUga2V5IGRldGVybWluYW50cyBvZiBtb3ZpZSByZXZlbnVlLCBwcm92aWRpbmcgaW5zaWdodHMgZm9yIHRoZSBpbmR1c3RyeS4NCg0KV2l0aCBhIGZvY3VzIG9uIHJldmVudWUgYXMgdGhlIHByaW1hcnkgbWV0cmljIG9mIHN1Y2Nlc3MsIG91ciBhbmFseXNpcyBzcGFucyB2YXJpb3VzIGRpbWVuc2lvbnMsIGluY2x1ZGluZyBnZW5yZSBwcmVmZXJlbmNlcywgcHJvZHVjdGlvbiBidWRnZXRzLCByZWxlYXNlIHRpbWluZywgYW5kIGdlb2dyYXBoaWNhbCBjb25zaWRlcmF0aW9ucy4gQnkgZGlzc2VjdGluZyB0aGVzZSBmYWN0b3JzLCB3ZSBhaW0gdG8gdW5jb3ZlciBwYXR0ZXJucyBhbmQgdHJlbmRzIHRoYXQgb2ZmZXIgdmFsdWFibGUgZ3VpZGFuY2UgZm9yIHRoZSBmaWxtIHByb2R1Y3Rpb24gY29tcGFueSBleGVjdXRpdmVzIHNlZWtpbmcgdG8gb3B0aW1pemUgdGhlaXIgc3RyYXRlZ2llcyBhbmQgbWF4aW1pemUgcmV0dXJucyBvbiBpbnZlc3RtZW50Lg0KDQpUaHJvdWdoIGEgc3lzdGVtYXRpYyBleGFtaW5hdGlvbiBvZiByZXZlbnVlIGRhdGEgYW5kIGluZHVzdHJ5IHRyZW5kcywgdGhpcyByZXBvcnQgc3RyaXZlcyB0byBlbXBvd2VyIHN0YWtlaG9sZGVycyB3aXRoIGFjdGlvbmFibGUgaW50ZWxsaWdlbmNlLCBmb3N0ZXJpbmcgaW5mb3JtZWQgZGVjaXNpb24tbWFraW5nIGFuZCBzdHJhdGVnaWMgaW5ub3ZhdGlvbiBpbiB0aGUgcmVhbG0gb2YgZmlsbSBwcm9kdWN0aW9uIGFuZCBkaXN0cmlidXRpb24uIEJ5IGV4cGxhaW5pbmcgdGhlIHVuZGVybHlpbmcgZHJpdmVycyBvZiBib3ggb2ZmaWNlIHN1Y2Nlc3MsIHdlIGFpbSB0byBjb250cmlidXRlIHRvIHRoZSBvbmdvaW5nIGRpYWxvZ3VlIHN1cnJvdW5kaW5nIHRoZSBhcnQgYW5kIGJ1c2luZXNzIG9mIGZpbG1tYWtpbmcsIHVsdGltYXRlbHkgc2hhcGluZyBhIG1vcmUgcHJvc3Blcm91cyBhbmQgdmlicmFudCBmdXR1cmUgZm9yIG91ciBwcm9kdWN0aW9uIGNvbXBhbnkuDQoNCiMgRGF0YSBEZXNjcmlwdGlvbiAmIENsZWFuaW5nDQoNClRoZSBhbmFseXNpcyBpbiB0aGlzIHJlcG9ydCBkcmF3cyB1cG9uIHRoZSBgTW92aWVzYCBkYXRhc2V0IG9idGFpbmVkIGZyb20gW0thZ2dsZV0oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9yb3VuYWtiYW5pay90aGUtbW92aWVzLWRhdGFzZXQpLCBlbmNvbXBhc3NpbmcgdmFyaW91cyBhdHRyaWJ1dGVzIG9mIG1vdmllcyBzdWNoIGFzIGJ1ZGdldHMsIHJldmVudWVzLCBnZW5yZXMsIHJlbGVhc2UgZGF0ZXMsIHByb2R1Y3Rpb24gY291bnRyaWVzLCBhbmQgcHJvZHVjdGlvbiBjb21wYW5pZXMuIFRoaXMgZGF0YXNldCBvZmZlcnMgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2YgdGhlIGdsb2JhbCBmaWxtIGluZHVzdHJ5LCBzcGFubmluZyBkaXZlcnNlIGdlbnJlcywgbGFuZ3VhZ2VzLCBhbmQgcHJvZHVjdGlvbiBjb250ZXh0cy4gUHJpb3IgdG8gYW5hbHlzaXMsIHJpZ29yb3VzIHByZXByb2Nlc3NpbmcgYW5kIGNsZWFuaW5nIHdlcmUgY29uZHVjdGVkIHRvIGVuc3VyZSBkYXRhIGludGVncml0eSBhbmQgcmVsaWFiaWxpdHkuIFRoaXMgaW52b2x2ZWQgYWRkcmVzc2luZyBtaXNzaW5nIHZhbHVlcyB0aHJvdWdoIGltcHV0YXRpb24gb3IgZXhjbHVzaW9uLCByZW1vdmluZyBkdXBsaWNhdGVzIHRvIHByZXZlbnQgcmVkdW5kYW5jeSwgYW5kIHN0YW5kYXJkaXppbmcgZGF0YSBmb3JtYXRzIGZvciBjb25zaXN0ZW5jeS4gVGhlIGdvYWwgb2YgdGhlc2UgY2xlYW5pbmcgcHJvY2VkdXJlcyB3YXMgdG8gZW5oYW5jZSB0aGUgZGF0YXNldCdzIHF1YWxpdHkgYW5kIHVzYWJpbGl0eSwgcHJvdmlkaW5nIGEgc29saWQgZm91bmRhdGlvbiBmb3Igcm9idXN0IGFuYWx5c2lzIG9mIGZpbG0gcmV2ZW51ZSB0cmVuZHMgYW5kIHBhdHRlcm5zLg0KDQoNCiMjIERhdGEgdHlwZXMNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyBPYnNlcnZlIHRoZSBmaXJzdCA2IHJvd3Mgb2YgdGhlIGRhdGFzZXQNCmhlYWQobW92aWVzKQ0KIyBDaGVjayB0aGUgZGF0YSB0eXBlIGZvciBlYWNoIHZhcmlhYmxlIG9mIHRoZSBkYXRhIGZyYW1lDQpnbGltcHNlKG1vdmllcykNCmBgYA0KIyMjIFNlYXJjaGluZyBmb3IgZXJyb3JzIGFuZCBhcmVhcyBvZiBpbXByb3ZlbWVudA0KKipPYnNlcnZhdGlvbnM6KiogDQoNCiogYGFkdWx0YCBjb2x1bW4gZGF0YSB0eXBlIGNvdWxkIGJlIGxvZ2ljYWwNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyBDaGVjayBpZiB2YXJpYWJsZSBpcyBsb2dpY2FsDQppcy5sb2dpY2FsKG1vdmllcyRhZHVsdCkNCmBgYA0KKiBgYmVsb25nc190b19jb2xsZWN0aW9uYCBjb2x1bW4gbXVzdCBiZSBjbGVhbmVkIGZvciBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBkYXRhICAgIA0KKiBgYnVkZ2V0YCBjb2x1bW4gZGF0YSB0eXBlIHNob3VsZCBiZSBpbnRlZ2VyIG9yIG51bWVyaWMgDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMgQ2hlY2sgaWYgdmFyaWFibGUgaXMgaW50ZWdlciBvciBudW1lcmljDQppcy5pbnRlZ2VyKG1vdmllcyRidWRnZXQpDQppcy5udW1lcmljKG1vdmllcyRidWRnZXQpDQpgYGANCiogYGdlbnJlc2AgY29sdW1uIG11c3QgYmUgY2xlYW5lZCBmb3IgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgZGF0YSAgICANCiogYG9yaWdpbmFsX2xhbmd1YWdlYCBjb2x1bW4gY291bGQgYmUgZmFjdG9yIA0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIENoZWNrIGlmIHZhcmlhYmxlIGlzIGZhY3Rvcg0KaXMuZmFjdG9yKG1vdmllcyRvcmlnaW5hbF9sYW5ndWFnZSkNCmBgYA0KKiBgcG9wdWxhcml0eWAgY29sdW1uIG11c3QgYmUgbnVtZXJpYyAgDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMgQ2hlY2sgaWYgdmFyaWFibGUgaXMgbnVtZXJpYw0KaXMubnVtZXJpYyhtb3ZpZXMkcG9wdWxhcml0eSkNCmBgYA0KKiBgcHJvZHVjdGlvbl9jb21wYW5pZXNgIGNvbHVtbiBtdXN0IGJlIGNsZWFuZWQgdG8gc2hvdyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gICAgIA0KKiBgcHJvZHVjdGlvbl9jb3VudHJpZXNgIGNvbHVtbiBtdXN0IGJlIGNsZWFuZWQgdG8gYXZvaWQgcmVkdW5kYW50IGFuZCBpcnJlbGV2YW50IGluZm9ybWF0aW9uICAgICAgIA0KKiBgcmVsZWFzZV9kYXRlYCBjb2x1bW4gZGF0YSB0eXBlIHNob3VsZCBiZSBEYXRlICAgDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMgQ2hlY2sgdmFyaWFibGUgdHlwZQ0KY2xhc3MobW92aWVzJHJlbGVhc2VfZGF0ZSkNCmBgYA0KKiBgc3Bva2VuX2xhbmd1YWdlc2AgY29sdW1uIG11c3QgYmUgY2xlYW5lZCB0byBhdm9pZCByZWR1bmRhbnQgYW5kIGlycmVsZXZhbnQgaW5mb3JtYXRpb24gICAgICAgDQoqIGBzdGF0dXNgIGNvbHVtbiBkYXRhIHR5cGUgY291bGQgYmUgZmFjdG9yICAgICAgDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMgQ2hlY2sgaWYgdmFyaWFibGUgaXMgZmFjdG9yDQppcy5mYWN0b3IobW92aWVzJHN0YXR1cykNCmBgYA0KKiBgdmlkZW9gIGNvbHVtbiBpcyBub3QgbmVjZXNzYXJ5IGZvciBhbmFseXNpcyBwdXJwb3NlcyAgIA0KDQojIyMgQ29udmVydGluZyBEYXRhIFR5cGVzICAgDQoqKlZhcmlhYmxlcyB0byBiZSBjb252ZXJ0ZWQ6KiogICAgICAgICAgICAgIA0KKiBhZHVsdCAobG9naWNhbCkgICANCiogYnVkZ2V0IChudW1lcmljKSAgICANCiogb3JpZ2luYWxfbGFuZ3VhZ2UgKGZhY3RvcikgICAgDQoqIHBvcHVsYXJpdHkgKG51bWVyaWMpICAgIA0KKiByZWxlYXNlX2RhdGUgKERhdGUpICAgIA0KKiBzdGF0dXMgKGZhY3RvcikNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIENvbnZlcnRpbmcgRGF0YSB0eXBlcw0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGFkdWx0ID0gYXMubG9naWNhbChtb3ZpZXMkYWR1bHQpKQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGJ1ZGdldCA9IGFzLm51bWVyaWMobW92aWVzJGJ1ZGdldCkpDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUob3JpZ2luYWxfbGFuZ3VhZ2UgPSBhcy5mYWN0b3IobW92aWVzJG9yaWdpbmFsX2xhbmd1YWdlKSkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShwb3B1bGFyaXR5ID0gYXMubnVtZXJpYyhtb3ZpZXMkcG9wdWxhcml0eSkpDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUocmVsZWFzZV9kYXRlID0gYXMuRGF0ZShtb3ZpZXMkcmVsZWFzZV9kYXRlKSkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShzdGF0dXMgPSBhcy5mYWN0b3IobW92aWVzJHN0YXR1cykpDQpgYGANCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIENoZWNraW5nIGlmIHRoZSBjb252ZXJzaW9uIHdhcyBtYWRlIHN1Y2Nlc3NmdWxseQ0KaXMubG9naWNhbChtb3ZpZXMkYWR1bHQpDQppcy5udW1lcmljKG1vdmllcyRidWRnZXQpDQppcy5mYWN0b3IobW92aWVzJG9yaWdpbmFsX2xhbmd1YWdlKQ0KaXMubnVtZXJpYyhtb3ZpZXMkcG9wdWxhcml0eSkNCmNsYXNzKG1vdmllcyRyZWxlYXNlX2RhdGUpDQppcy5mYWN0b3IobW92aWVzJHN0YXR1cykNCmBgYA0KDQojIyBUaWR5aW5nIHRoZSBkYXRhc2V0DQpWYXJpYWJsZXMgdGhlIG11c3QgYmUgY2xlYW5lZCxlYWNoIHBhcnQgb2YgdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBzZXBhcmF0ZWQgZXJhc2luZyB0YWdzLiAgICAgICAgDQoqIGJlbG9uZ3NfdG9fY29sbGVjdGlvbjogQ29udGFpbnMgImlkIiwibmFtZSIsInBvc3Rlcl9wYXJ0IiwiYmFja2Ryb3BfcGFydCIgICAgIA0KKiBnZW5yZXM6IENvbnRhaW5zICJpZCIsIm5hbWUiICAgICAgDQoqIHByb2R1Y3Rpb25fY29tcGFuaWVzOiBDb250YWlucyAibmFtZSIsImlkIiAgICAgIA0KKiBwcm9kdWN0aW9uX2NvdW50cmllczogQ29udGFpbnMgImFiYnJldmlhdGVkX25hbWUiLCJuYW1lIiAgICAgICANCiogc3Bva2VuX2xhbmd1YWdlczogQ29udGFpbnMgImFiYnJldmlhdGVkX25hbWUiLCJuYW1lIiAgICAgICAgDQoNCiMjIyBiZWxvbmdzX3RvX2NvbGxlY3Rpb24NCmBgYHtyfQ0KIyBEaXZpZGUgc3RyaW5nIGluIGNvbHVtbnMgZGVsaW1pdGluZyBieSAiOiINCmNvbGxlY3Rpb24gPC0gc3RyX3NwbGl0X2ZpeGVkKG1vdmllcyRiZWxvbmdzX3RvX2NvbGxlY3Rpb24sICI6IiwgbiA9IEluZikNCmBgYA0KDQpgYGB7cn0NCiMgQ2hvb3NlIGluZGV4IDEtNQ0KY29sbGVjdGlvbiA8LSBjb2xsZWN0aW9uWywxOjVdDQpgYGANCg0KYGBge3J9DQojIENob29zZSBpbmRleCAyLTUNCmNvbGxlY3Rpb24gPC0gY29sbGVjdGlvblssIGMoMiwzLDQsNSldDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGNvbGxlY3Rpb24pDQpgYGANCmBgYHtyfQ0KIyBDb252ZXJ0IHRvIGEgZGF0YSBmcmFtZQ0KY29sbGVjdGlvbiA8LSBhcy5kYXRhLmZyYW1lKGNvbGxlY3Rpb24pDQpgYGANCg0KYGBge3J9DQojRWxpbWluYXRlIHB1bmN0dWF0aW9uIHNpZ25zIGV4Y2VwdCAiLiIgYW5kICIvIg0KY29sbGVjdGlvbiA8LSBjb2xsZWN0aW9uICU+JSANCiAgbXV0YXRlKGlkX2NvbGxlY3Rpb24gPSBzdHJfcmVwbGFjZV9hbGwoY29sbGVjdGlvbiRWMSwgIltbOnB1bmN0Ol0mJlteLi9dXSIsICIgIikpDQpjb2xsZWN0aW9uIDwtIGNvbGxlY3Rpb24gJT4lIA0KICBtdXRhdGUobmFtZV9jb2xsZWN0aW9uID0gc3RyX3JlcGxhY2VfYWxsKGNvbGxlY3Rpb24kVjIsICJbWzpwdW5jdDpdJiZbXi4vXV0iLCAiICIpKQ0KY29sbGVjdGlvbiA8LSBjb2xsZWN0aW9uICU+JSANCiAgbXV0YXRlKHBvc3Rlcl9wYXRoX2NvbGxlY3Rpb24gPSBzdHJfcmVwbGFjZV9hbGwoY29sbGVjdGlvbiRWMywgIltbOnB1bmN0Ol0mJlteLi9dXSIsICIgIikpDQpjb2xsZWN0aW9uIDwtIGNvbGxlY3Rpb24gJT4lIA0KICBtdXRhdGUoYmFja2Ryb3BfcGF0aF9jb2xsZWN0aW9uID0gc3RyX3JlcGxhY2VfYWxsKGNvbGxlY3Rpb24kVjQsICJbWzpwdW5jdDpdJiZbXi4vXV0iLCAiICIpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBSZW1vdmUgc3BlY2ZpYyB3b3JkcyBmcm9tIGRhdGEgZnJhbWUNCmNvbGxlY3Rpb24kaWRfY29sbGVjdGlvbiA8LSBzdHJfcmVtb3ZlKGNvbGxlY3Rpb24kaWRfY29sbGVjdGlvbiwibmFtZSIpDQpjb2xsZWN0aW9uJG5hbWVfY29sbGVjdGlvbiA8LSBzdHJfcmVtb3ZlKGNvbGxlY3Rpb24kbmFtZV9jb2xsZWN0aW9uLCJwb3N0ZXIgcGF0aCIpDQpjb2xsZWN0aW9uJHBvc3Rlcl9wYXRoX2NvbGxlY3Rpb24gPC0gc3RyX3JlbW92ZShjb2xsZWN0aW9uJHBvc3Rlcl9wYXRoX2NvbGxlY3Rpb24sImJhY2tkcm9wIHBhdGgiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDaG9vc2Ugc3BlY2lmaWMgY29sdW1ucw0KY29sbGVjdGlvbiA8LSBjb2xsZWN0aW9uWyw1OjhdDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGNvbGxlY3Rpb24pDQpgYGANCmBgYHtyfQ0KIyBSZW1vdmUgd2hpdGVzcGFjZQ0KY29sbGVjdGlvbiRpZF9jb2xsZWN0aW9uIDwtIHN0cl90cmltKGNvbGxlY3Rpb24kaWRfY29sbGVjdGlvbiwgInJpZ2h0IikNCmNvbGxlY3Rpb24kbmFtZV9jb2xsZWN0aW9uIDwtIHN0cl90cmltKGNvbGxlY3Rpb24kbmFtZV9jb2xsZWN0aW9uLCAicmlnaHQiKQ0KY29sbGVjdGlvbiRwb3N0ZXJfcGF0aF9jb2xsZWN0aW9uIDwtIHN0cl90cmltKGNvbGxlY3Rpb24kcG9zdGVyX3BhdGhfY29sbGVjdGlvbiwgInJpZ2h0IikNCmNvbGxlY3Rpb24kYmFja2Ryb3BfcGF0aF9jb2xsZWN0aW9uIDwtIHN0cl90cmltKGNvbGxlY3Rpb24kYmFja2Ryb3BfcGF0aF9jb2xsZWN0aW9uLCAicmlnaHQiKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShjb2xsZWN0aW9uKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBZGQgc2VwYXJhdGVkIGNvbGxlY3Rpb24gdG8gbW92aWVzIGRhdGEgZnJhbWUNCm1vdmllcyA8LSBjYmluZChtb3ZpZXMsIGNvbGxlY3Rpb24pDQpgYGANCg0KYGBge3J9DQojIFJlbW92ZSB0aGUgJ2JlbG9uZ3NfdG9fY29sbGVjdGlvbicgY29sdW1uIGZyb20gdGhlICdtb3ZpZXMnIGRhdGEgZnJhbWUNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIA0KICBzZWxlY3QoLWJlbG9uZ3NfdG9fY29sbGVjdGlvbikNCmBgYA0KDQojIyMgZ2VucmVzIA0KYGBge3J9DQpuZXdfZ2VucmVzIDwtIHN0cl9zcGxpdF9maXhlZChtb3ZpZXMkZ2VucmVzLCAiOiIsIG4gPSBJbmYpDQpgYGANCg0KYGBge3J9DQpuZXdfZ2VucmVzIDwtIG5ld19nZW5yZXNbLDE6N10NCmBgYA0KDQpgYGB7cn0NCm5ld19nZW5yZXMgPC0gbmV3X2dlbnJlc1ssIGMoMyw1LDcpXQ0KYGBgDQoNCmBgYHtyfQ0KbmV3X2dlbnJlcyA8LSBhcy5kYXRhLmZyYW1lKG5ld19nZW5yZXMpDQpgYGANCg0KYGBge3J9DQpuZXdfZ2VucmVzIDwtIG5ld19nZW5yZXMgJT4lIA0KICBtdXRhdGUoZ2VucmUxID0gc3RyX3JlcGxhY2VfYWxsKG5ld19nZW5yZXMkVjEsICJbWzpwdW5jdDpdXSIsICIgIikpDQpuZXdfZ2VucmVzIDwtIG5ld19nZW5yZXMgJT4lIA0KICBtdXRhdGUoZ2VucmUyID0gc3RyX3JlcGxhY2VfYWxsKG5ld19nZW5yZXMkVjIsICJbWzpwdW5jdDpdXSIsICIgIikpDQpuZXdfZ2VucmVzIDwtIG5ld19nZW5yZXMgJT4lIA0KICBtdXRhdGUoZ2VucmUzID0gc3RyX3JlcGxhY2VfYWxsKG5ld19nZW5yZXMkVjMsICJbWzpwdW5jdDpdXSIsICIgIikpDQpgYGANCg0KYGBge3J9DQpuZXdfZ2VucmVzJGdlbnJlMSA8LSBzdHJfcmVtb3ZlKG5ld19nZW5yZXMkZ2VucmUxLCJpZCIpDQpuZXdfZ2VucmVzJGdlbnJlMiA8LSBzdHJfcmVtb3ZlKG5ld19nZW5yZXMkZ2VucmUyLCJpZCIpDQpuZXdfZ2VucmVzJGdlbnJlMyA8LSBzdHJfcmVtb3ZlKG5ld19nZW5yZXMkZ2VucmUzLCJpZCIpDQpgYGANCg0KYGBge3J9DQpuZXdfZ2VucmVzIDwtIG5ld19nZW5yZXNbLDQ6Nl0NCmBgYA0KDQpgYGB7cn0NCiMgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgaW4gZ2VucmUgY29sdW1ucw0KbmV3X2dlbnJlcyA8LSBuZXdfZ2VucmVzICU+JSANCiAgbXV0YXRlKGdlbnJlMSA9IHN0cl90cmltKGdlbnJlMSksDQogICAgICAgICBnZW5yZTIgPSBzdHJfdHJpbShnZW5yZTIpLA0KICAgICAgICAgZ2VucmUzID0gc3RyX3RyaW0oZ2VucmUzKSkNCmBgYA0KDQpgYGB7cn0NCm5ld19nZW5yZXMkZ2VucmUxIDwtIGFzLmZhY3RvcihuZXdfZ2VucmVzJGdlbnJlMSkNCm5ld19nZW5yZXMkZ2VucmUyIDwtIGFzLmZhY3RvcihuZXdfZ2VucmVzJGdlbnJlMikNCm5ld19nZW5yZXMkZ2VucmUzIDwtIGFzLmZhY3RvcihuZXdfZ2VucmVzJGdlbnJlMykNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkobmV3X2dlbnJlcykNCmBgYA0KDQpgYGB7cn0NCm1vdmllcyA8LSBjYmluZChtb3ZpZXMsIG5ld19nZW5yZXMpDQpgYGANCg0KYGBge3J9DQojIFJlbW92ZSB0aGUgb3JpZ2luYWwgJ2dlbnJlcycgY29sdW1uIGZyb20gdGhlICdtb3ZpZXMnIGRhdGEgZnJhbWUNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIA0KICBzZWxlY3QoLWdlbnJlcykNCmBgYA0KDQojIyMgcHJvZHVjdGlvbl9jb3VudHJpZXMNCmBgYHtyfQ0KbmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzIDwtIHN0cl9zcGxpdF9maXhlZChtb3ZpZXMkcHJvZHVjdGlvbl9jb3VudHJpZXMsICI6IiwgbiA9IEluZikNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvdW50cmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXNbLDI6N10NCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvdW50cmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXNbLCBjKDIsNCw2KV0NCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvdW50cmllcyA8LSBhcy5kYXRhLmZyYW1lKG5ld19wcm9kdWN0aW9uX2NvdW50cmllcykNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvdW50cmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMgJT4lIA0KICBtdXRhdGUoY291bnRyeTEgPSBzdHJfcmVwbGFjZV9hbGwobmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzJFYxLCAiW1s6cHVuY3Q6XV0iLCAiICIpKQ0KbmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzIDwtIG5ld19wcm9kdWN0aW9uX2NvdW50cmllcyAlPiUgDQogIG11dGF0ZShjb3VudHJ5MiA9IHN0cl9yZXBsYWNlX2FsbChuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMkVjIsICJbWzpwdW5jdDpdXSIsICIgIikpDQpuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMgPC0gbmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzICU+JSANCiAgbXV0YXRlKGNvdW50cnkzID0gc3RyX3JlcGxhY2VfYWxsKG5ld19wcm9kdWN0aW9uX2NvdW50cmllcyRWMywgIltbOnB1bmN0Ol1dIiwgIiAiKSkNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvdW50cmllcyRjb3VudHJ5MSA8LSBzdHJfcmVtb3ZlKG5ld19wcm9kdWN0aW9uX2NvdW50cmllcyRjb3VudHJ5MSwiaXNvIDMxNjYgMSIpDQpuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMkY291bnRyeTIgPC0gc3RyX3JlbW92ZShuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMkY291bnRyeTIsImlzbyAzMTY2IDEiKQ0KbmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzJGNvdW50cnkzIDwtIHN0cl9yZW1vdmUobmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzJGNvdW50cnkzLCJpc28gMzE2NiAxIikNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvdW50cmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXNbLDQ6Nl0NCmBgYA0KDQpgYGB7cn0NCiMgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgaW4gY291bnRyeSBjb2x1bW5zDQpuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMgPC0gbmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzICU+JSANCiAgbXV0YXRlKGNvdW50cnkxID0gc3RyX3RyaW0oY291bnRyeTEpLA0KICAgICAgICAgY291bnRyeTIgPSBzdHJfdHJpbShjb3VudHJ5MiksDQogICAgICAgICBjb3VudHJ5MyA9IHN0cl90cmltKGNvdW50cnkzKSkNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvdW50cmllcyRjb3VudHJ5MSA8LSBhcy5mYWN0b3IobmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzJGNvdW50cnkxKQ0KbmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzJGNvdW50cnkyIDwtIGFzLmZhY3RvcihuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMkY291bnRyeTIpDQpuZXdfcHJvZHVjdGlvbl9jb3VudHJpZXMkY291bnRyeTMgPC0gYXMuZmFjdG9yKG5ld19wcm9kdWN0aW9uX2NvdW50cmllcyRjb3VudHJ5MykNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkobmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzKQ0KYGBgDQoNCmBgYHtyfQ0KbW92aWVzIDwtIGNiaW5kKG1vdmllcywgbmV3X3Byb2R1Y3Rpb25fY291bnRyaWVzKQ0KYGBgDQoNCmBgYHtyfQ0KIyBSZW1vdmUgdGhlIG9yaWdpbmFsICdwcm9kdWN0aW9uX2NvdW50cmllcycgY29sdW1uIGZyb20gdGhlICdtb3ZpZXMnIGRhdGEgZnJhbWUNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIA0KICBzZWxlY3QoLXByb2R1Y3Rpb25fY291bnRyaWVzKQ0KYGBgDQoNCiMjIyBzcG9rZW5fbGFuZ3VhZ2VzDQpgYGB7cn0NCm5ld19zcG9rZW5fbGFuZ3VhZ2VzIDwtIHN0cl9zcGxpdF9maXhlZChtb3ZpZXMkc3Bva2VuX2xhbmd1YWdlcywgIjoiLCBuID0gSW5mKQ0KYGBgDQoNCmBgYHtyfQ0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMgPC0gbmV3X3Nwb2tlbl9sYW5ndWFnZXNbLDI6N10NCmBgYA0KDQpgYGB7cn0NCm5ld19zcG9rZW5fbGFuZ3VhZ2VzIDwtIG5ld19zcG9rZW5fbGFuZ3VhZ2VzWywgYygyLDQsNildDQpgYGANCg0KYGBge3J9DQpuZXdfc3Bva2VuX2xhbmd1YWdlcyA8LSBhcy5kYXRhLmZyYW1lKG5ld19zcG9rZW5fbGFuZ3VhZ2VzKQ0KYGBgDQoNCmBgYHtyfQ0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMgPC0gbmV3X3Nwb2tlbl9sYW5ndWFnZXMgJT4lIA0KICBtdXRhdGUoY291bnRyeTFfbGFuZ3VhZ2UgPSBzdHJfcmVwbGFjZV9hbGwobmV3X3Nwb2tlbl9sYW5ndWFnZXMkVjEsICJbWzpwdW5jdDpdXSIsICIgIikpDQpuZXdfc3Bva2VuX2xhbmd1YWdlcyA8LSBuZXdfc3Bva2VuX2xhbmd1YWdlcyAlPiUgDQogIG11dGF0ZShjb3VudHJ5Ml9sYW5ndWFnZSA9IHN0cl9yZXBsYWNlX2FsbChuZXdfc3Bva2VuX2xhbmd1YWdlcyRWMiwgIltbOnB1bmN0Ol1dIiwgIiAiKSkNCm5ld19zcG9rZW5fbGFuZ3VhZ2VzIDwtIG5ld19zcG9rZW5fbGFuZ3VhZ2VzICU+JSANCiAgbXV0YXRlKGNvdW50cnkzX2xhbmd1YWdlID0gc3RyX3JlcGxhY2VfYWxsKG5ld19zcG9rZW5fbGFuZ3VhZ2VzJFYzLCAiW1s6cHVuY3Q6XV0iLCAiICIpKQ0KYGBgDQoNCmBgYHtyfQ0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMkY291bnRyeTFfbGFuZ3VhZ2UgPC0gc3RyX3JlbW92ZShuZXdfc3Bva2VuX2xhbmd1YWdlcyRjb3VudHJ5MV9sYW5ndWFnZSwiaXNvIDYzOSAxIikNCm5ld19zcG9rZW5fbGFuZ3VhZ2VzJGNvdW50cnkyX2xhbmd1YWdlIDwtIHN0cl9yZW1vdmUobmV3X3Nwb2tlbl9sYW5ndWFnZXMkY291bnRyeTJfbGFuZ3VhZ2UsImlzbyA2MzkgMSIpDQpuZXdfc3Bva2VuX2xhbmd1YWdlcyRjb3VudHJ5M19sYW5ndWFnZSA8LSBzdHJfcmVtb3ZlKG5ld19zcG9rZW5fbGFuZ3VhZ2VzJGNvdW50cnkzX2xhbmd1YWdlLCJpc28gNjM5IDEiKQ0KYGBgDQoNCmBgYHtyfQ0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMgPC0gbmV3X3Nwb2tlbl9sYW5ndWFnZXNbLDQ6Nl0NCmBgYA0KDQpgYGB7cn0NCiMgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgaW4gbGFuZ3VhZ2UgY29sdW1ucw0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMgPC0gbmV3X3Nwb2tlbl9sYW5ndWFnZXMgJT4lIA0KICBtdXRhdGUoY291bnRyeTFfbGFuZ3VhZ2UgPSBzdHJfdHJpbShjb3VudHJ5MV9sYW5ndWFnZSksDQogICAgICAgICBjb3VudHJ5Ml9sYW5ndWFnZSA9IHN0cl90cmltKGNvdW50cnkyX2xhbmd1YWdlKSwNCiAgICAgICAgIGNvdW50cnkzX2xhbmd1YWdlID0gc3RyX3RyaW0oY291bnRyeTNfbGFuZ3VhZ2UpKQ0KYGBgDQoNCmBgYHtyfQ0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMkY291bnRyeTFfbGFuZ3VhZ2UgPC0gYXMuZmFjdG9yKG5ld19zcG9rZW5fbGFuZ3VhZ2VzJGNvdW50cnkxX2xhbmd1YWdlKQ0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMkY291bnRyeTJfbGFuZ3VhZ2UgPC0gYXMuZmFjdG9yKG5ld19zcG9rZW5fbGFuZ3VhZ2VzJGNvdW50cnkyX2xhbmd1YWdlKQ0KbmV3X3Nwb2tlbl9sYW5ndWFnZXMkY291bnRyeTNfbGFuZ3VhZ2UgPC0gYXMuZmFjdG9yKG5ld19zcG9rZW5fbGFuZ3VhZ2VzJGNvdW50cnkzX2xhbmd1YWdlKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShuZXdfc3Bva2VuX2xhbmd1YWdlcykNCmBgYA0KDQpgYGB7cn0NCm1vdmllcyA8LSBjYmluZChtb3ZpZXMsIG5ld19zcG9rZW5fbGFuZ3VhZ2VzKQ0KYGBgDQoNCmBgYHtyfQ0KIyBSZW1vdmUgdGhlIG9yaWdpbmFsICdzcG9rZW5fbGFuZ3VhZ2VzJyBjb2x1bW4gZnJvbSB0aGUgJ21vdmllcycgZGF0YSBmcmFtZQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgDQogIHNlbGVjdCgtc3Bva2VuX2xhbmd1YWdlcykNCmBgYA0KDQojIyMgcHJvZHVjdGlvbl9jb21wYW5pZXMNCmBgYHtyfQ0KbmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzIDwtIHN0cl9zcGxpdF9maXhlZChtb3ZpZXMkcHJvZHVjdGlvbl9jb21wYW5pZXMsICI6IiwgbiA9IEluZikNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXNbLDE6Nl0NCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXNbLCBjKDIsNCw2KV0NCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyA8LSBhcy5kYXRhLmZyYW1lKG5ld19wcm9kdWN0aW9uX2NvbXBhbmllcykNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMgJT4lIA0KICBtdXRhdGUoY29tcGFueTEgPSBzdHJfcmVwbGFjZV9hbGwobmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzJFYxLCAiW1s6cHVuY3Q6XV0iLCAiICIpKQ0KbmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzIDwtIG5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyAlPiUgDQogIG11dGF0ZShjb21wYW55MiA9IHN0cl9yZXBsYWNlX2FsbChuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMkVjIsICJbWzpwdW5jdDpdXSIsICIgIikpDQpuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMgPC0gbmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzICU+JSANCiAgbXV0YXRlKGNvbXBhbnkzID0gc3RyX3JlcGxhY2VfYWxsKG5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyRWMywgIltbOnB1bmN0Ol1dIiwgIiAiKSkNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyRjb21wYW55MSA8LSBzdHJfcmVtb3ZlKG5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyRjb21wYW55MSwiaWQiKQ0KbmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzJGNvbXBhbnkyIDwtIHN0cl9yZW1vdmUobmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzJGNvbXBhbnkyLCJpZCIpDQpuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMkY29tcGFueTMgPC0gc3RyX3JlbW92ZShuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMkY29tcGFueTMsImlkIikNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyA8LSBuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXNbLDQ6Nl0NCmBgYA0KDQpgYGB7cn0NCiMgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgaW4gY29tcGFueSBjb2x1bW5zDQpuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMgPC0gbmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzICU+JSANCiAgbXV0YXRlKGNvbXBhbnkxID0gc3RyX3RyaW0oY29tcGFueTEpLA0KICAgICAgICAgY29tcGFueTIgPSBzdHJfdHJpbShjb21wYW55MiksDQogICAgICAgICBjb21wYW55MyA9IHN0cl90cmltKGNvbXBhbnkzKSkNCmBgYA0KDQpgYGB7cn0NCm5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyRjb21wYW55MSA8LSBhcy5mYWN0b3IobmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzJGNvbXBhbnkxKQ0KbmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzJGNvbXBhbnkyIDwtIGFzLmZhY3RvcihuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMkY29tcGFueTIpDQpuZXdfcHJvZHVjdGlvbl9jb21wYW5pZXMkY29tcGFueTMgPC0gYXMuZmFjdG9yKG5ld19wcm9kdWN0aW9uX2NvbXBhbmllcyRjb21wYW55MykNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkobmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzKQ0KYGBgDQoNCmBgYHtyfQ0KbW92aWVzIDwtIGNiaW5kKG1vdmllcywgbmV3X3Byb2R1Y3Rpb25fY29tcGFuaWVzKQ0KYGBgDQoNCmBgYHtyfQ0KIyBSZW1vdmUgdGhlIG9yaWdpbmFsICdwcm9kdWN0aW9uX2NvbXBhbmllcycgY29sdW1uIGZyb20gdGhlICdtb3ZpZXMnIGRhdGEgZnJhbWUNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIA0KICBzZWxlY3QoLXByb2R1Y3Rpb25fY29tcGFuaWVzKQ0KYGBgDQoNCiMjIE91dCBvZiBSYW5nZSBWYWx1ZXMNCg0KKipWYXJpYWJsZXMgdGhhdCByZXF1aXJlIHRvIGJlIGNoZWNrZWQuKioNCg0KKiBgYnVkZ2V0YDogRG9lcyBub3QgaGF2ZSBhIHJhbmdlLCBidXQgY291bGQgYmUgaW1wb3J0YW50IHRvIGRldGVjdCBvdXRsaWVycyBmb3IgZnVydGhlciBhbmFseXNpcyAgICAgICANCiogYHBvcHVsYXJpdHlgOiBIYXMgYSByYW5nZSBmcm9tIDAgdG8gMTAwICAgICAgIA0KKiBgcnVudGltZWA6IERvZXMgbm90IGhhdmUgYSByYW5nZSwgYnV0IGNvdWxkIGJlIGltcG9ydGFudCB0byBkZXRlY3Qgb3V0bGllcnMgZm9yIGZ1cnRoZXIgYW5hbHlzaXMgICAgICAgIA0KKiBgdm90ZV9hdmVyYWdlYDogSGFzIGEgcmFuZ2UgZnJvbSAwIHRvIDEwICAgICAgIA0KKiBgdm90ZV9jb3VudGA6IERvZXMgbm90IGhhdmUgYSByYW5nZSwgYnV0IGNvdWxkIGJlIGltcG9ydGFudCB0byBkZXRlY3Qgb3V0bGllcnMgZm9yIGZ1cnRoZXIgYW5hbHlzaXMgIA0KKiBgcmV2ZW51ZWA6IHRvbyBtYW55IG1vdmllcyB3aXRoIDAgcmV2ZW51ZSwgY291bGQgYmUgYmV0dGVyIHRvIGltcHV0YXRlIG9yIHJlbW92ZSB0aG9zZSB2YWx1ZXMNCg0KIyMjIGJ1ZGdldA0KDQpgYGB7cn0NCiMgR2VuZXJhdGUgYW4gaGlzdG9ncmFtDQpnZ3Bsb3QobW92aWVzLGFlcyhidWRnZXQpKStnZW9tX2hpc3RvZ3JhbSgpDQpgYGANCg0KYGBge3J9DQojIFNvcnQgYW5kIG9idGFpbiBoaWdoZXN0IDEwIGFuZCBsb3dlc3QgMTAgcm93cyBieSBidWRnZXQNCnNvcnRlZF9idWRnZXQgPC0gc29ydChtb3ZpZXMkYnVkZ2V0KQ0KdGFpbChzb3J0ZWRfYnVkZ2V0LDEwKSAlPiUgZm9ybWF0KHNjaWVudGlmaWMgPSBGQUxTRSkNCmhlYWQoc29ydGVkX2J1ZGdldCwxMCkNCiMgQ291bnQgemVyb2VzDQptb3ZpZXMgJT4lIGNvdW50KGJ1ZGdldCA9PSAwKQ0Kc3VtbWFyeShtb3ZpZXMkYnVkZ2V0KQ0KYGBgDQpJdCBpcyBoaWdobHkgdW5saWtlbHkgdGhhdCBhIG1vdmllIGhhcyBhIGNvc3Qgb2YgMCBkb2xsYXJzIHRvIHByb2R1Y2UsIGFuZCBkdWUgdG8gdGhlIGhpZ2ggYW1vdW50IG9mIG1vdmllcyB0aGF0IGhhdmUgdGhpcyBidWRnZXQgaXQgY291bGQgbWVhbiB0aGUgYGJ1ZGdldGAgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUuIEFuIGltcHV0YXRpb24gbWV0aG9kIG11c3QgYmUgYXBwbGllZCBpbiB0aGlzIGNhc2UuDQoNCiMjIyByZXZlbnVlDQoNCmBgYHtyfQ0KIyBHZW5lcmF0ZSBhbiBoaXN0b2dyYW0NCmdncGxvdChtb3ZpZXMsYWVzKHJldmVudWUpKStnZW9tX2hpc3RvZ3JhbSgpDQpgYGANCg0KYGBge3J9DQojIFNvcnQgYW5kIG9idGFpbiBoaWdoZXN0IDEwIGFuZCBsb3dlc3QgMTAgcm93cyBieSBidWRnZXQNCnNvcnRlZF9yZXZlbnVlIDwtIHNvcnQobW92aWVzJHJldmVudWUpDQp0YWlsKHNvcnRlZF9yZXZlbnVlLDEwKSAlPiUgZm9ybWF0KHNjaWVudGlmaWMgPSBGQUxTRSkNCmhlYWQoc29ydGVkX3JldmVudWUsMTApDQojIENvdW50IHplcm9lcw0KbW92aWVzICU+JSBjb3VudChyZXZlbnVlID09IDApDQpzdW1tYXJ5KG1vdmllcyRyZXZlbnVlKQ0KYGBgDQpCZWNhdXNlIGFuIGltcHV0YXRpb24gd2lsbCBiZSBkb25lIGZvciBgYnVkZ2V0YCwgdGhlIHNhbWUgaGFzIHRvIGJlIGRvbmUgdG8gYHJldmVudWVgIHRvIGJhbGFuY2Ugb3V0IHRoZSBkYXRhIGFuZCBnZXQgcmlkIG9mIGl0J3Mgdm9sYXRpbGl0eS4NCg0KIyMjIHBvcHVsYXJpdHkNCmBgYHtyfQ0KIyBHZW5lcmF0ZSBhbiBoaXN0b2dyYW0NCmdncGxvdChtb3ZpZXMsYWVzKHBvcHVsYXJpdHkpKStnZW9tX2hpc3RvZ3JhbShiaW5zPTEwKSArIHhsaW0oMCwxMDApDQpgYGANCmBgYHtyfQ0KIyBTb3J0IGFuZCBvYnRhaW4gaGlnaGVzdCAxMCBhbmQgbG93ZXN0IDEwIHJvd3MgYnkgcG9wdWxhcml0eQ0Kc29ydGVkX3BvcHVsYXJpdHkgPC0gc29ydChtb3ZpZXMkcG9wdWxhcml0eSkNCnRhaWwoc29ydGVkX3BvcHVsYXJpdHksMTApDQpoZWFkKHNvcnRlZF9wb3B1bGFyaXR5LDEwKQ0KIyBDb3VudCB6ZXJvZXMNCm1vdmllcyAlPiUgY291bnQocG9wdWxhcml0eSA9PSAwKQ0Kc3VtbWFyeShtb3ZpZXMkcG9wdWxhcml0eSkNCmBgYA0KVGhlcmUgYXJlIHNvbWUgbW92aWVzIHRoYXQgZXhjZWVkIHRoZSAxMDAgcG9pbnRzIGxpbWl0LCB0aGUgdmFyaWFibGUgbXVzdCBiZSBpbXB1dGF0ZWQgZm9yIGEgYmV0dGVyIGFuYWx5c2lzIG9mIHRoZSBkYXRhLg0KDQojIyMgcnVudGltZQ0KYGBge3J9DQojIEdlbmVyYXRlIGFuIGhpc3RvZ3JhbQ0KZ2dwbG90KG1vdmllcyxhZXMocnVudGltZSkpK2dlb21faGlzdG9ncmFtKCkNCmBgYA0KDQpgYGB7cn0NCiMgU29ydCBhbmQgb2J0YWluIGhpZ2hlc3QgMTAgYW5kIGxvd2VzdCAxMCByb3dzIGJ5IHJ1bnRpbWUNCnNvcnRlZF9ydW50aW1lIDwtIHNvcnQobW92aWVzJHJ1bnRpbWUpDQp0YWlsKHNvcnRlZF9ydW50aW1lLDEwKQ0KaGVhZChzb3J0ZWRfcnVudGltZSwxMCkNCiMgQ291bnQgemVyb2VzDQptb3ZpZXMgJT4lIGNvdW50KHJ1bnRpbWUgPT0gMCkNCnN1bW1hcnkobW92aWVzJHJ1bnRpbWUpDQpgYGANClNvbWUgbW92aWVzIGxhc3QgMCBtaW51dGVzLCBhIG1vdmllIGNhbm5vdCBoYXZlIHRoYXQgZHVyYXRpb24sIGFuIGltcHV0YXRpb24gbXVzdCBiZSBkb25lIHRvIGZpeCBpdC4NCg0KIyMjIHZvdGVfYXZlcmFnZQ0KYGBge3J9DQojIEdlbmVyYXRlIGFuIGhpc3RvZ3JhbQ0KZ2dwbG90KG1vdmllcyxhZXModm90ZV9hdmVyYWdlKSkrZ2VvbV9oaXN0b2dyYW0oKQ0KYGBgDQoNCmBgYHtyfQ0KIyBTb3J0IGFuZCBvYnRhaW4gaGlnaGVzdCAxMCBhbmQgbG93ZXN0IDEwIHJvd3MgYnkgdm90ZV9hdmVyYWdlDQpzb3J0ZWRfdm90ZV9hdmVyYWdlIDwtIHNvcnQobW92aWVzJHZvdGVfYXZlcmFnZSkNCnRhaWwoc29ydGVkX3ZvdGVfYXZlcmFnZSwxMCkNCmhlYWQoc29ydGVkX3ZvdGVfYXZlcmFnZSwxMCkNCnN1bW1hcnkobW92aWVzJHZvdGVfYXZlcmFnZSkNCmBgYA0KVm90ZSBhdmVyYWdlcyBhcmUgaW4gb3JkZXIsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFwcGx5aW5nIGFuIGltcHV0YXRpb24gbWV0aG9kLg0KDQojIyMgdm90ZV9jb3VudA0KYGBge3J9DQojIEdlbmVyYXRlIGFuIGhpc3RvZ3JhbQ0KZ2dwbG90KG1vdmllcyxhZXModm90ZV9jb3VudCkpK2dlb21faGlzdG9ncmFtKCkNCmBgYA0KDQpgYGB7cn0NCiMgU29ydCBhbmQgb2J0YWluIGhpZ2hlc3QgMTAgYW5kIGxvd2VzdCAxMCByb3dzIGJ5IHZvdGVfY291bnQNCnNvcnRlZF92b3RlX2NvdW50IDwtIHNvcnQobW92aWVzJHZvdGVfY291bnQpDQp0YWlsKHNvcnRlZF92b3RlX2NvdW50LDEwKQ0KaGVhZChzb3J0ZWRfdm90ZV9jb3VudCwxMCkNCiMgQ291bnQgemVyb2VzDQptb3ZpZXMgJT4lIGNvdW50KHZvdGVfY291bnQgPT0gMCkNCnN1bW1hcnkobW92aWVzJHZvdGVfY291bnQpDQpgYGANClZvdGUgY291bnRzIGFyZSBpbiBvcmRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBhcHBseSBpbXB1dGF0aW9uIG1ldGhvZHMgdG8gdGhpcyB2YXJpYWJsZS4NCg0KIyMgSW1wdXRhdGlvbg0KT25seSA0IHZhcmlhYmxlcyBtdXN0IGJlIGltcHV0YXRlZCBiYXNlZCBvbiB0aGUgc2VhcmNoIG9mIG91dCBvZiByYW5nZSB2YWx1ZXMgZG9uZSBiZWZvcmUgd2hpY2ggYXJlIHRoZSBmb2xsb3dpbmc6ICANCg0KKiBgYnVkZ2V0YDogVmFsdWVzIGFyZSBnb2luZyB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBtZWFuIHRvIGF2b2lkIHRoZSBtdWx0aXBsZSB6ZXJvZXMgZnJvbSBkaXN0b3J0aW5nIHN0YXRpc3RpY2FsIGRlc2NyaXB0b3JzLiAgICANCiogYHJldmVudWVgOiBUaGUgc2FtZSBjYXNlIGFzIGluIGJ1ZGdldA0KKiBgcG9wdWxhcml0eWA6IE91dCBvZiByYW5nZSB2YWx1ZXMgYXJlIGdvaW5nIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJhbmdlIGxpbWl0IG9mIDEwMCB0byBhdm9pZCBlbGltaW5hdGluZyB0aGVtIGZyb20gdGhlIGRhdGFzZXQuICAgICAgICAgIA0KKiBgcnVudGltZWA6IFZhbHVlcyBhcmUgZ29pbmcgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgbWVhbiB0byBhdm9pZCB0aGUgbXVsdGlwbGUgemVyb2VzIGZyb20gZGlzdG9ydGluZyBzdGF0aXN0aWNhbCBkZXNjcmlwdG9ycy4NCg0KSXQgc2VlbXMgdGhhdCB0aGVyZSBpcyB2ZXJ5IGZldyBkYXRhIHRoYXQgd2FzIGxlZnQgYXMgTkEgaW4gdGhlIGRhdGFiYXNlIGFmdGVyIHRoZSBjbGVhbmluZyBwcm9jZXNzIGRvbmUgZHVyaW5nIHRoZSBkZWxpdmVyYWJsZSBvZiB0aGUgcHJvZ3Jlc3Mgc2V0dXAsIGhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgbWlzc2luZyBkYXRhIGluIHJldmVudWUsIHJ1bnRpbWUgYW5kIHZvdGVzIHdoaWNoIGNvdWxkIGJlIGFkcmVzc2VkIHdpdGggbWljZS4NCg0KIyMjIEFkdmFuY2VkIEltcHV0YXRpb24gdXNpbmcgTUlDRSAgICAgICAgICAgIA0KRm9yIGltcHV0YXRpb24gd2Ugd2lsbCBiZSB1c2luZyB0aGUgKk1JQ0UqIHBhY2thZ2UgYWxvbmcgd2l0aCB0aGUgdmFyaWFibGVzIGRldGVjdGVkIGJlZm9yZSB3aGljaCBhcmUgYHJldmVudWVgLCBgcnVudGltZWAsIGB2b3RlX2NvdW50YCBhbmQgYHZvdGVfYXZlcmFnZWAuICANCg0KIyMjIyBOb3RlIA0KICAgIA0KSSBlbmNvdW50ZXJlZCB0ZWNobmljYWwgZGlmZmljdWx0aWVzIHdoaWxlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSAqTUlDRSogbGlicmFyeSBmb3IgbXVsdGlwbGUgaW1wdXRhdGlvbi4gRGVzcGl0ZSBlZmZvcnRzIHRvIHJlc29sdmUgdGhlc2UgaXNzdWVzIHVzaW5nIGFsdGVybmF0aXZlIHBsYXRmb3JtcyBzdWNoIGFzICoqcG9zaXQqKiBhbmQgKipHb29nbGUgQ29sYWIqKiwgSSB3YXMgdW5hYmxlIHRvIG92ZXJjb21lIHRoZSBjaGFsbGVuZ2VzLiBBcyBhIHJlc3VsdCwgSSBhY2tub3dsZWRnZSB0aGF0IG5vdCB1c2luZyB0aGUgKk1JQ0UqIGxpYnJhcnkgbGltaXRlZCBteSBhYmlsaXR5IHRvIHBlcmZvcm0gbXVsdGlwbGUgaW1wdXRhdGlvbiBhbmQgYWRkcmVzcyBtaXNzaW5nIGRhdGEgY29tcHJlaGVuc2l2ZWx5LiBJbnN0ZWFkLCBJIGVtcGxveWVkIGFsdGVybmF0aXZlIGFwcHJvYWNoZXMgdG8gaGFuZGxlIG1pc3NpbmcgZGF0YS4gSG93ZXZlciwgaXQncyBpbXBvcnRhbnQgdG8gYWNrbm93bGVkZ2UgdGhhdCB0aGVzZSBtZXRob2RzIG1heSBpbnRyb2R1Y2UgYWRkaXRpb25hbCB1bmNlcnRhaW50eSBhbmQgcG90ZW50aWFsIGJpYXNlcyBpbnRvIG15IGFuYWx5c2lzLCBpbXBhY3RpbmcgdGhlIHZhbGlkaXR5IG9mIHRoZSByZXN1bHRzLg0KDQpgYGB7cn0NCiMgU3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGltcHV0YXRpb24NCiNtb3ZpZXNfbWljZSA8LSBtaWNlKG1vdmllczIsbT0xLG1heGl0PTUwLG1ldGg9J3BtbScsc2VlZD01MDApDQoNCiMgU3VtbWFyaXplcyB0aGUgdGhlIGltcHV0YXRpb24gY2hhcmFjdGVyaXN0aWNzIGRlZmluZWQgYmVmb3JlDQojc3VtbWFyeShtb3ZpZXNfbWljZSkNCg0KIyBBbGxvd3MgdG8gc2VlIHRoZSByZXN1bHQgTUlDRSBhc3NpZ25lZCB0byBtaXNzaW5nIHZhbHVlcw0KI21vdmllc19taWNlJGltcCRydW50aW1lDQoNCiMgRmlsbCB0aGUgZGF0YXNldCB3aXRoIHJlc3VsdHMgZnJvbSBmaXJzdCBvcHRpb24NCiMgbW92aWVzX2NsZWFuIDwtIGNvbXBsZXRlKG1vdmllc19taWNlLDEpDQoNCiMgU2VydmVzIGFzIGEgd2F5IHRvIGNoZWNrIGlmIGltcHV0YXRpb24gd2FzIGRvbmUgc3VjZXNzZnVsbHkNCiNzdW0oaXMubmEobW92aWVzX2NsZWFuKSkNCg0KIyBHZW5lcmF0ZXMgYSBkZW5zaXR5IHBsb3QNCiNkZW5zaXR5cGxvdChtb3ZpZXNfY2xlYW4pDQpgYGANCiAgICAgIA0KRGVuc2l0eSBwbG90IGNhbiBoZWxwIHRvIGRldGVybWluZSB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUgaW1wdXRhdGlvbiBpbiB0aGUgZGF0YXNldCwgaXQgaXMgcG9zc2libGUgdGhhdCBpbXB1dGF0aW9uIGlzIGxlc3MgcHJlY2lzZSBvbmNlIGl0IGdldCBwYXN0IGNlcnRhaW4gdmFsdWVzLCB0aGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRvIGNoZWNrIGFuZCB1c2Ugb3RoZXIgbWV0aG9kcyBpZiBuZWNlc3NhcnkuDQoNCiMjIyBidWRnZXQNCmBgYHtyfQ0Kc3VtbWFyeShtb3ZpZXMkYnVkZ2V0KQ0KYGBgDQpUaGUgYXZlcmFnZSBidWRnZXQgaXMgNCwyMjQsNTc5DQoNCmBgYHtyfQ0KIyBSZXBsYWNlIHplcm9lcyB3aXRoIHRoZSBidWRnZXQgbWVhbg0KbW92aWVzJGJ1ZGdldF9vcmlnaW5hbCA8LSBtb3ZpZXMkYnVkZ2V0ICAjIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGNvbHVtbg0KbW92aWVzJGJ1ZGdldCA8LSBpZmVsc2UobW92aWVzJGJ1ZGdldCA9PSAwLCBtZWFuKG1vdmllcyRidWRnZXQsIG5hLnJtID0gVFJVRSksIG1vdmllcyRidWRnZXQpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KG1vdmllcyRidWRnZXQpDQpgYGANCiMjIyByZXZlbnVlDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb3ZpZXMkcmV2ZW51ZSkNCmBgYA0KVGhlIGF2ZXJhZ2UgcmV2ZW51ZSBpcyAxMSwyMTAsMDAwDQoNCmBgYHtyfQ0KIyBSZXBsYWNlIHplcm9lcyB3aXRoIHRoZSByZXZlbnVlIG1lYW4NCm1vdmllcyRyZXZlbnVlX29yaWdpbmFsIDwtIG1vdmllcyRyZXZlbnVlICAjIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGNvbHVtbg0KbW92aWVzJHJldmVudWUgPC0gaWZlbHNlKG1vdmllcyRyZXZlbnVlID09IDAsIG1lYW4obW92aWVzJHJldmVudWUsIG5hLnJtID0gVFJVRSksIG1vdmllcyRyZXZlbnVlKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb3ZpZXMkcmV2ZW51ZSkNCmBgYA0KDQoNCiMjIyBwb3B1bGFyaXR5DQpgYGB7cn0NCnN1bW1hcnkobW92aWVzJHBvcHVsYXJpdHkpDQpgYGANCmBgYHtyfQ0KbW92aWVzIDwtIG1vdmllcyAlPiUNCiAgbXV0YXRlKHBvcHVsYXJpdHlfbWF4ID0gcG1pbihwbWF4KHBvcHVsYXJpdHksIDApLCAxMDApKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb3ZpZXMkcG9wdWxhcml0eV9tYXgpDQpgYGANCiMjIyBydW50aW1lICAgDQpgYGB7cn0NCnN1bW1hcnkobW92aWVzJHJ1bnRpbWUpDQpgYGANCkEgbW92aWUgYXZlcmFnZSBydW50aW1lIGlzIDk0LjEzIG1pbnV0ZXMNCg0KYGBge3J9DQojIFJlcGxhY2UgemVyb2VzIGFuZCBOQSB2YWx1ZXMgaW4gdGhlICdydW50aW1lJyBjb2x1bW4gd2l0aCB0aGUgYXZlcmFnZSBydW50aW1lICg5NCkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lDQogIG11dGF0ZShydW50aW1lID0gaWZlbHNlKHJ1bnRpbWUgPT0gMCB8IGlzLm5hKHJ1bnRpbWUpLCA5NCwgcnVudGltZSkpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KG1vdmllcyRydW50aW1lKQ0KYGBgDQpTaW5jZSBtdWx0aXBsZSB2YWx1ZXMgd2VyZSBOQSdzIHRoZSB2YWx1ZXMgd2VyZSBhbHNvIHJlcGxhY2VkIHdpdGggdGhlIGF2ZXJhZ2UNCg0KIyMgRHVwbGljYXRlcw0KTW9zdCBvZiB0aGUgdmFyaWFibGVzIGluIHRoZXNlIGRhdGFzZXQgZG9lcyBub3QgcmVxdWlyZSB0byBjaGVjayBmb3IgZHVwbGljYXRlcyBhcyBmb3IgZXhhbXBsZSBpdCBpcyBjb21wbGV0ZWx5IG5vcm1hbCB0aGF0IG1vdmllcyBzaGFyZSB0aGUgc2FtZSBnZW5yZXMsIHNwb2tlbiBsYW5ndWFnZSwgY29tcGFueSwgZXRjLiBIb3dldmVyIHRoZXJlIGFyZSB0aHJlZSB2YXJpYWJsZXMgdGhhdCBtdXN0IGJlIGNoZWNrZWQgZm9yIHBhcnRpYWwgZHVwbGljYXRlcyB3aGljaCBhcmUgdGhlIGZvbGxvd2luZy4gICAgDQoNCiogaWQgICAgDQoqIGltZGJfaWQgICAgDQoqIG9yaWdpbmFsX3RpdGxlICANCg0KIyMjIEZ1bGwgRHVwbGljYXRlcw0KYGBge3J9DQojIENvdW50aW5nIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVsbCBkdXBsaWNhdGVzDQpzdW0oZHVwbGljYXRlZChtb3ZpZXMpKQ0KYGBgDQpgYGB7cn0NCiMgQ3JlYXRpbmcgYSBkYXRhIGZyYW1lIGZvciBmdWxsIGR1cGxpY2F0ZXMgdmlzdWFsaXphdGlvbg0KZHVwbGljYXRlZF9yb3dzIDwtIG1vdmllc1tkdXBsaWNhdGVkKG1vdmllcyksIF0NCmR1cGxpY2F0ZWRfcm93cw0KYGBgDQpgYGB7cn0NCiMgUmVtb3ZlIGZ1bGwgZHVwbGljYXRlcw0KbW92aWVzIDwtIGRpc3RpbmN0KG1vdmllcykNCmBgYA0KDQpgYGB7cn0NCiMgVmVyaWZ5IHdoZXRoZXIgZnVsbCBkdXBsaWNhdGVzIHJlbWFpbiBvbiB0aGUgZGF0YSBzZXQNCnN1bShkdXBsaWNhdGVkKG1vdmllcykpDQpgYGANCkZ1bGwgRHVwbGljYXRlcyB3ZXJlIGVsaW1pbmF0ZWQgZnJvbSB0aGUgZGF0YXNldC4NCg0KIyMjIFBhcnRpYWwgRHVwbGljYXRlcyAgIA0KYGBge3J9DQojIENoZWNrIGZvciBwYXJ0aWFsIGR1cGxpY2F0ZXMNCm1vdmllcyAlPiUgDQogIGNvdW50KGlkKSAlPiUgDQogIGZpbHRlcihuID4gMSkNCm1vdmllcyAlPiUgDQogIGNvdW50KGltZGJfaWQpICU+JSANCiAgZmlsdGVyKG4gPiAxKQ0KbW92aWVzICU+JSANCiAgY291bnQob3JpZ2luYWxfdGl0bGUpICU+JSANCiAgZmlsdGVyKG4gPiAxKQ0KDQpgYGANCg0KVGhlcmUgYXJlIHBhcnRpYWwgZHVwbGljYXRlcyB3aGVyZSBtb3ZpZXMgaGF2ZSB0aGUgc2FtZSBpZCwgaW1kYl9pZCBvciBvcmlnaW5hbF90aXRsZSBob3dldmVyIHRoZXkgaGF2ZSB2YXJpYXRpb24gaW4gMSBvciBtb3JlIGNvbHVtbnMsIGluIHRoZSBjYXNlIG9mIG9yaWdpbmFsIHRpdGxlIGl0IHdhcyBmb3VuZCB0aGF0IHNvbWUgbW92aWVzIGhhZCB0aGUgc2FtZSBuYW1lLCBob3dldmVyIHRoZWlyIHByb2R1Y2VyLCBydW50aW1lLCB5ZWFyIGFuZCBvdmVydmlldyB3ZXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50IG1lYW5pbmcgdGhhdCB0aG9zZSBtb3ZpZXMgYXJlIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIuIA0KDQpJbiB0aGUgY2FzZSBvZiBpZCBhbmQgaW1kYl9pZCBhZnRlciBmaWx0ZXJpbmcgdGhlIGNhc2VzIGluIHRoZSBtb3ZpZXMgZGF0YSBmcmFtZSBpdCB3YXMgZm91bmQgYWxsIHRoZSBjb2x1bW5zIG1hdGNoZWQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHBvcHVsYXJpdHksIHRoaXMgY291bGQgYmUgY2F1c2VkIGlmIHRoZSBzYW1lIG1vdmllIHdhcyByZWdpc3RlcmVkIHR3aWNlIGJ5IGFjY2lkZW50IGJ1dCBvbiBhIGRpZmZlcmVudCB0aW1lLCBjYXVzaW5nIHRoZSBwb3B1bGFyaXR5IHNoaWZ0LiBJbiBvcmRlciB0byBzb2x2ZSB0aGlzIHByb2JsZW0gdGhlIG1heGltdW0gcG9wdWxhcml0eSB3aWxsIHVzZWQgdG8gbWVyZ2UgdGhlIGR1cGxpY2F0ZXMuIEZ1cnRoZXIgYWN0aW9uIHdpbGwgYmUgbWFkZSBkZXBlbmRpbmcgb2YgdGhlIHJlc3VsdC4NCg0KIyMjIyBpbWRiX2lkIGFuZCBpZA0KYGBge3J9DQojIEtlZXBzIHRoZSBtYXhpbXVtIHBvcHVsYXJpdHkgdmFsdWUgb2YgYSB2YXJpYWJsZSBhbmQgZGVsZXRlIGl0cyBkdXBsaWNhdGUNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIGdyb3VwX2J5KGltZGJfaWQpICU+JSBzbGljZV9tYXgocG9wdWxhcml0eV9tYXgpICU+JSB1bmdyb3VwKCkNCmBgYA0KDQpgYGB7cn0NCiMgQ2hlY2sgaG93IG1hbnkgcGFydGlhbCBkdXBsaWNhdGVzIHJlbWFpbiBvbiB0aGUgZGF0YXNldC4NCm1vdmllcyAlPiUgDQogIGNvdW50KGlkKSAlPiUgDQogIGZpbHRlcihuID4gMSkNCm1vdmllcyAlPiUgDQogIGNvdW50KGltZGJfaWQpICU+JSANCiAgZmlsdGVyKG4gPiAxKQ0KbW92aWVzICU+JSANCiAgY291bnQob3JpZ2luYWxfdGl0bGUpICU+JSANCiAgZmlsdGVyKG4gPiAxKQ0KYGBgDQoNCk1vc3Qgb2YgdGhlIHBhcnRpYWwgZHVwbGljYXRlcyBmb3IgdGhlIGlkIGNvbHVtbnMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQsIHRoZXJlIGFyZSBvbmx5IHRocmVlIGluc3RhbmNlcyB3aGVyZSBhbiBpbWRiX2lkIGlzIGR1cGxpY2F0ZWQgYW5kIHRoaXMgdmFsdWUgaXMgbGlrZWx5IGludmFsaWQuDQoNCmBgYHtyfQ0KIyBTZWUgcmVtYWluaW5nIHBhcnRpYWwgaW1kYl9pZCBkdXBsaWNhdGVzDQptb3ZpZXMgJT4lIGZpbHRlcihpbWRiX2lkICVpbiUgYygiMCIpKQ0KYGBgDQpMb29raW5nIGF0IHRoZSByZW1haW5pbmcgZHVwbGljYXRlcyBpdCBzZWVtcyBtb3N0IG9mIHRoZSBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nIHdoaWxlIHRoZSByZXN0IGlzIG91dCBvZiBwbGFjZSwgZHVlIHRvIHRoaXMgYSBwcm9wZXIgYWRqdXN0bWVudCBpbiB0aGUgZGF0YXNldCBjb3VsZCBiZSBkaWZmaWN1bHQgdG8gZG8sIGFuZCB3aXRoIHRoZWlyIGltZGJfaWQgbWlzc2luZyBpdCBjb3VsZCBiZSBoYXJkIHRvIG1hbnVhbGx5IGVudGVyIHRoZSBpbmZvcm1hdGlvbiwgdGhlcmVmb3JlIHRoZXNlIGFzcGVjdHMgaW4gY29tYmluYXRpb24gdG8gdGhlIGxvdyBhbW91bnQgb2YgZGF0YSB0aGUgZHVwbGljYXRlcyByZXByZXNlbnQgdG8gdGhlIGRhdGFzZXQsIHRoZSB0aHJlZSByb3dzIGFyZSBnb2luZyB0byBiZSBkZWxldGVkIG9uIHRoZWlyIGVudGlyZXR5Lg0KDQpgYGB7cn0NCiMgUmVtb3ZlIHJvd3Mgd2l0aCBhbiBpbWRiX2lkIG9mIDAgDQptb3ZpZXMgPC0gZmlsdGVyKG1vdmllcyxpbWRiX2lkICE9IDApDQpgYGANCg0KYGBge3J9DQojIEVuc3VyZSB0aGUgcm93cyB3aXRoIGFuIGltZGJfaWQgb2YgMCB3ZXJlIGVsaW1pbmF0ZWQNCm1vdmllcyAlPiUgDQogIGNvdW50KGltZGJfaWQpICU+JSANCiAgZmlsdGVyKG4gPiAxKQ0KYGBgDQoNCkFsdGhvdWdoIHBhcnRpYWwgZHVwbGljYXRlcyByZW1haW4gZm9yIHRoZSBvcmlnaW5hbF90aXRsZSB0aGlzIGFyZSBnb2luZyB0byBiZSBrZXB0IGluIHRoZSBkYXRhc2V0LCB3aGVuIGNoZWNraW5nIHRoZSBkYXRhc2V0IHRoZSB3ZXJlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIGFsbCB0aGUgY29sdW1ucywgYWxzbyBnaXZlbiBlYWNoIG9mIHRob3NlIGR1cGxpY2F0ZXMgaGFzIGl0cyBvd24gaWQgYW5kIGltZGJfaWQgZXZlbiBpZiB0aGUgdGl0bGUgc3VnZ2VzdCB0aGV5IGFyZSB0aGUgc2FtZSBtb3ZpZSwgaW4gcmVhbGl0eSB0aGV5IGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCBpbiBhbGwgYXNwZWN0cywgdGhlcmVmb3JlIHRoZXNlIHJvd3MgbXVzdCBiZSBzZWVuIGFzIGRpZmZlcmVudCBtb3ZpZXMgYW5kIG5vdCBkdXBsaWNhdGVzLg0KDQojIyBNYW5hZ2luZyBGYWN0b3IgTGV2ZWxzDQpFbGlnaWJsZSB2YXJpYWJsZXMgd2VyZSBjb252ZXJ0ZWQgdG8gZmFjdG9ycyBvbiB0aGUgcHJldmlvdXMgc3RlcHMgYW5kIG9uY2UgdGhlIGNvbHVtbnMgd2VyZSBwcm9wZXJseSBjbGVhbmVkLg0KYGBge3J9DQojIENoZWNrIGRhdGEgdHlwZSBmb3IgZWFjaCB2YXJpYWJsZQ0KZ2xpbXBzZShtb3ZpZXMpDQpgYGANCioqVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgd2lsbCBiZSBjb25zaWRlcmVkIGFzIGZhY3RvcnM6ICoqICAgIA0KKiBgb3JpZ2luYWxfbGFuZ3VhZ2VgICAgICANCiogYHN0YXR1c2AgICAgICANCiogYGdlbnJlMS0zYCAgICAgDQoqIGBjb21wYW55MS0zYCAgICAgIA0KKiBgY291bnRyeTEtM2AgICAgIA0KKiBgY291bnRyeTEtM19sYW5ndWFnZWANCiAgICAgDQpJbiB0aGlzIHN0YWdlIGZhY3RvciBsZXZlbHMgZm9yIGVhY2ggdmFyaWFibGUgd2lsbCBiZSBleHBsb3JlZCBpbiBvcmRlciB0byBmaW5kIGluY29uc2lzdGVuY2llcyBvciBlcnJvcnMgaW4gdGhlIGF2YWlsYWJsZSBjYXRlZ29yaWVzIGZvciBhIHZhcmlhYmxlLg0KDQojIyMgb3JpZ2luYWxfbGFuZ3VhZ2UNCmBgYHtyfQ0KIyBMb29raW5nIGZvciB0aGUgbGV2ZWxzIG9mIGEgZmFjdG9yLCBkcm9wbGV2ZWxzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGZhY3RvciBvbmx5IHRha2VzIGludG8gYWNjb3VudCB0aGUgbGV2ZWxzIHRoYXQgc3RpbGwgZXhpc3QgaW4gdGhlIGRhdGFzZXQuDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkb3JpZ2luYWxfbGFuZ3VhZ2UpKQ0KYGBgDQpCeSBleGFtaW5pbmcgdGhlIGxldmVscyBvZiB0aGUgb3JpZ2luYWwgbGFuZ3VhZ2Ugb25seSB0aGUgbGV2ZWwgaW4gYmxhbmsgbXVzdCBiZSBmdXJ0aGVyIGludmVzdGlnYXRlZCwgb3RoZXIgdGhhbiB0aGF0IGFsbCByZW1haW5pbmcgZmFjdG9yIGxldmVscyBhcmUgdmFsaWQgYW5kIGhhdmUgdGhlIHNhbWUgZm9ybWF0dGluZy4NCg0KYGBge3J9DQojIENvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aGluIGEgbGV2ZWwNCm1vdmllcyAlPiUgY291bnQob3JpZ2luYWxfbGFuZ3VhZ2UpDQpgYGANCg0KVGhlcmUgYXJlIDExIG1vdmllcyBpbiB3aGljaCB0aGUgY29sdW1uIG9yaWdpbmFsX2xhbmd1YWdlIGRvZXMgbm90IGNvbnRhaW4gaW5mb3JtYXRpb24uDQoNCmBgYHtyfQ0KIyBTZWUgd2hpY2ggbW92aWVzIGRvZXMgbm90IGNvbnRhaW4gb3JpZ2luYWxfbGFuZ3VhZ2UNCm1vdmllcyAlPiUgZmlsdGVyKG9yaWdpbmFsX2xhbmd1YWdlID09ICIiKQ0KYGBgDQoNCiMjIyBzdGF0dXMgDQpgYGB7cn0NCiMgTG9va2luZyBmb3IgdGhlIGxldmVscyBvZiBhIGZhY3RvciwgZHJvcGxldmVscyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmYWN0b3Igb25seSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGxldmVscyB0aGF0IHN0aWxsIGV4aXN0IGluIHRoZSBkYXRhc2V0Lg0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJHN0YXR1cykpDQpgYGANClRoZSBzYW1lIGlzc3VlIGlzIHByZXNlbnQgb24gdGhlIGBvcmlnaW5hbF9sYW5ndWFnZWAgZm9yIHRoZXNlIHZhcmlhYmxlLCB3aXRoIG5vIG90aGVyIGluY29uc2lzdGVuY2llcyBlbmNvdW50ZXJlZC4gICAgDQoNCmBgYHtyfQ0KIyBDb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiBhIGxldmVsDQptb3ZpZXMgJT4lIGNvdW50KHN0YXR1cykNCmBgYA0KDQpJbiB0b3RhbCA4NCByb3dzIGNvbnRhaW5zIGEgYmxhbmsgYHN0YXR1c2AuICAgIA0KDQpgYGB7cn0NCiMgU2VlIHdoaWNoIG1vdmllcyBkb2VzIG5vdCBjb250YWluIGEgc3RhdHVzDQptb3ZpZXMgJT4lIGZpbHRlcihzdGF0dXMgPT0gIiIpDQpgYGANCg0KDQojIyMgZ2VucmUgdmFyaWFibGVzDQpgYGB7cn0NCiMgTG9va2luZyBmb3IgdGhlIGxldmVscyBvZiBhIGZhY3RvciwgZHJvcGxldmVscyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmYWN0b3Igb25seSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGxldmVscyB0aGF0IHN0aWxsIGV4aXN0IGluIHRoZSBkYXRhc2V0Lg0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGdlbnJlMSkpDQpgYGANCmBgYHtyfQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGdlbnJlMikpDQpgYGANCmBgYHtyfQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGdlbnJlMykpDQpgYGANCmBHZW5yZXNgIGFyZSBwcm9wZXJseSBkZXNjcmliZWQgb24gdGhlIGZhY3RvcnMsIHRoZSBvbmx5IG9ic2VydmF0aW9ucyBhcmUgdGhlIGJsYW5rIHZhbHVlcyBhbmQgYWxzbyB0aGF0IHRoZXJlIGlzIGEgMiBsZXR0ZXIgd2hpdGUgc3BhY2UgaW4gZWFjaCBmYWN0b3IsIHByb2JhYmx5IGR1ZSB0byB0aGUgY29sdW1uIHNlcGFyYXRpb24gcHJvY2VzcyB0aGF0IHdhcyBtYWRlIHRvIHRoZSBjb2x1bW5zIGluIEpTT04gZm9ybWF0Lg0KDQpgYGB7cn0NCiMgQ291bnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyB3aXRoaW4gYSBsZXZlbA0KbW92aWVzICU+JSBjb3VudChnZW5yZTEpDQptb3ZpZXMgJT4lIGNvdW50KGdlbnJlMikNCm1vdmllcyAlPiUgY291bnQoZ2VucmUzKQ0KYGBgDQpUaGVyZSBhcmUgMjQzNyByb3dzIGluIHRoZSBkYXRhc2V0IHdoZXJlIGBtb3ZpZXNgIGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIGdlbnJlLCBmb3IgdGhlIG90aGVyIHR3byB2YXJpYWJsZXMgdGhlIG51bWJlciBpbmNyZWFzZXMsIGhvd2V2ZXIgd2Ugd2lsbCBvbmx5IGZvY3VzIG9uIHRoZSBnZW5yZTEgdW5kZWZpbmVkIGdlbnJlcyBhcyBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBhIG1vdmllIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBnZW5yZS4NCg0KIyMjIGNvbXBhbnkgdmFyaWFibGVzDQpgYGB7cn0NCiMgTG9va2luZyBmb3IgdGhlIGxldmVscyBvZiBhIGZhY3RvciwgZHJvcGxldmVscyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmYWN0b3Igb25seSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGxldmVscyB0aGF0IHN0aWxsIGV4aXN0IGluIHRoZSBkYXRhc2V0LiBXZSB3aWxsIG9ubHkgdXNlIHRoZSBmaXJzdCA1MCBsZXZlbHMgZm9yIGRlbW9zdHJhdGlvbiBwdXJwb3Nlcy4NCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb21wYW55MSkpICU+JSBoZWFkKDUwKQ0KDQojVGhlIG90aGVyIHZhcmlhYmxlcyB3b24ndCBiZSBzaG93IGZvciBwcmVzZW50YXRpb24gcHVycG9zZXMgYnV0IHRoaXMgaXMgdGhlIGNvZGUgdGhhdCB3b3VsZCBzaG93IHRoZWlyIGxldmVscw0KI2xldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb21wYW55MikpDQojbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvbXBhbnkzKSkNCmBgYA0KTG9va2luZyBhdCB0aGUgZmFjdG9yIGxldmVscyBmb3IgdGhpcyBjYXRlZ29yaWVzLCBpdCBpcyBjbGVhciB0aGVyZSBhcmUgYSBsb3Qgb2YgY29tcGFuaWVzIGludm9sdmVkIGFuZCB0aGVyZWZvcmUgYSBsb3Qgb2YgbGV2ZWxzIHdpdGhpbiB0aGUgZmFjdG9ycy4NCg0KYGBge3J9DQptb3ZpZXMgJT4lIGNvdW50KGNvbXBhbnkxKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KbW92aWVzICU+JSBjb3VudChjb21wYW55MikgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCm1vdmllcyAlPiUgY291bnQoY29tcGFueTMpICU+JSBhcnJhbmdlKGRlc2MobikpDQpgYGANClRoZXJlIGFyZSB0d28gd2F5cyB0byBwcm9jZWVkIHdpdGggdGhpcyBpc3N1ZSwgYSBmaXJzdCBzb2x1dGlvbiBjb3VsZCBiZSB0byBvbmx5IGNvbnNpZGVyIGNvbXBhbmllcyB3aGljaCBoYXZlIHRoZSBtb3N0IGFtb3VudCBvZiBtb3ZpZXMgcHJvZHVjZWQgYXMgYSBsZXZlbHMgYW5kIHNtYWxsZXIgY29tcGFuaWVzIGNvbnNpZGVyIHRoZW0gYXMgb3RoZXJzLCB0aGUgb3RoZXIgc29sdXRpb24gd291bGQgYmUgdG8gZHJvcCB0aGlzIHZhcmlhYmxlIGFzIGEgZmFjdG9yIGFuZCByZXBsYWNlIGl0J3MgZGF0YSB0eXBlIGFzIGEgc3RyaW5nLiBXZSBjb25zaWRlciB0aGUgZmlyc3Qgc29sdXRpb24gaXMgdGhlIHdheSB0byBnbyBhcyBpdCB3b3VsZCBhbGxvdyB1cyB0byBzdGlsbCBtYWtlIGFuIGFuYWx5c2lzIG9mIHRoZSBjb21wYW5pZXMuDQoNCk90aGVyIGlzc3VlcyBhcmUgdGhlIHJvd3MgdGhhdCBjb250YWluIGEgYmxhbmsgYW5kIGFsc28gdGhhdCB0aGVyZSBpcyBhIDIgc3BhY2Ugd2hpdGUgc3BhY2UgYmVmb3JlIGVhY2ggY29tcGFueSBuYW1lLCB3aGljaCBhbHNvIHNob3VsZCBiZSBjb3JyZWN0ZWQuDQoNCiMjIyBjb3VudHJ5X2xhbmd1YWdlcyB2YXJpYWJsZXMNCmBgYHtyfQ0KIyBMb29raW5nIGZvciB0aGUgbGV2ZWxzIG9mIGEgZmFjdG9yLCBkcm9wbGV2ZWxzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGZhY3RvciBvbmx5IHRha2VzIGludG8gYWNjb3VudCB0aGUgbGV2ZWxzIHRoYXQgc3RpbGwgZXhpc3QgaW4gdGhlIGRhdGFzZXQuDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkY291bnRyeTFfbGFuZ3VhZ2UpKQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvdW50cnkyX2xhbmd1YWdlKSkNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb3VudHJ5M19sYW5ndWFnZSkpDQpgYGANCkZhY3RvciBsZXZlbHMgaGF2ZSB0aGUgZmlyc3QgMiBjaGFyYWN0ZXJzIGluIGJsYW5rIGluIGEgc2ltaWxhciB3YXkgdG8gb3RoZXIgdmFyaWFibGVzIHBsdXMgYSBsZXZlbCB3aXRob3V0IGNoYXJhY3RlcnMsIGhvd2V2ZXIgdGhlIGJpZ2dlc3QgaXNzdWUgaXMgdGhhdCB0aGUgbGFuZ3VhZ2VzIGFyZSB3cml0dGVuIGluIHRoZWlyIG9yaWdpbmFsIGxhbmd1YWdlIHdpdGggbWF5IGNvbXBsaWNhdGUgb3VyIGVmZm9ydHMgdG8gYW5hbHl6ZSB2YXJpYWJsZXMgcmVsYXRlZCB0byBsYW5ndWFnZSwgc28gYSBzb2x1dGlvbiBjb3VsZCBiZSB0byB0cmFuc2xhdGUgdGhlIGxhbmd1YWdlIG5hbWVzIHRvIEVuZ2xpc2guDQoNCmBgYHtyfQ0KIyBDb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiBhIGxldmVsDQptb3ZpZXMgJT4lIGNvdW50KGNvdW50cnkxX2xhbmd1YWdlKQ0KbW92aWVzICU+JSBjb3VudChjb3VudHJ5Ml9sYW5ndWFnZSkNCm1vdmllcyAlPiUgY291bnQoY291bnRyeTNfbGFuZ3VhZ2UpDQpgYGANCk9ubHkgdGhlIGZpcnN0IGBjb3VudHJ5X2xhbmd1YWdlYCB2YXJpYWJsZSB3aXRoIGEgYmxhbmsgbGV2ZWwgbXVzdCBiZSBmaXhlZCwgYXMgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgYSBtb3ZpZSB0byBoYXZlIG1vcmUgdGhhbiAxIGxhbmd1YWdlIGF2YWlsYWJsZS4NCg0KIyMgRml4aW5nIGNhdGVnb3JpY2FsIGRhdGEgcHJvYmxlbXMNCkJ5IHVzaW5nIGZ1bmN0aW9ucyBvbiBmYWN0b3JzIHdlIHdlcmUgYWJsZSB0byBkZXRlY3QgaW5jb25zaXN0ZW5jaWVzLCBlcnJvcnMgYW5kIG9wcG9ydHVuaXRpZXMgdG8gaW1wcm92ZSB0aGUgZGF0YSBsZWdpYmlsaXR5IGJ5IG1ha2luZyBhZGp1c3RtZW50cyB0byB0aGUgZmFjdG9yIGxldmVscy4gSW4gdGhpcyBzZWN0aW9ucyB3ZSB3aWxsIGJlIGZpeGluZyBhbGwgcmVsYXRlZCBjYXRlZ29yaWNhbCBkYXRhIGlzc3VlcyB0aGF0IHdlcmUgZGV0ZWN0ZWQgcHJldmlvdXNseS4NCg0KIyMjIG9yaWdpbmFsX2xhbmd1YWdlICAgICAgIA0KKiBEZXRlY3RlZCBJc3N1ZXM6IEEgbGV2ZWwgZG9lcyBub3QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24gICAgICANCiogQWZmZWN0ZWQgUm93czogMTEgYmxhbmsgJiAzMyB4eCAgICAgICANCiogUHJvcG9zZWQgU29sdXRpb246IEFmdGVyIGNoZWNraW5nIHNvbWUgbW92aWVzIHRoYXQgZG9uwrR0IGNvbnRhaW4gaW5mb3JtYXRpb24sIEkgaGF2ZSBkZWRpY2VkIHRvIGNoYW5nZSBibGFuayB0byAieHgiIHZhbHVlcyBhbmQgY2xhc3NpZnkgdGhlbSBhcyBzaWxlbnQgbW92aWVzLg0KDQpgYGB7cn0NCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRvcmlnaW5hbF9sYW5ndWFnZSkpDQpgYGANCg0KYGBge3J9DQojIFNlZSBtb3ZpZXMgd2l0aG91dCBvcmlnaW5hbF9sYW5ndWFnZQ0KbW92aWVzICU+JSBmaWx0ZXIob3JpZ2luYWxfbGFuZ3VhZ2UgPT0gIiIpDQpgYGANClRoZXJlIGFyZSBvbmx5IDExIHJvd3MgaW4gd2hpY2ggdGhlIG9yaWdpbmFsIGxhbmd1YWdlIGlzIG5vdCBwcmVzZW50DQoNCmBgYHtyfQ0KIyBBZGQgcm93cyB3aXRob3V0IG9yaWdpbmFsIGxhbmd1YWdlIHRvIHRoZSBjYXRlZ29yeSAieHgiDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUob3JpZ2luYWxfbGFuZ3VhZ2UgPSBmY3RfY29sbGFwc2Uob3JpZ2luYWxfbGFuZ3VhZ2UsIHh4ID0gYygieHgiLCIiKSkpDQpgYGANCg0KYGBge3J9DQojIFNlZSBtb3ZpZXMgaWYgY2hhbmdlcyB3ZXJlIGFwcGxpZWQgDQptb3ZpZXMgJT4lIGZpbHRlcihvcmlnaW5hbF9sYW5ndWFnZSA9PSAiIikNCmBgYA0KDQpgYGB7cn0NCiMgU2VlIG1vdmllcyB3aXRob3V0IG9yaWdpbmFsX2xhbmd1YWdlDQptb3ZpZXMgJT4lIGZpbHRlcihvcmlnaW5hbF9sYW5ndWFnZSA9PSAieHgiKQ0KYGBgDQoNCiMjIyBzdGF0dXMgICAgICANCiogRGV0ZWN0ZWQgSXNzdWVzOiBBIGxldmVsIGRvZXMgbm90IGNvbnRhaW4gYW55IGluZm9ybWF0aW9uICAgIA0KKiBBZmZlY3RlZCBSb3dzOiA4NCAgICAgICAgDQoqIFByb3Bvc2VkIFNvbHV0aW9uOiBVc2UgdGhlIGByZWxlYXNlX2RhdGVgIHZhcmlhYmxlIHRvIGtub3cgd2hpY2ggc3RhdHVzIGdpdmUgdG8gbW92aWVzIHdpdGhvdXQgb25lICAgIA0KDQpgYGB7cn0NCmxldmVscyhtb3ZpZXMkc3RhdHVzKQ0KYGBgDQoNCmBgYHtyfQ0KIyBTZWUgbW92aWVzIHdpdGhvdXQgc3RhdHVzDQptb3ZpZXMgJT4lIGZpbHRlcihzdGF0dXMgPT0gIiIpDQpgYGANCk1vc3QgbW92aWVzIGRvIGNvbnRhaW4gYSByZWxlYXNlIGRhdGUgd2hpY2ggaGFzIGFscmVhZHkgaGFwcGVuZWQsIHNvIGZvciB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgbW92aWVzIGhhdmUgYSByZWxlYXNlIGRhdGUgYmVmb3JlIDIwMTcgdGhlaXIgc3RhdHVzIHdpbGwgYmUgY29uc2lkZXJlZCBhcyAiUmVsZWFzZWQiLg0KDQpgYGB7cn0NCiMgQXNzaWduIG1vdmllcyB3aXRoIGEgcmVsZWFzZSBkYXRlIHRvIHRoZSBsZXZlbCAiUmVsZWFzZWQiDQptb3ZpZXMgPC0gbW92aWVzICU+JQ0KICBtdXRhdGUoc3RhdHVzID0gaWZfZWxzZSghaXMubmEocmVsZWFzZV9kYXRlKSxmY3RfY29sbGFwc2Uoc3RhdHVzLCBSZWxlYXNlZCA9IGMoIlJlbGVhc2VkIiwiIikpLHN0YXR1cykpDQpgYGANCg0KYGBge3J9DQojIENoZWNrIGlmIHRoZSBtb3ZpZXMgd2l0aG91dCBzdGF0dXMgYW5kIGEgcmVsZWFzZSBkYXRlIG5vdyBmb3JtIHBhcnQgb2YgIlJlbGVhc2VkIg0KbW92aWVzICU+JSBjb3VudChzdGF0dXMpDQpgYGANCg0KYGBge3J9DQojIFNlZSByZW1haW5pbmcgdmFyaWFibGVzDQptb3ZpZXMgJT4lIGZpbHRlcihzdGF0dXMgPT0gIiIpDQpgYGANCg0KRHVlIHRvIHRoZSBmYWN0IG9ubHkgYSBmZXcgcm93cyB3aXRob3V0IHN0YXR1cyByZW1haW4sIHRoZWlyIGltZGJfaWQncyB3ZXJlIGRpcmVjdGx5IHNlYXJjaGVkIGZvciBpbiBvcmRlciB0byBmaW5kIHRoZWlyIHN0YXR1cy4gSXQgc2VlbXMgYWxsIHRoZSByZW1haW5pbmcgbW92aWVzIHdlcmUgYWxzbyByZWxlYXNlZCwgc28gd2UgYXJlIGFkZGluZyB0aGVzZSBtb3ZpZXMgdG8gdGhlICJSZWxlYXNlZCIgY2F0ZWdvcnkuDQoNCmBgYHtyfQ0KIyBBZGQgcmVtYWluaW5nIG1vdmllcyB0byBjYXRlZ29yeSAiUmVsZWFzZWQiDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoc3RhdHVzID0gZmN0X2NvbGxhcHNlKHN0YXR1cywgUmVsZWFzZWQgPSBjKCJSZWxlYXNlZCIsIiIpKSkNCmBgYA0KDQpgYGB7cn0NCiMgQ2hlY2sgaWYgYW55IG1vdmllIHJlbWFpbnMgd2l0aG91dCBzdGF0dXMuDQptb3ZpZXMgJT4lIGNvdW50KHN0YXR1cykNCmBgYA0KYGBge3J9DQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkc3RhdHVzKSkNCmBgYA0KInN0YXR1cyIgY29sdW1uIG5vdyBjb250YWlucyB0aGUgcHJvcGVyIGNhdGVnb3JpZXMgYW5kIGRvZXMgbm90IG5lZWQgYW55IGFkZGl0aW9uYWwgZml4ZXMuDQoNCiMjIyBnZW5yZSB2YXJpYWJsZXMgICAgDQoqIERldGVjdGVkIElzc3VlczogVGhlcmUgYXJlIG1vdmllcyB3aGljaCBkb2VzIG5vdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBnZW5yZSwgYWxsIGxldmVscyBoYXZlIGEgMiBjaGFyYWN0ZXIgYmxhbmsgc3BhY2UgYXQgdGhlIHN0YXJ0LiAgICAgDQoqIEFmZmVjdGVkIFJvd3M6IDI0MzcgKE5vIGdlbnJlKSwgQUxMIChibGFuayBzcGFjZXMgYXQgc3RhcnQpICAgIA0KKiBQcm9wb3NlZCBTb2x1dGlvbjogUmVuYW1lIGxldmVsIHdpdGhvdXQgYSBnZW5yZSB0byAiVW5zcGVjaWZpZWQiLCByZW1vdmUgYWxsIGxldmVscyBibGFuayBzcGFjZXMgYXQgc3RhcnQuICAgDQoNCmBgYHtyfQ0KIyBTZWUgbGV2ZWxzIGZvciBhIHZhcmlhYmxlDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkZ2VucmUxKSkNCmBgYA0KDQpgYGB7cn0NCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRnZW5yZTIpKQ0KYGBgDQpgYGB7cn0NCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRnZW5yZTMpKQ0KYGBgDQpgYGB7cn0NCiMgU2VlIGhvdyBtdWNoIHJvd3MgZG9lcyBub3QgaGF2ZSBhIGdlbnJlDQptb3ZpZXMgJT4lIGNvdW50KGdlbnJlMSkNCmBgYA0KRHVlIHRvIHRoZSBhbW91bnQgb2Ygcm93cyB3aXRob3V0IGEgZ2VucmUgZGF0YSBjYW5ub3QgYmUgbWFudWFsbHkgYWRkZWQgd2l0aG91dCB0YWtpbmcgYSBsb25nIGFtb3VudCBvZiB0aW1lIGFuZCB3ZSBkbyBub3QgaGF2ZSBhIHdheSB0byBleHRyYWN0IGxhcmdlIGFtb3VudHMgb2YgZGF0YSBmcm9tIGltZGIsIHRoZXJlZm9yZSB3ZSBhcmUgZ29pbmcgdG8gcHV0IHRoZSByb3dzIHdpdGhvdXQgYSBnZW5yZSBpbiBhIGNhdGVnb3J5IGNhbGxlZCAiVW5zcGVjaWZpZWQiIGZvciBgZ2VucmUyYCBhbmQgYGdlbnJlM2Agd2hlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IGEgbW92aWUgaGFzIG1vcmUgdGhhbiAxIGdlbnJlLCB3ZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSB0ZXJtICJOQSIgYXMgdGhlIGNhdGVnb3J5IG5hbWUuDQoNCmBgYHtyfQ0KIyBDcmVhdGUgdGhlIGNhdGVnb3J5ICJVbnNwZWNpZmllZCINCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShnZW5yZTEgPSBmY3RfY29sbGFwc2UoZ2VucmUxLCBVbnNwZWNpZmllZCA9ICIiKSkNCmBgYA0KDQpgYGB7cn0NCiMgU2VlIGlmIHRoZSBuZXcgY2F0ZWdvcnkgd2FzIGNyZWF0ZWQNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRnZW5yZTEpKQ0KbW92aWVzICU+JSBjb3VudChnZW5yZTEpDQpgYGANCg0KYGBge3J9DQojIEVsaW1pbmF0ZSB3aGl0ZSBzcGFjZSBpbmNvbnNpc3RlbmN5DQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoZ2VucmUxID0gc3RyX3RyaW0oZ2VucmUxKSkgDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoZ2VucmUyID0gc3RyX3RyaW0oZ2VucmUyKSkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShnZW5yZTMgPSBzdHJfdHJpbShnZW5yZTMpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBSZWNvbnZlcnQgdmFyaWFibGVzIHRvIGZhY3RvciBkYXRhIHR5cGUNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShnZW5yZTEgPSBhcy5mYWN0b3IobW92aWVzJGdlbnJlMSkpDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoZ2VucmUyID0gYXMuZmFjdG9yKG1vdmllcyRnZW5yZTIpKQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGdlbnJlMyA9IGFzLmZhY3Rvcihtb3ZpZXMkZ2VucmUzKSkNCmBgYA0KDQpgYGB7cn0NCiMgTGV2ZWxzIHNob3VsZCBub3cgaGF2ZSB0aGVpciB3aGl0ZSBzcGFjZSByZW1vdmVkDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkZ2VucmUxKSkNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRnZW5yZTIpKQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGdlbnJlMykpDQpgYGANCg0KYGBge3J9DQojIENyZWF0ZSBhIG5ldyBjb2x1bW4gJ2dlbnJlX2NvdW50JyB0byBjb3VudCB0aGUgbnVtYmVyIG9mIGdlbnJlcyBmb3IgZWFjaCByb3cNCm1vdmllcyRnZW5yZV9jb3VudCA8LSByb3dTdW1zKG1vdmllc1ssIGMoImdlbnJlMSIsICJnZW5yZTIiLCAiZ2VucmUzIildICE9ICIiKQ0KYGBgDQpJIGxlZnQgY29sdW1ucyBgZ2VucmUyYCBhbmQgYGdlbnJlM2AgYmxhbmsgdG8gbWFrZSBhIGNvdW50IG9mIHRob3NlIG1vdmllcyB3aXRoIDEgb3IgbW9yZSBnZW5yZXMgZm9yIGxhdGVyIHVzZS4gR2VucmUgdmFyaWFibGVzIGFyZSBub3cgY2xlYW4gYW5kIHJlYWR5IGZvciB1c2UgaW4gYW5hbHlzaXMuDQoNCg0KIyMjIGNvbXBhbnkgdmFyaWFibGVzICAgICAgICAgIA0KKiBEZXRlY3RlZCBJc3N1ZXM6IDIgY2hhcmFjdGVyIGJsYW5rIHNwYWNlLCBsYWNrIG9mIGEgY29tcGFueSBpbiBjZXJ0YWluIGNhc2VzIGFuZCB0aGVyZSBhcmUgYSBsb3Qgb2YgbGV2ZWxzIHdpdGhpbiB0aGUgZmFjdG9yLCB3aGljaCBtYXkgbWFrZSB0aGUgYW5hbHlzaXMgb2YgY29tcGFuaWVzIGluY29udmVuaWVudC4gICAgIA0KKiBBZmZlY3RlZCBSb3dzOiAxMTg2MiAoTm8gY29tcGFueSksIEFMTCAoYmxhbmsgc3BhY2VzIGF0IHN0YXJ0IGFuZCBleGNlc3NpdmUgYW1vdW50IG9mIGxldmVscy4gICAgDQoqIFByb3Bvc2VkIFNvbHV0aW9uOiBFbXB0eSByb3dzIHdpbGwgYmUgcHV0IGludG8gYSBjYXRlZ29yeSBjYWxsZWQgIk5vIENvbXBhbnkiLCBibGFuayBzcGFjZXMgd2lsbCBiZSByZW1vdmVkIGFuZCBpbiB0aGUgY2FzZSBvZiB0aGUgY2F0ZWdvcmllcyBhbW91bnQsIHRoZXkgYXJlIGdvaW5nIHRvIGJlIHJlZHVjZWQsIG9ubHkgdGhlIGZpcnN0IDUwIGNvbXBhbmllcyB3aWxsIGhhdmUgYSBjYXRlZ29yeSB3aGlsZSB0aGUgcmVzdCB3aWxsIGJlIHB1dCBpbnRvIGEgY2F0ZWdvcnkgbmFtZWQgIk90aGVyIg0KDQpgYGB7cn0NCiMgU2VlIGxldmVscyBmb3IgYSB2YXJpYWJsZQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvbXBhbnkxKSkgJT4lIGhlYWQoMjUpDQpgYGANCmBgYHtyfQ0KIyBTb3J0IGNvbXBhbmllcyBieSBhbW91bnQgb2YgbW92aWVzIHByb2R1Y2VkDQpjb21wYW55MV9zb3J0IDwtIG1vdmllcyAlPiUgY291bnQoY29tcGFueTEpICU+JSBhcnJhbmdlKGRlc2MobikpDQpjb21wYW55Ml9zb3J0IDwtIG1vdmllcyAlPiUgY291bnQoY29tcGFueTIpICU+JSBhcnJhbmdlKGRlc2MobikpDQpjb21wYW55M19zb3J0IDwtIG1vdmllcyAlPiUgY291bnQoY29tcGFueTMpICU+JSBhcnJhbmdlKGRlc2MobikpDQpgYGANCg0KYGBge3J9DQojIEdldCBtYWluIGNvbXBhbmllcyBhbmQgdGhlIGNhc2VzIHdoZXJlIHRoZSBjb21wYW55IGlzIG5vdCBzcGVjaWZpZWQNCnRvcF81MF9jb21wYW55MSA8LSBjb21wYW55MV9zb3J0JGNvbXBhbnkxWzE6NTFdDQp0b3BfNTBfY29tcGFueTIgPC0gY29tcGFueTJfc29ydCRjb21wYW55MlsxOjUxXQ0KdG9wXzUwX2NvbXBhbnkzIDwtIGNvbXBhbnkzX3NvcnQkY29tcGFueTNbMTo1MV0NCmBgYA0KDQoNCmBgYHtyfQ0KIyBNb3ZlIGFsbCB0aGUgY29tcGFuaWVzIHRoYXQgZG9lcyBub3QgZm9ybSBwYXJ0IG9mIHRoZSA1MCBiaWdnZXN0IGNvbXBhbmllcyBvciBhcmUgYmxhbmsgaW4gdGhlIGNhdGVnb3J5ICJPdGhlciINCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShjb21wYW55MSA9IGZjdF9jb2xsYXBzZShjb21wYW55MSwgIk90aGVyIiA9IGNvbXBhbnkxWyFjb21wYW55MSAlaW4lIHRvcF81MF9jb21wYW55MV0pKQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGNvbXBhbnkyID0gZmN0X2NvbGxhcHNlKGNvbXBhbnkyLCAiT3RoZXIiID0gY29tcGFueTJbIWNvbXBhbnkyICVpbiUgdG9wXzUwX2NvbXBhbnkyXSkpDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoY29tcGFueTMgPSBmY3RfY29sbGFwc2UoY29tcGFueTMsICJPdGhlciIgPSBjb21wYW55M1shY29tcGFueTMgJWluJSB0b3BfNTBfY29tcGFueTJdKSkNCmBgYA0KDQpgYGB7cn0NCiMgQ2hlY2sgaWYgdGhlIGNoYW5nZSB3YXMgbWFkZSBzdWNlc3NmdWxseQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvbXBhbnkxKSkgDQptb3ZpZXMgJT4lIGNvdW50KGNvbXBhbnkxKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvbXBhbnkyKSkgDQptb3ZpZXMgJT4lIGNvdW50KGNvbXBhbnkyKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvbXBhbnkzKSkgDQptb3ZpZXMgJT4lIGNvdW50KGNvbXBhbnkzKSAlPiUgYXJyYW5nZShkZXNjKG4pKQ0KDQpgYGANClRoZSBuZXh0IHN0ZXAgaXMgdG8gcmVwbGFjZSB0aGUgYmxhbmsgY2F0ZWdvcnkgd2l0aCBhIG5ldyBjYXRlZ29yeSBuYW1lICJObyBDb21wYW55IiBmb3IgY29tcGFueTEsIHRoaXMgYmVjYXVzZSBpdCBpcyBub3QgaW1wb3J0YW50IHRvIGNhbGwgIk5vIENvbXBhbnkiIGZvciB0aGUgb3RoZXIgdmFyaWFibGVzLiBUbyBtYWtlIHVzZSBvZiB0aGlzIEkgd2lsbCBhZGQgYSB2YXJpYWJsZSBjYWxsZWQgYGNvbXBhbnlfY291bnRgIGZvciBsYXRlciBhbmFseXNpcy4NCg0KYGBge3J9DQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoY29tcGFueTEgPSBmY3RfY29sbGFwc2UoY29tcGFueTEsICJObyBDb21wYW55IiA9ICIiKSkNCmBgYA0KDQpgYGB7cn0NCiMgQ3JlYXRlIGEgbmV3IGNvbHVtbiAnZ2VucmVfY291bnQnIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgZ2VucmVzIGZvciBlYWNoIHJvdw0KbW92aWVzJGNvbXBhbnlfY291bnQgPC0gcm93U3Vtcyhtb3ZpZXNbLCBjKCJjb21wYW55MSIsICJjb21wYW55MiIsICJjb21wYW55MyIpXSAhPSAiIikNCmBgYA0KDQpgYGB7cn0NCiMgQ2hlY2sgaWYgdGhlIGNoYW5nZSB3YXMgZG9uZSBjb3JyZWN0bHkNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb21wYW55MSkpIA0KbW92aWVzICU+JSBjb3VudChjb21wYW55MSkgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb21wYW55MikpIA0KbW92aWVzICU+JSBjb3VudChjb21wYW55MikgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb21wYW55MykpIA0KbW92aWVzICU+JSBjb3VudChjb21wYW55MykgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCmBgYA0KRmluYWxseSB0aGUgYmxhbmsgc3BhY2VzIGFyZSBnb2luZyB0byBiZSByZW1vdmVkIGZyb20gZWFjaCByb3cuDQoNCmBgYHtyfQ0KIyBFbGltaW5hdGUgd2hpdGUgc3BhY2UgaW5jb25zaXN0ZW5jeQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGNvbXBhbnkxID0gc3RyX3RyaW0oY29tcGFueTEpKSANCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShjb21wYW55MiA9IHN0cl90cmltKGNvbXBhbnkyKSkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShjb21wYW55MyA9IHN0cl90cmltKGNvbXBhbnkzKSkNCmBgYA0KDQpgYGB7cn0NCiMgUmVjb252ZXJ0IHZhcmlhYmxlcyB0byBmYWN0b3IgZGF0YSB0eXBlDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoY29tcGFueTEgPSBhcy5mYWN0b3IobW92aWVzJGNvbXBhbnkxKSkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShjb21wYW55MiA9IGFzLmZhY3Rvcihtb3ZpZXMkY29tcGFueTIpKQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGNvbXBhbnkzID0gYXMuZmFjdG9yKG1vdmllcyRjb21wYW55MykpDQpgYGANCg0KYGBge3J9DQojIExldmVscyBzaG91bGQgbm93IGhhdmUgdGhlaXIgd2hpdGUgc3BhY2UgcmVtb3ZlZA0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvbXBhbnkxKSkNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb21wYW55MikpDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkY29tcGFueTMpKQ0KYGBgDQpDb21wYW55IGNvbHVtbiBpcyBub3cgY2xlYW4gd2l0aCBwcm9wZXIgY2F0ZWdvcml6YXRpb24gYW5kIGl0cyByZWFkeSBmb3IgdXNlIGluIGFuYWx5c2lzLg0KDQojIyMgY291bnRyeV9sYW5ndWFnZSB2YXJpYWJsZXMgICAgIA0KKiBEZXRlY3RlZCBJc3N1ZXM6IDIgY2hhcmFjdGVyIGJsYW5rIHNwYWNlLCBsYWNrIG9mIGxhbmd1YWdlIGFuZCBsYW5ndWFnZSBuYW1lcyBpbiB0aGVpciBvcmlnaW5hbCBsYW5ndWFnZSwgdGhpcyBpcyBhbiBpc3N1ZSBhcyBpdCBjb3VsZCBjb21wbGljYXRlIG91ciBlZmZvcnRzIHRvIHVuZGVyc3RhbmQgdGhlIGRhdGFzZXQuICAgIA0KKiBBZmZlY3RlZCBSb3dzOiA0MDUwIChObyBsYW5ndWFnZSksIEFMTCAoYmxhbmsgc3BhY2UgYW5kIGxldmVscyBpbiBvcmlnaW5hbCBsYW5ndWFnZSkgICAgIA0KKiBQcm9wb3NlZCBTb2x1dGlvbjogUmVtb3ZlIGJsYW5rIHNwYWNlcywgY3JlYXRlIGEgY2F0ZWdvcnkgZm9yIG1vdmllcyB3aXRob3V0IGEgbGFuZ3VhZ2UgY2FsbGVkICJVbnNwZWNpZmllZCBMYW5ndWFnZSIgYW5kIHRyYW5zbGF0ZSB0byBFbmdsaXNoIHRoZSBsYW5ndWFnZSBmb3IgYWxsIGxldmVscy4NCg0KDQpgYGB7cn0NCiMgU2VlIGxldmVscyBmb3IgYSB2YXJpYWJsZQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvdW50cnkxX2xhbmd1YWdlKSkNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb3VudHJ5Ml9sYW5ndWFnZSkpDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkY291bnRyeTNfbGFuZ3VhZ2UpKQ0KYGBgDQpUaGUgZmlzcnQgc3RlcCB0byBjbGVhbiB0aGUgY29sdW1ucyB3aWxsIGJlIHRvIHJlbW92ZSB0aGUgd2hpdGVzcGFjZSBvbiBlYWNoIG9mIHRoZSB2YXJpYWJsZXMuDQoNCmBgYHtyfQ0KIyBFbGltaW5hdGUgd2hpdGUgc3BhY2UgaW5jb25zaXN0ZW5jeQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGNvdW50cnkxX2xhbmd1YWdlID0gc3RyX3RyaW0oY291bnRyeTFfbGFuZ3VhZ2UpKSANCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShjb3VudHJ5Ml9sYW5ndWFnZSA9IHN0cl90cmltKGNvdW50cnkyX2xhbmd1YWdlKSkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShjb3VudHJ5M19sYW5ndWFnZSA9IHN0cl90cmltKGNvdW50cnkzX2xhbmd1YWdlKSkNCmBgYA0KDQpgYGB7cn0NCiMgUmVjb252ZXJ0IHZhcmlhYmxlcyB0byBmYWN0b3IgZGF0YSB0eXBlDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoY291bnRyeTFfbGFuZ3VhZ2UgPSBhcy5mYWN0b3IobW92aWVzJGNvdW50cnkxX2xhbmd1YWdlKSkNCm1vdmllcyA8LSBtb3ZpZXMgJT4lIG11dGF0ZShjb3VudHJ5Ml9sYW5ndWFnZSA9IGFzLmZhY3Rvcihtb3ZpZXMkY291bnRyeTJfbGFuZ3VhZ2UpKQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgbXV0YXRlKGNvdW50cnkzX2xhbmd1YWdlID0gYXMuZmFjdG9yKG1vdmllcyRjb3VudHJ5M19sYW5ndWFnZSkpDQpgYGANCg0KYGBge3J9DQojIFNlZSBsZXZlbHMgZm9yIGEgdmFyaWFibGUNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb3VudHJ5MV9sYW5ndWFnZSkpDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkY291bnRyeTJfbGFuZ3VhZ2UpKQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvdW50cnkzX2xhbmd1YWdlKSkNCmBgYA0KDQpUaGUgc2Vjb25kIHN0ZXAgdG8gY2xlYW4gdGhpcyBjb2x1bW4gd2lsbCBiZSBhc3NpbmcgYSBuYW1lIHRvIHRoZSBsZXZlbCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gaWRlbnRpZnkgaXQgZmFzdGVyLg0KDQpgYGB7cn0NCiMgQ3JlYXRlIHRoZSBjYXRlZ29yeSAiVW5zcGVjaWZpZWQgTGFuZ3VhZ2UiDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoY291bnRyeTFfbGFuZ3VhZ2UgPSBmY3RfY29sbGFwc2UoY291bnRyeTFfbGFuZ3VhZ2UsICJVbnNwZWNpZmllZCBMYW5ndWFnZSIgPSAiIikpDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoY291bnRyeTJfbGFuZ3VhZ2UgPSBmY3RfY29sbGFwc2UoY291bnRyeTJfbGFuZ3VhZ2UsICJVbnNwZWNpZmllZCBMYW5ndWFnZSIgPSAiIikpDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoY291bnRyeTNfbGFuZ3VhZ2UgPSBmY3RfY29sbGFwc2UoY291bnRyeTNfbGFuZ3VhZ2UsICJVbnNwZWNpZmllZCBMYW5ndWFnZSIgPSAiIikpDQpgYGANCg0KYGBge3J9DQojIFNlZSBsZXZlbHMgZm9yIGEgdmFyaWFibGUNCmxldmVscyhkcm9wbGV2ZWxzKG1vdmllcyRjb3VudHJ5MV9sYW5ndWFnZSkpDQpsZXZlbHMoZHJvcGxldmVscyhtb3ZpZXMkY291bnRyeTJfbGFuZ3VhZ2UpKQ0KbGV2ZWxzKGRyb3BsZXZlbHMobW92aWVzJGNvdW50cnkzX2xhbmd1YWdlKSkNCmBgYA0KDQpGb3IgdGhlIG1lYW4gdGltZSB0cmFuc2xhdGlvbiB3aWxsIG5vdCBiZSBtYWRlIGF0IHRoaXMgc3RhZ2UsIGhvd2V2ZXIgaXQgaXMgc29tZXRoaW5nIHRoYXQgY291bGQgZnVydGhlciBpbXByb3ZlIHRoZSBvdmVyYWxsIGNsZWFubGluZXNzIGluIHRoZSBkYXRhIHNldCwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIGFuYWx5emUgaW5mb3JtYXRpb24gaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRocmVlIGNvbHVtbnMuDQoNCiMjIyBGaW5kaW5nIGludmFsaWQgaW1kYl9pZCAgICAgDQpBIGltZGIgaWQgc2hvdWxkIGhhdmUgdGhlIHNhbWUgY2hhcmFjdGVyIGxlbmd0aCByZWdhcmRsZXNzIG9mIHRoZSBmb3JtYXQsIHRoaXMgaXMgYW4gZXhhbXBsZSBvZiBob3cgaXQgc2hvdWxkIGxvb2sgInR0NzE1ODgxNCIuIEluIHRvdGFsIGl0IGNvbnRhaW5zIDkgY2hhcmFjdGVycyB0aGVyZWZvcmUsIGFueSBgaW1kYl9pZGAgdGhhdCBjb250YWlucyBsZXNzIHRoYW4gdGhhdCBzaG91bGQgYmUgY2hhbmdlZC4NCg0KYGBge3J9DQojIEZpbmQgb3V0IHRoZSBsZW5naHQgb2YgYW4gaW1kYl9pZA0Kc3RyX2xlbmd0aChtb3ZpZXMkaW1kYl9pZCkgJT4lIGhlYWQoMTApDQpgYGANCmFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aXRoaW4gdGhlIGZpcnN0IDEwIHJvd3MsIGhvd2V2ZXIgd2UgbmVlZCB0byBzZWUgaWYgdGhlcmUgYXJlIG1vcmUgZXJyb3JzIGFzaWRlIGZyb20gdGhhdCBvbmUuDQoNCmBgYHtyfQ0KIyBTZWFyY2ggZm9yIGludmFsaWQgaWQncw0KbW92aWVzICU+JQ0KZmlsdGVyKHN0cl9sZW5ndGgoaW1kYl9pZCkgIT0gOSkNCmBgYA0KQnkgcnVubmluZyB0aGUgY29kZSB3ZSBjYW4gZmluZCB0aGF0IHRoZSBvbmx5IGludmFsaWQgaWQgaXMgdGhlIHNhbWUgd2UgaGF2ZSBkZXRlY3RlZCBwcmV2aW91c2x5LCBzZWFyY2hpbmcgb24gaW1kYiB0aGUgdGl0bGUgb2YgdGhlIG1vdmllLCB0aGUgaWQgZm9yIHRoaXMgbW92aWUgd2FzIGZvdW5kLCB3aGljaCBpcyB0aGUgZm9sbG93aW5nICJ0dDEzMDg2MjIiDQoNCmBgYHtyfQ0KIyBSZXBsYWNlIHRoZSBpbnZhbGlkIGlkIHdpdGggdGhlIGNvcnJlY3Qgb25lDQptb3ZpZXMgPC0gbW92aWVzICU+JSBtdXRhdGUoaW1kYl9pZCA9IGNhc2Vfd2hlbihpbWRiX2lkID09ICIiIH4gc3RyX3JlcGxhY2UoaW1kYl9pZCwgIl4kIiwgInR0MTMwODYyMiIpLFRSVUUgfiBpbWRiX2lkKSkNCmBgYA0KDQpgYGB7cn0NCiMgU2VlIGlmIGludmFsaWQgaWQncyByZW1haW4NCm1vdmllcyAlPiUgZmlsdGVyKHN0cl9sZW5ndGgoaW1kYl9pZCkgIT0gOSkNCmBgYA0KDQojIyAgTWVyZ2luZyBEYXRhc2V0cw0KVW50aWwgdGhpcyBwb2ludCwgSSBoYXZlIG9ubHkgZm9jdXNlZCBvbiB0aGUgbW92aWVzX21ldGFkYXRhIGNzdiBmaWxlcywgaG93ZXZlciBpdCBpcyBub3QgdGhlIG9ubHkgZmlsZSBhdmFpbGFibGUgdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgZGF0YSBzZXQuIFRoZXJlIGlzIG90aGVyIGZpbGUgdGhhdCBjb3VsZCBiZSByZWxldmFudCB0byBhZGQgdG8gdGhpcyBkYXRhIHNldCBpbiBvcmRlciB0byBmdXJ0aGVyIGV4cGFuZCBvdXIgYW5hbHlzaXMgcG9zc2liaWxpdGllcy4gSW4gb3JkZXIgdG8gZG8gdGhpcyB3ZSBhcmUgZ29pbmcgdG8gdXNlIG1lcmdlIGZ1bmN0aW9ucyB0byBzdWNjZXNzZnVsbHkgaW5jbHVkZSB0aGUgb3RoZXIgaW5mb3JtYXRpb24gaW4gdGhpcyBkYXRhIHNldC4NCg0KVGhlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIG1lcmdlLCBhcmUgdGhlIGtleXdvcmRzIGZpbGUgd2hpY2ggZ3JvdXBzIGJ5IGlkIHRoZSBrZXl3b3JkcyB0aGF0IGlkZW50aWZ5IGEgbW92aWUuDQoNCiMjIyBJbXBvcnRpbmcgYW5kIG1lcmdpbmcNCg0KIyMjIyBUZXh0IERhdGEgYW5kIERpc3RhbmNlICAgICAgIA0KSW4gb3JkZXIgdG8gZml4IGFueSBvcnRob2dyYXBoaWMgZXJyb3JzIGluIHRoZSBjb3VudHJ5IGNvbHVtbnMgd2UgYXJlIGdvaW5nIHRvIHVzZSAqc3RyaW5nZGlzdCogYW5kICpmdXp6eWpvaW4qIHBhY2thZ2VzLCB0aGlzIHdpbGwgaGVscCB1cyB0byBjb3JyZWN0IGFueSB0eXBvIGluIHRoZSBjb3VudHJpZXMgY29sdW1uICAgIA0KDQpgYGB7cn0NCiMgR2V0IHRoZSB1bmlxdWUgbGFuZ3VhZ2VzIA0KdW5pcXVlX2xhbmd1YWdlcyA8LSB0YWJsZShtb3ZpZXMkY291bnRyeTFfbGFuZ3VhZ2UpDQp3cml0ZS5jc3YodW5pcXVlX2xhbmd1YWdlcywibGFuZ3VhZ2VzLmNzdiIpDQpgYGANCg0KYGBge3J9DQojIFJlYWQgbGlzdCB3aXRoIGNvcnJlY3QgbmFtZXMgDQpsYW5ndWFnZXNfY29ycmVjdGVkIDwtIHJlYWQuY3N2KCJEOlxcQnVzaW5lc3MgQW5hbHl0aWNzXFxsYW5ndWFnZXNfY29ycmVjdGVkLmNzdiIpDQpgYGANCg0KYGBge3J9DQojIEpvaW4gYm90aCBkYXRhc2V0cyB1c2luZyBzdHJpbmcgZGlzdGFuY2UgYXMgdGhlIGNyaXRlcmlhDQogIG1vdmllcyA8LSBtb3ZpZXMgJT4lDQogICAgc3RyaW5nZGlzdF9sZWZ0X2pvaW4obGFuZ3VhZ2VzX2NvcnJlY3RlZCwgYnkgPSBjKCJjb3VudHJ5MV9sYW5ndWFnZSIgPSAiTGFuZ3VhZ2UiKSwgbWV0aG9kID0gImRsIikgJT4lDQogICAgc3RyaW5nZGlzdF9sZWZ0X2pvaW4obGFuZ3VhZ2VzX2NvcnJlY3RlZCwgYnkgPSBjKCJjb3VudHJ5Ml9sYW5ndWFnZSIgPSAiTGFuZ3VhZ2UiKSwgbWV0aG9kID0gImRsIikgJT4lDQogICAgc3RyaW5nZGlzdF9sZWZ0X2pvaW4obGFuZ3VhZ2VzX2NvcnJlY3RlZCwgYnkgPSBjKCJjb3VudHJ5M19sYW5ndWFnZSIgPSAiTGFuZ3VhZ2UiKSwgbWV0aG9kID0gImRsIikNCmBgYA0KDQpgYGB7cn0NCiMgQ291bnQgdGhlIHZhbHVlcw0Kc3VtbWFyeShtb3ZpZXMkY291bnRyeTFfbGFuZ3VhZ2UpDQpzdW1tYXJ5KG1vdmllcyRjb3VudHJ5Ml9sYW5ndWFnZSkNCnN1bW1hcnkobW92aWVzJGNvdW50cnkzX2xhbmd1YWdlKQ0KYGBgDQpUaGUgbGFuZ3VhZ2UgdmFsdWVzIGFyZSBpbXBvcnRlZCBhbmQgY29ycmVjdGVkIGluIGNhc2UgdGhlcmUgd2FzIGEgdHlwbyB3aXRoaW4gdGhlIGRhdGFzZXQuIFdpdGggdGhpcyB3ZSBlbnN1cmUgdGhhdCB0aGUgc2FtZSBsYW5ndWFnZSBzdGF5cyBpbiBvbmUgY2F0ZWdvcnkgb25seS4gDQoNCk5vdyB3ZSBpbXBvcnQgYGtleXdvcmRzYC4NCmBgYHtyfQ0KIyBJbXBvcnRpbmcgZmlsZXMNCmtleXdvcmRzIDwtIHJlYWQuY3N2KCJEOlxcQnVzaW5lc3MgQW5hbHl0aWNzXFxrZXl3b3Jkcy5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBSZW1vdmUgZHVwbGljYXRlcyBmcm9tIGtleXdvcmRzIGFuZCBsaW5rcw0Ka2V5d29yZHMgPC0gZGlzdGluY3Qoa2V5d29yZHMpDQpgYGANCg0KYGBge3J9DQojIE1lcmdpbmcgbW92aWVzIGRmIHdpdGgga2V5d29yZHMgZGYgb25seSBtYWludGFpbmluZyBjb2luY2lkZW5jZXMgd2l0aCBtb3ZpZXMuDQptb3ZpZXMgPC0gbWVyZ2UobW92aWVzLGtleXdvcmRzLGFsbC54ID1UUlVFKQ0KYGBgDQoNCk5vdyB0aGUgbW92aWVzIGNvbnRhaW4gdGhlaXIgY29ycmVzcG9uZGluZyBrZXl3b3JkcyB3aGVuIGFwcGxpY2FibGUsIGhvd2V2ZXIgdGhlIGtleXdvcmRzIGFyZSBpbiBKU09OIGZvcm1hdCB3aGljaCBmb3IgYW5hbHlzaXMgcHVycG9zZXMgaXMgbm90IGFkZXF1YXRlLCB0aGVyZWZvcmUgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSB0aHJlZSBuZXcgY29sdW1ucyBmb3IgcmVnaXN0ZXJpbmcgdGhlIGZpcnN0IHRocmVlIGtleXdvcmRzIGEgbW92aWVzIHVzZXMuDQoNCiMjIyBDbGVhbmluZyBtZXJnZWQgZGF0YXNldA0KDQpgYGB7cn0NCiMgU2VwYXJhdGUgaW50byBjb2x1bW5zIGJ5IDoNCm5ld19rZXl3b3JkcyA8LSBzdHJfc3BsaXRfZml4ZWQobW92aWVzJGtleXdvcmRzLCAiOiIsIG4gPSBJbmYpDQpgYGANCg0KYGBge3J9DQojIENob29zZSB1bnRpbCB0aGUgdGhpcmQga2V5d29yZA0KbmV3X2tleXdvcmRzIDwtIG5ld19rZXl3b3Jkc1ssIDI6N10NCmBgYA0KDQpgYGB7cn0NCiMgT25seSBzZWxlY3QgY29sdW1ucyB3aXRoIHRoZSBrZXl3b3Jkcw0KbmV3X2tleXdvcmRzIDwtIG5ld19rZXl3b3Jkc1ssIGMoMiw0LDYpXQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShuZXdfa2V5d29yZHMpDQpgYGANCg0KYGBge3J9DQojIENvbnZlcnQgdG8gZGF0YSBmcmFtZQ0KbmV3X2tleXdvcmRzIDwtIGFzLmRhdGEuZnJhbWUobmV3X2tleXdvcmRzKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDbGVhbmluZyBhbmQgdHJpbW1pbmcgc3BhY2VzDQpuZXdfa2V5d29yZHMgPC0gbmV3X2tleXdvcmRzICU+JSANCiAgbXV0YXRlKA0KICAgIGtleXdvcmQxID0gc3RyX3JlcGxhY2VfYWxsKFYxLCAiW1s6cHVuY3Q6XV0iLCAiICIpLA0KICAgIGtleXdvcmQyID0gc3RyX3JlcGxhY2VfYWxsKFYyLCAiW1s6cHVuY3Q6XV0iLCAiICIpLA0KICAgIGtleXdvcmQzID0gc3RyX3JlcGxhY2VfYWxsKFYzLCAiW1s6cHVuY3Q6XV0iLCAiICIpDQogICkgJT4lIA0KICBtdXRhdGUoDQogICAga2V5d29yZDEgPSBzdHJfcmVtb3ZlX2FsbChrZXl3b3JkMSwgIlxcYmlkXFxiIiksDQogICAga2V5d29yZDIgPSBzdHJfcmVtb3ZlX2FsbChrZXl3b3JkMiwgIlxcYmlkXFxiIiksDQogICAga2V5d29yZDMgPSBzdHJfcmVtb3ZlX2FsbChrZXl3b3JkMywgIlxcYmlkXFxiIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KIyBSZW1vdmUgdGhlIG9yaWdpbmFsIGNvbHVtbnMgVjEsIFYyLCBWMw0KbmV3X2tleXdvcmRzIDwtIHNlbGVjdChuZXdfa2V5d29yZHMsIGtleXdvcmQxLCBrZXl3b3JkMiwga2V5d29yZDMpDQpgYGANCg0KYGBge3J9DQojIFRyaW0gYWxsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlIHNwYWNlcw0KbmV3X2tleXdvcmRzIDwtIG5ld19rZXl3b3JkcyAlPiUgDQogIG11dGF0ZSgNCiAgICBrZXl3b3JkMSA9IHN0cl90cmltKGtleXdvcmQxKSwNCiAgICBrZXl3b3JkMiA9IHN0cl90cmltKGtleXdvcmQyKSwNCiAgICBrZXl3b3JkMyA9IHN0cl90cmltKGtleXdvcmQzKQ0KICApDQpgYGANCg0KYGBge3J9DQojIENvbnZlcnQgdG8gZmFjdG9yDQpuZXdfa2V5d29yZHMka2V5d29yZDEgPC0gYXMuZmFjdG9yKG5ld19rZXl3b3JkcyRrZXl3b3JkMSkNCm5ld19rZXl3b3JkcyRrZXl3b3JkMiA8LSBhcy5mYWN0b3IobmV3X2tleXdvcmRzJGtleXdvcmQyKQ0KbmV3X2tleXdvcmRzJGtleXdvcmQzIDwtIGFzLmZhY3RvcihuZXdfa2V5d29yZHMka2V5d29yZDMpDQpgYGANCg0KYGBge3J9DQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdG8gY2hlY2sgdGhlIGNsZWFuIGRhdGENCnN1bW1hcnkobmV3X2tleXdvcmRzKQ0KYGBgDQoNCmBgYHtyfQ0KbW92aWVzIDwtIGNiaW5kKG1vdmllcywgbmV3X2tleXdvcmRzKQ0KYGBgDQoNCmBgYHtyfQ0KbW92aWVzIDwtIG1vdmllcyAlPiUgDQogIHNlbGVjdCgta2V5d29yZHMpIA0KYGBgDQpCeSB1c2luZyB0aGUgbWVyZ2UgZnVuY3Rpb24gd2UgYXJlIG5vdyBhYmxlIHRvIHNlZSB3aGljaCBhcmUgdGhlIG1vc3QgcG9wdWxhciBrZXl3b3JkcyBvbiB0aGUgd2hvbGUgZGF0YXNldCBhbmQgYWxzbyBzZWFyY2ggZm9yIGFueSBzcGVjaWZpYyBtb3ZpZSBmb3IgdGhlaXIga2V5d29yZHMsIHdoaWNoIGNvdWxkIGJlIGltcG9ydGFudCB0byBjb25zaWRlciB3aGVuIGRvaW5nIGRhdGEgYW5hbHlzaXMuIA0KDQojIyBSZW1vdmluZyB1bm5lc3Nlc2FyeSB2YXJpYWJsZXMNCg0KYGBge3J9DQojIENoZWNrIGZvciBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgJ3RpdGxlcycgdmFyaWFibGUNCm1pc3NpbmdfdGl0bGUgPC0gc3VtKGlzLm5hKG1vdmllcyR0aXRsZSkpDQoNCiMgRGlzcGxheSB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgdmFsdWVzDQptaXNzaW5nX3RpdGxlDQpgYGANCmBgYHtyfQ0KdGFpbChtb3ZpZXMkdGl0bGUpDQpgYGANCkV2ZW50aG91Z2ggaSBjaGVja2VkIGZvciBtaXNzaW5nIHZhbHVlcyB3aXRoIGNvZGUsIEkgbG9va2VkIG1hbnVhbGx5IGFuZCBzZWUgbWlzc2luZyB2YWx1ZXMgaW4gdGl0bGUgYW5kIGBvcmlnaW5hbF90aXRsZWAgcmVtYWlucyBpbnRhY3QuDQoNCmBgYHtyfQ0KIyBSZW1vdmUgdW5uZWNlc3Nhcnkgcm93cw0KbW92aWVzIDwtIHNlbGVjdChtb3ZpZXMsIC12aWRlbywgLXRpdGxlKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemluZyBtaXNzaW5nIHZhbHVlcyAgICAgICANCmBgYHtyfQ0KIyBTcGxpdCB0aGUgZGF0YXNldCB0byBvYnRhaW4gYSBiZXR0ZXIgdmlzdWFsaXphdGlvbiB3aGVuIHVzaW5nIHZpc2RhdA0KbW92aWVzcDEgPC0gc2VsZWN0KG1vdmllcywxOjEwKQ0KbW92aWVzcDIgPC0gc2VsZWN0KG1vdmllcywxMToyMCkNCm1vdmllc3AzIDwtIHNlbGVjdChtb3ZpZXMsMjE6MzApDQptb3ZpZXNwNCA8LSBzZWxlY3QobW92aWVzLDMxOjQxKQ0KYGBgDQoNCg0KYGBge3J9DQojIFZpc3VhbGl6ZSBtaXNzaW5nIHZhbHVlcw0KdmlzX21pc3MobW92aWVzcDEsd2Fybl9sYXJnZV9kYXRhID0gRkFMU0UpDQp2aXNfbWlzcyhtb3ZpZXNwMix3YXJuX2xhcmdlX2RhdGEgPSBGQUxTRSkNCnZpc19taXNzKG1vdmllc3AzLHdhcm5fbGFyZ2VfZGF0YSA9IEZBTFNFKQ0KdmlzX21pc3MobW92aWVzcDQsd2Fybl9sYXJnZV9kYXRhID0gRkFMU0UpDQpgYGANCg0KIyAgRXhwbG9yaW5nIGFuZCB2aXN1YWxpemluZyBjYXRlZ29yaWNhbCBhbmQgbnVtZXJpY2FsIGRhdGENCg0KIyMgRGF0YSBFeHBsb3JlciAgICAgICAgIA0KTm93IHRoYXQgd2UgaGF2ZSBtZXJnZWQgYW5kIGNsZWFuZWQgdGhlIG5ldyBkYXRhc2V0LCB3ZSBjYW4gY3JlYXRlIGEgcmVwb3J0IGluIHdpdGggdGhlIGRhdGEgZXhwbG9yZXIgbGlicmFyeSB0byBvYnRhaW4gaW5zaWdodHMgYWJvdXQgb3VyIGRhdGFzZXQuIEJ1dCBmaXJzdCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IHJvd3MgaW4gb3JkZXIgdG8gb2J0YWluIGEgYmV0dGVyIHJlcG9ydC4gRm9yIHRoZSByZXBvcnQgd2Ugd2lsbCBvbmx5IGluY2x1ZGUgb25lIG9mIGVhY2ggdmFyaWFibGUgaW4gY2FzZXMgd2hlcmUgdGhlcmUgaXMgbW9yZSB0aGFuIDEuICAgICANCg0KYGBge3J9DQojIENyZWF0aW5nIGEgc2hvcnRlciBkYXRhIHNldA0KbW92aWVzX3Nob3J0IDwtIHNlbGVjdChtb3ZpZXMsYWR1bHQsb3JpZ2luYWxfdGl0bGUscmV2ZW51ZSxidWRnZXQscnVudGltZSxyZWxlYXNlX2RhdGUsc3RhdHVzLHZvdGVfYXZlcmFnZSx2b3RlX2NvdW50LHBvcHVsYXJpdHlfbWF4LGdlbnJlMSxnZW5yZV9jb3VudCxjb21wYW55MSxjb21wYW55X2NvdW50LGNvdW50cnkxLGNvdW50cnkxX2xhbmd1YWdlLGtleXdvcmQxKQ0KYGBgDQogICAgDQpLbm93IHRoYXQgd2UgaGF2ZSB0aGUgc2ltcGxpZmllZCBkYXRhc2V0IHRvIGBtb3ZpZXNfc2hvcnRgIHdlIHdpbGwgY3JlYXRlIHRoZSByZXBvcnQgdXNpbmcgdGhlIGByZXZlbnVlYCBhcyBvdXIgbWFpbiBmb2N1cyBmb3IgYW5hbHlzaXMuDQpgYGB7cn0NCiMgRm9yIHRoZSByZXBvcnQgd2UgYXJlIGdvaW5nIHRvIHVzZSByZXZlbnVlIGFzIG91ciBkZXBlbmRlbnQgdmFyaWFibGUNCiNjcmVhdGVfcmVwb3J0KG1vdmllc19zaG9ydCx5PSAicmV2ZW51ZSIpDQpgYGANCkEgcmVwb3J0IHdhcyBjcmVhdGVkIHdpdGggKkRhdGEgRXhwbG9yZXIqIHRvIHNlZSBtaXNzaW5nIHZhbHVlcyBhbmQgb3RoZXIgZGF0YS4gSSB3aWxsIGtlZXAgdGhpcyBhcyBhIGNvbW1lbnQgZm9yIGxvYWRpbmcgcHVycG9zZXMgZm9yIGl0IGlzIG5vdCBpbXBvcnRhbnQgdGhhdCBpdCBvcGVucyB1cCBldmVyeSB0aW1lIEkgcnVuIHRoZSBjb2RlLg0KDQojIyB0YWJsZXMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIEZyZXF1ZW5jeSB0YWJsZSBmb3IgZ2VucmVzDQpnZW5yZV9mcmVxIDwtIHRhYmxlKG1vdmllcyRnZW5yZTEpDQoNCiMgRGlzcGxheSB0aGUgZnJlcXVlbmN5IHRhYmxlDQpwcmludChnZW5yZV9mcmVxKQ0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgUHJvcG9ydGlvbiB0YWJsZSBmb3IgZ2VucmVzDQpnZW5yZV9wcm9wIDwtIHByb3AudGFibGUodGFibGUobW92aWVzJGdlbnJlMSkpDQoNCiMgRGlzcGxheSB0aGUgcHJvcG9ydGlvbiB0YWJsZQ0KcHJpbnQoZ2VucmVfcHJvcCkNCmBgYA0KQnkgYSBsYXJnZSBtYXJnaW4sIHRoZSBtb3N0IG1vdmllcyBpbiB0aGUgZGF0YXNldCBhcmUgZHJhbWEgbW92aWVzLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxhbmd1YWdlX2ZyZXEgPC0gdGFibGUobW92aWVzJG9yaWdpbmFsX2xhbmd1YWdlKQ0KDQpwcmludChsYW5ndWFnZV9mcmVxKQ0KYGBgDQpBcyBleHBlY3RlZCwgbW9zdCBtb3ZpZXMgYXJlIGluIGVuZ2xpc2guDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KY3Jvc3NfdGFibGUgPC0gdGFibGUobW92aWVzJGdlbnJlMSwgbW92aWVzJGNvdW50cnkxKQ0KDQpwcmludChjcm9zc190YWJsZSkNCmBgYA0KV2l0aCB0aGlzIGNyb3NzIHRhYnVsYXRpb24gd2UgY2FuIGtub3cgd2hhdCBjb3VudHJ5IG1ha2VzIHRoZSBtb3N0IGFtb3VudCBvZiBtb3ZpZXMgYmFzZWQgb24gZ2VucmUsIFVuaXRlZCBTdGF0ZXMsIGJlaW5nIHRoZSBtYWpvciBwcm9kdWNlciwgbWFrZXMgY29tZWR5IG1vdmllcyB0aGUgbW9zdC4gV291bGQgdGhvc2UgYmUgdGhlIG1vdmllcyB0aGF0IG1ha2UgdGhlIG1vc3QgcmV2ZW51ZT8NCg0KIyMgSW50ZXJhY3RpdmUgVmlzdWFsaXphdGlvbiB3aXRoIEVzcXVpc3NlDQoNCmBgYHtyIGVzcXVpc3NlLXZpc3VhbGl6YXRpb24sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgTG9hZCB0aGUgJ21vdmllcycgZGF0YXNldCBpbnRvIEVzcXVpc3NlIGZvciBpbnRlcmFjdGl2ZSBwbG90dGluZw0KI2VzcXVpc3NlcihkYXRhID0gbW92aWVzKQ0KYGBgDQpGb3IgdGhlIGZvbGxvd2luZyBjaGFydHMgYW5kIGdyYXBocyBJIHVzZWQgdGhlIHBhY2thZ2UgKkVzcXVpc3NlKiBpbiBvcmRlciB0byBvYnRhaW4gbW9yZSBjb21wbGV4IHZpc3VhbGl6YXRpb25zLCB5ZXQgdGhlIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIHJlbWFpbiBhcyBhIGNvbW1lbnQgaW4gb3JkZXIgZm9yIGl0IG5vdCB0byBsb2FkIGV2ZXJ5IHRpbWUgSSBydW4gdGhlIGNvZGUuDQoNCiMjIGdyYXBocyBhbmQgY2hhcnRzDQoNCiMjIyBidWRnZXQgdnMuIHJldmVudWUNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpnZ3Bsb3QobW92aWVzLCBhZXMoeCA9IGJ1ZGdldCwgeSA9IHJldmVudWUpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnMoeCA9ICJCdWRnZXQiLCB5ID0gIlJldmVudWUiLCB0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBCdWRnZXQgYW5kIFJldmVudWUiKQ0KDQpgYGANCldlIGNhbiBzZWUgdGhhdCBpZiB0aGVyZSBpcyBhIGhpZ2hlciBidWRnZXQgdGhlcmUgcHJvYmFibHkgd2lsbCBiZSBhIGhpZ2hlciByZXZlbnVlLCB5ZXQgaXQgc2VlbXMgdGhhdCB0aGVyZSBjb3VsZCBiZSBhIGxpbWl0IGJlY2F1c2UgaWYgeW91IGV4Y2VlZCBhIGNlcnRhaW4gYnVkZ2V0IHRoZW4gaXQgY291bGQgYmUgdG9vIGhpZ2ggdG8gbWFrZSBhIHByb2ZpdCBvdXQgb2YgaXQuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KG1vdmllcywgYWVzKHggPSBidWRnZXQsIHkgPSByZXZlbnVlLCBjb2xvciA9IGdlbnJlMSkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKw0KICBmYWNldF93cmFwKH4gZ2VucmUxKSArDQogIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gc2NhbGVzOjpkb2xsYXIpICsNCiAgc2NhbGVfeV9sb2cxMChsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgKw0KICBsYWJzKHggPSAiQnVkZ2V0IChsb2cgc2NhbGUpIiwgeSA9ICJSZXZlbnVlIChsb2cgc2NhbGUpIiwgdGl0bGUgPSAiQnVkZ2V0IHZzLiBSZXZlbnVlIGJ5IEdlbnJlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMgZ2VucmUNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIEJhciBwbG90IG9mIGF2ZXJhZ2UgcmV2ZW51ZSBieSBnZW5yZQ0KbW92aWVzICU+JQ0KICBncm91cF9ieShnZW5yZTEpICU+JQ0KICBzdW1tYXJpc2UoYXZnX3JldmVudWUgPSBtZWFuKHJldmVudWUsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBnZW5yZTEsIHkgPSBhdmdfcmV2ZW51ZSwgZmlsbCA9IGdlbnJlMSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh4ID0gIkdlbnJlIiwgeSA9ICJBdmVyYWdlIFJldmVudWUiLCB0aXRsZSA9ICJBdmVyYWdlIFJldmVudWUgYnkgR2VucmUiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCkJ5IGZhciwgYWR2ZW50dXJlIG1vdmllcyBtYWtlIHRoZSBtb3N0IHJldmVudWUuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBDYWxjdWxhdGluZyBhdmVyYWdlIHBvcHVsYXJpdHkgZm9yIGVhY2ggZ2VucmUNCmdlbnJlMV9wb3B1bGFyaXR5IDwtIG1vdmllcyAlPiUNCiAgZ3JvdXBfYnkoZ2VucmUxKSAlPiUNCiAgc3VtbWFyaXNlKGF2ZXJhZ2VfcG9wdWxhcml0eSA9IG1lYW4ocG9wdWxhcml0eSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogIGFycmFuZ2UoZGVzYyhhdmVyYWdlX3BvcHVsYXJpdHkpKQ0KDQojIFBsb3QNCmdncGxvdChnZW5yZTFfcG9wdWxhcml0eSwgYWVzKHggPSByZW9yZGVyKGdlbnJlMSwgLWF2ZXJhZ2VfcG9wdWxhcml0eSksIHkgPSBhdmVyYWdlX3BvcHVsYXJpdHksIGZpbGwgPSBnZW5yZTEpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh4ID0gIlByaW1hcnkgR2VucmUiLCB5ID0gIkF2ZXJhZ2UgUG9wdWxhcml0eSIsIHRpdGxlID0gIkF2ZXJhZ2UgUG9wdWxhcml0eSBieSBHZW5yZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KV2l0aCB0aGlzIHBhc3QgYW5heWlzaXMgd2Ugbm93IGtub3cgMyB0aGluZ3M6DQoNCiogVW5pdGVkIFN0YXRlcyBpcyB0aGUgYmlnZ2VzdCBtb3ZpZSBwcm9kdWNlciBhbmQgbW9zdGx5IGRvZXMgY29tZWR5IG1vdmllcy4NCiogRnJvbSBhbGwgbW92aWVzLCBkcmFtYSBpcyB0aGUgZ2VucmUgdGhhdCBpcyB1c2VkIHRoZSBtb3N0Lg0KKiBBZHZlbnR1cmUgaXMgdGhlIG1vc3QgcG9wdWxhciBnZW5yZSBhcyB3ZWxsIGFzIHRoZSBvbmUgdGhhdCBtYWtlcyBtb3JlIHJldmVudWUgaW4gYXZlcmFnZS4NCg0KV2l0aCB0aGF0LCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBhbiBhZHZlbnR1cmUgbW92aWUgaXMgdGhlIG1vc3QgbGlrZWx5IHRvIGJlIGEgc3VjY2Vzcy4NCg0KIyMjIHJ1bnRpbWUNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpnZ3Bsb3QobW92aWVzLCBhZXMoeCA9IHN0YXR1cywgeSA9IHJ1bnRpbWUpKSArDQogIGdlb21fYm94cGxvdChmaWxsID0gInNreWJsdWUiKSArDQogIGxhYnMoeCA9ICJTdGF0dXMiLCB5ID0gIlJ1bnRpbWUgKG1pbnV0ZXMpIiwgdGl0bGUgPSAiUnVudGltZSBEaXN0cmlidXRpb24gYnkgTW92aWUgU3RhdHVzIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBEZWZpbmUgcmV2ZW51ZSByYW5nZXMNCnJldmVudWVfcmFuZ2VzIDwtIGMoMCwgMTAwMDAwMDAsIDUwMDAwMDAwLCAxMDAwMDAwMDAsIEluZikNCg0KIyBDcmVhdGUgYSBuZXcgY29sdW1uIGZvciByZXZlbnVlIHJhbmdlDQptb3ZpZXMgPC0gbW92aWVzICU+JQ0KICBtdXRhdGUocmV2ZW51ZV9yYW5nZSA9IGN1dChyZXZlbnVlLCBicmVha3MgPSByZXZlbnVlX3JhbmdlcywgbGFiZWxzID0gYygiTG93IiwgIk1lZGl1bSIsICJIaWdoIiwgIlZlcnkgSGlnaCIpKSkNCg0KIyBIaXN0b2dyYW0gb2YgbW92aWUgcnVudGltZXMgYnkgcmV2ZW51ZSByYW5nZQ0KZ2dwbG90KG1vdmllcywgYWVzKHggPSBydW50aW1lKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZmFjZXRfd3JhcCh+IHJldmVudWVfcmFuZ2UpICsNCiAgbGFicyh4ID0gIlJ1bnRpbWUiLCB5ID0gIkZyZXF1ZW5jeSIsIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBNb3ZpZSBSdW50aW1lcyBieSBSZXZlbnVlIFJhbmdlIikNCg0KYGBgDQpUaGUgaGlzdG9ncmFtIHZpc3VhbGl6ZXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb3ZpZSBydW50aW1lcyBhY3Jvc3MgZGlmZmVyZW50IHJldmVudWUgcmFuZ2VzLiBJZiBpdCBpcyBpbiB2ZXJ5IGhpZ2ggaXQgbWVhbnMgdGhhdCB0aGUgbW92aWUgbWFkZSBhIGxvdCBvZiByZXZlbnVlLiBXZSBjYW4gc2VlIHRoYXQgbW9zdCBtb3ZpZXMgbWFkZSBtZWRpdW0gcmV2ZW51ZSB3aGljaCBpcyBhcm91bmQgMTAsMDAwLDAwMC4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIEZpbHRlciBvdXQgbW92aWVzIHdpdGggcnVudGltZSA+IDMwMCBtaW51dGVzDQpmaWx0ZXJlZF9tb3ZpZXMgPC0gbW92aWVzICU+JSBmaWx0ZXIocnVudGltZSA8PSAzMDApDQoNCiMgRmluZCB0aGUgbWVhbiBydW50aW1lIG9mIGZpbHRlcmVkIG1vdmllcw0KbWVhbl9ydW50aW1lIDwtIG1lYW4oZmlsdGVyZWRfbW92aWVzJHJ1bnRpbWUsIG5hLnJtID0gVFJVRSkNCnByaW50KHBhc3RlKCJNZWFuIHJ1bnRpbWUgKGZpbHRlcmVkKToiLCByb3VuZChtZWFuX3J1bnRpbWUsIDIpKSkNCg0KIyBDcmVhdGUgYSBzY2F0dGVycGxvdCBvZiByZXZlbnVlIHZzLiBydW50aW1lIGZvciBmaWx0ZXJlZCBtb3ZpZXMNCmdncGxvdChmaWx0ZXJlZF9tb3ZpZXMsIGFlcyh4ID0gcnVudGltZSwgeSA9IHJldmVudWUpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnMoeCA9ICJSdW50aW1lIChtaW51dGVzKSIsIHkgPSAiUmV2ZW51ZSIsIHRpdGxlID0gIlJldmVudWUgdnMuIFJ1bnRpbWUgKEZpbHRlcmVkKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KYGBge3J9DQojIENhbGN1bGF0ZSB0aGUgbWVhbiBydW50aW1lIG9mIGZpbHRlcmVkIG1vdmllcw0KbWVhbl9ydW50aW1lX2ZpbHRlcmVkIDwtIG1lYW4oZmlsdGVyZWRfbW92aWVzJHJ1bnRpbWUsIG5hLnJtID0gVFJVRSkNCnByaW50KHBhc3RlKCJNZWFuIHJ1bnRpbWUgKGZpbHRlcmVkKToiLCByb3VuZChtZWFuX3J1bnRpbWVfZmlsdGVyZWQsIDIpKSkNCmBgYA0KV2l0aCB0aGlzIHBhc3QgYHJ1bnRpbWVgIGFuYWx5c2lzLCB3ZSBjYW4gY29ubHVkZSB0aGF0IGZvciBhIG1vdmllIHRvIGJlIGEgc3VjY2VzcyBvciBpbiBvdGhlciB3b3JkcywgaGF2ZSBhIGhpZ2hlciByZXZlbnVlLCBpdCBzaG91bGQgbGFzdCBiZXR3ZWVuIDk2IGFuZCAxNTAgbWludXRlcy4gQSBnb29kIHN3ZWV0IHNwb3QgZm9yIHRoZSBiZXN0IG1vdmllIHdvdWxkIGJlIHR3byBob3Vycy4NCg0KIyMjIHJlbGVhc2UgZGF0ZQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgRXh0cmFjdCBtb250aCBmcm9tIHJlbGVhc2VfZGF0ZSBhbmQgY2FsY3VsYXRlIGF2ZXJhZ2UgcmV2ZW51ZSBieSBtb250aA0KbW92aWVzJHJlbGVhc2VfbW9udGggPC0gbW9udGgoYXMuRGF0ZShtb3ZpZXMkcmVsZWFzZV9kYXRlKSkNCm1vbnRoX3JldmVudWUgPC0gbW92aWVzICU+JQ0KICBncm91cF9ieShyZWxlYXNlX21vbnRoKSAlPiUNCiAgc3VtbWFyaXNlKGF2ZXJhZ2VfcmV2ZW51ZSA9IG1lYW4ocmV2ZW51ZSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogIGFycmFuZ2UocmVsZWFzZV9tb250aCkNCg0KIyBQbG90DQpnZ3Bsb3QobW9udGhfcmV2ZW51ZSwgYWVzKHggPSBmYWN0b3IocmVsZWFzZV9tb250aCwgbGFiZWxzID0gbW9udGgubmFtZSksIHkgPSBhdmVyYWdlX3JldmVudWUpKSArDQogIGdlb21fY29sKGZpbGwgPSAic3RlZWxibHVlIikgKw0KICBsYWJzKHggPSAiTW9udGggb2YgUmVsZWFzZSIsIHkgPSAiQXZlcmFnZSBSZXZlbnVlIiwgdGl0bGUgPSAiQXZlcmFnZSBSZXZlbnVlIGJ5IE1vbnRoIG9mIFJlbGVhc2UiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCkl0IHdhcyB0byBiZSBleHBlY3RlZCB5ZXQgdGhpcyBjbGFyaWZpZXMgdGhlIHRoZW9yeSB0aGF0IG1vdmllcyB0aGF0IGNvbWUgb3V0IG9uIHBlb3BsZXMgdmFjYXRpb25zIGFyZSB0aGUgbW9zdCBwcm9maXRhYmxlLiBXZSBjYW4gc2VlIHRoYXQgbW92aWVzIGhhdmUgbW9yZSBzdWNjZXNzIHdoZW4gcmVsZWFzZWQgaW4gc3VtbWVyIChqdW5lICYganVseSkgYW5kIGFzbG8gaW4gd2ludGVyIChub3ZlbWJlciAmIGRlY2VtYmVyKS4gSSB3b3VsZCBub3Qgc2F5IGhvbGlkYXlzIGFyZSB0aGUgYmVzdCBidXQgdmFjYXRpb24gdGltZSBmb3Igc3VyZS4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQptb3ZpZXMgJT4lDQogIG11dGF0ZSh5ZWFyID0gbHVicmlkYXRlOjp5ZWFyKHJlbGVhc2VfZGF0ZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gcG9wdWxhcml0eSkpICsNCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gIlBvcHVsYXJpdHkiKSwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3Ntb290aChhZXMoeSA9IHZvdGVfYXZlcmFnZSwgY29sb3IgPSAiVm90ZSBBdmVyYWdlIiksIHNlID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+IGFkdWx0KSArDQogIGxhYnMoeCA9ICJSZWxlYXNlIFllYXIiLCB5ID0gIlNjYWxlIiwgdGl0bGUgPSAiVHJlbmRzIGluIFBvcHVsYXJpdHkgYW5kIFZvdGUgQXZlcmFnZSBPdmVyIFllYXJzIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiUG9wdWxhcml0eSIgPSAiYmx1ZSIsICJWb3RlIEF2ZXJhZ2UiID0gInJlZCIpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQpXZSBjYW4gc2VlIHRoYXQgaW4gcGFzdCB5ZWFycywgdGhlIGF1ZGllbmNlIHdhcyBub3QgdG9vIGFtdXNlZCBieSBtb3ZpZXMgeWV0IHRoZSBxdWFsaXR5IG9mIHRoZW0gd2VyZSBzdGlsbCBncmVhdC4gTm93YWRheXMgcGVvcGxlIGFyZSB3YXkgbW9yZSBpbnRlcmVzdGVkLg0KDQoNCiMjIyBjb21wYW5pZXMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIFRhYmxlIG9mIHRvcCBwcm9kdWN0aW9uIGNvbXBhbmllcyBieSByZXZlbnVlDQp0b3BfcHJvZHVjdGlvbiA8LSBtb3ZpZXMgJT4lDQogIGdyb3VwX2J5KGNvbXBhbnkxKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3JldmVudWUgPSBzdW0ocmV2ZW51ZSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHRvcF9uKDEwLCB0b3RhbF9yZXZlbnVlKQ0KDQojIEJhciBwbG90IG9mIHRvcCBwcm9kdWN0aW9uIGNvbXBhbmllcyBieSByZXZlbnVlDQpnZ3Bsb3QodG9wX3Byb2R1Y3Rpb24sIGFlcyh4ID0gcmVvcmRlcihjb21wYW55MSwgdG90YWxfcmV2ZW51ZSksIHkgPSB0b3RhbF9yZXZlbnVlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJza3libHVlIikgKw0KICBsYWJzKHggPSAiUHJvZHVjdGlvbiBDb21wYW55IiwgeSA9ICJUb3RhbCBSZXZlbnVlIiwgdGl0bGUgPSAiVG9wIFByb2R1Y3Rpb24gQ29tcGFuaWVzIGJ5IFJldmVudWUiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCkhlcmUgd2UgY2FuIHNlZSB0aGF0ICJPdGhlciIgYW5kICJObyBjb21wYW55IiBhcmUgdmVyeSBoaWdoIGluIGNvbXBhcmlzb24gd2l0aCB0aGUgcmVzdCBvZiB0aGUgY2F0ZWdvcmllcywgdGhhdCBpcyBiZWNhdXNlIHRoZXNlIGNhdGVnb3JpZXMgbWFrZSB1cCBmb3IgYSBzZXQgb2YgY29tcGFuaWVzIHRoYXQgZWl0aGVyIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSBkYXRhc2V0IG9yIGFyZSB0b28gc21hbGwgdG8gZXZlbiBib3RoZXIgbWVhc3VyaW5nLiBXaGVuIHB1dCB0b2dldGhlciB0aGV5IGFyZSBncmVhdCBidXQgaXQgY2Fubm90IGJlIGNvbnNpZGVyZWQgYXMgb25lLiBJbmRpdmlkdWFsbHksIFBhcmFtb3VudCBQaWN0dXJlcyBpcyB0aGUgbW9zdCBzdWNjZXNzZnVsbCBjb21wYW55LiANCg0KKk5PVEU6Kg0KDQpUaGlzIGRvZXMgbm90IG1lYW4gb3RoZXIgcHJvZHVjdGlvbiBjb21wYW5pZXMgYXJlIG5vdCBpbXBvcnRhbnQsIGEgY29sbGFib3JhdGlvbiBiZXR3ZWVuIGJpZyBhbmQgc21hbGwgcHJvZHVjdGlvbiBjb21wYW5pZXMgY291bGQgcmVzdWx0IGEgYmV0dGVyIG1hdGNoLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBDYWxjdWxhdGUgdG90YWwgcmV2ZW51ZSBwZXIgY291bnRyeQ0KY291bnRyeV9yZXZlbnVlIDwtIG1vdmllcyAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeTEpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfcmV2ZW51ZSA9IHN1bShyZXZlbnVlLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsX3JldmVudWUpKSAjIEFycmFuZ2UgYnkgdG90YWwgcmV2ZW51ZSBpbiBkZXNjZW5kaW5nIG9yZGVyDQoNCiMgU2VsZWN0IHRvcCBOIGNvdW50cmllcyB3aXRoIHRoZSBoaWdoZXN0IHRvdGFsIHJldmVudWUNCnRvcF9jb3VudHJpZXMgPC0gY291bnRyeV9yZXZlbnVlICU+JQ0KICB0b3Bfbig1LCB0b3RhbF9yZXZlbnVlKSAjIENoYW5nZSA1IHRvIHRoZSBkZXNpcmVkIG51bWJlciBvZiB0b3AgY291bnRyaWVzDQoNCiMgRmlsdGVyIG1vdmllcyBkYXRhc2V0IGZvciB0aGUgdG9wIGNvdW50cmllcw0KdG9wX21vdmllcyA8LSBtb3ZpZXMgJT4lDQogIGZpbHRlcihjb3VudHJ5MSAlaW4lIHRvcF9jb3VudHJpZXMkY291bnRyeTEpDQoNCiMgQmFyIHBsb3Qgb2YgcmV2ZW51ZSBieSBudW1iZXIgb2YgcHJvZHVjdGlvbiBjb21wYW5pZXMgZm9yIHRvcCBjb3VudHJpZXMNCmdncGxvdCh0b3BfbW92aWVzLCBhZXMoeCA9IGNvbXBhbnlfY291bnQsIHkgPSByZXZlbnVlLCBmaWxsID0gY291bnRyeTEpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZmFjZXRfd3JhcCh+IGNvdW50cnkxKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIFByb2R1Y3Rpb24gQ29tcGFuaWVzIiwgeSA9ICJSZXZlbnVlIiwgdGl0bGUgPSAiUmV2ZW51ZSBieSBOdW1iZXIgb2YgUHJvZHVjdGlvbiBDb21wYW5pZXMgZm9yIFRvcCBDb3VudHJpZXMiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCkluIHRoZSBhbmFseXNpcyBmb3IgcHJvZHVjdGlvbiBjb21wYW5pZXMsIEl0IHdhcyBmb3VuZCB0aGF0IG1vdmllcyBtYWRlIGluIGNvbGxhYm9yYXRpb24gYmV0d2VlbiB0aHJlZSBjb21wYW5pZXMgYXJlIG1vcmUgbGlrZWx5IHRvIG1ha2UgdGhlIG1vc3QgcmV2ZW51ZS4gVGhpcyB3YXkgd2UgY2FuIGRldGVybWluZSB0aGF0Og0KDQoqIENvbGxhYm9yYXRpb24gaXMga2V5IGluIHByb2R1Y3Rpb24NCiogQW1lcmljYW4gbW92aWVzIG1ha2UgdGhlIGJlc3QgbW92aWVzDQoNCg0KIyMjIHRpdGxlcw0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgZWFjaCBtb3ZpZSB0aXRsZQ0KbW92aWVzJHRpdGxlX2xlbmd0aCA8LSBuY2hhcihtb3ZpZXMkb3JpZ2luYWxfdGl0bGUpDQoNCiMgQ3JlYXRlIGEgc2NhdHRlcnBsb3Qgb2YgcmV2ZW51ZSB2cy4gdGl0bGUgbGVuZ3RoDQpnZ3Bsb3QobW92aWVzLCBhZXMoeCA9IHRpdGxlX2xlbmd0aCwgeSA9IHJldmVudWUpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnMoeCA9ICJUaXRsZSBMZW5ndGgiLCB5ID0gIlJldmVudWUiLCB0aXRsZSA9ICJSZXZlbnVlIHZzLiBUaXRsZSBMZW5ndGgiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIENhbGN1bGF0ZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KY29ycmVsYXRpb24gPC0gY29yKG1vdmllcyRyZXZlbnVlLCBtb3ZpZXMkdGl0bGVfbGVuZ3RoKQ0KcHJpbnQocGFzdGUoIkNvcnJlbGF0aW9uIGNvZWZmaWNpZW50OiIsIHJvdW5kKGNvcnJlbGF0aW9uLCAyKSkpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGVhY2ggbW92aWUgdGl0bGUNCm1vdmllcyR0aXRsZV9sZW5ndGggPC0gbmNoYXIobW92aWVzJG9yaWdpbmFsX3RpdGxlKQ0KDQojIEZpbmQgdGhlIG1lYW4gbGVuZ3RoIG9mIG1vdmllIHRpdGxlcw0KbWVhbl90aXRsZV9sZW5ndGggPC0gbWVhbihtb3ZpZXMkdGl0bGVfbGVuZ3RoKQ0KcHJpbnQocGFzdGUoIk1lYW4gdGl0bGUgbGVuZ3RoOiIsIHJvdW5kKG1lYW5fdGl0bGVfbGVuZ3RoLCAyKSkpDQpgYGANCkZvciBtb3ZpZSB0aXRsZXMsIHRoZSBhbmFseXNpcyBtYWRlIHdhcyBkb25lIHRvIGRldGVybWluZSB0aGUgcmlnaHQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYSBtb3ZpZSB0aXRsZSBoYXN0IHRvIGhhdmUgaW4gb3JkZXIgdG8gaW5jcmVhc2UgdGhlIHByb2JhYmlsaXR5IG9mIGl0IGJlaW5nIGEgc3VjY2Vzcy4gSXQgd2FzIGZvdW5kIHRoYXQgdGl0bGVzIHdpdGggYXJvdW5kIDE2IGNoYXJhY3RlcnMgbWFrZSB0aGUgYmVzdCBsZW5ndGggZm9yIGEgbW92aWUgdGl0bGUuDQoNCg0KIyMgV29yZCBjbG91ZHMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQp3b3JkY2xvdWQocGFzdGUobW92aWVzJGtleXdvcmQxLCBtb3ZpZXMka2V5d29yZDIsIG1vdmllcyRrZXl3b3JkMyksIA0KICBtYXgud29yZHMgPSAxMDAsDQogIHJhbmRvbS5vcmRlciA9IEZBTFNFLA0KICBjb2xvcnMgPSBicmV3ZXIucGFsKDgsICJEYXJrMiIpKQ0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgQ2FsY3VsYXRlIHRoZSBzdW0gb2YgcmV2ZW51ZSBmb3IgZWFjaCBrZXl3b3JkDQprZXl3b3JkX3JldmVudWUgPC0gYWdncmVnYXRlKHJldmVudWUgfiBrZXl3b3JkMSwgZGF0YSA9IG1vdmllcywgc3VtKQ0KDQojIEdlbmVyYXRlIHRoZSB3b3JkIGNsb3VkIHdpdGggcmV2ZW51ZS1iYXNlZCB3ZWlnaHRpbmcNCndvcmRjbG91ZCh3b3JkcyA9IGtleXdvcmRfcmV2ZW51ZSRrZXl3b3JkLCANCiAgICAgICAgICBmcmVxID0ga2V5d29yZF9yZXZlbnVlJHJldmVudWUsIA0KICAgICAgICAgIG1heC53b3JkcyA9IDEwMCwNCiAgICAgICAgICByYW5kb20ub3JkZXIgPSBGQUxTRSwNCiAgICAgICAgICBjb2xvcnMgPSBicmV3ZXIucGFsKDgsICJEYXJrMiIpKQ0KYGBgDQpJbiB0aGVzZSB3b3JkIGNsb3VkcyB3ZSBjYW4gc2VlIHRoZSBtb3N0IHJlcGVhdGVkIHdvcmRzIHRocm91Z2hvdXQgYWxsIG1vdmllcy4gSW4gdGhlIHNlY29uZCAqd29yZGNsb3VkKiwgaXQgc2hvd3MgdXMgdGhlIHdvcmRzIHRoYXQgYXJlIHJlcGVhdGVkIHRoZSBtb3N0IHdpdGggcmV2ZW51ZS1iYXNlZCB3ZWlnaHRpbmcsIG1lYW5pbmcgdGhlc2Ugd29yZHMgd2VyZSByZXBlYXRlZCB0aGUgbW9zdCBpbiBtb3ZpZXMgd2l0aCBoaWdoZXIgcmV2ZW51ZS4gV2UgY2FuIHNlZSB0aGF0IG1vdmllcyB3aXRoIG1vcmUgcmV2ZW51ZXMgbWVudGlvbiB0aGUgd29yZHM6IGJhc2VkIG9uIG5vdmVsLCB3b21hbiBkaXJlY3RvciBhbmQgc2F2aW5nIHRoZSB3b3JsZCwgYWxzbyBiaWcgY2l0aWVzIGxpa2UgcGFyaXMsIG5ldyB5b3JrLCBsb25kb24sIGV0Yy4gYnV0IHRoYXQgY291bGQgYmUgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBtb3ZpZSB3YXMgbWFkZSwgdGhlIHNldHRpbmcgb3IgYW5vdGhlciBmYWN0b3IuDQoNCiMjIFN0YXRpc3RpY2FsIG1lYXN1cmVzDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0Kc3RyKG1vdmllcykNCmBgYA0KDQpgYGB7cn0NCiMgQ29udmVydCBidWRnZXQgYW5kIHJldmVudWUgYXMgbnVtZXJpYw0KbW92aWVzJGJ1ZGdldF9vcmlnaW5hbCA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihtb3ZpZXMkYnVkZ2V0X29yaWdpbmFsKSkNCm1vdmllcyRyZXZlbnVlX29yaWdpbmFsIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKG1vdmllcyRyZXZlbnVlX29yaWdpbmFsKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnN1bW1hcnkobW92aWVzJGJ1ZGdldF9vcmlnaW5hbCkNCnN1bW1hcnkobW92aWVzJHJldmVudWVfb3JpZ2luYWwpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIERlZmluZSB0aGUgTW9kZSBGdW5jdGlvbg0KZ2V0X21vZGUgPC0gZnVuY3Rpb24odikgew0KICB1bmlxdiA8LSB1bmlxdWUodikNCiAgdW5pcXZbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHYsIHVuaXF2KSkpXQ0KfQ0KDQojIENvbnZlcnQgYnVkZ2V0X29yaWdpbmFsIGFuZCByZXZlbnVlX29yaWdpbmFsIHRvIG51bWVyaWMNCm1vdmllcyRidWRnZXRfb3JpZ2luYWwgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIobW92aWVzJGJ1ZGdldF9vcmlnaW5hbCkpDQptb3ZpZXMkcmV2ZW51ZV9vcmlnaW5hbCA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihtb3ZpZXMkcmV2ZW51ZV9vcmlnaW5hbCkpDQoNCiMgQ2FsY3VsYXRlIFN0YXRpc3RpY3MNCmJ1ZGdldF9tb2RlIDwtIGdldF9tb2RlKG1vdmllcyRidWRnZXRfb3JpZ2luYWwpDQpyZXZlbnVlX21vZGUgPC0gZ2V0X21vZGUobW92aWVzJHJldmVudWVfb3JpZ2luYWwpDQoNCmJ1ZGdldF9tZWFuIDwtIG1lYW4obW92aWVzJGJ1ZGdldF9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KYnVkZ2V0X21lZGlhbiA8LSBtZWRpYW4obW92aWVzJGJ1ZGdldF9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KYnVkZ2V0X3NkIDwtIHNkKG1vdmllcyRidWRnZXRfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCmJ1ZGdldF9taW4gPC0gbWluKG1vdmllcyRidWRnZXRfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCmJ1ZGdldF9tYXggPC0gbWF4KG1vdmllcyRidWRnZXRfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCg0KcmV2ZW51ZV9tZWFuIDwtIG1lYW4obW92aWVzJHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCnJldmVudWVfbWVkaWFuIDwtIG1lZGlhbihtb3ZpZXMkcmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KcmV2ZW51ZV9zZCA8LSBzZChtb3ZpZXMkcmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KcmV2ZW51ZV9taW4gPC0gbWluKG1vdmllcyRyZXZlbnVlX29yaWdpbmFsLCBuYS5ybSA9IFRSVUUpDQpyZXZlbnVlX21heCA8LSBtYXgobW92aWVzJHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCg0KIyBQcmludCBSZXN1bHRzDQpjYXQoIkJ1ZGdldCAtIE1vZGU6IiwgYnVkZ2V0X21vZGUsICIsIE1lYW46IiwgYnVkZ2V0X21lYW4sICIsIE1lZGlhbjoiLCBidWRnZXRfbWVkaWFuLCAiLCBTdGFuZGFyZCBEZXZpYXRpb246IiwgYnVkZ2V0X3NkLCAiLCBNaW5pbXVtOiIsIGJ1ZGdldF9taW4sICIsIE1heGltdW06IiwgYnVkZ2V0X21heCwgIlxuIikNCmNhdCgiUmV2ZW51ZSAtIE1vZGU6IiwgcmV2ZW51ZV9tb2RlLCAiLCBNZWFuOiIsIHJldmVudWVfbWVhbiwgIiwgTWVkaWFuOiIsIHJldmVudWVfbWVkaWFuLCAiLCBTdGFuZGFyZCBEZXZpYXRpb246IiwgcmV2ZW51ZV9zZCwgIiwgTWluaW11bToiLCByZXZlbnVlX21pbiwgIiwgTWF4aW11bToiLCByZXZlbnVlX21heCwgIlxuIikNCmBgYA0KDQpXZSBjb3VsZCBoYXZlIHdvcmtlZCB3aXRoIHRoZSBkYXRhIGFzIGl0IHdhcywgYnV0IHdlIGRlY2lkZWQgdG8gY29uZHVjdCBhIGRpZmZlcmVudCBhbmFseXNpcyBieSBjb21wYXJpbmcgdGhlIGNhdGVnb3JpZXMgb2YgYnVkZ2V0IGFuZCByZXZlbnVlIGFmdGVyIGV4Y2x1ZGluZyB6ZXJvIHZhbHVlcy4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGFyZSBtYW55IHplcm9zIGluIHRoZSBkYXRhLCBhbmQgd2Ugd2FudCB0byBoYXZlIGEgY2xlYXJlciB2aXNpb24gb2YgdGhlIGNhc2VzIHRoYXQgZG8gY29udGFpbiBjb21wbGV0ZSBpbmZvcm1hdGlvbi4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQptb3ZpZXNfZmlsdGVyZWRfYnVkZ2V0IDwtIG1vdmllc1ttb3ZpZXMkYnVkZ2V0X29yaWdpbmFsICE9IDAsIF0NCg0KYnVkZ2V0X21lYW5fZmlsdGVyZWQgPC0gbWVhbihtb3ZpZXNfZmlsdGVyZWRfYnVkZ2V0JGJ1ZGdldF9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KYnVkZ2V0X21lZGlhbl9maWx0ZXJlZCA8LSBtZWRpYW4obW92aWVzX2ZpbHRlcmVkX2J1ZGdldCRidWRnZXRfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCmJ1ZGdldF9zZF9maWx0ZXJlZCA8LSBzZChtb3ZpZXNfZmlsdGVyZWRfYnVkZ2V0JGJ1ZGdldF9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KYnVkZ2V0X21pbl9maWx0ZXJlZCA8LSBtaW4obW92aWVzX2ZpbHRlcmVkX2J1ZGdldCRidWRnZXRfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCmJ1ZGdldF9tYXhfZmlsdGVyZWQgPC0gbWF4KG1vdmllc19maWx0ZXJlZF9idWRnZXQkYnVkZ2V0X29yaWdpbmFsLCBuYS5ybSA9IFRSVUUpDQoNCmNhdCgiQnVkZ2V0IChGaWx0cmFkbykgLSBNZWRpYTogIiwgYnVkZ2V0X21lYW5fZmlsdGVyZWQsICIsIE1lZGlhbmE6ICIsIGJ1ZGdldF9tZWRpYW5fZmlsdGVyZWQsICIsIERlc3ZpYWNpw7NuIEVzdMOhbmRhcjogIiwgYnVkZ2V0X3NkX2ZpbHRlcmVkLCAiLCBNw61uaW1vOiAiLCBidWRnZXRfbWluX2ZpbHRlcmVkLCAiLCBNw6F4aW1vOiAiLCBidWRnZXRfbWF4X2ZpbHRlcmVkLCAiXG4iKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbW92aWVzX2ZpbHRlcmVkX3JldmVudWUgPC0gbW92aWVzW21vdmllcyRyZXZlbnVlX29yaWdpbmFsICE9IDAsIF0NCg0KcmV2ZW51ZV9tZWFuX2ZpbHRlcmVkIDwtIG1lYW4obW92aWVzX2ZpbHRlcmVkX3JldmVudWUkcmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KcmV2ZW51ZV9tZWRpYW5fZmlsdGVyZWQgPC0gbWVkaWFuKG1vdmllc19maWx0ZXJlZF9yZXZlbnVlJHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCnJldmVudWVfc2RfZmlsdGVyZWQgPC0gc2QobW92aWVzX2ZpbHRlcmVkX3JldmVudWUkcmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KcmV2ZW51ZV9taW5fZmlsdGVyZWQgPC0gbWluKG1vdmllc19maWx0ZXJlZF9yZXZlbnVlJHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCnJldmVudWVfbWF4X2ZpbHRlcmVkIDwtIG1heChtb3ZpZXNfZmlsdGVyZWRfcmV2ZW51ZSRyZXZlbnVlX29yaWdpbmFsLCBuYS5ybSA9IFRSVUUpDQoNCmNhdCgiUmV2ZW51ZSAoRmlsdHJhZG8pIC0gTWVkaWE6ICIsIHJldmVudWVfbWVhbl9maWx0ZXJlZCwgIiwgTWVkaWFuYTogIiwgcmV2ZW51ZV9tZWRpYW5fZmlsdGVyZWQsICIsIERlc3ZpYWNpw7NuIEVzdMOhbmRhcjogIiwgcmV2ZW51ZV9zZF9maWx0ZXJlZCwgIiwgTcOtbmltbzogIiwgcmV2ZW51ZV9taW5fZmlsdGVyZWQsICIsIE3DoXhpbW86ICIsIHJldmVudWVfbWF4X2ZpbHRlcmVkLCAiXG4iKQ0KYGBgDQoNCg0KIyMjIFN0YXRpc3RpYyBhbmFseXNpcw0KDQpgYGB7ciwgLCBlY2hvPUZBTFNFfQ0KIyAod2l0aG91dCB6ZXJvcyBpbiBidWRnZXQgYW5kIHJldmVudWUpDQptb3ZpZXNfZmlsdGVyZWRfYm90aCA8LSBtb3ZpZXNbbW92aWVzJGJ1ZGdldF9vcmlnaW5hbCAhPSAwICYgbW92aWVzJHJldmVudWVfb3JpZ2luYWwgIT0gMCwgXQ0KDQojIHNjYXR0ZXJwbG90DQpnZ3Bsb3QoZGF0YSA9IG1vdmllc19maWx0ZXJlZF9ib3RoLCBhZXMoeCA9IGJ1ZGdldF9vcmlnaW5hbCwgeSA9IHJldmVudWVfb3JpZ2luYWwpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgIA0KICBsYWJzKHRpdGxlID0gIkJ1ZGdldCB2cyBSZXZlbnVlIiwNCiAgICAgICB4ID0gIkJ1ZGdldCIsDQogICAgICAgeSA9ICJSZXZlbnVlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQpgYGANCg0KYGBge3IsaW5jbHVkZT1GQUxTRX0NCm1vdmllc19maWx0ZXJlZF9ib3RoJGNvdW50cnkxIDwtIHRyaW13cyhtb3ZpZXNfZmlsdGVyZWRfYm90aCRjb3VudHJ5MSkNCg0KbW92aWVzX2ZpbHRlcmVkX2JvdGggPC0gbW92aWVzX2ZpbHRlcmVkX2JvdGggJT4lDQogIG11dGF0ZShVU0EgPSBjb3VudHJ5MSA9PSAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikNCg0KaGVhZChtb3ZpZXNfZmlsdGVyZWRfYm90aCkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnN1bW1hcnlfc3RhdHMgPC0gbW92aWVzX2ZpbHRlcmVkX2JvdGggJT4lDQogIGdyb3VwX2J5KFVTQSkgJT4lDQogIHN1bW1hcml6ZSgNCiAgICBtZWFuX3JldmVudWUgPSBtZWFuKHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSksDQogICAgbWVkaWFuX3JldmVudWUgPSBtZWRpYW4ocmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KICApDQoNCnByaW50KHN1bW1hcnlfc3RhdHMpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpnZXRfbW9kZSA8LSBmdW5jdGlvbih2KSB7DQogIHVuaXF2IDwtIHVuaXF1ZSh2KQ0KICB0YWJ1bGF0ZWQgPC0gdGFidWxhdGUobWF0Y2godiwgdW5pcXYpKQ0KICBpZiAoYW55KHRhYnVsYXRlZCA+IDEpKSB7DQogICAgdW5pcXZbd2hpY2gubWF4KHRhYnVsYXRlZCldDQogIH0gZWxzZSB7DQogICAgTkEgICMgUmV0dXJuIE5BIGlmIG5vIG1vZGUgZXhpc3RzDQogIH0NCn0NCg0KbWVhbl9yZXZlbnVlIDwtIG1lYW4obW92aWVzX2ZpbHRlcmVkX2JvdGgkcmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KbWVkaWFuX3JldmVudWUgPC0gbWVkaWFuKG1vdmllc19maWx0ZXJlZF9ib3RoJHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCm1vZGVfcmV2ZW51ZSA8LSBnZXRfbW9kZShtb3ZpZXNfZmlsdGVyZWRfYm90aCRyZXZlbnVlX29yaWdpbmFsKQ0Kc2RfcmV2ZW51ZSA8LSBzZChtb3ZpZXNfZmlsdGVyZWRfYm90aCRyZXZlbnVlX29yaWdpbmFsLCBuYS5ybSA9IFRSVUUpDQp2YXJfcmV2ZW51ZSA8LSB2YXIobW92aWVzX2ZpbHRlcmVkX2JvdGgkcmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KaXFyX3JldmVudWUgPC0gSVFSKG1vdmllc19maWx0ZXJlZF9ib3RoJHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkNCm1pbl9yZXZlbnVlIDwtIG1pbihtb3ZpZXNfZmlsdGVyZWRfYm90aCRyZXZlbnVlX29yaWdpbmFsLCBuYS5ybSA9IFRSVUUpDQptYXhfcmV2ZW51ZSA8LSBtYXgobW92aWVzX2ZpbHRlcmVkX2JvdGgkcmV2ZW51ZV9vcmlnaW5hbCwgbmEucm0gPSBUUlVFKQ0KcmFuZ2VfcmV2ZW51ZSA8LSByYW5nZShtb3ZpZXNfZmlsdGVyZWRfYm90aCRyZXZlbnVlX29yaWdpbmFsLCBuYS5ybSA9IFRSVUUpDQpkaWZmX3JldmVudWUgPC0gbWF4X3JldmVudWUgLSBtaW5fcmV2ZW51ZSAgDQoNCg0Kc3RhdGlzdGljc190YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBTdGF0aXN0aWMgPSBjKCJNZWFuIiwgIk1lZGlhbiIsICJNb2RlIiwgIlN0YW5kYXJkIERldmlhdGlvbiIsICJWYXJpYW5jZSIsICJJUVIiLCAiTWluIiwgIk1heCIsICJEaWZmIiwgIlJhbmdlIiksDQogIFZhbHVlID0gYyhtZWFuX3JldmVudWUsIG1lZGlhbl9yZXZlbnVlLCBtb2RlX3JldmVudWUsIHNkX3JldmVudWUsIHZhcl9yZXZlbnVlLCBpcXJfcmV2ZW51ZSwgbWluX3JldmVudWUsIG1heF9yZXZlbnVlLCBkaWZmX3JldmVudWUsIHBhc3RlKHJhbmdlX3JldmVudWVbMV0sICJ0byIsIHJhbmdlX3JldmVudWVbMl0pKQ0KKQ0KDQpwcmludChzdGF0aXN0aWNzX3RhYmxlKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KG1vdmllc19maWx0ZXJlZF9ib3RoLCBhZXMoeCA9IGxvZyhyZXZlbnVlX29yaWdpbmFsKSwgZmlsbCA9IGZhY3RvcihVU0EpKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjMpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IERpc3RyaWJ1dGlvbiBvZiBSZXZlbnVlIiwNCiAgICAgICB4ID0gIlJldmVudWUiLA0KICAgICAgIHkgPSAiRGVuc2l0eSIsDQogICAgICAgZmlsbCA9ICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gInJlZCIsICJGQUxTRSIgPSAiYmx1ZSIpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KG1vdmllc19maWx0ZXJlZF9ib3RoLCBhZXMoeCA9IGxvZyhyZXZlbnVlX29yaWdpbmFsKSwgZmlsbCA9IGZhY3RvcihVU0EpKSkgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjMpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IERpc3RyaWJ1dGlvbiBvZiBSZXZlbnVlIiwNCiAgICAgICB4ID0gIlJldmVudWUiLA0KICAgICAgIHkgPSAiRGVuc2l0eSIsDQogICAgICAgZmlsbCA9ICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gInJlZCIsICJGQUxTRSIgPSAiYmx1ZSIpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KIyMgUmVtb3Zpbmcgb3V0bGllcnMNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQptb3ZpZXNfZmlsdGVyZWRfYm90aCA8LSBtb3ZpZXNfZmlsdGVyZWRfYm90aCAlPiUNCm11dGF0ZShpc19vdXRsaWVyID0gcmV2ZW51ZV9vcmlnaW5hbCA8IDEwMDAwMCkNCm1vdmllc19maWx0ZXJlZF9ib3RoICU+JQ0KZmlsdGVyKGlzX291dGxpZXIpICU+JQ0KYXJyYW5nZShkZXNjKHJldmVudWVfb3JpZ2luYWwpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBGaWx0ZXIgb3V0IG91dGxpZXJzDQptb3ZpZXNfZmlsdGVyZWRfbm9fb3V0bGllcnMgPC0gbW92aWVzX2ZpbHRlcmVkX2JvdGggJT4lDQogIGZpbHRlcighaXNfb3V0bGllcikNCg0KIyBQbG90IGRlbnNpdHkgZGlzdHJpYnV0aW9ucyBvZiBsb2ctdHJhbnNmb3JtZWQgcmV2ZW51ZSB3aXRob3V0IG91dGxpZXJzDQpnZ3Bsb3QobW92aWVzX2ZpbHRlcmVkX25vX291dGxpZXJzLCBhZXMoeCA9IGxvZyhyZXZlbnVlX29yaWdpbmFsKSwgZmlsbCA9IGZhY3RvcihVU0EpKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjMpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IERpc3RyaWJ1dGlvbiBvZiBMb2ctdHJhbnNmb3JtZWQgUmV2ZW51ZSAoRXhjbHVkaW5nIE91dGxpZXJzKSIsDQogICAgICAgeCA9ICJMb2cgUmV2ZW51ZSIsDQogICAgICAgeSA9ICJEZW5zaXR5IiwNCiAgICAgICBmaWxsID0gIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAicmVkIiwgIkZBTFNFIiA9ICJibHVlIikpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3J9DQojIENhbGN1bGF0aW5nIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIG51bWVyaWNhbCB2YXJpYWJsZXMNCmNvcnJlbGF0aW9uX21hdHJpeCA8LSBjb3IobW92aWVzX2ZpbHRlcmVkX25vX291dGxpZXJzWywgYygiYnVkZ2V0X29yaWdpbmFsIiwgInJldmVudWVfb3JpZ2luYWwiLCAicG9wdWxhcml0eV9tYXgiLCAidm90ZV9hdmVyYWdlIiwgInZvdGVfY291bnQiKV0pDQoNCiMgU2NhdHRlcnBsb3Qgb2YgYnVkZ2V0IHZzIHJldmVudWUNCmdncGxvdChkYXRhID0gbW92aWVzX2ZpbHRlcmVkX25vX291dGxpZXJzLCBhZXMoeCA9IGJ1ZGdldF9vcmlnaW5hbCwgeSA9IHJldmVudWVfb3JpZ2luYWwpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsgIA0KICBsYWJzKHRpdGxlID0gIkJ1ZGdldCB2cyBSZXZlbnVlIiwNCiAgICAgICB4ID0gIkJ1ZGdldCIsDQogICAgICAgeSA9ICJSZXZlbnVlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCiMgQW5hbHlzaXMgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJ1ZGdldCBhbmQgcmV2ZW51ZQ0KYnVkZ2V0X3JldmVudWVfbG0gPC0gbG0ocmV2ZW51ZV9vcmlnaW5hbCB+IGJ1ZGdldF9vcmlnaW5hbCwgZGF0YSA9IG1vdmllc19maWx0ZXJlZF9ub19vdXRsaWVycykNCnN1bW1hcnkoYnVkZ2V0X3JldmVudWVfbG0pDQoNCiMgR2V0IHRoZSB0b3AgMTUgY291bnRyaWVzIGJ5IHJldmVudWUNCnRvcF9jb3VudHJpZXMgPC0gbW92aWVzX2ZpbHRlcmVkX25vX291dGxpZXJzICU+JQ0KICBncm91cF9ieShjb3VudHJ5MSkgJT4lDQogIHN1bW1hcml6ZSh0b3RhbF9yZXZlbnVlID0gc3VtKHJldmVudWVfb3JpZ2luYWwsIG5hLnJtID0gVFJVRSkpICU+JQ0KICB0b3BfbigxNSwgdG90YWxfcmV2ZW51ZSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9yZXZlbnVlKSkgJT4lDQogIHB1bGwoY291bnRyeTEpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIHRoZSB0b3AgMTUgY291bnRyaWVzDQptb3ZpZXNfZmlsdGVyZWRfdG9wX2NvdW50cmllcyA8LSBtb3ZpZXNfZmlsdGVyZWRfbm9fb3V0bGllcnMgJT4lDQogIGZpbHRlcihjb3VudHJ5MSAlaW4lIHRvcF9jb3VudHJpZXMpDQoNCiMgU2NhdHRlcnBsb3Qgb2YgcmV2ZW51ZSBieSBjb3VudHJ5IGZvciB0b3AgMTUgY291bnRyaWVzDQpnZ3Bsb3QoZGF0YSA9IG1vdmllc19maWx0ZXJlZF90b3BfY291bnRyaWVzLCBhZXMoeCA9IGNvdW50cnkxLCB5ID0gcmV2ZW51ZV9vcmlnaW5hbCwgZmlsbCA9IGNvdW50cnkxKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiUmV2ZW51ZSBieSBDb3VudHJ5IG9mIE9yaWdpbiAoVG9wIDE1IENvdW50cmllcykiLA0KICAgICAgIHggPSAiQ291bnRyeSIsDQogICAgICAgeSA9ICJSZXZlbnVlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpDQoNCmBgYA0KDQojIyMgc2hhcGUNCg0KYGBge3J9DQojIFN1bW1hcnkgU3RhdGlzdGljcw0Kc3VtbWFyeV9zdGF0cyA8LSBmdW5jdGlvbihkYXRhLCBjb2wpIHsNCiAgY2F0KCJcbi0tLSBTdW1tYXJ5IFN0YXRpc3RpY3MgZm9yIiwgY29sLCAiLS0tXG4iKQ0KICBtZWFuX3ZhbCA8LSBtZWFuKGRhdGFbW2NvbF1dLCBuYS5ybSA9IFRSVUUpDQogIG1lZGlhbl92YWwgPC0gbWVkaWFuKGRhdGFbW2NvbF1dLCBuYS5ybSA9IFRSVUUpDQogIG1vZGVfdmFsIDwtIGdldF9tb2RlKGRhdGFbW2NvbF1dKQ0KICBzZF92YWwgPC0gc2QoZGF0YVtbY29sXV0sIG5hLnJtID0gVFJVRSkNCiAgcmFuZ2VfdmFsIDwtIHJhbmdlKGRhdGFbW2NvbF1dLCBuYS5ybSA9IFRSVUUpDQogIGlxcl92YWwgPC0gSVFSKGRhdGFbW2NvbF1dLCBuYS5ybSA9IFRSVUUpDQogIHNrZXduZXNzX3ZhbCA8LSBza2V3bmVzcyhkYXRhW1tjb2xdXSwgbmEucm0gPSBUUlVFKQ0KICBrdXJ0b3Npc192YWwgPC0ga3VydG9zaXMoZGF0YVtbY29sXV0sIG5hLnJtID0gVFJVRSkNCg0KICBjYXQoIk1lYW46IiwgbWVhbl92YWwsICJcbk1lZGlhbjoiLCBtZWRpYW5fdmFsLCAiXG5Nb2RlOiIsIG1vZGVfdmFsLCANCiAgICAgICJcblN0YW5kYXJkIERldmlhdGlvbjoiLCBzZF92YWwsICJcblZhcmlhbmNlOiIsIHNkX3ZhbF4yLA0KICAgICAgIlxuUmFuZ2U6IFsiLCByYW5nZV92YWxbMV0sICIsIiwgcmFuZ2VfdmFsWzJdLCAiXSIsDQogICAgICAiXG5JbnRlcnF1YXJ0aWxlIFJhbmdlOiIsIGlxcl92YWwsDQogICAgICAiXG5Ta2V3bmVzczoiLCBza2V3bmVzc192YWwsICJcbkt1cnRvc2lzOiIsIGt1cnRvc2lzX3ZhbCwgIlxuIikNCn0NCg0KIyBSdW4gdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBmdW5jdGlvbiBmb3IgJ2J1ZGdldF9vcmlnaW5hbCcgYW5kICdyZXZlbnVlX29yaWdpbmFsJw0Kc3VtbWFyeV9zdGF0cyhtb3ZpZXMsICJidWRnZXRfb3JpZ2luYWwiKQ0Kc3VtbWFyeV9zdGF0cyhtb3ZpZXMsICJyZXZlbnVlX29yaWdpbmFsIikNCg0KYGBgDQoNCiMgUmVzdWx0cy9maW5kaW5ncw0KDQpBbG1vc3QgYWxsIGZpbmRpbmdzIGFyZSBiYXNlZCBvbiByZXZlbnVlLCBhcyBJIGNob3NlIGl0IGFzIG15IGluZGVwZW5kZW50IHZhcmlhYmxlLiBCYXNlZCBvbiB0aGF0LCB3ZSBjYW4gZmluZCBtYW55IGludGVyZXN0aW5nIGFuZCB1c2VmdWwgaW5zaWdodHMuIA0KDQoqKlJlY2VwaWUgZm9yIGEgc3VjY2Vzc2Z1bCBtb3ZpZToqKg0KDQoqICpQcmltYXJ5IGxhbmd1YWdlOiogRW5nbGlzaA0KKiAqTWFpbiB0aGVtZS9nZW5yZToqIEFkdmVudHVyZQ0KKiAqU3ViLWdlbnJlOiogQWN0aW9uL0ZhbnRhc3kvU2NpZW5jZSBGaWN0aW9uL0ZhbWlseQ0KKiAqRHVyYXRpb24gb2YgdGhlIG1vdmllOiogQXJvdW5kIDIgaG91cnMgbG9uZyANCiogKlJlbGVhc2UgdGltZToqIFN1bW1lciAoSnVuZSAmIEp1bHkpDQoqICpDb21wYW5pZXM6KiBDb2xsYWJvcmF0ZSB3aXRoIG90aGVyIGNvbXBhbmllcyAoMiBvdGhlciBjb21wYW5pZXMpLiBCZXN0IGNvbXBhbmllcyB0byB3b3JrIHdpdGggYXJlIFBhcmFtb3VudCwgVW5pdmVyc2FsIGFuZCBEaXNuZXkuIENvbGxhYm9yYXRpb24gd2l0aCBzbWFsbGVyIHByb2R1Y3Rpb24gY29tcGFuaWVzIHdvdWxkIGFsc28gYmVuZWZpdCBncmVhdGx5IGFzIGxvbmcgYXMgdGhleSBhcmUgYW1lcmljYW4uDQoqICpUaXRsZToqIFRoZSBtb3ZpZSBuYW1lIGhhcyB0byBiZSAxNiBjaGFyYWN0ZXIgbG9uZy4NCiogKlBsb3Q6KiBUaGUgbW92aWUgbXVzdCBiZSAiYmFzZWQgb24gYSBub3ZlbCIgb3IgInNhdmluZyB0aGUgd29ybGQiLg0KKiAqU2V0dGluZzoqIEJlc3QgcGxhY2VzIGZvciB0aGUgbW92aWUgc2V0dGluZyB3b3VsZCBiZSBFbmdsYW5kLCBMb25kb24sIFBhcmlzIG9yIE5ldyB5b3JrLg0KKiAqRGlyZWN0b3IqIFdoZW4gbG9va2luZyBhdCBrZXl3b3JkcyBpbiB0aGUgZGF0YWJhc2UsIG9uZSBvZiB0aGUgbW9zdCByZXBlYXRlZCB3b3JkcyBhbW9uZyBoaWdoIHJldmVudWUgbW92aWVzIGlzICJ3b21hbiBkaXJlY3RvciIuIEhvd2V2ZXIsIGJhc2VkIG9uIGludGVybmV0IHNlYXJjaCBvZiBoaWdoZXN0IGdyb3NzaW5nIG1vdmllcywgbW9zdCBmaWxtIGRpcmVjdG9ycyBvZiB0aG9zZSBtb3ZpZXMgYXJlIG1lbi4NCg0KSGVyZSBhcmUgc29tZSB2aXN1YWxpemF0aW9ucyB1c2VkIHRvIGNvbmZpcm0gdGhpcyBtb3ZpZSByZWNlcGllLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGFuZ3VhZ2VfZnJlcSA8LSB0YWJsZShtb3ZpZXMkb3JpZ2luYWxfbGFuZ3VhZ2UpDQoNCnByaW50KGxhbmd1YWdlX2ZyZXEpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIEJhciBwbG90IG9mIGF2ZXJhZ2UgcmV2ZW51ZSBieSBnZW5yZQ0KbW92aWVzICU+JQ0KICBncm91cF9ieShnZW5yZTEpICU+JQ0KICBzdW1tYXJpc2UoYXZnX3JldmVudWUgPSBtZWFuKHJldmVudWUsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBnZW5yZTEsIHkgPSBhdmdfcmV2ZW51ZSwgZmlsbCA9IGdlbnJlMSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh4ID0gIkdlbnJlIiwgeSA9ICJBdmVyYWdlIFJldmVudWUiLCB0aXRsZSA9ICJBdmVyYWdlIFJldmVudWUgYnkgR2VucmUiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIENhbGN1bGF0aW5nIGF2ZXJhZ2UgcG9wdWxhcml0eSBmb3IgZWFjaCBnZW5yZQ0KZ2VucmUxX3BvcHVsYXJpdHkgPC0gbW92aWVzICU+JQ0KICBncm91cF9ieShnZW5yZTEpICU+JQ0KICBzdW1tYXJpc2UoYXZlcmFnZV9wb3B1bGFyaXR5ID0gbWVhbihwb3B1bGFyaXR5LCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgYXJyYW5nZShkZXNjKGF2ZXJhZ2VfcG9wdWxhcml0eSkpDQoNCiMgUGxvdA0KZ2dwbG90KGdlbnJlMV9wb3B1bGFyaXR5LCBhZXMoeCA9IHJlb3JkZXIoZ2VucmUxLCAtYXZlcmFnZV9wb3B1bGFyaXR5KSwgeSA9IGF2ZXJhZ2VfcG9wdWxhcml0eSwgZmlsbCA9IGdlbnJlMSkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBsYWJzKHggPSAiUHJpbWFyeSBHZW5yZSIsIHkgPSAiQXZlcmFnZSBQb3B1bGFyaXR5IiwgdGl0bGUgPSAiQXZlcmFnZSBQb3B1bGFyaXR5IGJ5IEdlbnJlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBGaWx0ZXIgb3V0IG1vdmllcyB3aXRoIHJ1bnRpbWUgPiAzMDAgbWludXRlcw0KZmlsdGVyZWRfbW92aWVzIDwtIG1vdmllcyAlPiUgZmlsdGVyKHJ1bnRpbWUgPD0gMzAwKQ0KDQojIEZpbmQgdGhlIG1lYW4gcnVudGltZSBvZiBmaWx0ZXJlZCBtb3ZpZXMNCm1lYW5fcnVudGltZSA8LSBtZWFuKGZpbHRlcmVkX21vdmllcyRydW50aW1lLCBuYS5ybSA9IFRSVUUpDQpwcmludChwYXN0ZSgiTWVhbiBydW50aW1lIChmaWx0ZXJlZCk6Iiwgcm91bmQobWVhbl9ydW50aW1lLCAyKSkpDQoNCiMgQ3JlYXRlIGEgc2NhdHRlcnBsb3Qgb2YgcmV2ZW51ZSB2cy4gcnVudGltZSBmb3IgZmlsdGVyZWQgbW92aWVzDQpnZ3Bsb3QoZmlsdGVyZWRfbW92aWVzLCBhZXMoeCA9IHJ1bnRpbWUsIHkgPSByZXZlbnVlKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHggPSAiUnVudGltZSAobWludXRlcykiLCB5ID0gIlJldmVudWUiLCB0aXRsZSA9ICJSZXZlbnVlIHZzLiBSdW50aW1lIChGaWx0ZXJlZCkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBFeHRyYWN0IG1vbnRoIGZyb20gcmVsZWFzZV9kYXRlIGFuZCBjYWxjdWxhdGUgYXZlcmFnZSByZXZlbnVlIGJ5IG1vbnRoDQptb3ZpZXMkcmVsZWFzZV9tb250aCA8LSBtb250aChhcy5EYXRlKG1vdmllcyRyZWxlYXNlX2RhdGUpKQ0KbW9udGhfcmV2ZW51ZSA8LSBtb3ZpZXMgJT4lDQogIGdyb3VwX2J5KHJlbGVhc2VfbW9udGgpICU+JQ0KICBzdW1tYXJpc2UoYXZlcmFnZV9yZXZlbnVlID0gbWVhbihyZXZlbnVlLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgYXJyYW5nZShyZWxlYXNlX21vbnRoKQ0KDQojIFBsb3QNCmdncGxvdChtb250aF9yZXZlbnVlLCBhZXMoeCA9IGZhY3RvcihyZWxlYXNlX21vbnRoLCBsYWJlbHMgPSBtb250aC5uYW1lKSwgeSA9IGF2ZXJhZ2VfcmV2ZW51ZSkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnMoeCA9ICJNb250aCBvZiBSZWxlYXNlIiwgeSA9ICJBdmVyYWdlIFJldmVudWUiLCB0aXRsZSA9ICJBdmVyYWdlIFJldmVudWUgYnkgTW9udGggb2YgUmVsZWFzZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgVGFibGUgb2YgdG9wIHByb2R1Y3Rpb24gY29tcGFuaWVzIGJ5IHJldmVudWUNCnRvcF9wcm9kdWN0aW9uIDwtIG1vdmllcyAlPiUNCiAgZ3JvdXBfYnkoY29tcGFueTEpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfcmV2ZW51ZSA9IHN1bShyZXZlbnVlLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgdG9wX24oMTAsIHRvdGFsX3JldmVudWUpDQoNCiMgQmFyIHBsb3Qgb2YgdG9wIHByb2R1Y3Rpb24gY29tcGFuaWVzIGJ5IHJldmVudWUNCmdncGxvdCh0b3BfcHJvZHVjdGlvbiwgYWVzKHggPSByZW9yZGVyKGNvbXBhbnkxLCB0b3RhbF9yZXZlbnVlKSwgeSA9IHRvdGFsX3JldmVudWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiKSArDQogIGxhYnMoeCA9ICJQcm9kdWN0aW9uIENvbXBhbnkiLCB5ID0gIlRvdGFsIFJldmVudWUiLCB0aXRsZSA9ICJUb3AgUHJvZHVjdGlvbiBDb21wYW5pZXMgYnkgUmV2ZW51ZSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgQ2FsY3VsYXRlIHRvdGFsIHJldmVudWUgcGVyIGNvdW50cnkNCmNvdW50cnlfcmV2ZW51ZSA8LSBtb3ZpZXMgJT4lDQogIGdyb3VwX2J5KGNvdW50cnkxKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3JldmVudWUgPSBzdW0ocmV2ZW51ZSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9yZXZlbnVlKSkgIyBBcnJhbmdlIGJ5IHRvdGFsIHJldmVudWUgaW4gZGVzY2VuZGluZyBvcmRlcg0KDQojIFNlbGVjdCB0b3AgTiBjb3VudHJpZXMgd2l0aCB0aGUgaGlnaGVzdCB0b3RhbCByZXZlbnVlDQp0b3BfY291bnRyaWVzIDwtIGNvdW50cnlfcmV2ZW51ZSAlPiUNCiAgdG9wX24oNSwgdG90YWxfcmV2ZW51ZSkgIyBDaGFuZ2UgNSB0byB0aGUgZGVzaXJlZCBudW1iZXIgb2YgdG9wIGNvdW50cmllcw0KDQojIEZpbHRlciBtb3ZpZXMgZGF0YXNldCBmb3IgdGhlIHRvcCBjb3VudHJpZXMNCnRvcF9tb3ZpZXMgPC0gbW92aWVzICU+JQ0KICBmaWx0ZXIoY291bnRyeTEgJWluJSB0b3BfY291bnRyaWVzJGNvdW50cnkxKQ0KDQojIEJhciBwbG90IG9mIHJldmVudWUgYnkgbnVtYmVyIG9mIHByb2R1Y3Rpb24gY29tcGFuaWVzIGZvciB0b3AgY291bnRyaWVzDQpnZ3Bsb3QodG9wX21vdmllcywgYWVzKHggPSBjb21wYW55X2NvdW50LCB5ID0gcmV2ZW51ZSwgZmlsbCA9IGNvdW50cnkxKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGZhY2V0X3dyYXAofiBjb3VudHJ5MSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpkb2xsYXIpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBQcm9kdWN0aW9uIENvbXBhbmllcyIsIHkgPSAiUmV2ZW51ZSIsIHRpdGxlID0gIlJldmVudWUgYnkgTnVtYmVyIG9mIFByb2R1Y3Rpb24gQ29tcGFuaWVzIGZvciBUb3AgQ291bnRyaWVzIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBlYWNoIG1vdmllIHRpdGxlDQptb3ZpZXMkdGl0bGVfbGVuZ3RoIDwtIG5jaGFyKG1vdmllcyRvcmlnaW5hbF90aXRsZSkNCg0KIyBDcmVhdGUgYSBzY2F0dGVycGxvdCBvZiByZXZlbnVlIHZzLiB0aXRsZSBsZW5ndGgNCmdncGxvdChtb3ZpZXMsIGFlcyh4ID0gdGl0bGVfbGVuZ3RoLCB5ID0gcmV2ZW51ZSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgbGFicyh4ID0gIlRpdGxlIExlbmd0aCIsIHkgPSAiUmV2ZW51ZSIsIHRpdGxlID0gIlJldmVudWUgdnMuIFRpdGxlIExlbmd0aCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgQ2FsY3VsYXRlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50DQpjb3JyZWxhdGlvbiA8LSBjb3IobW92aWVzJHJldmVudWUsIG1vdmllcyR0aXRsZV9sZW5ndGgpDQpwcmludChwYXN0ZSgiQ29ycmVsYXRpb24gY29lZmZpY2llbnQ6Iiwgcm91bmQoY29ycmVsYXRpb24sIDIpKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgQ2FsY3VsYXRlIHRoZSBzdW0gb2YgcmV2ZW51ZSBmb3IgZWFjaCBrZXl3b3JkDQprZXl3b3JkX3JldmVudWUgPC0gYWdncmVnYXRlKHJldmVudWUgfiBrZXl3b3JkMSwgZGF0YSA9IG1vdmllcywgc3VtKQ0KDQojIEdlbmVyYXRlIHRoZSB3b3JkIGNsb3VkIHdpdGggcmV2ZW51ZS1iYXNlZCB3ZWlnaHRpbmcNCndvcmRjbG91ZCh3b3JkcyA9IGtleXdvcmRfcmV2ZW51ZSRrZXl3b3JkLCANCiAgICAgICAgICBmcmVxID0ga2V5d29yZF9yZXZlbnVlJHJldmVudWUsIA0KICAgICAgICAgIG1heC53b3JkcyA9IDEwMCwNCiAgICAgICAgICByYW5kb20ub3JkZXIgPSBGQUxTRSwNCiAgICAgICAgICBjb2xvcnMgPSBicmV3ZXIucGFsKDgsICJEYXJrMiIpKQ0KYGBgDQoNCiMgQ29uY2x1c2lvbnMNCg0KSW4gY29uY2x1c2lvbiwgdGhlIGFuYWx5c2lzIG9mIHJldmVudWUgZGF0YSBpbiB0aGUgZmlsbSBpbmR1c3RyeSByZXZlYWxzIGEgcmVmaW5lZCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBmYWN0b3JzIGluZmx1ZW5jaW5nIG1vdmllIHN1Y2Nlc3MuIEVuZ2xpc2gtbGFuZ3VhZ2UgZmlsbXMsIHBhcnRpY3VsYXJseSB3aXRoaW4gdGhlIGFkdmVudHVyZSBnZW5yZSwgZG9taW5hdGUgdGhlIGJveCBvZmZpY2UsIHN1Z2dlc3RpbmcgYSBjbGVhciBwcmVmZXJlbmNlIGFtb25nIGF1ZGllbmNlcy4gU3RyYXRlZ2ljIGVsZW1lbnRzIHN1Y2ggYXMgcnVudGltZSwgcmVsZWFzZSB0aW1pbmcsIGFuZCBjb2xsYWJvcmF0aXZlIHBhcnRuZXJzaGlwcyB3aXRoIHJlbm93bmVkIHByb2R1Y3Rpb24gY29tcGFuaWVzIHNpZ25pZmljYW50bHkgaW1wYWN0IHJldmVudWUgb3V0Y29tZXMuIE1vcmVvdmVyLCB0aGUgcHJlc2VuY2Ugb2YgZmVtYWxlIGRpcmVjdG9ycyBlbWVyZ2VzIGFzIGEgcG90ZW50aWFsbHkgbHVjcmF0aXZlIHBhdGggZm9yIGVuaGFuY2luZyBmaWxtIHByb2ZpdGFiaWxpdHkuIFRoZXNlIGZpbmRpbmdzIHJlaW5mb3JjZSB0aGUgaW1wb3J0YW5jZSBvZiBzdHJhdGVnaWMgZGVjaXNpb24tbWFraW5nIGFuZCBhdWRpZW5jZS1jZW50cmljIGNvbnRlbnQgY3JlYXRpb24gaW4gZHJpdmluZyByZXZlbnVlIGdyb3d0aCBpbiB0aGUgZmlsbSBpbmR1c3RyeS4gQnkgbGV2ZXJhZ2luZyB0aGVzZSBpbnNpZ2h0cywgc3Rha2Vob2xkZXJzIGNhbiBuYXZpZ2F0ZSBtYXJrZXQgZHluYW1pY3MgbW9yZSBlZmZlY3RpdmVseSwgdWx0aW1hdGVseSBmb3N0ZXJpbmcgc3VzdGFpbmVkIHN1Y2Nlc3MgYW5kIGlubm92YXRpb24gaW4gbW92aWUgcHJvZHVjdGlvbi4NCg0KIyMgQnVzaW5lc3MgUmVjb21tZW5kYXRpb25zOg0KDQoxLiAqKlN0cmF0ZWdpYyBQYXJ0bmVyc2hpcHM6KiogRXN0YWJsaXNoIHBhcnRuZXJzaGlwcyB3aXRoIGxlYWRpbmcgcHJvZHVjdGlvbiBjb21wYW5pZXMgbGlrZSBQYXJhbW91bnQsIFVuaXZlcnNhbCwgYW5kIERpc25leSB0byBsZXZlcmFnZSB0aGVpciBleHBlcnRpc2UgYW5kIHJlc291cmNlcy4gQWRkaXRpb25hbGx5LCBleHBsb3JlIGNvbGxhYm9yYXRpb25zIHdpdGggZW1lcmdpbmcgQW1lcmljYW4gcHJvZHVjdGlvbiBob3VzZXMgdG8gZGl2ZXJzaWZ5IGNvbnRlbnQgb2ZmZXJpbmdzLg0KDQoyLiAqKkNvbnRlbnQgRGV2ZWxvcG1lbnQ6KiogRm9jdXMgb24gcHJvZHVjaW5nIEVuZ2xpc2gtbGFuZ3VhZ2UgYWR2ZW50dXJlIGZpbG1zIHdpdGggY29tcGVsbGluZyBzdG9yeWxpbmVzIGNlbnRlcmVkIG9uIHRoZW1lcyBsaWtlIGFjdGlvbiwgZmFudGFzeSwgc2NpZW5jZSBmaWN0aW9uLCBvciBmYW1pbHktb3JpZW50ZWQgbmFycmF0aXZlcy4gQ29uc2lkZXIgYWRhcHRpbmcgcG9wdWxhciBub3ZlbHMgZm9yIGNpbmVtYXRpYyBhZGFwdGF0aW9ucyB0byBjYXBpdGFsaXplIG9uIGV4aXN0aW5nIGZhbiBiYXNlcy4NCg0KMy4gKipSZWxlYXNlIFN0cmF0ZWd5OioqIFBsYW4gbW92aWUgcmVsZWFzZXMgZHVyaW5nIHRoZSBzdW1tZXIgc2Vhc29uLCBwYXJ0aWN1bGFybHkgaW4gSnVuZSBhbmQgSnVseSwgdG8gbWF4aW1pemUgYm94IG9mZmljZSBwZXJmb3JtYW5jZS4gVXRpbGl6ZSBkYXRhLWRyaXZlbiBpbnNpZ2h0cyB0byBpZGVudGlmeSBvcHRpbWFsIHJlbGVhc2UgZGF0ZXMgYW5kIGF2b2lkIGNsYXNoZXMgd2l0aCBtYWpvciBibG9ja2J1c3RlciByZWxlYXNlcy4NCg0KNC4gKipEaXJlY3RvcmlhbCBEaXZlcnNpdHk6KiogRW5jb3VyYWdlIGRpdmVyc2l0eSBpbiBkaXJlY3RvcmlhbCByb2xlcyBieSBhY3RpdmVseSBzZWVraW5nIG9wcG9ydHVuaXRpZXMgdG8gY29sbGFib3JhdGUgd2l0aCB0YWxlbnRlZCBmZW1hbGUgZGlyZWN0b3JzLiBFbWJyYWNlIGluY2x1c2l2aXR5IGFuZCBwcm9tb3RlIGdlbmRlciBkaXZlcnNpdHkgaW4gY3JlYXRpdmUgZGVjaXNpb24tbWFraW5nIHByb2Nlc3Nlcy4NCg0KNS4gKipNYXJrZXQgRXhwYW5zaW9uOioqIEV4cGxvcmUgb3Bwb3J0dW5pdGllcyB0byBleHBhbmQgaW50byBpbnRlcm5hdGlvbmFsIG1hcmtldHMgd2hpbGUgbWFpbnRhaW5pbmcgYSBmb2N1cyBvbiBFbmdsaXNoLXNwZWFraW5nIGF1ZGllbmNlcy4gVGFpbG9yIG1hcmtldGluZyBzdHJhdGVnaWVzIGFuZCBsb2NhbGl6YXRpb24gZWZmb3J0cyB0byByZXNvbmF0ZSB3aXRoIGRpdmVyc2UgY3VsdHVyYWwgcHJlZmVyZW5jZXMgYW5kIHNlbnNpYmlsaXRpZXMuDQoNCkltcGxlbWVudGluZyB0aGVzZSByZWNvbW1lbmRhdGlvbnMgY2FuIGVuaGFuY2UgdGhlIG92ZXJhbGwgc3VjY2VzcyBhbmQgcHJvZml0YWJpbGl0eSBvZiBtb3ZpZSBwcm9kdWN0aW9ucywgZHJpdmluZyBzdXN0YWluZWQgZ3Jvd3RoIGluIHRoZSBkeW5hbWljIGVudGVydGFpbm1lbnQgaW5kdXN0cnkgbGFuZHNjYXBlLg0KDQoNCiMgUmVmZXJlbmNlcw0KDQpJbiB0aGUgZGF0YSBjbGVhbmluZyBwcm9jZXNzLCBJIHNlYXJjaGVkIGZvciB2YXJpb3VzIG1vdmllcyB0aGF0IHdlcmUgcG9zc2libHkgc2lsZW50IGFuZCBmb3VuZCB0aGF0IHRoZXkgaW4gZmFjdCB3ZXJlLiBGb3IgZXhhbXBsZTogW0JsYWNrc21pdGggU2NlbmVdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9QmxhY2tzbWl0aCtTY2VuZSZzY2FfZXN2PTMwNTE3ZWE2Njk5MDQxODgmc2NhX3Vwdj0xJnJsej0xQzFDSEJGX2VzTVg4NjFNWDg2MSZlaT10V3N3Wm9fN0JjS19wODRQNWFxTTBBayZ2ZWQ9MGFoVUtFd2pQcWZDN2hlbUZBeFhDMzhrREhXVVZBNW9RNGRVRENCQSZ1YWN0PTUmb3E9QmxhY2tzbWl0aCtTY2VuZSZnc19scD1FZ3huZDNNdGQybDZMWE5sY25BaUVFSnNZV05yYzIxcGRHZ2dVMk5sYm1VeUJSQXVHSUFFTWdZUUFCZ1dHQjR5QmhBQUdCWVlIaklJRUFBWUZoZ2VHQTh5QmhBQUdCWVlIaklHRUFBWUZoZ2VNZ1lRQUJnV0dCNHlDQkFBR0lBRUdLSUVNaFFRTGhpQUJCaVhCUmpjQkJqZUJCamdCTmdCQTBqYjlCTlFuUElUV0p6eUUzQUJlQUdRQVFDWUFkWUJvQUhXQWFvQkF6SXRNYmdCQThnQkFQZ0JBZmdCQXBnQ0FxQUNpZ0tvQWdyQ0FoUVFBQmlBQkJqakJCaTBBaGpwQkJqcUF0Z0JBY0lDRmhBQUdBTVl0QUlZNVFJWTZnSVlqQU1ZandIWUFRTENBaFlRTGhnREdMUUNHT1VDR09vQ0dJd0RHSThCMkFFQ21BTWJ1Z1lFQ0FFWUI3b0dCQWdDR0FxNkJnWUlBeEFCR0JTU0J3VXhMakF1TWFBSGxRYyZzY2xpZW50PWd3cy13aXotc2VycCkgYW5kIFtMZSBtYW5vaXIgZHUgZGlhYmxlXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPUxlK21hbm9pcitkdStkaWFibGUmc2NhX2Vzdj0zMDUxN2VhNjY5OTA0MTg4JnNjYV91cHY9MSZybHo9MUMxQ0hCRl9lc01YODYxTVg4NjEmZWk9RTIwd1pydjlHSzdNcDg0UHpvR184QUUmdmVkPTBhaFVLRXdqNzB2WGlodW1GQXhVdTVza0RIYzdBRHg0UTRkVURDQkEmdWFjdD01Jm9xPUxlK21hbm9pcitkdStkaWFibGUmZ3NfbHA9RWd4bmQzTXRkMmw2TFhObGNuQWlFMHhsSUcxaGJtOXBjaUJrZFNCa2FXRmliR1V5QlJBdUdJQUVNZ1lRQUJnV0dCNHlCaEFBR0JZWUhqSUdFQUFZRmhnZU1nWVFBQmdXR0I0eUJoQUFHQllZSGpJR0VBQVlGaGdlTWdZUUFCZ1dHQjR5QmhBQUdCWVlIaklHRUFBWUZoZ2VNaFFRTGhpQUJCaVhCUmpjQkJqZUJCamdCTmdCQTBpMkNGRDJCVmoyQlhBQmVBR1FBUUNZQVpnQm9BR1lBYW9CQXpBdU1iZ0JBOGdCQVBnQkFmZ0JBcGdDQXFBQ3lRR29BaFRDQWhNUUxoaUFCQmhER0xRQ0dJb0ZHT29DMkFFQndnSVRFQUFZZ0FRWVF4aTBBaGlLQlJqcUF0Z0JBY0lDRkJBQUdJQUVHT01FR0xRQ0dPa0VHT29DMkFFQndnSVdFQzRZQXhpMEFoamxBaGpxQWhpTUF4aVBBZGdCQXNJQ0ZoQUFHQU1ZdEFJWTVRSVk2Z0lZakFNWWp3SFlBUUtZQXg2NkJnUUlBUmdIdWdZR0NBSVFBUmdLdWdZR0NBTVFBUmdVa2djRE1TNHhvQWU2Q0Emc2NsaWVudD1nd3Mtd2l6LXNlcnApLiBJIGFsc28gc2VhcmNoZWQgZm9yIG1vdmllcyB0aGF0IGhhZCB6ZXJvIGluIHJ1bnRpbWUgdG8gdmVyaWZ5IGlmIHRoZXkgaW4gZmFjdCBkaWQgdG8gZGV0ZXJtaW5lIGlmIGkgaGFkIHRvIGltcHV0YXRlIHRob3NlIHZhbHVlcywgaGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSBtb3ZpZXM6IFtUb3JubyBhIHZpdmVyZSBkYSBzb2xvXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPSUwOSUwRCUwQVRvcm5vK2Erdml2ZXJlK2RhK3NvbG8mc2NhX2Vzdj0zMDUxN2VhNjY5OTA0MTg4JnNjYV91cHY9MSZybHo9MUMxQ0hCRl9lc01YODYxTVg4NjEmZWk9TjIwd1pxcXNKWVRDcDg0UHA3MjB1QTgmdmVkPTBhaFVLRXdqcW81ZjBodW1GQXhVRTRja0RIYWNlRGZjUTRkVURDQkEmdWFjdD01Jm9xPSUwOSUwRCUwQVRvcm5vK2Erdml2ZXJlK2RhK3NvbG8mZ3NfbHA9RWd4bmQzTXRkMmw2TFhObGNuQWlHQWtLVkc5eWJtOGdZU0IyYVhabGNtVWdaR0VnYzI5c2J6SVRFQzRZZ0FRWVF4aTBBaGlLQlJqcUF0Z0JBVElURUM0WWdBUVlReGkwQWhpS0JSanFBdGdCQVRJVEVDNFlnQVFZUXhpMEFoaUtCUmpxQXRnQkFUSVRFQzRZZ0FRWVF4aTBBaGlLQlJqcUF0Z0JBVElXRUM0WWdBUVlReGpVQWhpMEFoaUtCUmpxQXRnQkFUSVRFQzRZZ0FRWVF4aTBBaGlLQlJqcUF0Z0JBVElURUM0WWdBUVlReGkwQWhpS0JSanFBdGdCQVRJV0VDNFlnQVFZUXhqVUFoaTBBaGlLQlJqcUF0Z0JBVElURUM0WWdBUVlReGkwQWhpS0JSanFBdGdCQVRJVEVBQVlnQVFZUXhpMEFoaUtCUmpxQXRnQkFUSVdFQzRZQXhpMEFoamxBaGpxQWhpTUF4aVBBZGdCQWpJV0VBQVlBeGkwQWhqbEFoanFBaGlNQXhpUEFkZ0JBaklXRUFBWUF4aTBBaGpsQWhqcUFoaU1BeGlQQWRnQkFqSVdFQUFZQXhpMEFoamxBaGpxQWhpTUF4aVBBZGdCQWpJV0VBQVlBeGkwQWhqbEFoanFBaGlNQXhpUEFkZ0JBaklXRUFBWUF4aTBBaGpsQWhqcUFoaU1BeGlQQWRnQkFqSVdFQUFZQXhpMEFoamxBaGpxQWhpTUF4aVBBZGdCQWpJV0VDNFlBeGkwQWhqbEFoanFBaGlNQXhpUEFkZ0JBaklXRUFBWUF4aTBBaGpsQWhqcUFoaU1BeGlQQWRnQkFqSVdFQUFZQXhpMEFoamxBaGpxQWhpTUF4aVBBZGdCQWtqNzNKa0JVTGpYbVFGWXVOZVpBWEFDZUFHUUFRQ1lBUUNnQVFDcUFRQzRBUVBJQVFENEFRSDRBUUtZQWdLZ0FsS29BaFNZQXoyNkJnUUlBUmdIdWdZR0NBSVFBUmdLa2djQk1xQUhBQSZzY2xpZW50PWd3cy13aXotc2VycCksIFtUaGUgQmxhY2sgV2F0ZXJzIG9mIEVjaG8ncyBQb25kXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPVRoZStCbGFjaytXYXRlcnMrb2YrRWNobyUyN3MrUG9uZCZzY2FfZXN2PTMwNTE3ZWE2Njk5MDQxODgmc2NhX3Vwdj0xJnJsej0xQzFDSEJGX2VzTVg4NjFNWDg2MSZiaXc9MTI4MCZiaWg9NTkzJmVpPTVhY3hadnlYTE5XNWtQSVBxN3l1OEFvJnZlZD0wYWhVS0V3aThucVNCcy11RkF4WFZIRVFJSFN1ZUM2NFE0ZFVEQ0JBJnVhY3Q9NSZvcT1UaGUrQmxhY2srV2F0ZXJzK29mK0VjaG8lMjdzK1BvbmQmZ3NfbHA9RWd4bmQzTXRkMmw2TFhObGNuQWlIMVJvWlNCQ2JHRmpheUJYWVhSbGNuTWdiMllnUldOb2J5ZHpJRkJ2Ym1ReUJSQXVHSUFFTWdVUUFCaUFCRElHRUFBWUZoZ2VNZ1lRQUJnV0dCNHlCaEFBR0JZWUhqSUdFQUFZRmhnZU1nWVFBQmdXR0I0eUJoQUFHQllZSGpJSUVBQVlnQVFZb2dReUNCQUFHSUFFR0tJRU1oUVFMaGlBQkJpWEJSamNCQmplQkJqZ0JOZ0JBa2p1QlZETkFsak5BbkFCZUFHUUFRQ1lBWm9Cb0FHYUFhb0JBekF1TWJnQkE4Z0JBUGdCQWZnQkFwZ0NBcUFDM2dHb0FnckNBaFlRQUJnREdMUUNHT1VDR09vQ0dJd0RHSThCMkFFQndnSVdFQzRZQXhpMEFoamxBaGpxQWhpTUF4aVBBZGdCQVpnREtyb0dCQWdCR0FxNkJnWUlBaEFCR0JTU0J3TXhMakdnQjg0TCZzY2xpZW50PWd3cy13aXotc2VycCkgYW5kIFtzdGFyIEZvcmNlOiBGdWdpdGl2ZSBBbGllbiBJSSBydW50aW1lXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPXN0YXIrRm9yY2UlM0ErRnVnaXRpdmUrQWxpZW4rSUkrcnVudGltZSZzY2FfZXN2PTMwNTE3ZWE2Njk5MDQxODgmc2NhX3Vwdj0xJnJsej0xQzFDSEJGX2VzTVg4NjFNWDg2MSZiaXc9MTI4MCZiaWg9NTkzJmVpPXhka3pacFhDRHVxZ2tQSVBfSWVzcUFvJnZlZD0wYWhVS0V3alZ1S2Z0eXUtRkF4VnFFRVFJSGZ3REM2VVE0ZFVEQ0JBJnVhY3Q9NSZvcT1zdGFyK0ZvcmNlJTNBK0Z1Z2l0aXZlK0FsaWVuK0lJK3J1bnRpbWUmZ3NfbHA9RWd4bmQzTXRkMmw2TFhObGNuQWlKWE4wWVhJZ1JtOXlZMlU2SUVaMVoybDBhWFpsSUVGc2FXVnVJRWxKSUhKMWJuUnBiV1V5QlJBaEdLQUJTS0lRVUtjQ1dNWU1jQUY0QVpBQkFKZ0I5UUdnQVpvS3FnRUZNQzQzTGpHNEFRUElBUUQ0QVFHWUFnbWdBcjBLd2dJS0VBQVlzQU1ZMWdRWVI4SUNCeEF1R0lBRUdCUENBZ2dRQUJnVEdCWVlIc0lDQ0JBQUdJQUVHS0lFd2dJV0VDNFlnQVFZRXhpWEJSamNCQmplQkJqZ0JOZ0JBWmdEQUlnR0FaQUdBcm9HQmdnQkVBRVlGSklIQlRFdU55NHhvQWZKR0Emc2NsaWVudD1nd3Mtd2l6LXNlcnApLiBMYXN0bHksIEkgY29uc3VsdGVkIHNlYXJjaGVzIG9mIHRoZSBtb3N0IHByb2ZpdGFibGUgbW92aWVzIHRvIHNlZSBpZiB0aGUgZGlyZWN0b3Igd2FzIGEgbWFuIG9yIHdvbWFuLCBbQm94IE9mZmljZSBNb2pvXShodHRwczovL3d3dy5ib3hvZmZpY2Vtb2pvLmNvbS9jaGFydC90b3BfbGlmZXRpbWVfZ3Jvc3MvP2FyZWE9WFdXKSBpcyBhIHdlYnNpdGUgdGhhdCBsaXN0ZWQgdGhlIGhpZ2hlc3QgZ3Jvc3NpbmcgbW92aWVzIGFuZCBkaXNwbGF5cyB0aGVpciBpbmZvcm1hdGlvbi4NCg==