From 5890792e574bdd6c64aac6ac357dd05992e4638b Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 10 Dec 2018 19:38:04 +0200 Subject: [PATCH 01/94] major refactor in HTMLVideo to prevent race conditions --- .../Player/Video/stremio-video/HTMLVideo.js | 187 +++++++++--------- 1 file changed, 97 insertions(+), 90 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index e95fa2dfb..9862a61ac 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -1,6 +1,7 @@ var EventEmitter = require('events'); var HTMLVideo = function(containerElement) { + var self = this; var style = document.createElement('style'); containerElement.appendChild(style); style.sheet.insertRule('#' + containerElement.id + ' video { width: 100%; height: 100%; }', style.sheet.cssRules.length); @@ -8,10 +9,37 @@ var HTMLVideo = function(containerElement) { var videoElement = document.createElement('video'); containerElement.appendChild(videoElement); videoElement.crossOrigin = 'anonymous'; - videoElement.autoplay = true; var events = new EventEmitter(); - var ready = false; + var loaded = false; + var destroyed = false; var dispatchArgsQueue = []; + var getPaused = function() { + if (!loaded) { + return null; + } + + return !!videoElement.paused; + }; + var getTime = function() { + if (!loaded) { + return null; + } + + return Math.floor(videoElement.currentTime * 1000); + }; + var getDuration = function() { + if (!loaded || isNaN(videoElement.duration)) { + return null; + } + + return Math.floor(videoElement.duration * 1000); + }; + var getVolume = function() { + return videoElement.muted ? 0 : Math.floor(videoElement.volume * 100); + }; + var getSubtitles = function() { + return []; + }; var onEnded = function() { events.emit('ended'); }; @@ -46,89 +74,68 @@ var HTMLVideo = function(containerElement) { critical: critical }); }; - var onPausedChanged = function() { - events.emit('propChanged', 'paused', videoElement.paused); - }; - var onTimeChanged = function() { - events.emit('propChanged', 'time', videoElement.currentTime * 1000); - }; - var onDurationChanged = function() { - events.emit('propChanged', 'duration', isNaN(videoElement.duration) ? null : videoElement.duration * 1000); - }; - var onVolumeChanged = function() { - events.emit('propChanged', 'volume', !videoElement.muted ? videoElement.volume * 100 : 0); - }; - var onSubtitlesChanged = function() { - var subtitles = []; - for (var i = 0; i < videoElement.textTracks.length; i++) { - if (videoElement.textTracks[i].kind === 'subtitles') { - subtitles.push({ - id: videoElement.textTracks[i].id, - language: videoElement.textTracks[i].language, - label: videoElement.textTracks[i].label - }); - } - } - - events.emit('propChanged', 'subtitles', subtitles); - }; - var onReady = function() { - ready = true; + var onLoaded = function() { for (var i = 0; i < dispatchArgsQueue.length; i++) { - this.dispatch.apply(this, dispatchArgsQueue[i]); + self.dispatch.apply(self, dispatchArgsQueue[i]); } dispatchArgsQueue = []; - }.bind(this); - videoElement.addEventListener('ended', onEnded); - videoElement.addEventListener('error', onError); + }; + var onPausedChanged = function() { + events.emit('propChanged', 'paused', getPaused()); + }; + var onTimeChanged = function() { + events.emit('propChanged', 'time', getTime()); + }; + var onDurationChanged = function() { + events.emit('propChanged', 'duration', getDuration()); + }; + var onVolumeChanged = function() { + events.emit('propChanged', 'volume', getVolume()); + }; + var onSubtitlesChanged = function() { + events.emit('propChanged', 'subtitles', getSubtitles()); + }; this.on = function(eventName, listener) { + if (destroyed) { + throw new Error('Unable to add ' + eventName + ' listener to destroyed video'); + } + events.on(eventName, listener); }; this.dispatch = function() { + if (destroyed) { + throw new Error('Unable to dispatch ' + arguments[0] + ' to destroyed video'); + } + if (arguments[0] === 'observeProp') { switch (arguments[1]) { case 'paused': - events.emit('propValue', 'paused', videoElement.paused); + events.emit('propValue', 'paused', getPaused()); videoElement.removeEventListener('pause', onPausedChanged); videoElement.removeEventListener('play', onPausedChanged); videoElement.addEventListener('pause', onPausedChanged); videoElement.addEventListener('play', onPausedChanged); return; case 'time': - events.emit('propValue', 'time', videoElement.currentTime * 1000); + events.emit('propValue', 'time', getTime()); videoElement.removeEventListener('timeupdate', onTimeChanged); videoElement.addEventListener('timeupdate', onTimeChanged); return; case 'duration': - events.emit('propValue', 'duration', isNaN(videoElement.duration) ? null : videoElement.duration * 1000); + events.emit('propValue', 'duration', getDuration()); videoElement.removeEventListener('durationchange', onDurationChanged); videoElement.addEventListener('durationchange', onDurationChanged); return; case 'volume': - events.emit('propValue', 'volume', !videoElement.muted ? videoElement.volume * 100 : 0); + events.emit('propValue', 'volume', getVolume()); videoElement.removeEventListener('volumechange', onVolumeChanged); videoElement.addEventListener('volumechange', onVolumeChanged); return; case 'subtitles': - var subtitles = []; - for (var i = 0; i < videoElement.textTracks.length; i++) { - if (videoElement.textTracks[i].kind === 'subtitles') { - subtitles.push({ - id: videoElement.textTracks[i].id, - language: videoElement.textTracks[i].language, - label: videoElement.textTracks[i].label - }); - } - } - - events.emit('propValue', 'subtitles', subtitles); - videoElement.textTracks.removeEventListener('addtrack', onSubtitlesChanged); - videoElement.textTracks.removeEventListener('removetrack', onSubtitlesChanged); - videoElement.textTracks.addEventListener('addtrack', onSubtitlesChanged); - videoElement.textTracks.addEventListener('removetrack', onSubtitlesChanged); + events.emit('propValue', 'subtitles', getSubtitles()); return; default: throw new Error('observeProp not supported: ' + arguments[1]); @@ -136,11 +143,15 @@ var HTMLVideo = function(containerElement) { } else if (arguments[0] === 'setProp') { switch (arguments[1]) { case 'paused': - arguments[2] ? videoElement.pause() : videoElement.play(); - return; + if (loaded) { + arguments[2] ? videoElement.pause() : videoElement.play(); + } + break; case 'time': - videoElement.currentTime = arguments[2] / 1000; - return; + if (loaded) { + videoElement.currentTime = arguments[2] / 1000; + } + break; case 'volume': videoElement.muted = false; videoElement.volume = arguments[2] / 100; @@ -150,59 +161,55 @@ var HTMLVideo = function(containerElement) { } } else if (arguments[0] === 'command') { switch (arguments[1]) { - case 'load': - if (!isNaN(arguments[3].time)) { - videoElement.currentTime = arguments[3].time / 1000; - } - - videoElement.src = arguments[2].url; - videoElement.load(); - onReady(); - return; case 'mute': videoElement.muted = true; - break; + return; case 'unmute': - if (videoElement.volume === 0) { - videoElement.volume = 0.5; - } - + videoElement.volume = videoElement.volume !== 0 ? videoElement.volume : 0.5; videoElement.muted = false; - break; + return; case 'addExtraSubtitles': - if (ready) { - for (var i = 0; i < arguments[2].length; i++) { - var track = document.createElement('track'); - track.kind = 'subtitles'; - track.id = arguments[2][i].id; - track.src = arguments[2][i].url; - track.label = arguments[2][i].label; - track.srclang = arguments[2][i].language; - videoElement.appendChild(track); - } + if (loaded) { } break; case 'stop': - events.removeAllListeners(); videoElement.removeEventListener('ended', onEnded); videoElement.removeEventListener('error', onError); + loaded = false; + videoElement.removeAttribute('src'); + videoElement.load(); + videoElement.currentTime = 0; + onPausedChanged(); + onTimeChanged(); + onDurationChanged(); + onSubtitlesChanged(); + return; + case 'load': + self.dispatch('command', 'stop'); + videoElement.addEventListener('ended', onEnded); + videoElement.addEventListener('error', onError); + videoElement.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; + videoElement.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; + videoElement.src = arguments[2].url; + loaded = true; + onLoaded(); + return; + case 'destroy': + self.dispatch('command', 'stop'); + events.removeAllListeners(); videoElement.removeEventListener('pause', onPausedChanged); videoElement.removeEventListener('play', onPausedChanged); videoElement.removeEventListener('timeupdate', onTimeChanged); videoElement.removeEventListener('durationchange', onDurationChanged); videoElement.removeEventListener('volumechange', onVolumeChanged); - videoElement.textTracks.removeEventListener('addtrack', onSubtitlesChanged); - videoElement.textTracks.removeEventListener('removetrack', onSubtitlesChanged); - videoElement.removeAttribute('src'); - videoElement.load(); - ready = false; + destroyed = true; return; default: throw new Error('command not supported: ' + arguments[1]); } } - if (!ready) { + if (!loaded) { dispatchArgsQueue.push(Array.from(arguments)); } }; From 6c6c2747c9ab131a5555e74664a9c14e6ee9a577 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 10 Dec 2018 19:55:05 +0200 Subject: [PATCH 02/94] emit prop changed on load --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 9862a61ac..e91cda1c4 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -74,7 +74,7 @@ var HTMLVideo = function(containerElement) { critical: critical }); }; - var onLoaded = function() { + var flushArgsQueue = function() { for (var i = 0; i < dispatchArgsQueue.length; i++) { self.dispatch.apply(self, dispatchArgsQueue[i]); } @@ -192,7 +192,11 @@ var HTMLVideo = function(containerElement) { videoElement.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; videoElement.src = arguments[2].url; loaded = true; - onLoaded(); + onPausedChanged(); + onTimeChanged(); + onDurationChanged(); + onSubtitlesChanged(); + flushArgsQueue(); return; case 'destroy': self.dispatch('command', 'stop'); From da3301da9654e1ae2e7228980bd21e1a775a33ef Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 10 Dec 2018 20:01:52 +0200 Subject: [PATCH 03/94] clear dispatch args queue on stop --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index e91cda1c4..e983b631e 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -176,6 +176,7 @@ var HTMLVideo = function(containerElement) { videoElement.removeEventListener('ended', onEnded); videoElement.removeEventListener('error', onError); loaded = false; + dispatchArgsQueue = []; videoElement.removeAttribute('src'); videoElement.load(); videoElement.currentTime = 0; @@ -185,7 +186,9 @@ var HTMLVideo = function(containerElement) { onSubtitlesChanged(); return; case 'load': + var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); self.dispatch('command', 'stop'); + dispatchArgsQueue = dispatchArgsQueueCopy; videoElement.addEventListener('ended', onEnded); videoElement.addEventListener('error', onError); videoElement.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; From dd82d462efe081f02705b5e5b932eff65e086f5f Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 10 Dec 2018 20:07:07 +0200 Subject: [PATCH 04/94] no need to reset state when error is thrown by the video --- src/routes/Player/Player.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index bfc336325..7342b9d0e 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -45,12 +45,6 @@ class Player extends Component { onError = (error) => { if (error.critical) { this.stop(); - this.setState({ - paused: null, - time: null, - duration: null, - volume: null - }); } alert(error.message); From b79edeceaea7137f66bf725a3ad7e94ae2dd7776 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 11:03:53 +0200 Subject: [PATCH 05/94] extra default value of Video frozen --- src/routes/Player/Video/Video.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/Video/Video.js b/src/routes/Player/Video/Video.js index 6a08d83c5..d5255df11 100644 --- a/src/routes/Player/Video/Video.js +++ b/src/routes/Player/Video/Video.js @@ -67,7 +67,7 @@ Video.propTypes = { onPropChanged: PropTypes.func.isRequired }; Video.defaultProps = { - extra: {} + extra: Object.freeze({}) }; export default Video; From ba3500f718f8c52ce1a58dcf33346181c55bba0d Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 11:04:10 +0200 Subject: [PATCH 06/94] App wrapped in React.StrictMode --- src/app/app.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/app/app.js b/src/app/app.js index 2ef3ecba1..e69e0b6ea 100644 --- a/src/app/app.js +++ b/src/app/app.js @@ -1,4 +1,4 @@ -import React, { PureComponent } from 'react'; +import React, { PureComponent, StrictMode } from 'react'; import { Router } from 'stremio-common'; import routerConfig from './routerConfig'; import styles from './styles'; @@ -6,10 +6,12 @@ import styles from './styles'; class App extends PureComponent { render() { return ( - + + + ); } } From f893f5d698c46ba0c5c18a9598b47b91160d5754 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 14:06:32 +0200 Subject: [PATCH 07/94] subtitleTracks/selectedSubtitleTrack props added + minor refactor --- .../Player/Video/stremio-video/HTMLVideo.js | 145 ++++++++++-------- 1 file changed, 82 insertions(+), 63 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index e983b631e..8d42bf4c2 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -1,44 +1,52 @@ var EventEmitter = require('events'); -var HTMLVideo = function(containerElement) { +var HTMLVideo = function(container) { var self = this; - var style = document.createElement('style'); - containerElement.appendChild(style); - style.sheet.insertRule('#' + containerElement.id + ' video { width: 100%; height: 100%; }', style.sheet.cssRules.length); - style.sheet.insertRule('#' + containerElement.id + ' video::cue { font-size: 22px; }', style.sheet.cssRules.length); - var videoElement = document.createElement('video'); - containerElement.appendChild(videoElement); - videoElement.crossOrigin = 'anonymous'; var events = new EventEmitter(); var loaded = false; var destroyed = false; var dispatchArgsQueue = []; + var subtitleTracks = []; + var selectedSubtitleTrack = null; + var styles = document.createElement('style'); + var video = document.createElement('video'); + + container.appendChild(styles); + styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; }', styles.sheet.cssRules.length); + styles.sheet.insertRule('#' + container.id + ' video::cue { font-size: 22px; }', styles.sheet.cssRules.length); + container.appendChild(video); + video.crossOrigin = 'anonymous'; + video.controls = false; + var getPaused = function() { if (!loaded) { return null; } - return !!videoElement.paused; + return !!video.paused; }; var getTime = function() { if (!loaded) { return null; } - return Math.floor(videoElement.currentTime * 1000); + return Math.floor(video.currentTime * 1000); }; var getDuration = function() { - if (!loaded || isNaN(videoElement.duration)) { + if (!loaded || isNaN(video.duration)) { return null; } - return Math.floor(videoElement.duration * 1000); + return Math.floor(video.duration * 1000); }; var getVolume = function() { - return videoElement.muted ? 0 : Math.floor(videoElement.volume * 100); + return video.muted ? 0 : Math.floor(video.volume * 100); }; - var getSubtitles = function() { - return []; + var getSubtitleTracks = function() { + return subtitleTracks.slice(); + }; + var getSelectedSubtitleTrack = function() { + return selectedSubtitleTrack; }; var onEnded = function() { events.emit('ended'); @@ -46,7 +54,7 @@ var HTMLVideo = function(containerElement) { var onError = function() { var message; var critical; - switch (videoElement.error.code) { + switch (video.error.code) { case 1: message = 'Fetching process aborted'; critical = false; @@ -69,18 +77,11 @@ var HTMLVideo = function(containerElement) { } events.emit('error', { - code: videoElement.error.code, + code: video.error.code, message: message, critical: critical }); }; - var flushArgsQueue = function() { - for (var i = 0; i < dispatchArgsQueue.length; i++) { - self.dispatch.apply(self, dispatchArgsQueue[i]); - } - - dispatchArgsQueue = []; - }; var onPausedChanged = function() { events.emit('propChanged', 'paused', getPaused()); }; @@ -93,8 +94,18 @@ var HTMLVideo = function(containerElement) { var onVolumeChanged = function() { events.emit('propChanged', 'volume', getVolume()); }; - var onSubtitlesChanged = function() { - events.emit('propChanged', 'subtitles', getSubtitles()); + var onSubtitleTracksChanged = function() { + events.emit('propChanged', 'subtitleTracks', getSubtitleTracks()); + }; + var onSelectedSubtitleTrackChanged = function() { + events.emit('propChanged', 'selectedSubtitleTrack', getSelectedSubtitleTrack()); + }; + var flushArgsQueue = function() { + for (var i = 0; i < dispatchArgsQueue.length; i++) { + self.dispatch.apply(self, dispatchArgsQueue[i]); + } + + dispatchArgsQueue = []; }; this.on = function(eventName, listener) { @@ -114,28 +125,31 @@ var HTMLVideo = function(containerElement) { switch (arguments[1]) { case 'paused': events.emit('propValue', 'paused', getPaused()); - videoElement.removeEventListener('pause', onPausedChanged); - videoElement.removeEventListener('play', onPausedChanged); - videoElement.addEventListener('pause', onPausedChanged); - videoElement.addEventListener('play', onPausedChanged); + video.removeEventListener('pause', onPausedChanged); + video.removeEventListener('play', onPausedChanged); + video.addEventListener('pause', onPausedChanged); + video.addEventListener('play', onPausedChanged); return; case 'time': events.emit('propValue', 'time', getTime()); - videoElement.removeEventListener('timeupdate', onTimeChanged); - videoElement.addEventListener('timeupdate', onTimeChanged); + video.removeEventListener('timeupdate', onTimeChanged); + video.addEventListener('timeupdate', onTimeChanged); return; case 'duration': events.emit('propValue', 'duration', getDuration()); - videoElement.removeEventListener('durationchange', onDurationChanged); - videoElement.addEventListener('durationchange', onDurationChanged); + video.removeEventListener('durationchange', onDurationChanged); + video.addEventListener('durationchange', onDurationChanged); return; case 'volume': events.emit('propValue', 'volume', getVolume()); - videoElement.removeEventListener('volumechange', onVolumeChanged); - videoElement.addEventListener('volumechange', onVolumeChanged); + video.removeEventListener('volumechange', onVolumeChanged); + video.addEventListener('volumechange', onVolumeChanged); return; - case 'subtitles': - events.emit('propValue', 'subtitles', getSubtitles()); + case 'subtitleTracks': + events.emit('propValue', 'subtitleTracks', getSubtitleTracks()); + return; + case 'selectedSubtitleTrack': + events.emit('propValue', 'selectedSubtitleTrack', getSelectedSubtitleTrack()); return; default: throw new Error('observeProp not supported: ' + arguments[1]); @@ -144,17 +158,17 @@ var HTMLVideo = function(containerElement) { switch (arguments[1]) { case 'paused': if (loaded) { - arguments[2] ? videoElement.pause() : videoElement.play(); + arguments[2] ? video.pause() : video.play(); } break; case 'time': if (loaded) { - videoElement.currentTime = arguments[2] / 1000; + video.currentTime = arguments[2] / 1000; } break; case 'volume': - videoElement.muted = false; - videoElement.volume = arguments[2] / 100; + video.muted = false; + video.volume = arguments[2] / 100; return; default: throw new Error('setProp not supported: ' + arguments[1]); @@ -162,53 +176,58 @@ var HTMLVideo = function(containerElement) { } else if (arguments[0] === 'command') { switch (arguments[1]) { case 'mute': - videoElement.muted = true; + video.muted = true; return; case 'unmute': - videoElement.volume = videoElement.volume !== 0 ? videoElement.volume : 0.5; - videoElement.muted = false; + video.volume = video.volume !== 0 ? video.volume : 0.5; + video.muted = false; return; case 'addExtraSubtitles': if (loaded) { + // } break; case 'stop': - videoElement.removeEventListener('ended', onEnded); - videoElement.removeEventListener('error', onError); + video.removeEventListener('ended', onEnded); + video.removeEventListener('error', onError); loaded = false; dispatchArgsQueue = []; - videoElement.removeAttribute('src'); - videoElement.load(); - videoElement.currentTime = 0; + subtitleTracks = []; + selectedSubtitleTrack = null; + video.removeAttribute('src'); + video.load(); + video.currentTime = 0; onPausedChanged(); onTimeChanged(); onDurationChanged(); - onSubtitlesChanged(); + onSubtitleTracksChanged(); + onSelectedSubtitleTrackChanged(); return; case 'load': var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); self.dispatch('command', 'stop'); dispatchArgsQueue = dispatchArgsQueueCopy; - videoElement.addEventListener('ended', onEnded); - videoElement.addEventListener('error', onError); - videoElement.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; - videoElement.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; - videoElement.src = arguments[2].url; + video.addEventListener('ended', onEnded); + video.addEventListener('error', onError); + video.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; + video.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; + video.src = arguments[2].url; loaded = true; onPausedChanged(); onTimeChanged(); onDurationChanged(); - onSubtitlesChanged(); + onSubtitleTracksChanged(); + onSelectedSubtitleTrackChanged(); flushArgsQueue(); return; case 'destroy': self.dispatch('command', 'stop'); events.removeAllListeners(); - videoElement.removeEventListener('pause', onPausedChanged); - videoElement.removeEventListener('play', onPausedChanged); - videoElement.removeEventListener('timeupdate', onTimeChanged); - videoElement.removeEventListener('durationchange', onDurationChanged); - videoElement.removeEventListener('volumechange', onVolumeChanged); + video.removeEventListener('pause', onPausedChanged); + video.removeEventListener('play', onPausedChanged); + video.removeEventListener('timeupdate', onTimeChanged); + video.removeEventListener('durationchange', onDurationChanged); + video.removeEventListener('volumechange', onVolumeChanged); destroyed = true; return; default: @@ -225,7 +244,7 @@ var HTMLVideo = function(containerElement) { HTMLVideo.manifest = { name: 'HTMLVideo', embedded: true, - props: ['paused', 'time', 'duration', 'volume', 'subtitles'] + props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrack'] }; module.exports = HTMLVideo; From 2777b4c83baef51ce08ec16df593812a3959c7a1 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 14:06:52 +0200 Subject: [PATCH 08/94] HTMLVideo.dispatch refactored to work with switch --- .../Player/Video/stremio-video/HTMLVideo.js | 230 +++++++++--------- 1 file changed, 118 insertions(+), 112 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 8d42bf4c2..dc4a6ac42 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -121,118 +121,124 @@ var HTMLVideo = function(container) { throw new Error('Unable to dispatch ' + arguments[0] + ' to destroyed video'); } - if (arguments[0] === 'observeProp') { - switch (arguments[1]) { - case 'paused': - events.emit('propValue', 'paused', getPaused()); - video.removeEventListener('pause', onPausedChanged); - video.removeEventListener('play', onPausedChanged); - video.addEventListener('pause', onPausedChanged); - video.addEventListener('play', onPausedChanged); - return; - case 'time': - events.emit('propValue', 'time', getTime()); - video.removeEventListener('timeupdate', onTimeChanged); - video.addEventListener('timeupdate', onTimeChanged); - return; - case 'duration': - events.emit('propValue', 'duration', getDuration()); - video.removeEventListener('durationchange', onDurationChanged); - video.addEventListener('durationchange', onDurationChanged); - return; - case 'volume': - events.emit('propValue', 'volume', getVolume()); - video.removeEventListener('volumechange', onVolumeChanged); - video.addEventListener('volumechange', onVolumeChanged); - return; - case 'subtitleTracks': - events.emit('propValue', 'subtitleTracks', getSubtitleTracks()); - return; - case 'selectedSubtitleTrack': - events.emit('propValue', 'selectedSubtitleTrack', getSelectedSubtitleTrack()); - return; - default: - throw new Error('observeProp not supported: ' + arguments[1]); - } - } else if (arguments[0] === 'setProp') { - switch (arguments[1]) { - case 'paused': - if (loaded) { - arguments[2] ? video.pause() : video.play(); - } - break; - case 'time': - if (loaded) { - video.currentTime = arguments[2] / 1000; - } - break; - case 'volume': - video.muted = false; - video.volume = arguments[2] / 100; - return; - default: - throw new Error('setProp not supported: ' + arguments[1]); - } - } else if (arguments[0] === 'command') { - switch (arguments[1]) { - case 'mute': - video.muted = true; - return; - case 'unmute': - video.volume = video.volume !== 0 ? video.volume : 0.5; - video.muted = false; - return; - case 'addExtraSubtitles': - if (loaded) { - // - } - break; - case 'stop': - video.removeEventListener('ended', onEnded); - video.removeEventListener('error', onError); - loaded = false; - dispatchArgsQueue = []; - subtitleTracks = []; - selectedSubtitleTrack = null; - video.removeAttribute('src'); - video.load(); - video.currentTime = 0; - onPausedChanged(); - onTimeChanged(); - onDurationChanged(); - onSubtitleTracksChanged(); - onSelectedSubtitleTrackChanged(); - return; - case 'load': - var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); - self.dispatch('command', 'stop'); - dispatchArgsQueue = dispatchArgsQueueCopy; - video.addEventListener('ended', onEnded); - video.addEventListener('error', onError); - video.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; - video.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; - video.src = arguments[2].url; - loaded = true; - onPausedChanged(); - onTimeChanged(); - onDurationChanged(); - onSubtitleTracksChanged(); - onSelectedSubtitleTrackChanged(); - flushArgsQueue(); - return; - case 'destroy': - self.dispatch('command', 'stop'); - events.removeAllListeners(); - video.removeEventListener('pause', onPausedChanged); - video.removeEventListener('play', onPausedChanged); - video.removeEventListener('timeupdate', onTimeChanged); - video.removeEventListener('durationchange', onDurationChanged); - video.removeEventListener('volumechange', onVolumeChanged); - destroyed = true; - return; - default: - throw new Error('command not supported: ' + arguments[1]); - } + switch (arguments[0]) { + case 'observeProp': + switch (arguments[1]) { + case 'paused': + events.emit('propValue', 'paused', getPaused()); + video.removeEventListener('pause', onPausedChanged); + video.removeEventListener('play', onPausedChanged); + video.addEventListener('pause', onPausedChanged); + video.addEventListener('play', onPausedChanged); + return; + case 'time': + events.emit('propValue', 'time', getTime()); + video.removeEventListener('timeupdate', onTimeChanged); + video.addEventListener('timeupdate', onTimeChanged); + return; + case 'duration': + events.emit('propValue', 'duration', getDuration()); + video.removeEventListener('durationchange', onDurationChanged); + video.addEventListener('durationchange', onDurationChanged); + return; + case 'volume': + events.emit('propValue', 'volume', getVolume()); + video.removeEventListener('volumechange', onVolumeChanged); + video.addEventListener('volumechange', onVolumeChanged); + return; + case 'subtitleTracks': + events.emit('propValue', 'subtitleTracks', getSubtitleTracks()); + return; + case 'selectedSubtitleTrack': + events.emit('propValue', 'selectedSubtitleTrack', getSelectedSubtitleTrack()); + return; + default: + throw new Error('observeProp not supported: ' + arguments[1]); + } + break; + case 'setProp': + switch (arguments[1]) { + case 'paused': + if (loaded) { + arguments[2] ? video.pause() : video.play(); + } + break; + case 'time': + if (loaded) { + video.currentTime = arguments[2] / 1000; + } + break; + case 'volume': + video.muted = false; + video.volume = arguments[2] / 100; + return; + default: + throw new Error('setProp not supported: ' + arguments[1]); + } + break; + case 'command': + switch (arguments[1]) { + case 'mute': + video.muted = true; + return; + case 'unmute': + video.volume = video.volume !== 0 ? video.volume : 0.5; + video.muted = false; + return; + case 'addExtraSubtitles': + if (loaded) { + // + } + break; + case 'stop': + video.removeEventListener('ended', onEnded); + video.removeEventListener('error', onError); + loaded = false; + dispatchArgsQueue = []; + subtitleTracks = []; + selectedSubtitleTrack = null; + video.removeAttribute('src'); + video.load(); + video.currentTime = 0; + onPausedChanged(); + onTimeChanged(); + onDurationChanged(); + onSubtitleTracksChanged(); + onSelectedSubtitleTrackChanged(); + return; + case 'load': + var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); + self.dispatch('command', 'stop'); + dispatchArgsQueue = dispatchArgsQueueCopy; + video.addEventListener('ended', onEnded); + video.addEventListener('error', onError); + video.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; + video.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; + video.src = arguments[2].url; + loaded = true; + onPausedChanged(); + onTimeChanged(); + onDurationChanged(); + onSubtitleTracksChanged(); + onSelectedSubtitleTrackChanged(); + flushArgsQueue(); + return; + case 'destroy': + self.dispatch('command', 'stop'); + events.removeAllListeners(); + video.removeEventListener('pause', onPausedChanged); + video.removeEventListener('play', onPausedChanged); + video.removeEventListener('timeupdate', onTimeChanged); + video.removeEventListener('durationchange', onDurationChanged); + video.removeEventListener('volumechange', onVolumeChanged); + destroyed = true; + return; + default: + throw new Error('command not supported: ' + arguments[1]); + } + break; + default: + throw new Error('Invalid dispatch call: ' + arguments[0]); } if (!loaded) { From 5d803f8208c06f1aea045a105ab3e3702289493f Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 16:20:53 +0200 Subject: [PATCH 09/94] addSubtitleTracks command implelemted --- .../Player/Video/stremio-video/HTMLVideo.js | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index dc4a6ac42..629a89bce 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -178,6 +178,21 @@ var HTMLVideo = function(container) { break; case 'command': switch (arguments[1]) { + case 'addSubtitleTracks': + if (loaded) { + var uniqSubtitleIds = {}; + subtitleTracks = subtitleTracks.concat(arguments[2]) + .reduce(function(result, subtitleTrack) { + if (!uniqSubtitleIds[subtitleTrack.id]) { + uniqSubtitleIds[subtitleTrack.id] = true; + result.push(Object.freeze(subtitleTrack)); + } + + return result; + }, []); + onSubtitleTracksChanged(); + } + break; case 'mute': video.muted = true; return; @@ -185,11 +200,6 @@ var HTMLVideo = function(container) { video.volume = video.volume !== 0 ? video.volume : 0.5; video.muted = false; return; - case 'addExtraSubtitles': - if (loaded) { - // - } - break; case 'stop': video.removeEventListener('ended', onEnded); video.removeEventListener('error', onError); From c279f871b653dfdd62ed7c96947aae5244b5a6b0 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 16:39:55 +0200 Subject: [PATCH 10/94] remove video innerhtml after stop --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 629a89bce..4575c238c 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -207,6 +207,7 @@ var HTMLVideo = function(container) { dispatchArgsQueue = []; subtitleTracks = []; selectedSubtitleTrack = null; + while (video.hasChildNodes()) video.removeChild(video.lastChild); video.removeAttribute('src'); video.load(); video.currentTime = 0; From 6497db4c8e9f29f37573194803b7f325e0332a42 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 17:00:59 +0200 Subject: [PATCH 11/94] constructor validation implemented in HTMLVideo --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 4575c238c..ca4f4fa2a 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -1,6 +1,10 @@ var EventEmitter = require('events'); var HTMLVideo = function(container) { + if (!(container instanceof HTMLElement)) { + throw new Error('Instance of HTMLElement required as a first argument'); + } + var self = this; var events = new EventEmitter(); var loaded = false; From 8be29b6815698a5cfaf16eb2419fc6becaa5a5b4 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 11 Dec 2018 17:03:26 +0200 Subject: [PATCH 12/94] remove HTMLVideo's elements from container on destroy --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index ca4f4fa2a..ee0c0f040 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -246,6 +246,8 @@ var HTMLVideo = function(container) { video.removeEventListener('timeupdate', onTimeChanged); video.removeEventListener('durationchange', onDurationChanged); video.removeEventListener('volumechange', onVolumeChanged); + container.removeChild(video); + container.removeChild(styles); destroyed = true; return; default: From 22731db58850d25f0ac508071939347204979cf1 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 10:52:44 +0200 Subject: [PATCH 13/94] more strict arguments validation imlemented for addSubtitleTracks --- .../Player/Video/stremio-video/HTMLVideo.js | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index ee0c0f040..a37a73f7e 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -184,16 +184,25 @@ var HTMLVideo = function(container) { switch (arguments[1]) { case 'addSubtitleTracks': if (loaded) { - var uniqSubtitleIds = {}; - subtitleTracks = subtitleTracks.concat(arguments[2]) - .reduce(function(result, subtitleTrack) { - if (!uniqSubtitleIds[subtitleTrack.id]) { - uniqSubtitleIds[subtitleTrack.id] = true; - result.push(Object.freeze(subtitleTrack)); + subtitleTracks = (Array.isArray(arguments[2]) ? arguments[2] : []) + .filter(function(track) { + return track && typeof track.url === 'string' && track.url.length > 0; + }) + .map(function(track) { + return Object.freeze(Object.assign({}, track, { + id: track.url + })); + }) + .concat(subtitleTracks) + .filter(function(track, index, tracks) { + for (var i = 0; i < tracks.length; i++) { + if (tracks[i].id === track.id) { + return i === index; + } } - return result; - }, []); + return false; + }); onSubtitleTracksChanged(); } break; From e24a98d68647dcba017bab544a8f6f65dbe6003d Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 10:55:03 +0200 Subject: [PATCH 14/94] more strict validation added to time and volume setters --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index a37a73f7e..4e518addb 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -169,12 +169,16 @@ var HTMLVideo = function(container) { break; case 'time': if (loaded) { - video.currentTime = arguments[2] / 1000; + if (!isNaN(arguments[2])) { + video.currentTime = arguments[2] / 1000; + } } break; case 'volume': - video.muted = false; - video.volume = arguments[2] / 100; + if (!isNaN(arguments[2])) { + video.muted = false; + video.volume = arguments[2] / 100; + } return; default: throw new Error('setProp not supported: ' + arguments[1]); From fe998ea8556fca298c09b6442bb4db8a9d74734d Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 10:58:35 +0200 Subject: [PATCH 15/94] HTMLVideo use named private functions instead of anonymous --- .../Player/Video/stremio-video/HTMLVideo.js | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 4e518addb..8fdeb35f3 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -22,40 +22,40 @@ var HTMLVideo = function(container) { video.crossOrigin = 'anonymous'; video.controls = false; - var getPaused = function() { + function getPaused() { if (!loaded) { return null; } return !!video.paused; }; - var getTime = function() { + function getTime() { if (!loaded) { return null; } return Math.floor(video.currentTime * 1000); }; - var getDuration = function() { + function getDuration() { if (!loaded || isNaN(video.duration)) { return null; } return Math.floor(video.duration * 1000); }; - var getVolume = function() { + function getVolume() { return video.muted ? 0 : Math.floor(video.volume * 100); }; - var getSubtitleTracks = function() { + function getSubtitleTracks() { return subtitleTracks.slice(); }; - var getSelectedSubtitleTrack = function() { + function getSelectedSubtitleTrack() { return selectedSubtitleTrack; }; - var onEnded = function() { + function onEnded() { events.emit('ended'); }; - var onError = function() { + function onError() { var message; var critical; switch (video.error.code) { @@ -86,25 +86,25 @@ var HTMLVideo = function(container) { critical: critical }); }; - var onPausedChanged = function() { + function onPausedChanged() { events.emit('propChanged', 'paused', getPaused()); }; - var onTimeChanged = function() { + function onTimeChanged() { events.emit('propChanged', 'time', getTime()); }; - var onDurationChanged = function() { + function onDurationChanged() { events.emit('propChanged', 'duration', getDuration()); }; - var onVolumeChanged = function() { + function onVolumeChanged() { events.emit('propChanged', 'volume', getVolume()); }; - var onSubtitleTracksChanged = function() { + function onSubtitleTracksChanged() { events.emit('propChanged', 'subtitleTracks', getSubtitleTracks()); }; - var onSelectedSubtitleTrackChanged = function() { + function onSelectedSubtitleTrackChanged() { events.emit('propChanged', 'selectedSubtitleTrack', getSelectedSubtitleTrack()); }; - var flushArgsQueue = function() { + function flushArgsQueue() { for (var i = 0; i < dispatchArgsQueue.length; i++) { self.dispatch.apply(self, dispatchArgsQueue[i]); } From 72d621bb89e64b2b8d9fd4d704ef598eaef89733 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 10:59:33 +0200 Subject: [PATCH 16/94] Invalid dispatch call error message improved --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 8fdeb35f3..29ec278c0 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -268,7 +268,7 @@ var HTMLVideo = function(container) { } break; default: - throw new Error('Invalid dispatch call: ' + arguments[0]); + throw new Error('Invalid dispatch call: ' + Array.from(arguments).map(String)); } if (!loaded) { From 0ba91f7ac1bf4e4337411f49bb961014076be228 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 11:07:40 +0200 Subject: [PATCH 17/94] return default values for subtitles props if no video is loaded --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 29ec278c0..ac1ccf3d2 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -47,9 +47,17 @@ var HTMLVideo = function(container) { return video.muted ? 0 : Math.floor(video.volume * 100); }; function getSubtitleTracks() { + if (!loaded) { + return []; + } + return subtitleTracks.slice(); }; function getSelectedSubtitleTrack() { + if (!loaded) { + return null; + } + return selectedSubtitleTrack; }; function onEnded() { From 69bb97f2aaa07633800ad10537b6e38dfe118e77 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 11:13:10 +0200 Subject: [PATCH 18/94] subtitleTracks order fixed --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index ac1ccf3d2..13712855a 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -196,7 +196,7 @@ var HTMLVideo = function(container) { switch (arguments[1]) { case 'addSubtitleTracks': if (loaded) { - subtitleTracks = (Array.isArray(arguments[2]) ? arguments[2] : []) + var extraSubtitleTracks = (Array.isArray(arguments[2]) ? arguments[2] : []) .filter(function(track) { return track && typeof track.url === 'string' && track.url.length > 0; }) @@ -204,8 +204,8 @@ var HTMLVideo = function(container) { return Object.freeze(Object.assign({}, track, { id: track.url })); - }) - .concat(subtitleTracks) + }); + subtitleTracks = subtitleTracks.concat(extraSubtitleTracks) .filter(function(track, index, tracks) { for (var i = 0; i < tracks.length; i++) { if (tracks[i].id === track.id) { From 614c5da641981a8234aeaa912a41f2b343d6edd4 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 12:31:20 +0200 Subject: [PATCH 19/94] setProp selectedSubtitleTrack implemented --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 13712855a..a7a3eb178 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -182,6 +182,19 @@ var HTMLVideo = function(container) { } } break; + case 'selectedSubtitleTrack': + if (loaded) { + var subtitleTrack; + for (var i = 0; i < subtitleTracks.length; i++) { + if (subtitleTracks[i].id === arguments[2]) { + subtitleTrack = subtitleTracks[i]; + break; + } + } + selectedSubtitleTrack = subtitleTrack ? subtitleTrack.id : null; + onSelectedSubtitleTrackChanged(); + } + break; case 'volume': if (!isNaN(arguments[2])) { video.muted = false; From 3fa17159bbde30cda74d4a94c4f4b3d7b8892278 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 12:39:58 +0200 Subject: [PATCH 20/94] dispatch destroy comman on video unmount --- src/routes/Player/Video/Video.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/Video/Video.js b/src/routes/Player/Video/Video.js index d5255df11..51742c4af 100644 --- a/src/routes/Player/Video/Video.js +++ b/src/routes/Player/Video/Video.js @@ -31,7 +31,7 @@ class Video extends Component { } componentWillUnmount() { - this.dispatch('stop'); + this.dispatch('command', 'destroy'); } selectVideoImplementation = () => { From 3c9d17819a07ac35fde4ea014af2cbdbfd75ddb6 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 12:45:02 +0200 Subject: [PATCH 21/94] dispatch stop command if error is critical --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index a7a3eb178..2d5b211a6 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -93,6 +93,10 @@ var HTMLVideo = function(container) { message: message, critical: critical }); + + if (error.critical) { + self.dispatch('command', 'stop'); + } }; function onPausedChanged() { events.emit('propChanged', 'paused', getPaused()); From d392c73c78c2ceacffc841e6e8fd07e3618d1fc0 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 15:02:31 +0200 Subject: [PATCH 22/94] route-container declared to be overflow hidden --- src/app/styles.less | 1 + src/routes/Player/styles.less | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/styles.less b/src/app/styles.less index 54b76d7e2..25f4440f9 100644 --- a/src/app/styles.less +++ b/src/app/styles.less @@ -84,5 +84,6 @@ bottom: 0; left: 0; z-index: 0; + overflow: hidden; background-color: var(--color-background); } \ No newline at end of file diff --git a/src/routes/Player/styles.less b/src/routes/Player/styles.less index a1cfb86db..989af785f 100644 --- a/src/routes/Player/styles.less +++ b/src/routes/Player/styles.less @@ -2,7 +2,6 @@ position: relative; width: 100%; height: 100%; - overflow: hidden; .layer { position: absolute; From f81ad6f88e908f54b421f2529c9ec8addf4967a7 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 15:03:33 +0200 Subject: [PATCH 23/94] control-bar shadow background implemented --- src/routes/Player/ControlBar/styles.less | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index b8e66b372..3d3881d2f 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -3,8 +3,11 @@ } .control-bar-container { - top: initial !important; padding: 0 calc(var(--control-bar-button-height) * 0.4); + display: flex; + flex-direction: column; + justify-content: flex-end; + overflow: hidden; .time-slider { --time-slider-thumb-size: calc(var(--control-bar-button-height) * 0.4); @@ -59,6 +62,16 @@ flex: 1 } } + + &::after { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + box-shadow: 0 0 calc(var(--control-bar-button-height) * 2) calc(var(--control-bar-button-height) * 2) var(--color-backgrounddarker); + content: ""; + } } .popup-container { From 7be7c53fbfa593d7bcf64b548b26c7cc741264f6 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 15:04:56 +0200 Subject: [PATCH 24/94] comunication bridge for subtitles implemented --- src/routes/Player/ControlBar/ControlBar.js | 49 +++++++++++++++++++--- src/routes/Player/ControlBar/styles.less | 5 +++ src/routes/Player/Player.js | 28 +++++++------ 3 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 4941801f2..888957192 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -12,7 +12,8 @@ class ControlBar extends Component { super(props); this.state = { - sharePopupOpen: false + sharePopupOpen: false, + subtitlesPopupOpen: false }; } @@ -22,7 +23,10 @@ class ControlBar extends Component { nextProps.time !== this.props.time || nextProps.duration !== this.props.duration || nextProps.volume !== this.props.volume || - nextState.sharePopupOpen !== this.state.sharePopupOpen; + nextProps.subtitleTracks !== this.props.subtitleTracks || + nextProps.selectedSubtitleTrack !== this.props.selectedSubtitleTrack || + nextState.sharePopupOpen !== this.state.sharePopupOpen || + nextState.subtitlesPopupOpen !== this.state.subtitlesPopupOpen; } setTime = (time) => { @@ -33,6 +37,10 @@ class ControlBar extends Component { this.props.setVolume(volume); } + setSelectedSubtitleTrack = (selectedSubtitleTrack) => { + this.props.setSelectedSubtitleTrack(selectedSubtitleTrack); + } + toogleVolumeMute = () => { this.props.volume === 0 ? this.props.unmute() : this.props.mute(); } @@ -49,6 +57,14 @@ class ControlBar extends Component { this.setState({ sharePopupOpen: false }); } + onSubtitlesPopupOpen = () => { + this.setState({ subtitlesPopupOpen: true }); + } + + onSubtitlesPopupClose = () => { + this.setState({ subtitlesPopupOpen: false }); + } + renderShareButton() { return ( @@ -64,6 +80,27 @@ class ControlBar extends Component { ); } + renderSubtitlesButton() { + if (this.props.subtitleTracks.length === 0) { + return null; + } + + return ( + + +
+ +
+
+ +
+ +
+
+
+ ); + } + renderVolumeButton() { if (this.props.volume === null) { return null; @@ -115,6 +152,7 @@ class ControlBar extends Component { setVolume={this.setVolume} />
+ {this.renderSubtitlesButton()} {this.renderShareButton()}
@@ -128,15 +166,16 @@ ControlBar.propTypes = { time: PropTypes.number, duration: PropTypes.number, volume: PropTypes.number, - subtitles: PropTypes.arrayOf(PropTypes.shape({ + subtitleTracks: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.string.isRequired, label: PropTypes.string.isRequired, - language: PropTypes.string.isRequired - })), + })).isRequired, + selectedSubtitleTrack: PropTypes.string, play: PropTypes.func.isRequired, pause: PropTypes.func.isRequired, setTime: PropTypes.func.isRequired, setVolume: PropTypes.func.isRequired, + setSelectedSubtitleTrack: PropTypes.func.isRequired, mute: PropTypes.func.isRequired, unmute: PropTypes.func.isRequired }; diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 3d3881d2f..e213052a6 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -84,5 +84,10 @@ width: calc(var(--control-bar-button-height) * 5); height: calc(var(--control-bar-button-height) * 3); } + + &.subtitles-popup-content { + width: calc(var(--control-bar-button-height) * 7); + height: calc(var(--control-bar-button-height) * 5); + } } } \ No newline at end of file diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 7342b9d0e..859d9c929 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -15,7 +15,8 @@ class Player extends Component { time: null, duration: null, volume: null, - subtitles: null + subtitleTracks: [], + selectedSubtitleTrack: null }; } @@ -24,16 +25,15 @@ class Player extends Component { nextState.time !== this.state.time || nextState.duration !== this.state.duration || nextState.volume !== this.state.volume || - nextState.subtitles !== this.state.subtitles; + nextState.subtitleTracks !== this.state.subtitleTracks || + nextState.selectedSubtitleTrack !== this.state.selectedSubtitleTrack; } componentDidMount() { - this.addExtraSubtitles([ + this.addSubtitleTracks([ { - id: 'id1', url: 'https://raw.githubusercontent.com/amzn/web-app-starter-kit-for-fire-tv/master/out/mrss/assets/sample_video-en.vtt', - label: 'English (Github)', - language: 'en' + label: 'English' } ]); } @@ -43,10 +43,6 @@ class Player extends Component { } onError = (error) => { - if (error.critical) { - this.stop(); - } - alert(error.message); } @@ -74,6 +70,10 @@ class Player extends Component { this.videoRef.current && this.videoRef.current.dispatch('setProp', 'volume', volume); } + setSelectedSubtitleTrack = (selectedSubtitleTrack) => { + this.videoRef.current && this.videoRef.current.dispatch('setProp', 'selectedSubtitleTrack', selectedSubtitleTrack); + } + mute = () => { this.videoRef.current && this.videoRef.current.dispatch('command', 'mute'); } @@ -82,8 +82,8 @@ class Player extends Component { this.videoRef.current && this.videoRef.current.dispatch('command', 'unmute'); } - addExtraSubtitles = (subtitles) => { - this.videoRef.current && this.videoRef.current.dispatch('command', 'addExtraSubtitles', subtitles); + addSubtitleTracks = (subtitleTracks) => { + this.videoRef.current && this.videoRef.current.dispatch('command', 'addSubtitleTracks', subtitleTracks); } stop = () => { @@ -115,11 +115,13 @@ class Player extends Component { time={this.state.time} duration={this.state.duration} volume={this.state.volume} - subtitles={this.state.subtitles} + subtitleTracks={this.state.subtitleTracks} + selectedSubtitleTrack={this.state.selectedSubtitleTrack} play={this.play} pause={this.pause} setTime={this.setTime} setVolume={this.setVolume} + setSelectedSubtitleTrack={this.setSelectedSubtitleTrack} mute={this.mute} unmute={this.unmute} /> From e8726e0df38868f8ac454f48badde116bb3cfa87 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 21:31:45 +0200 Subject: [PATCH 25/94] slider fixed whem value is more than maxValue --- src/common/Slider/Slider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Slider/Slider.js b/src/common/Slider/Slider.js index 251e18686..ae80f66da 100644 --- a/src/common/Slider/Slider.js +++ b/src/common/Slider/Slider.js @@ -89,7 +89,7 @@ class Slider extends Component { render() { const thumbStartProp = this.orientation === 'horizontal' ? 'left' : 'bottom'; - const thumbStart = (this.props.value - this.props.minimumValue) / (this.props.maximumValue - this.props.minimumValue); + const thumbStart = Math.min((this.props.value - this.props.minimumValue) / (this.props.maximumValue - this.props.minimumValue), 1); return (
From 70284e604604d72a3e3fedeb2809071fc744b5a6 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 12 Dec 2018 21:32:21 +0200 Subject: [PATCH 26/94] player container reset zindex to 0 --- src/routes/Player/styles.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Player/styles.less b/src/routes/Player/styles.less index 989af785f..bb3a7af63 100644 --- a/src/routes/Player/styles.less +++ b/src/routes/Player/styles.less @@ -2,6 +2,7 @@ position: relative; width: 100%; height: 100%; + z-index: 0; .layer { position: absolute; From cbae90ec953a47f133e9b71461b47493e031a505 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Thu, 13 Dec 2018 15:25:02 +0200 Subject: [PATCH 27/94] simple SubtitlesPicker implemented --- src/routes/Player/ControlBar/ControlBar.js | 21 +-- .../SubtitlesPicker/SubtitlesPicker.js | 79 ++++++++++++ .../ControlBar/SubtitlesPicker/index.js | 3 + .../ControlBar/SubtitlesPicker/styles.less | 121 ++++++++++++++++++ src/routes/Player/ControlBar/styles.less | 3 +- src/routes/Player/Player.js | 20 ++- .../Player/Video/stremio-video/HTMLVideo.js | 28 ++-- 7 files changed, 239 insertions(+), 36 deletions(-) create mode 100644 src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js create mode 100644 src/routes/Player/ControlBar/SubtitlesPicker/index.js create mode 100644 src/routes/Player/ControlBar/SubtitlesPicker/styles.less diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 888957192..b70a6be4c 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -5,6 +5,7 @@ import Icon from 'stremio-icons/dom'; import { Popup } from 'stremio-common'; import TimeSlider from './TimeSlider'; import VolumeSlider from './VolumeSlider'; +import SubtitlesPicker from './SubtitlesPicker'; import styles from './styles'; class ControlBar extends Component { @@ -24,7 +25,7 @@ class ControlBar extends Component { nextProps.duration !== this.props.duration || nextProps.volume !== this.props.volume || nextProps.subtitleTracks !== this.props.subtitleTracks || - nextProps.selectedSubtitleTrack !== this.props.selectedSubtitleTrack || + nextProps.selectedSubtitleTrackId !== this.props.selectedSubtitleTrackId || nextState.sharePopupOpen !== this.state.sharePopupOpen || nextState.subtitlesPopupOpen !== this.state.subtitlesPopupOpen; } @@ -37,8 +38,8 @@ class ControlBar extends Component { this.props.setVolume(volume); } - setSelectedSubtitleTrack = (selectedSubtitleTrack) => { - this.props.setSelectedSubtitleTrack(selectedSubtitleTrack); + setSelectedSubtitleTrackId = (selectedSubtitleTrackId) => { + this.props.setSelectedSubtitleTrackId(selectedSubtitleTrackId); } toogleVolumeMute = () => { @@ -93,9 +94,12 @@ class ControlBar extends Component {
-
- -
+
); @@ -169,13 +173,14 @@ ControlBar.propTypes = { subtitleTracks: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.string.isRequired, label: PropTypes.string.isRequired, + origin: PropTypes.string.isRequired })).isRequired, - selectedSubtitleTrack: PropTypes.string, + selectedSubtitleTrackId: PropTypes.string, play: PropTypes.func.isRequired, pause: PropTypes.func.isRequired, setTime: PropTypes.func.isRequired, setVolume: PropTypes.func.isRequired, - setSelectedSubtitleTrack: PropTypes.func.isRequired, + setSelectedSubtitleTrackId: PropTypes.func.isRequired, mute: PropTypes.func.isRequired, unmute: PropTypes.func.isRequired }; diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js new file mode 100644 index 000000000..8b81a2684 --- /dev/null +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -0,0 +1,79 @@ +import React, { Fragment } from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import styles from './styles'; + +const ORIGIN_PRIORITIES = { + 'Local': 1, + 'Embedded': 2 +}; +const LABEL_PRIORITIES = { + 'English': 1, + 'Brazil': 2 +}; +const subtitlesComparator = (PRIORITIES) => { + return (a, b) => { + const valueA = PRIORITIES[a]; + const valueB = PRIORITIES[b]; + if (!isNaN(valueA) && !isNaN(valueB)) return valueA - valueB; + if (!isNaN(valueA)) return -1; + if (!isNaN(valueB)) return 1; + return a - b; + } +}; + +const SubtitlesPicker = ({ className, subtitleTracks, selectedSubtitleTrackId, setSelectedSubtitleTrackId }) => { + const groupedSubtitleTracks = subtitleTracks.reduce((result, track) => { + result[track.origin] = result[track.origin] || {}; + result[track.origin][track.label] = result[track.origin][track.label] || []; + result[track.origin][track.label].push(track); + return result; + }, {}); + const toggleOnClick = () => { + setSelectedSubtitleTrackId(selectedSubtitleTrackId === null ? subtitleTracks[0].id : null); + }; + + return ( +
+
+
ON
+
OFF
+
+
+
+ { + Object.keys(groupedSubtitleTracks) + .sort(subtitlesComparator(ORIGIN_PRIORITIES)) + .map((origin) => { + return ( + +
{origin}
+ { + Object.keys(groupedSubtitleTracks[origin]) + .sort(subtitlesComparator(LABEL_PRIORITIES)) + .map((label) => ( +
{label}
+ )) + } +
+ ); + }) + } +
+
+
+ ); +}; + +SubtitlesPicker.propTypes = { + className: PropTypes.string, + selectedSubtitleTrackId: PropTypes.string, + subtitleTracks: PropTypes.arrayOf(PropTypes.shape({ + id: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + origin: PropTypes.string.isRequired + })).isRequired, + setSelectedSubtitleTrackId: PropTypes.func.isRequired +}; + +export default SubtitlesPicker; diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/index.js b/src/routes/Player/ControlBar/SubtitlesPicker/index.js new file mode 100644 index 000000000..804f92489 --- /dev/null +++ b/src/routes/Player/ControlBar/SubtitlesPicker/index.js @@ -0,0 +1,3 @@ +import SubtitlesPicker from './SubtitlesPicker'; + +export default SubtitlesPicker; diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less new file mode 100644 index 000000000..8e4f695a5 --- /dev/null +++ b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less @@ -0,0 +1,121 @@ +.subtitles-picker-container { + width: var(--subtitles-picker-width); + height: calc(var(--subtitles-picker-width) * 0.6); + padding: calc(var(--subtitles-picker-width) * 0.03); + gap: calc(var(--subtitles-picker-width) * 0.03); + display: grid; + grid-template-columns: 3fr 5fr; + grid-template-rows: 1fr 6fr; + grid-template-areas: + "toggle-button preferences" + "languages-list preferences"; + + .toggle-button-container { + grid-area: toggle-button; + position: relative; + z-index: 0; + cursor: pointer; + + .toggle-label { + width: 45%; + height: 100%; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 18px; + line-height: 1; + color: var(--color-surfacelight); + + &:first-of-type { + margin-right: 10%; + } + } + + .toggle-thumb { + width: 45%; + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + background-color: var(--color-primarydark); + transition: left 0.2s; + + &.off { + left: 0; + } + + &.on { + left: 55%; + } + } + + &:hover { + .toggle-label { + color: var(--color-surfacelighter); + } + + .toggle-thumb { + background-color: var(--color-primarylight); + } + } + } + + .languages-container { + grid-area: languages-list; + display: flex; + flex-direction: column; + align-items: stretch; + overflow-y: auto; + + .language-origin { + padding: 0 0.2em; + font-size: 14px; + font-style: italic; + word-wrap: break-word; + color: var(--color-surfacelighter80); + border-bottom: 1px solid var(--color-surfacelighter80); + + &:not(:first-of-type) { + margin-top: 1.5em; + } + } + + .language-label { + padding: 0.4em; + font-size: 18px; + text-align: center; + color: var(--color-surfacelight); + word-wrap: break-word; + cursor: pointer; + + &.selected { + color: var(--color-surfacelighter); + background-color: var(--color-primarydark); + } + + &:hover { + color: var(--color-surfacelighter); + background-color: var(--color-primarylight); + } + } + } + + .preferences-container { + grid-area: preferences; + display: flex; + flex-direction: column; + align-items: center; + + .variants-container { + flex: 1; + display: flex; + flex-direction: row; + align-items: center; + + .variant-button { + width: calc(var(--subtitles-picker-width) * 0.1); + height: calc(var(--subtitles-picker-width) * 0.1); + } + } + } +} \ No newline at end of file diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index e213052a6..9d3bcf05c 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -86,8 +86,7 @@ } &.subtitles-popup-content { - width: calc(var(--control-bar-button-height) * 7); - height: calc(var(--control-bar-button-height) * 5); + --subtitles-picker-width: calc(var(--control-bar-button-height) * 8); } } } \ No newline at end of file diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 859d9c929..6c5fbfaf9 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -2,6 +2,7 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import Video from './Video'; import ControlBar from './ControlBar'; +import subtitles from './subtitles'; import styles from './styles'; class Player extends Component { @@ -16,7 +17,7 @@ class Player extends Component { duration: null, volume: null, subtitleTracks: [], - selectedSubtitleTrack: null + selectedSubtitleTrackId: null }; } @@ -26,16 +27,11 @@ class Player extends Component { nextState.duration !== this.state.duration || nextState.volume !== this.state.volume || nextState.subtitleTracks !== this.state.subtitleTracks || - nextState.selectedSubtitleTrack !== this.state.selectedSubtitleTrack; + nextState.selectedSubtitleTrackId !== this.state.selectedSubtitleTrackId; } componentDidMount() { - this.addSubtitleTracks([ - { - url: 'https://raw.githubusercontent.com/amzn/web-app-starter-kit-for-fire-tv/master/out/mrss/assets/sample_video-en.vtt', - label: 'English' - } - ]); + this.addSubtitleTracks(subtitles); } onEnded = () => { @@ -70,8 +66,8 @@ class Player extends Component { this.videoRef.current && this.videoRef.current.dispatch('setProp', 'volume', volume); } - setSelectedSubtitleTrack = (selectedSubtitleTrack) => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'selectedSubtitleTrack', selectedSubtitleTrack); + setSelectedSubtitleTrackId = (selectedSubtitleTrackId) => { + this.videoRef.current && this.videoRef.current.dispatch('setProp', 'selectedSubtitleTrackId', selectedSubtitleTrackId); } mute = () => { @@ -116,12 +112,12 @@ class Player extends Component { duration={this.state.duration} volume={this.state.volume} subtitleTracks={this.state.subtitleTracks} - selectedSubtitleTrack={this.state.selectedSubtitleTrack} + selectedSubtitleTrackId={this.state.selectedSubtitleTrackId} play={this.play} pause={this.pause} setTime={this.setTime} setVolume={this.setVolume} - setSelectedSubtitleTrack={this.setSelectedSubtitleTrack} + setSelectedSubtitleTrackId={this.setSelectedSubtitleTrackId} mute={this.mute} unmute={this.unmute} /> diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 2d5b211a6..921173dae 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -11,7 +11,7 @@ var HTMLVideo = function(container) { var destroyed = false; var dispatchArgsQueue = []; var subtitleTracks = []; - var selectedSubtitleTrack = null; + var selectedSubtitleTrackId = null; var styles = document.createElement('style'); var video = document.createElement('video'); @@ -53,12 +53,12 @@ var HTMLVideo = function(container) { return subtitleTracks.slice(); }; - function getSelectedSubtitleTrack() { + function getSelectedSubtitleTrackId() { if (!loaded) { return null; } - return selectedSubtitleTrack; + return selectedSubtitleTrackId; }; function onEnded() { events.emit('ended'); @@ -113,8 +113,8 @@ var HTMLVideo = function(container) { function onSubtitleTracksChanged() { events.emit('propChanged', 'subtitleTracks', getSubtitleTracks()); }; - function onSelectedSubtitleTrackChanged() { - events.emit('propChanged', 'selectedSubtitleTrack', getSelectedSubtitleTrack()); + function onSelectedSubtitleTrackIdChanged() { + events.emit('propChanged', 'selectedSubtitleTrackId', getSelectedSubtitleTrackId()); }; function flushArgsQueue() { for (var i = 0; i < dispatchArgsQueue.length; i++) { @@ -165,8 +165,8 @@ var HTMLVideo = function(container) { case 'subtitleTracks': events.emit('propValue', 'subtitleTracks', getSubtitleTracks()); return; - case 'selectedSubtitleTrack': - events.emit('propValue', 'selectedSubtitleTrack', getSelectedSubtitleTrack()); + case 'selectedSubtitleTrackId': + events.emit('propValue', 'selectedSubtitleTrackId', getSelectedSubtitleTrackId()); return; default: throw new Error('observeProp not supported: ' + arguments[1]); @@ -186,7 +186,7 @@ var HTMLVideo = function(container) { } } break; - case 'selectedSubtitleTrack': + case 'selectedSubtitleTrackId': if (loaded) { var subtitleTrack; for (var i = 0; i < subtitleTracks.length; i++) { @@ -195,8 +195,8 @@ var HTMLVideo = function(container) { break; } } - selectedSubtitleTrack = subtitleTrack ? subtitleTrack.id : null; - onSelectedSubtitleTrackChanged(); + selectedSubtitleTrackId = subtitleTrack ? subtitleTrack.id : null; + onSelectedSubtitleTrackIdChanged(); } break; case 'volume': @@ -248,7 +248,7 @@ var HTMLVideo = function(container) { loaded = false; dispatchArgsQueue = []; subtitleTracks = []; - selectedSubtitleTrack = null; + selectedSubtitleTrackId = null; while (video.hasChildNodes()) video.removeChild(video.lastChild); video.removeAttribute('src'); video.load(); @@ -257,7 +257,7 @@ var HTMLVideo = function(container) { onTimeChanged(); onDurationChanged(); onSubtitleTracksChanged(); - onSelectedSubtitleTrackChanged(); + onSelectedSubtitleTrackIdChanged(); return; case 'load': var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); @@ -273,7 +273,7 @@ var HTMLVideo = function(container) { onTimeChanged(); onDurationChanged(); onSubtitleTracksChanged(); - onSelectedSubtitleTrackChanged(); + onSelectedSubtitleTrackIdChanged(); flushArgsQueue(); return; case 'destroy': @@ -305,7 +305,7 @@ var HTMLVideo = function(container) { HTMLVideo.manifest = { name: 'HTMLVideo', embedded: true, - props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrack'] + props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrackId'] }; module.exports = HTMLVideo; From 4cd784f249d59539ef3a32f2ddfc25781cc4fae9 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Thu, 13 Dec 2018 15:29:35 +0200 Subject: [PATCH 28/94] HTMLVideo ignores embedded extra subtitles --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 921173dae..41f443b19 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -215,7 +215,10 @@ var HTMLVideo = function(container) { if (loaded) { var extraSubtitleTracks = (Array.isArray(arguments[2]) ? arguments[2] : []) .filter(function(track) { - return track && typeof track.url === 'string' && track.url.length > 0; + return track && + typeof track.url === 'string' && + track.url.length > 0 && + track.origin !== 'EMBEDDED'; }) .map(function(track) { return Object.freeze(Object.assign({}, track, { From f1f967d585321af415d282a5dd9a3e4ad1927e79 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Thu, 13 Dec 2018 15:32:35 +0200 Subject: [PATCH 29/94] SubtitlesPicker declared purecomponent --- .../SubtitlesPicker/SubtitlesPicker.js | 104 +++++++++--------- 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index 8b81a2684..5fed57917 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -1,4 +1,4 @@ -import React, { Fragment } from 'react'; +import React, { PureComponent, Fragment } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import styles from './styles'; @@ -11,59 +11,63 @@ const LABEL_PRIORITIES = { 'English': 1, 'Brazil': 2 }; -const subtitlesComparator = (PRIORITIES) => { - return (a, b) => { - const valueA = PRIORITIES[a]; - const valueB = PRIORITIES[b]; - if (!isNaN(valueA) && !isNaN(valueB)) return valueA - valueB; - if (!isNaN(valueA)) return -1; - if (!isNaN(valueB)) return 1; - return a - b; + +class SubtitlesPicker extends PureComponent { + subtitlesComparator = (PRIORITIES) => { + return (a, b) => { + const valueA = PRIORITIES[a]; + const valueB = PRIORITIES[b]; + if (!isNaN(valueA) && !isNaN(valueB)) return valueA - valueB; + if (!isNaN(valueA)) return -1; + if (!isNaN(valueB)) return 1; + return a - b; + } } -}; -const SubtitlesPicker = ({ className, subtitleTracks, selectedSubtitleTrackId, setSelectedSubtitleTrackId }) => { - const groupedSubtitleTracks = subtitleTracks.reduce((result, track) => { - result[track.origin] = result[track.origin] || {}; - result[track.origin][track.label] = result[track.origin][track.label] || []; - result[track.origin][track.label].push(track); - return result; - }, {}); - const toggleOnClick = () => { - setSelectedSubtitleTrackId(selectedSubtitleTrackId === null ? subtitleTracks[0].id : null); - }; + render() { + const { className, subtitleTracks, selectedSubtitleTrackId, setSelectedSubtitleTrackId } = this.props; + const groupedSubtitleTracks = subtitleTracks.reduce((result, track) => { + result[track.origin] = result[track.origin] || {}; + result[track.origin][track.label] = result[track.origin][track.label] || []; + result[track.origin][track.label].push(track); + return result; + }, {}); + const toggleOnClick = () => { + setSelectedSubtitleTrackId(selectedSubtitleTrackId === null ? subtitleTracks[0].id : null); + }; - return ( -
-
-
ON
-
OFF
-
+ return ( +
+
+
ON
+
OFF
+
+
+
+ { + Object.keys(groupedSubtitleTracks) + .sort(this.subtitlesComparator(ORIGIN_PRIORITIES)) + .map((origin) => { + return ( + +
{origin}
+ { + Object.keys(groupedSubtitleTracks[origin]) + .sort(this.subtitlesComparator(LABEL_PRIORITIES)) + .map((label) => ( +
{label}
+ )) + } +
+ ); + }) + } +
+
-
- { - Object.keys(groupedSubtitleTracks) - .sort(subtitlesComparator(ORIGIN_PRIORITIES)) - .map((origin) => { - return ( - -
{origin}
- { - Object.keys(groupedSubtitleTracks[origin]) - .sort(subtitlesComparator(LABEL_PRIORITIES)) - .map((label) => ( -
{label}
- )) - } -
- ); - }) - } -
-
-
- ); -}; + ); + } +} SubtitlesPicker.propTypes = { className: PropTypes.string, From 1ab7b6403091b520aeed9f58e7411e4b2af5534d Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 17 Dec 2018 17:36:27 +0200 Subject: [PATCH 30/94] default line-height changed to 1 --- src/app/styles.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/styles.less b/src/app/styles.less index 25f4440f9..7942017be 100644 --- a/src/app/styles.less +++ b/src/app/styles.less @@ -61,6 +61,7 @@ min-width: 1000px; min-height: 650px; font-family: 'Roboto', 'sans-serif'; + line-height: 1; } #app { From 1af3f1239ecf67a88651efbb921c6eea339a973c Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 17 Dec 2018 17:38:00 +0200 Subject: [PATCH 31/94] check for valid origin in HTMLVideo --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 41f443b19..327b61d74 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -218,6 +218,8 @@ var HTMLVideo = function(container) { return track && typeof track.url === 'string' && track.url.length > 0 && + typeof track.origin === 'string' && + track.origin.length > 0 && track.origin !== 'EMBEDDED'; }) .map(function(track) { From 7567b4ac0ef82856b5b8f7b3696a5a642576fedd Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 17 Dec 2018 17:38:19 +0200 Subject: [PATCH 32/94] Subtitles picker ui fully implemented --- .../SubtitlesPicker/SubtitlesPicker.js | 165 ++++++++++++++---- .../ControlBar/SubtitlesPicker/styles.less | 138 +++++++++++---- .../Player/ControlBar/TimeSlider/styles.less | 1 - src/routes/Player/ControlBar/styles.less | 2 +- 4 files changed, 234 insertions(+), 72 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index 5fed57917..e4ceb2861 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -1,15 +1,12 @@ import React, { PureComponent, Fragment } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; +import Icon from 'stremio-icons/dom'; import styles from './styles'; const ORIGIN_PRIORITIES = { - 'Local': 1, - 'Embedded': 2 -}; -const LABEL_PRIORITIES = { - 'English': 1, - 'Brazil': 2 + 'LOCAL': 1, + 'EMBEDDED': 2 }; class SubtitlesPicker extends PureComponent { @@ -24,46 +21,132 @@ class SubtitlesPicker extends PureComponent { } } + toggleOnClick = () => { + this.props.setSelectedSubtitleTrackId(this.props.selectedSubtitleTrackId === null ? this.props.subtitleTracks[0].id : null); + } + + labelOnClick = (event) => { + const selectedTrack = this.props.subtitleTracks.find(({ label, origin }) => { + return label === event.currentTarget.dataset.label && + origin === event.currentTarget.dataset.origin; + }); + if (selectedTrack) { + this.props.setSelectedSubtitleTrackId(selectedTrack.id); + } + } + + trackOnClick = (event) => { + this.props.setSelectedSubtitleTrackId(event.currentTarget.dataset.trackId); + } + + renderToggleButton({ selectedTrack }) { + return ( +
+
ON
+
OFF
+
+
+ ); + } + + renderLabelsList({ groupedTracks, selectedTrack }) { + return ( +
+ { + Object.keys(groupedTracks) + .sort(this.subtitlesComparator(ORIGIN_PRIORITIES)) + .map((origin) => ( + +
{origin}
+ { + Object.keys(groupedTracks[origin]) + .sort(this.subtitlesComparator(this.props.languagePriorities)) + .map((label) => { + const selected = selectedTrack && selectedTrack.label === label && selectedTrack.origin === origin; + return ( +
+ ); + }) + } + + )) + } +
+ ); + } + + renderPreferences({ groupedTracks, selectedTrack }) { + if (!selectedTrack) { + return ( +
+
Subtitles are disabled
+
+ ); + } + + return ( +
+
Preferences
+ { + groupedTracks[selectedTrack.origin][selectedTrack.label].length > 1 ? +
+ {groupedTracks[selectedTrack.origin][selectedTrack.label].map((track, index) => { + return ( +
+ ); + })} +
+ : + null + } +
+
+ +
+
{(17).toFixed(2)}s
+
+ +
+
+
+
+ +
+
17pt
+
+ +
+
+
+ ); + } + render() { - const { className, subtitleTracks, selectedSubtitleTrackId, setSelectedSubtitleTrackId } = this.props; - const groupedSubtitleTracks = subtitleTracks.reduce((result, track) => { + const selectedTrack = this.props.subtitleTracks.find(({ id }) => id === this.props.selectedSubtitleTrackId); + const groupedTracks = this.props.subtitleTracks.reduce((result, track) => { result[track.origin] = result[track.origin] || {}; result[track.origin][track.label] = result[track.origin][track.label] || []; result[track.origin][track.label].push(track); return result; }, {}); - const toggleOnClick = () => { - setSelectedSubtitleTrackId(selectedSubtitleTrackId === null ? subtitleTracks[0].id : null); - }; return ( -
-
-
ON
-
OFF
-
-
-
- { - Object.keys(groupedSubtitleTracks) - .sort(this.subtitlesComparator(ORIGIN_PRIORITIES)) - .map((origin) => { - return ( - -
{origin}
- { - Object.keys(groupedSubtitleTracks[origin]) - .sort(this.subtitlesComparator(LABEL_PRIORITIES)) - .map((label) => ( -
{label}
- )) - } -
- ); - }) - } -
-
+
+ {this.renderToggleButton({ selectedTrack })} + {this.renderLabelsList({ groupedTracks, selectedTrack })} + {this.renderPreferences({ groupedTracks, selectedTrack })}
); } @@ -72,6 +155,7 @@ class SubtitlesPicker extends PureComponent { SubtitlesPicker.propTypes = { className: PropTypes.string, selectedSubtitleTrackId: PropTypes.string, + languagePriorities: PropTypes.objectOf(PropTypes.number).isRequired, subtitleTracks: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.string.isRequired, label: PropTypes.string.isRequired, @@ -79,5 +163,10 @@ SubtitlesPicker.propTypes = { })).isRequired, setSelectedSubtitleTrackId: PropTypes.func.isRequired }; +SubtitlesPicker.defaultProps = { + languagePriorities: Object.freeze({ + English: 1 + }) +}; export default SubtitlesPicker; diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less index 8e4f695a5..7c90c41a7 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less +++ b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less @@ -1,14 +1,15 @@ .subtitles-picker-container { - width: var(--subtitles-picker-width); - height: calc(var(--subtitles-picker-width) * 0.6); - padding: calc(var(--subtitles-picker-width) * 0.03); - gap: calc(var(--subtitles-picker-width) * 0.03); + width: calc(var(--subtitles-picker-button-size) * 14); + height: calc(var(--subtitles-picker-button-size) * 8); + font-size: calc(var(--subtitles-picker-button-size) * 0.5); + padding: calc(var(--subtitles-picker-button-size) * 0.3); + gap: calc(var(--subtitles-picker-button-size) * 0.3); display: grid; - grid-template-columns: 3fr 5fr; - grid-template-rows: 1fr 6fr; + grid-template-columns: auto calc(var(--subtitles-picker-button-size) * 8); + grid-template-rows: var(--subtitles-picker-button-size) auto; grid-template-areas: "toggle-button preferences" - "languages-list preferences"; + "labels-list preferences"; .toggle-button-container { grid-area: toggle-button; @@ -17,35 +18,32 @@ cursor: pointer; .toggle-label { - width: 45%; + width: 40%; height: 100%; display: inline-flex; align-items: center; justify-content: center; - font-size: 18px; + font-weight: 500; line-height: 1; color: var(--color-surfacelight); &:first-of-type { - margin-right: 10%; + margin-right: 20%; } } .toggle-thumb { - width: 45%; + width: 40%; position: absolute; top: 0; bottom: 0; + left: 0; z-index: 1; background-color: var(--color-primarydark); transition: left 0.2s; - &.off { - left: 0; - } - &.on { - left: 55%; + left: 60%; } } @@ -60,41 +58,40 @@ } } - .languages-container { - grid-area: languages-list; + .labels-list-container { + grid-area: labels-list; display: flex; flex-direction: column; align-items: stretch; overflow-y: auto; + overflow-x: hidden; - .language-origin { + .track-origin { padding: 0 0.2em; - font-size: 14px; + margin-bottom: 0.2em; + font-size: 80%; font-style: italic; - word-wrap: break-word; - color: var(--color-surfacelighter80); + overflow-wrap: break-word; border-bottom: 1px solid var(--color-surfacelighter80); + color: var(--color-surfacelighter80); &:not(:first-of-type) { - margin-top: 1.5em; + margin-top: 0.7em; } } .language-label { - padding: 0.4em; - font-size: 18px; + padding: 0.5em 0.3em; + overflow-wrap: break-word; text-align: center; - color: var(--color-surfacelight); - word-wrap: break-word; + color: var(--color-surfacelighter); cursor: pointer; &.selected { - color: var(--color-surfacelighter); background-color: var(--color-primarydark); } &:hover { - color: var(--color-surfacelighter); background-color: var(--color-primarylight); } } @@ -105,16 +102,93 @@ display: flex; flex-direction: column; align-items: center; + justify-content: center; + + .subtitles-disabled-label { + font-size: 170%; + line-height: 1.2; + text-align: center; + word-spacing: calc(var(--subtitles-picker-button-size) * 9); + color: var(--color-surfacelighter); + } + + .preferences-label { + height: var(--subtitles-picker-button-size); + color: var(--color-surfacelight); + display: flex; + align-items: center; + margin-bottom: calc(var(--subtitles-picker-button-size) * 0.3); + } .variants-container { + align-self: stretch; + height: calc(var(--subtitles-picker-button-size) * 2); + display: flex; + flex-direction: row; + align-content: flex-start; + flex-wrap: wrap; + overflow-x: hidden; + overflow-y: auto; + + .variant-button { + flex: none; + min-width: var(--subtitles-picker-button-size); + height: var(--subtitles-picker-button-size); + display: flex; + align-items: center; + justify-content: center; + color: var(--color-surfacelight); + background-color: var(--color-backgroundlighter); + + &.selected { + color: var(--color-surfacelighter); + background-color: var(--color-primarydark); + } + + &:hover { + color: var(--color-surfacelighter); + background-color: var(--color-primarylight); + } + } + } + + .number-input-container { flex: 1; + width: 65%; display: flex; flex-direction: row; align-items: center; - .variant-button { - width: calc(var(--subtitles-picker-width) * 0.1); - height: calc(var(--subtitles-picker-width) * 0.1); + .number-input-button { + width: var(--subtitles-picker-button-size); + height: var(--subtitles-picker-button-size); + display: flex; + align-items: center; + justify-content: center; + background-color: var(--color-primary); + cursor: pointer; + + .number-input-icon { + height: 50%; + fill: var(--color-surfacelighter); + } + + &:hover { + background-color: var(--color-primarylight); + } + } + + .number-input-value { + flex: 1; + height: var(--subtitles-picker-button-size); + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + color: var(--color-surfacelighter); + border-style: solid; + border-color: var(--color-primary); + border-width: 1px 0; } } } diff --git a/src/routes/Player/ControlBar/TimeSlider/styles.less b/src/routes/Player/ControlBar/TimeSlider/styles.less index 570a33da9..3aeb99d6a 100644 --- a/src/routes/Player/ControlBar/TimeSlider/styles.less +++ b/src/routes/Player/ControlBar/TimeSlider/styles.less @@ -5,7 +5,6 @@ .label { font-size: calc(var(--time-slider-thumb-size) * 0.7); - line-height: 1; color: var(--color-surfacelight); } diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 9d3bcf05c..04e38849d 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -86,7 +86,7 @@ } &.subtitles-popup-content { - --subtitles-picker-width: calc(var(--control-bar-button-height) * 8); + --subtitles-picker-button-size: calc(var(--control-bar-button-height) * 0.6); } } } \ No newline at end of file From 997f2249049f79211d3040d837637f5099295b6f Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 18 Dec 2018 11:37:10 +0200 Subject: [PATCH 33/94] TimeSlider renamed to SeekBar --- src/routes/Player/ControlBar/ControlBar.js | 96 ++++++++++--------- .../TimeSlider.js => SeekBar/SeekBar.js} | 8 +- src/routes/Player/ControlBar/SeekBar/index.js | 3 + .../{TimeSlider => SeekBar}/styles.less | 8 +- .../Player/ControlBar/TimeSlider/index.js | 3 - src/routes/Player/ControlBar/styles.less | 6 +- 6 files changed, 66 insertions(+), 58 deletions(-) rename src/routes/Player/ControlBar/{TimeSlider/TimeSlider.js => SeekBar/SeekBar.js} (92%) create mode 100644 src/routes/Player/ControlBar/SeekBar/index.js rename src/routes/Player/ControlBar/{TimeSlider => SeekBar}/styles.less (69%) delete mode 100644 src/routes/Player/ControlBar/TimeSlider/index.js diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index b70a6be4c..8a5815f40 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -1,9 +1,9 @@ -import React, { Component } from 'react'; +import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import Icon from 'stremio-icons/dom'; import { Popup } from 'stremio-common'; -import TimeSlider from './TimeSlider'; +import SeekBar from './SeekBar'; import VolumeSlider from './VolumeSlider'; import SubtitlesPicker from './SubtitlesPicker'; import styles from './styles'; @@ -66,6 +66,53 @@ class ControlBar extends Component { this.setState({ subtitlesPopupOpen: false }); } + renderSeekBar() { + return ( + + ); + } + + renderPlayPauseButton() { + if (this.props.paused === null) { + return null; + } + + const icon = this.props.paused ? 'ic_play' : 'ic_pause'; + return ( +
+ +
+ ); + } + + renderVolumeBar() { + if (this.props.volume === null) { + return null; + } + + const icon = this.props.volume === 0 ? 'ic_volume0' : + this.props.volume < 50 ? 'ic_volume1' : + this.props.volume < 100 ? 'ic_volume2' : + 'ic_volume3'; + return ( + +
+ +
+ +
+ ); + } + renderShareButton() { return ( @@ -105,56 +152,17 @@ class ControlBar extends Component { ); } - renderVolumeButton() { - if (this.props.volume === null) { - return null; - } - - const icon = this.props.volume === 0 ? 'ic_volume0' : - this.props.volume < 50 ? 'ic_volume1' : - this.props.volume < 100 ? 'ic_volume2' : - 'ic_volume3'; - return ( -
- -
- ); - } - - renderPlayPauseButton() { - if (this.props.paused === null) { - return null; - } - - const icon = this.props.paused ? 'ic_play' : 'ic_pause'; - return ( -
- -
- ); - } - render() { - if (['paused', 'time', 'duration', 'volume', 'subtitles'].every(propName => this.props[propName] === null)) { + if (['paused', 'time', 'duration', 'volume', 'subtitleTracks'].every(propName => this.props[propName] === null)) { return null; } return (
- + {this.renderSeekBar()}
{this.renderPlayPauseButton()} - {this.renderVolumeButton()} - + {this.renderVolumeBar()}
{this.renderSubtitlesButton()} {this.renderShareButton()} diff --git a/src/routes/Player/ControlBar/TimeSlider/TimeSlider.js b/src/routes/Player/ControlBar/SeekBar/SeekBar.js similarity index 92% rename from src/routes/Player/ControlBar/TimeSlider/TimeSlider.js rename to src/routes/Player/ControlBar/SeekBar/SeekBar.js index 4079e82b2..be1b048af 100644 --- a/src/routes/Player/ControlBar/TimeSlider/TimeSlider.js +++ b/src/routes/Player/ControlBar/SeekBar/SeekBar.js @@ -5,7 +5,7 @@ import debounce from 'lodash.debounce'; import { Slider } from 'stremio-common'; import styles from './styles'; -class TimeSlider extends Component { +class SeekBar extends Component { constructor(props) { super(props); @@ -99,7 +99,7 @@ class TimeSlider extends Component { } return ( -
+
{this.renderTimeLabel()} {this.renderSlider()} {this.renderDurationLabel()} @@ -108,11 +108,11 @@ class TimeSlider extends Component { } } -TimeSlider.propTypes = { +SeekBar.propTypes = { className: PropTypes.string, time: PropTypes.number, duration: PropTypes.number, setTime: PropTypes.func.isRequired }; -export default TimeSlider; +export default SeekBar; diff --git a/src/routes/Player/ControlBar/SeekBar/index.js b/src/routes/Player/ControlBar/SeekBar/index.js new file mode 100644 index 000000000..98fa01d24 --- /dev/null +++ b/src/routes/Player/ControlBar/SeekBar/index.js @@ -0,0 +1,3 @@ +import SeekBar from './SeekBar'; + +export default SeekBar; diff --git a/src/routes/Player/ControlBar/TimeSlider/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less similarity index 69% rename from src/routes/Player/ControlBar/TimeSlider/styles.less rename to src/routes/Player/ControlBar/SeekBar/styles.less index 3aeb99d6a..6edb6a2fc 100644 --- a/src/routes/Player/ControlBar/TimeSlider/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -1,20 +1,20 @@ -.time-slider-container { +.seek-bar-container { display: flex; flex-direction: row; align-items: center; .label { - font-size: calc(var(--time-slider-thumb-size) * 0.7); + font-size: calc(var(--seek-bar-thumb-size) * 0.7); color: var(--color-surfacelight); } .slider { - --thumb-size: var(--time-slider-thumb-size); + --thumb-size: var(--seek-bar-thumb-size); --track-color: var(--color-primarydark); --thumb-color: var(--color-primary); --thumb-active-color: var(--color-primarylight); flex: 1; - margin: 0 var(--time-slider-thumb-size); + margin: 0 var(--seek-bar-thumb-size); } &:hover, &.active { diff --git a/src/routes/Player/ControlBar/TimeSlider/index.js b/src/routes/Player/ControlBar/TimeSlider/index.js deleted file mode 100644 index 1627d93c0..000000000 --- a/src/routes/Player/ControlBar/TimeSlider/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import TimeSlider from './TimeSlider'; - -export default TimeSlider; diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 04e38849d..3b983da5a 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -9,9 +9,9 @@ justify-content: flex-end; overflow: hidden; - .time-slider { - --time-slider-thumb-size: calc(var(--control-bar-button-height) * 0.4); - height: var(--time-slider-thumb-size); + .seek-bar { + --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.4); + height: var(--seek-bar-thumb-size); width: 100%; } From aaa932aa904681fe0cb455e7f232ec157282cd5c Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 18 Dec 2018 13:00:30 +0200 Subject: [PATCH 34/94] dependencies updated --- package.json | 31 +- yarn.lock | 2130 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 1473 insertions(+), 688 deletions(-) diff --git a/package.json b/package.json index 3f2dbde6e..cc8db0ae6 100755 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "hat": "0.0.3", "lodash.debounce": "4.0.8", "prop-types": "15.6.2", - "react": "16.6.0", - "react-dom": "16.6.0", + "react": "16.6.3", + "react-dom": "16.6.3", "react-router": "4.3.1", "react-router-dom": "4.3.1", "stremio-addon-client": "git+ssh://git@github.com/Stremio/stremio-addon-client.git#v1.5.1", @@ -33,28 +33,27 @@ "stremio-translations": "git+ssh://git@github.com/Stremio/stremio-translations.git#v1.41.0" }, "devDependencies": { - "@babel/core": "7.1.2", - "@babel/plugin-proposal-class-properties": "7.1.0", - "@babel/plugin-proposal-object-rest-spread": "7.0.0", - "@babel/preset-env": "7.1.0", + "@babel/core": "7.2.2", + "@babel/plugin-proposal-class-properties": "7.2.1", + "@babel/plugin-proposal-object-rest-spread": "7.2.0", + "@babel/preset-env": "7.2.0", "@babel/preset-react": "7.0.0", - "@babel/runtime": "7.1.2", - "@storybook/addon-actions": "4.0.4", - "@storybook/addon-links": "4.0.4", - "@storybook/addons": "4.0.4", - "@storybook/react": "4.0.4", - "autoprefixer": "9.4.0", + "@babel/runtime": "7.2.0", + "@storybook/addon-actions": "4.1.2", + "@storybook/addon-links": "4.1.2", + "@storybook/addons": "4.1.2", + "@storybook/react": "4.1.2", + "autoprefixer": "9.4.3", "babel-loader": "8.0.4", "copy-webpack-plugin": "4.6.0", - "css-loader": "1.0.1", + "css-loader": "2.0.1", "html-webpack-plugin": "3.2.0", - "less": "3.8.1", + "less": "3.9.0", "less-loader": "4.1.0", "postcss-loader": "3.0.0", "style-loader": "0.23.1", "terser-webpack-plugin": "1.1.0", - "uglifyjs-webpack-plugin": "2.0.1", - "webpack": "4.25.1", + "webpack": "4.27.1", "webpack-cli": "3.1.2", "webpack-dev-server": "3.1.10" } diff --git a/yarn.lock b/yarn.lock index d1df5d988..a9bb86fd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,18 +9,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.2.tgz#f8d2a9ceb6832887329a7b60f9d035791400ba4e" - integrity sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw== +"@babel/core@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.0.tgz#08958f1371179f62df6966d8a614003d11faeb04" + integrity sha512-9EWmD0cQAbcXSc+31RIoYgEHx3KQ2CCSMDBhnXrShWvo45TMw+3/55KVxlhkG53kw9tl87DqINgHDgFVhZJV/Q== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.1.2" - "@babel/helpers" "^7.1.2" - "@babel/parser" "^7.1.2" - "@babel/template" "^7.1.2" + "@babel/generator" "^7.0.0" + "@babel/helpers" "^7.1.0" + "@babel/parser" "^7.1.0" + "@babel/template" "^7.1.0" "@babel/traverse" "^7.1.0" - "@babel/types" "^7.1.2" + "@babel/types" "^7.0.0" convert-source-map "^1.1.0" debug "^3.1.0" json5 "^0.5.0" @@ -29,12 +29,32 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.1.2", "@babel/generator@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.5.tgz#615f064d13d95f8f9157c7261f68eddf32ec15b3" - integrity sha512-IO31r62xfMI+wBJVmgx0JR9ZOHty8HkoYpQAjRWUGG9vykBTlGHdArZ8zoFtpUu2gs17K7qTl/TtPpiSi6t+MA== +"@babel/core@7.2.2", "@babel/core@^7.1.6": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" + integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== dependencies: - "@babel/types" "^7.1.5" + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.2" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.2.2" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" + integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== + dependencies: + "@babel/types" "^7.2.2" jsesc "^2.5.1" lodash "^4.17.10" source-map "^0.5.0" @@ -72,6 +92,17 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-create-class-features-plugin@^7.2.1": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.2.2.tgz#aac79552e41c94716a804d371e943f20171df0c5" + integrity sha512-Q4qZE5wS3NWpOS6UV9yhIS/NmSyf2keF0E0IwDvx8WxTheVopVIY6BSQ/0vz72OTTruz0cOA2yIUh6Kdg3qprA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-define-map@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" @@ -127,15 +158,15 @@ "@babel/types" "^7.0.0" "@babel/helper-module-transforms@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" - integrity sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw== + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" lodash "^4.17.10" "@babel/helper-optimise-call-expression@^7.0.0": @@ -194,23 +225,23 @@ "@babel/types" "^7.0.0" "@babel/helper-wrap-function@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" - integrity sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/template" "^7.1.0" "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.2.0" -"@babel/helpers@^7.1.2": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.5.tgz#68bfc1895d685f2b8f1995e788dbfe1f6ccb1996" - integrity sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg== +"@babel/helpers@^7.1.0", "@babel/helpers@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" + integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== dependencies: "@babel/template" "^7.1.2" "@babel/traverse" "^7.1.5" - "@babel/types" "^7.1.5" + "@babel/types" "^7.2.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -221,21 +252,21 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.2", "@babel/parser@^7.1.3", "@babel/parser@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.5.tgz#20b7d5e7e1811ba996f8a868962ea7dd2bfcd2fc" - integrity sha512-WXKf5K5HT6X0kKiCOezJZFljsfxKV1FpU8Tf1A7ZpGvyd/Q4hlrJm2EwoH2onaUq3O4tLDp+4gk0hHPsMyxmOg== +"@babel/parser@^7.1.0", "@babel/parser@^7.1.3", "@babel/parser@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.2.tgz#37ebdbc88a2e1ebc6c8dd3d35ea9436e3e39e477" + integrity sha512-UNTmQ5cSLDeBGBl+s7JeowkqIHgmFAGBnLDdIzFmUNSuS5JF0XBcN59jsh/vJO/YjfsBqMxhMjoFGmNExmf0FA== -"@babel/plugin-proposal-async-generator-functions@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" - integrity sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew== +"@babel/plugin-proposal-async-generator-functions@^7.1.0", "@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@7.1.0", "@babel/plugin-proposal-class-properties@^7.1.0": +"@babel/plugin-proposal-class-properties@7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz#9af01856b1241db60ec8838d84691aa0bd1e8df4" integrity sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw== @@ -247,15 +278,33 @@ "@babel/helper-replace-supers" "^7.1.0" "@babel/plugin-syntax-class-properties" "^7.0.0" -"@babel/plugin-proposal-json-strings@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" - integrity sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q== +"@babel/plugin-proposal-class-properties@7.2.1", "@babel/plugin-proposal-class-properties@^7.2.0": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.2.1.tgz#c734a53e0a1ec40fe5c22ee5069d26da3b187d05" + integrity sha512-/4FKFChkQ2Jgb8lBDsvFX496YTi7UWTetVgS8oJUpX1e/DlaoeEK57At27ug8Hu2zI2g8bzkJ+8k9qrHZRPGPA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.2.1" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-decorators@7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.2.tgz#79829bd75fced6581ec6c7ab1930e8d738e892e7" + integrity sha512-YooynBO6PmBgHvAd0fl5e5Tq/a0pEC6RqF62ouafme8FzdIVH41Mz/u1dn8fFVm4jzEJ+g/MsOxouwybJPuP8Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.1.0" -"@babel/plugin-proposal-object-rest-spread@7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.0.0": +"@babel/plugin-proposal-json-strings@^7.0.0", "@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" integrity sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw== @@ -263,104 +312,133 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.0.0" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" - integrity sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw== +"@babel/plugin-proposal-object-rest-spread@7.2.0", "@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" + integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" - integrity sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ== +"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0", "@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" regexpu-core "^4.2.0" -"@babel/plugin-syntax-async-generators@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" - integrity sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA== +"@babel/plugin-syntax-async-generators@^7.0.0", "@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-class-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz#e051af5d300cbfbcec4a7476e37a803489881634" - integrity sha512-cR12g0Qzn4sgkjrbrzWy2GE7m9vMl/sFkqZ3gIpAQdrvPDnLM8180i+ANDFIXfjHo9aqp0ccJlQ0QNZcFUbf9w== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz#23b3b7b9bcdabd73672a9149f728cd3be6214812" + integrity sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-flow@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0.tgz#70638aeaad9ee426bc532e51523cff8ff02f6f17" - integrity sha512-zGcuZWiWWDa5qTZ6iAnpG0fnX/GOu49pGR5PFvkQ9GmKNaSphXQnlNXh/LG20sqWtNrx/eB6krzfEzcwvUyeFA== +"@babel/plugin-syntax-decorators@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" + integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.0.0": +"@babel/plugin-syntax-dynamic-import@7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" - integrity sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz#6dfb7d8b6c3be14ce952962f658f3b7eb54c33ee" + integrity sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-jsx@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" - integrity sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg== +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" + integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" - integrity sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw== +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" - integrity sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw== +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" - integrity sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w== +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" - integrity sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g== +"@babel/plugin-syntax-optional-catch-binding@^7.0.0", "@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz#55d240536bd314dcbbec70fd949c5cabaed1de29" + integrity sha512-WhKr6yu6yGpGcNMVgIBuI9MkredpVc7Y3YR4UzEZmDztHoL6wV56YBHLhWnjO1EvId1B32HrD3DRFc+zSoKI1g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.1.0", "@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" + integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" -"@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" - integrity sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ== +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.1.5.tgz#3e8e0bc9a5104519923302a24f748f72f2f61f37" - integrity sha512-jlYcDrz+5ayWC7mxgpn1Wj8zj0mmjCT2w0mPIMSwO926eXBRxpEgoN/uQVRBfjtr8ayjcmS+xk2G1jaP8JjMJQ== +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" + integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.10" -"@babel/plugin-transform-classes@^7.1.0": +"@babel/plugin-transform-classes@7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" integrity sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg== @@ -374,45 +452,66 @@ "@babel/helper-split-export-declaration" "^7.0.0" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" - integrity sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA== +"@babel/plugin-transform-classes@^7.1.0", "@babel/plugin-transform-classes@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" + integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz#e69ff50ca01fac6cb72863c544e516c2b193012f" - integrity sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw== +"@babel/plugin-transform-destructuring@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz#68e911e1935dda2f06b6ccbbf184ffb024e9d43a" + integrity sha512-Fr2GtF8YJSXGTyFPakPFB4ODaEKGU04bPsAllAIabwoXdFrPxL0LVXQX5dQWoxOjjgozarJcC9eWGsj0fD6Zsg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" - integrity sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig== +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" + integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0", "@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" regexpu-core "^4.1.3" -"@babel/plugin-transform-duplicate-keys@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" - integrity sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ== +"@babel/plugin-transform-duplicate-keys@^7.0.0", "@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" - integrity sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ== +"@babel/plugin-transform-exponentiation-operator@^7.1.0", "@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-flow-strip-types@^7.0.0": +"@babel/plugin-transform-flow-strip-types@7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0.tgz#c40ced34c2783985d90d9f9ac77a13e6fb396a01" integrity sha512-WhXUNb4It5a19RsgKKbQPrjmy4yWOY1KynpEbNw7bnd1QTcrT/EIl3MJvnGgpgvrKyKbqX7nUNOJfkpLOnoDKA== @@ -420,57 +519,65 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow" "^7.0.0" -"@babel/plugin-transform-for-of@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" - integrity sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA== +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.0.tgz#db6180d098caaabdd609a8da3800f5204e66b69b" + integrity sha512-xhQp0lyXA5vk8z1kJitdMozQYEWfo4MgC6neNXrb5euqHiTIGhj5ZWfFPkVESInQSk9WZz1bbNmIRz6zKfWGVA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" - integrity sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg== +"@babel/plugin-transform-function-name@^7.1.0", "@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" - integrity sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA== +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" - integrity sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A== +"@babel/plugin-transform-modules-amd@^7.1.0", "@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-commonjs@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" - integrity sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA== +"@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-systemjs@^7.0.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.1.3.tgz#2119a3e3db612fd74a19d88652efbfe9613a5db0" - integrity sha512-PvTxgjxQAq4pvVUZF3mD5gEtVDuId8NtWkJsZLEJZMZAW3TvgQl1pmydLLN1bM8huHFVVU43lf0uvjQj9FRkKw== +"@babel/plugin-transform-modules-systemjs@^7.0.0", "@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" + integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== dependencies: "@babel/helper-hoist-variables" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-umd@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" - integrity sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig== +"@babel/plugin-transform-modules-umd@^7.1.0", "@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -482,54 +589,77 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" - integrity sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw== +"@babel/plugin-transform-object-super@^7.1.0", "@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" -"@babel/plugin-transform-parameters@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" - integrity sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw== +"@babel/plugin-transform-parameters@^7.1.0", "@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" + integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== dependencies: "@babel/helper-call-delegate" "^7.1.0" "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-display-name@^7.0.0": +"@babel/plugin-transform-react-constant-elements@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.0.0.tgz#ab413e33e9c46a766f5326014bcbf9e2b34ef7a4" + integrity sha512-z8yrW4KCVcqPYr0r9dHXe7fu3daLzn0r6TQEFoGbXahdrzEwT1d1ux+/EnFcqIHv9uPilUlnRnPIUf7GMO0ehg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-constant-elements@^7.0.0", "@babel/plugin-transform-react-constant-elements@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz#ed602dc2d8bff2f0cb1a5ce29263dbdec40779f7" + integrity sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz#93759e6c023782e52c2da3b75eca60d4f10533ee" integrity sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0.tgz#a84bb70fea302d915ea81d9809e628266bb0bc11" - integrity sha512-pymy+AK12WO4safW1HmBpwagUQRl9cevNX+82AIAtU1pIdugqcH+nuYP03Ja6B+N4gliAaKWAegIBL/ymALPHA== +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" "@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz#28e00584f9598c0dd279f6280eee213fa0121c3c" - integrity sha512-OSeEpFJEH5dw/TtxTg4nijl4nHBbhqbKL94Xo/Y17WKIf2qJWeIk/QeXACF19lG1vMezkxqruwnTjVizaW7u7w== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" "@babel/plugin-transform-react-jsx@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" - integrity sha512-0TMP21hXsSUjIQJmu/r7RiVxeFrXRcMUigbKu0BLegJK9PkYodHstaszcig7zxXfaBji2LYUdtqIkHs+hgYkJQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz#ca36b6561c4d3b45524f8efb6f0fbc9a0d1d622f" + integrity sha512-h/fZRel5wAfCqcKgq3OhbmYaReo7KkoJBpt8XnvpS7wqaNMqtw5xhxutzcm35iMUWucfAdT/nvGTsWln0JTg2Q== dependencies: "@babel/helper-builder-react-jsx" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" "@babel/plugin-transform-regenerator@^7.0.0": version "7.0.0" @@ -538,7 +668,7 @@ dependencies: regenerator-transform "^0.13.3" -"@babel/plugin-transform-runtime@^7.1.0": +"@babel/plugin-transform-runtime@7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz#9f76920d42551bb577e2dc594df229b5f7624b63" integrity sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg== @@ -548,47 +678,55 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" - integrity sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw== +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" - integrity sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ== +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" - integrity sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw== +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" - integrity sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg== +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typeof-symbol@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" - integrity sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg== +"@babel/plugin-transform-typeof-symbol@^7.0.0", "@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" - integrity sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw== +"@babel/plugin-transform-typescript@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.2.0.tgz#bce7c06300434de6a860ae8acf6a442ef74a99d1" + integrity sha512-EnI7i2/gJ7ZNr2MuyvN2Hu+BHJENlxWte5XygPvfj/MbvtOkWor9zcnHpMMQL2YYaaCcqtIvJUyJ7QVfoGs7ew== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" @@ -641,49 +779,49 @@ js-levenshtein "^1.1.3" semver "^5.3.0" -"@babel/preset-env@^7.1.0": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.5.tgz#a28b5482ca8bc2f2d0712234d6c690240b92495d" - integrity sha512-pQ+2o0YyCp98XG0ODOHJd9z4GsSoV5jicSedRwCrU8uiqcJahwQiOq0asSZEb/m/lwyu6X5INvH/DSiwnQKncw== +"@babel/preset-env@7.2.0", "@babel/preset-env@^7.1.6", "@babel/preset-env@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.0.tgz#a5030e7e4306af5a295dd5d7c78dc5464af3fee2" + integrity sha512-haGR38j5vOGVeBatrQPr3l0xHbs14505DcM57cbJy48kgMFvvHHoYEhHuRV+7vi559yyAUAVbTWzbK/B/pzJng== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.1.0" - "@babel/plugin-proposal-json-strings" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" - "@babel/plugin-syntax-async-generators" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.1.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.1.5" - "@babel/plugin-transform-classes" "^7.1.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-dotall-regex" "^7.0.0" - "@babel/plugin-transform-duplicate-keys" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.1.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.1.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-amd" "^7.1.0" - "@babel/plugin-transform-modules-commonjs" "^7.1.0" - "@babel/plugin-transform-modules-systemjs" "^7.0.0" - "@babel/plugin-transform-modules-umd" "^7.1.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" "@babel/plugin-transform-new-target" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.1.0" - "@babel/plugin-transform-parameters" "^7.1.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typeof-symbol" "^7.0.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - browserslist "^4.1.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.3.0" @@ -707,48 +845,56 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" -"@babel/runtime@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" - integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg== +"@babel/preset-typescript@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz#49ad6e2084ff0bfb5f1f7fb3b5e76c434d442c7f" + integrity sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.1.0" + +"@babel/runtime@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" + integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.5.tgz#4170907641cf1f61508f563ece3725150cc6fe39" - integrity sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA== +"@babel/runtime@7.2.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" + integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== dependencies: regenerator-runtime "^0.12.0" -"@babel/template@^7.1.0", "@babel/template@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" - integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== +"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.1.2" - "@babel/types" "^7.1.2" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.5.tgz#5aafca2039aa058c104cf2bfeb9fc4a857ccbca9" - integrity sha512-eU6XokWypl0MVJo+MTSPUtlfPePkrqsF26O+l1qFGlCKWwmiYAYy2Sy44Qw8m2u/LbPCsxYt90rghmqhYMGpPA== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.2.tgz#961039de1f9bcb946d807efe2dba9c92e859d188" + integrity sha512-E5Bn9FSwHpSkUhthw/XEuvFZxIgrqb9M8cX8j5EUQtrUG5DQUy6bFyl7G7iQ1D1Czudor+xkmp81JbLVVM0Sjg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.1.5" + "@babel/generator" "^7.2.2" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.5" - "@babel/types" "^7.1.5" - debug "^3.1.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + debug "^4.1.0" globals "^11.1.0" lodash "^4.17.10" -"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.5.tgz#12fe64e91a431234b7017b4227a78cc0eec4e081" - integrity sha512-sJeqa/d9eM/bax8Ivg+fXF7FpN3E/ZmTrWbkk6r+g7biVYfALMnLin4dKijsaqEhpd2xvOGfQTkQkD31YCVV4A== +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" + integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== dependencies: esutils "^2.0.2" lodash "^4.17.10" @@ -866,22 +1012,23 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nodelib/fs.stat@^1.0.1": +"@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@storybook/addon-actions@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-4.0.4.tgz#134b83f287ab43ea59e55ce3b22126ebfd541f80" - integrity sha512-XIqA8SUVZp9T+8QFZySzPbY/pSzv3dR17y2t/hgwnw0WJDQ0LcZ/1qUQJ9J87sz5ElMIQNrxKJJEk/kf2Qug4A== +"@storybook/addon-actions@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-4.1.2.tgz#0249822e85accf85311a1a4a6f8feee7cc42e171" + integrity sha512-rgXDD5P+UymFR5PqPD6u4nViQbRojhJXrAg2SOhXv8eUSnwWGX/hUqeGS8s6IC+F1Wv67UlcERty14Vpo7e8pg== dependencies: "@emotion/core" "^0.13.1" "@emotion/provider" "^0.11.2" "@emotion/styled" "^0.10.6" - "@storybook/addons" "4.0.4" - "@storybook/components" "4.0.4" - "@storybook/core-events" "4.0.4" + "@storybook/addons" "4.1.2" + "@storybook/components" "4.1.2" + "@storybook/core-events" "4.1.2" + core-js "^2.5.7" deep-equal "^1.0.1" global "^4.3.2" lodash "^4.17.11" @@ -890,50 +1037,51 @@ react-inspector "^2.3.0" uuid "^3.3.2" -"@storybook/addon-links@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-4.0.4.tgz#0b225c460335eb5da4af6d9061a82c2bb4cb9d74" - integrity sha512-f8uuwY9uqmG02Q+Zu10Hppq118JG2Ksih0BvpY2X3d2JAkcWllH0YosH6Sd5g1TgxMI+OMSXLDEsAojmmMX9MQ== +"@storybook/addon-links@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-4.1.2.tgz#f5fce2a96b86574a4f8d3195dc249093dafe4055" + integrity sha512-/nmFJ+85/K0jS+9mQyWjGYNO4J/n6dK/J5ks6gMn8xXU4iys1l2vHEJupUHq5nERuLANYxJGogzko1kgvqIiCg== dependencies: - "@storybook/addons" "4.0.4" - "@storybook/components" "4.0.4" - "@storybook/core-events" "4.0.4" + "@storybook/addons" "4.1.2" + "@storybook/components" "4.1.2" + "@storybook/core-events" "4.1.2" + core-js "^2.5.7" global "^4.3.2" prop-types "^15.6.2" -"@storybook/addons@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-4.0.4.tgz#133609c527435aba1149ead53ca91f694db1a490" - integrity sha512-e7S5kYCytPsAM2p8dMQNUV0QEnY9P9mf6zVgbVgdZ2O1b2uMwD/ABj/BhYLgsB7gdshGrcV5vkMXAAGwMsN6Sg== +"@storybook/addons@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-4.1.2.tgz#c5b21f19b9d648a52800f6854f8ca99d08e71aef" + integrity sha512-b9GrSzD6HTFK1U06zbZaFNKlBanrBBpaDfHPByEdkefzGmGMVpDehC+wG8xuUoENjYlbZH7D6GnlTKdHviXkGg== dependencies: - "@storybook/channels" "4.0.4" - "@storybook/components" "4.0.4" + "@storybook/channels" "4.1.2" + "@storybook/components" "4.1.2" global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/channel-postmessage@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-4.0.4.tgz#5c8d0c8ac49b92fa95abcf23d1d80d043a8558b0" - integrity sha512-XcQ7YNRWdsHRKl8+aaTFh6YNjyFkuuCWrklqDWBJpl/GyBV4IZa1nCVYSGYl1mMtsL4LVRmurHbWuS839RWJ4w== +"@storybook/channel-postmessage@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-4.1.2.tgz#081884d3b34e277cdb0a872b5e94920759b0f60b" + integrity sha512-VjCcGzn5kYrQzzfsSJbAseC5/3Js3NRPFRRUF/qVZiUyPzOBi66gH56IWfQdCBONaJAzwqtmdNjMPz5ZNZfccA== dependencies: - "@storybook/channels" "4.0.4" + "@storybook/channels" "4.1.2" global "^4.3.2" json-stringify-safe "^5.0.1" -"@storybook/channels@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-4.0.4.tgz#fdf717cd726d15508ac80ff93a3893b75d3ab8b8" - integrity sha512-EeRby5oCyyYBkBrxI7Cg8F65FkYJjVK0jbGWpIugcjtnfOeP57xLcZuukcjhLjl/oaC/RYw7A/6c0nFW4kV0GQ== +"@storybook/channels@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-4.1.2.tgz#4efc82e2775fc143d5c5aa95b332ddd0e5b5bdd2" + integrity sha512-sdwiF7a0mKI0r/6g6qgaIvQRu+MGsvQ+Fv0HSDUU0qrThE8LhA6dl8wLjJ2BcHY93edksCKRg8zMhc0yARopOw== -"@storybook/client-logger@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-4.0.4.tgz#b3570c8d39b051261fe1cda992f13208338cff8c" - integrity sha512-T9Na9yWwH+1qfQ2izB0ul7QvtKE9C8nQCz8bTYzgBq84MD7kgowKRC/rhdz/EqNGvkZQcl9OOPRptWGt5eamuw== +"@storybook/client-logger@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-4.1.2.tgz#4169e84a9a6d001eb99bcd1a2e365977f365fc34" + integrity sha512-T+B5pOVuBInx9WRYT/0bz/4QsPtlbexjZThl6Fb6E0xM6anHL9ADgY591Bd3lCVXi0UnPgx9Zw2hhBFC1WNrvQ== -"@storybook/components@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-4.0.4.tgz#e07fc89cd7d64e0686c933da92a3e849d8c59d60" - integrity sha512-v13Tm5ACYrk01bszl0EpFGKe9YyCdQjdJOEE9laDiGS6rWEydl0T5QmzhBD6yNgf+k6gs96JylxswlyyqHe32Q== +"@storybook/components@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-4.1.2.tgz#e7b52e19dde4e22db3625230280290e346dcb7bc" + integrity sha512-qCVIsgSBbEr8TaTyFZw5nwkui+7MLscI0/zodbluvFo2e2uorxH5W2gPqn76t0PVZaubAbn2t62pnJytyFbNbw== dependencies: "@emotion/core" "^0.13.1" "@emotion/provider" "^0.11.2" @@ -946,37 +1094,35 @@ react-textarea-autosize "^7.0.4" render-fragment "^0.1.1" -"@storybook/core-events@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-4.0.4.tgz#bf457afe9aec3fb2cd66d7cad3fa5e5821e01503" - integrity sha512-+OFFYTVSZd6zjZQMCUF2HQ0hIPfel9NyBBABbPxEtbvWEx/cp4RMfk5VFVISpwYJQMhnqCUU0/t3VoLTKFtm1g== +"@storybook/core-events@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-4.1.2.tgz#73c36938537158d1f22767cd183a59576089c1d7" + integrity sha512-tyYqmVRmkHUWjgJ7A4hjSJ6qreaZhWWlvoGCCrPMQ09QSwtNkC41Ie6yLW64ZXp7PS4FK6yvVw+30YHNA53KZQ== -"@storybook/core@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-4.0.4.tgz#c310bcdd2cb13356ebe3538f1f2944b6c31c45d9" - integrity sha512-GAikZtRgrMdGOJvVBVBPvLpSkzhwlyTKO/14VWyTx2EYEBLu+9FMoNCuSOUL+0OvpWKggE5Y569zLeFu0y5LVA== +"@storybook/core@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-4.1.2.tgz#b97ef2a8430012f1c8c6992a4c9cd186014deef7" + integrity sha512-NjE/sbZoMcur9pgGJ+KHyCeDMQnHx02u1Z+potG7H45QFwPXEG8NZ2s4iGi9kjkyDoF4JHI6swyQ9xy6mSoepA== dependencies: - "@babel/plugin-proposal-class-properties" "^7.1.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.1.0" - "@babel/preset-env" "^7.1.0" - "@babel/runtime" "^7.1.2" + "@babel/plugin-proposal-class-properties" "^7.2.0" + "@babel/preset-env" "^7.2.0" "@emotion/core" "^0.13.1" "@emotion/provider" "^0.11.2" "@emotion/styled" "^0.10.6" - "@storybook/addons" "4.0.4" - "@storybook/channel-postmessage" "4.0.4" - "@storybook/client-logger" "4.0.4" - "@storybook/core-events" "4.0.4" - "@storybook/node-logger" "4.0.4" - "@storybook/ui" "4.0.4" + "@storybook/addons" "4.1.2" + "@storybook/channel-postmessage" "4.1.2" + "@storybook/client-logger" "4.1.2" + "@storybook/core-events" "4.1.2" + "@storybook/node-logger" "4.1.2" + "@storybook/ui" "4.1.2" airbnb-js-shims "^1 || ^2" autoprefixer "^9.3.1" babel-plugin-macros "^2.4.2" - babel-preset-minify "^0.5.0" + babel-preset-minify "^0.5.0 || 0.6.0-alpha.5" boxen "^2.0.0" case-sensitive-paths-webpack-plugin "^2.1.2" chalk "^2.4.1" + child-process-promise "^2.2.1" cli-table3 "0.5.1" commander "^2.19.0" common-tags "^1.8.0" @@ -985,10 +1131,12 @@ detect-port "^1.2.3" dotenv-webpack "^1.5.7" ejs "^2.6.1" + eventemitter3 "^3.1.0" express "^4.16.3" file-loader "^2.0.0" file-system-cache "^1.0.5" find-cache-dir "^2.0.0" + fs-extra "^7.0.1" global "^4.3.2" html-webpack-plugin "^4.0.0-beta.2" inquirer "^6.2.0" @@ -1000,17 +1148,21 @@ opn "^5.4.0" postcss-flexbugs-fixes "^4.1.0" postcss-loader "^3.0.0" + pretty-hrtime "^1.0.3" prop-types "^15.6.2" qs "^6.5.2" raw-loader "^0.5.1" react-dev-utils "^6.1.0" redux "^4.0.1" + regenerator-runtime "^0.12.1" resolve "^1.8.1" semver "^5.6.0" serve-favicon "^2.5.0" shelljs "^0.8.2" + spawn-promise "^0.1.8" style-loader "^0.23.1" svg-url-loader "^2.3.2" + terser-webpack-plugin "^1.1.0" url-loader "^1.1.2" webpack "^4.23.1" webpack-dev-middleware "^3.4.0" @@ -1025,13 +1177,16 @@ "@storybook/react-simple-di" "^1.2.1" babel-runtime "6.x.x" -"@storybook/node-logger@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-4.0.4.tgz#0f12de826297df22eec689b82e55e01e9c195ea9" - integrity sha512-6WvMrICmsGwLD5zPzW81a75Rt4o0uQPCkZAkudbiy6ur6DE/0TYvTIx/QSoUFLEVYYr7JfQ40DdqT4MEPxGSqQ== +"@storybook/node-logger@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-4.1.2.tgz#fa2a70f0c3154acbd399211276a24fa82b533fe1" + integrity sha512-aMK6Kc8903ThpFeJLE7H8VCHcOdyHPC1M9Um80BAqzFzqR0ynEVcxrt8/aN6UyUJXpeIM1Ef7IVhJyH0VDJwVg== dependencies: - "@babel/runtime" "^7.1.2" + chalk "^2.4.1" + core-js "^2.5.7" npmlog "^4.1.2" + pretty-hrtime "^1.0.3" + regenerator-runtime "^0.12.1" "@storybook/podda@^1.2.3": version "1.2.3" @@ -1069,42 +1224,49 @@ dependencies: babel-runtime "^6.5.0" -"@storybook/react@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-4.0.4.tgz#5230f9d16c3ee85b4dcd90e4b8d594572f8cde45" - integrity sha512-e9K/K6ZqVw2w0FiggpsDPjUh60n4VrXJysKhwfWWf237D2jpralnlXKs0ku+6krk6g1crJW0dsdwmpTYilr+tg== +"@storybook/react@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-4.1.2.tgz#dd2a717f55e48daa90ff3f9ecf9120db8edbeb80" + integrity sha512-I64rTCvlWmzcawFeqDN83q46CPQeYAs1x7h44JNkZUTE1lNZ+gTaxTPOVa+dGtz+CJ2JpMXbvrno8e2F8NLMCQ== dependencies: + "@babel/plugin-transform-react-constant-elements" "^7.2.0" "@babel/preset-flow" "^7.0.0" "@babel/preset-react" "^7.0.0" - "@babel/runtime" "^7.1.2" "@emotion/styled" "^0.10.6" - "@storybook/core" "4.0.4" - "@storybook/node-logger" "4.0.4" + "@storybook/core" "4.1.2" + "@storybook/node-logger" "4.1.2" + "@svgr/webpack" "^4.0.3" + babel-plugin-named-asset-import "^0.2.3" babel-plugin-react-docgen "^2.0.0" + babel-preset-react-app "^6.1.0" common-tags "^1.8.0" + core-js "^2.5.7" global "^4.3.2" lodash "^4.17.11" mini-css-extract-plugin "^0.4.4" prop-types "^15.6.2" + react "^16.6.0" react-dev-utils "^6.1.0" + react-dom "^16.6.0" + regenerator-runtime "^0.12.1" semver "^5.6.0" webpack "^4.23.1" -"@storybook/ui@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-4.0.4.tgz#d7b96be6ccc4e90760dd5e8277a734660bc0d234" - integrity sha512-07o7qKQehsIzte4cjp0o9mXEf9YDEiRo3DQbHyTqFehEsj1vSJH/+WH5p5eAK4Zu7K01wprdOoyxsq2tRKQ8xA== +"@storybook/ui@4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-4.1.2.tgz#f48042eef72ae4a21fe62463fa2e5d0b71b5fd1f" + integrity sha512-e/sZ05tj2SohNT+l60eaxWb9wAHV/kthckTNrsdjFoaWSqB9Vt6Ljk4phMtSCr+w1oxl2EGyETjQG9pPOTvzxg== dependencies: "@emotion/core" "^0.13.1" "@emotion/provider" "^0.11.2" "@emotion/styled" "^0.10.6" - "@storybook/components" "4.0.4" - "@storybook/core-events" "4.0.4" + "@storybook/components" "4.1.2" + "@storybook/core-events" "4.1.2" "@storybook/mantra-core" "^1.7.2" "@storybook/podda" "^1.2.3" "@storybook/react-komposer" "^2.0.5" deep-equal "^1.0.1" - events "^3.0.0" + eventemitter3 "^3.1.0" fuse.js "^3.3.0" global "^4.3.2" keycode "^2.2.0" @@ -1116,6 +1278,143 @@ react-modal "^3.6.1" react-treebeard "^3.1.0" +"@svgr/babel-plugin-add-jsx-attribute@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.0.0.tgz#5acf239cd2747b1a36ec7e708de05d914cb9b948" + integrity sha512-PDvHV2WhSGCSExp+eIMEKxYd1Q0SBvXLb4gAOXbdh0dswHFFgXWzxGjCmx5aln4qGrhkuN81khzYzR/44DYaMA== + +"@svgr/babel-plugin-remove-jsx-attribute@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.0.3.tgz#32564b5c4d761b51e34492b6a4894196c0f75803" + integrity sha512-fpG7AzzJxz1tc8ITYS1jCAt1cq4ydK2R+sx//BMTJgvOjfk91M5GiqFolP8aYTzLcum92IGNAVFS3zEcucOQEA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.0.0.tgz#0b59338c00671cf8137eb823bd84a3efac686502" + integrity sha512-nBGVl6LzXTdk1c6w3rMWcjq3mYGz+syWc5b3CdqAiEeY/nswYDoW/cnGUKKC8ofD6/LaG+G/IUnfv3jKoHz43A== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.0.0.tgz#91785643540c2300f3d89e515b37af9b5ce4e695" + integrity sha512-ejQqpTfORy6TT5w1x/2IQkscgfbtNFjitcFDu63GRz7qfhVTYhMdiJvJ1+Aw9hmv9bO4tXThGQDr1IF5lIvgew== + +"@svgr/babel-plugin-svg-dynamic-title@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.0.0.tgz#eb8d50b80ba0a26f9b27c7268e2a803d90f1bc9e" + integrity sha512-OE6GT9WRKWqd0Dk6NJ5TYXTF5OxAyn74+c/D+gTLbCXnK2A0luEXuwMbe5zR5Px4A/jow2OeEBboTENl4vtuQg== + +"@svgr/babel-plugin-svg-em-dimensions@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.0.0.tgz#0de3972c46ff1960bed765646037a3a7f9e1da3d" + integrity sha512-QeDRGHXfjYEBTXxV0TsjWmepsL9Up5BOOlMFD557x2JrSiVGUn2myNxHIrHiVW0+nnWnaDcrkjg/jUvbJ5nKCg== + +"@svgr/babel-plugin-transform-react-native-svg@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.0.0.tgz#5e8ecc2a9870ae05fb1e553b1fe9c6b5853a1c66" + integrity sha512-c6eE6ovs14k6dmHKoy26h7iRFhjWNnwYVrDWIPfouVm/gcLIeMw/ME4i91O5LEfaDHs6kTRCcVpbAVbNULZOtw== + +"@svgr/babel-plugin-transform-svg-component@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.1.0.tgz#257159e28a21ac20988b1eaa5f59d4724f37fdaa" + integrity sha512-uulxdx2p3nrM2BkrtADQHK8IhEzCxdUILfC/ddvFC8tlFWuKiA3ych8C6q0ulyQHq34/3hzz+3rmUbhWF9redg== + +"@svgr/babel-preset@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.1.0.tgz#f6fa8ad90064b85dd7a3566a70b7006e789e8385" + integrity sha512-Nat5aJ3VO3LE8KfMyIbd3sGWnaWPiFCeWIdEV+lalga0To/tpmzsnPDdnrR9fNYhvSSLJbwhU/lrLYt9wXY0ZQ== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^4.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^4.0.3" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "^4.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "^4.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "^4.0.0" + "@svgr/babel-plugin-transform-svg-component" "^4.1.0" + +"@svgr/core@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.1.0.tgz#4f8ad24fb4ab25c787c12a6bbb511c6430558f83" + integrity sha512-ahv3lvOKuUAcs0KbQ4Jr5fT5pGHhye4ew8jZVS4lw8IQdWrbG/o3rkpgxCPREBk7PShmEoGQpteeXVwp2yExuQ== + dependencies: + "@svgr/plugin-jsx" "^4.1.0" + camelcase "^5.0.0" + cosmiconfig "^5.0.7" + +"@svgr/hast-util-to-babel-ast@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.1.0.tgz#a1eb0f47059769896f759f47995b636fce5d9fa4" + integrity sha512-tdkEZHmigYYiVhIEzycAMKN5aUSpddUnjr6v7bPwaNTFuSyqGUrpCg1JlIGi7PUaaJVHbn6whGQMGUpKOwT5nw== + dependencies: + "@babel/types" "^7.1.6" + +"@svgr/plugin-jsx@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.1.0.tgz#4045e9cc0589374a6c182a1217c80e6734b5cbec" + integrity sha512-xwu+9TGziuN7cu7p+vhCw2EJIfv8iDNMzn2dR0C7fBYc8q+SRtYTcg4Uyn8ZWh6DM+IZOlVrS02VEMT0FQzXSA== + dependencies: + "@babel/core" "^7.1.6" + "@svgr/babel-preset" "^4.1.0" + "@svgr/hast-util-to-babel-ast" "^4.1.0" + rehype-parse "^6.0.0" + unified "^7.0.2" + vfile "^3.0.1" + +"@svgr/plugin-svgo@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.0.3.tgz#a07ea0a736c26fa3a5440fe8e222e2e887764cab" + integrity sha512-MgL1CrlxvNe+1tQjPUc2bIJtsdJOIE5arbHlPgW+XVWGjMZTUcyNNP8R7/IjM2Iyrc98UJY+WYiiWHrinnY9ZQ== + dependencies: + cosmiconfig "^5.0.7" + merge-deep "^3.0.2" + svgo "^1.1.1" + +"@svgr/webpack@^4.0.3": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.1.0.tgz#20c88f32f731c7b1d4711045b2b993887d731c28" + integrity sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ== + dependencies: + "@babel/core" "^7.1.6" + "@babel/plugin-transform-react-constant-elements" "^7.0.0" + "@babel/preset-env" "^7.1.6" + "@babel/preset-react" "^7.0.0" + "@svgr/core" "^4.1.0" + "@svgr/plugin-jsx" "^4.1.0" + "@svgr/plugin-svgo" "^4.0.3" + loader-utils "^1.1.0" + +"@types/node@*": + version "10.12.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz#20e85651b62fd86656e57c9c9bc771ab1570bc59" + integrity sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA== + +"@types/q@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.1.tgz#48fd98c1561fe718b61733daed46ff115b496e18" + integrity sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA== + +"@types/unist@*", "@types/unist@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.2.tgz#5dc0a7f76809b7518c0df58689cd16a19bd751c6" + integrity sha512-iHI60IbyfQilNubmxsq4zqSjdynlmc2Q/QvH9kjzg9+CCYVVzq1O6tc7VBzSygIwnmOt07w80IG6HDQvjv3Liw== + +"@types/vfile-message@*": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-1.0.1.tgz#e1e9895cc6b36c462d4244e64e6d0b6eaf65355a" + integrity sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA== + dependencies: + "@types/node" "*" + "@types/unist" "*" + +"@types/vfile@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-3.0.2.tgz#19c18cd232df11ce6fa6ad80259bc86c366b09b9" + integrity sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw== + dependencies: + "@types/node" "*" + "@types/unist" "*" + "@types/vfile-message" "*" + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -1321,9 +1620,9 @@ address@1.0.3, address@^1.0.1: symbol.prototype.description "^1.0.0" ajv-errors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" - integrity sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk= + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0: version "3.2.0" @@ -1331,9 +1630,9 @@ ajv-keywords@^3.1.0: integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= ajv@^6.1.0, ajv@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" - integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== + version "6.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" + integrity sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -1348,9 +1647,9 @@ ansi-align@^2.0.0: string-width "^2.0.0" ansi-colors@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.1.tgz#9638047e4213f3428a11944a7d4b31cba0a3ff95" - integrity sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ== + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-escapes@^3.0.0: version "3.1.0" @@ -1372,6 +1671,11 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1443,9 +1747,9 @@ array-flatten@1.1.1: integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" - integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-includes@^3.0.3: version "3.0.3" @@ -1575,30 +1879,18 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.0.tgz#4264ee11fdde83e6a2fb0136e6954af6361bf0b6" - integrity sha512-gv1a1rzOyxmB2JuyXDLVNWyyUl1uelaKyxO1OP3UNWk7jAP+EhAT9rZdcDBH0C+ZEeTL56qNR4j2TjRZL68bXA== +autoprefixer@9.4.3, autoprefixer@^9.3.1: + version "9.4.3" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.3.tgz#c97384a8fd80477b78049163a91bbc725d9c41d9" + integrity sha512-/XSnzDepRkAU//xLcXA/lUWxpsBuw0WiriAHOqnxkuCtzLhaz+fL4it4gp20BQ8n5SyLzK/FOc7A0+u/rti2FQ== dependencies: - browserslist "^4.3.5" - caniuse-lite "^1.0.30000912" + browserslist "^4.3.6" + caniuse-lite "^1.0.30000921" normalize-range "^0.1.2" num2fraction "^1.2.2" postcss "^7.0.6" postcss-value-parser "^3.3.1" -autoprefixer@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.3.1.tgz#71b622174de2b783d5fd99f9ad617b7a3c78443e" - integrity sha512-DY9gOh8z3tnCbJ13JIWaeQsoYncTGdsrgCceBaQSIL4nvdrLxgbRSBPevg2XbX7u4QCSfLheSJEEIUUSlkbx6Q== - dependencies: - browserslist "^4.3.3" - caniuse-lite "^1.0.30000898" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.5" - postcss-value-parser "^3.3.1" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -1663,7 +1955,14 @@ babel-loader@8.0.4: mkdirp "^0.5.1" util.promisify "^1.0.0" -babel-plugin-macros@^2.4.2: +babel-plugin-dynamic-import-node@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz#c0adfb07d95f4a4495e9aaac6ec386c4d7c2524e" + integrity sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA== + dependencies: + object.assign "^4.1.0" + +babel-plugin-macros@2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz#21b1a2e82e2130403c5ff785cba6548e9b644b28" integrity sha512-NBVpEWN4OQ/bHnu1fyDaAaTPAjnhXCEPqr1RwqxrU7b6tZ2hypp+zX4hlNfmVGfClD5c3Sl6Hfj5TJNF5VG5aA== @@ -1671,6 +1970,14 @@ babel-plugin-macros@^2.4.2: cosmiconfig "^5.0.5" resolve "^1.8.1" +babel-plugin-macros@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.3.tgz#870345aa538d85f04b4614fea5922b55c45dd551" + integrity sha512-M8cE1Rx0zgfKYBWAS+T6ZVCLGuTKdBI5Rn3fu9q6iVdH0UjaXdmF501/VEYn7kLHCgguhGNk5JBzOn64e2xDEA== + dependencies: + cosmiconfig "^5.0.5" + resolve "^1.8.1" + babel-plugin-minify-builtins@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz#31eb82ed1a0d0efdc31312f93b6e4741ce82c36b" @@ -1745,6 +2052,11 @@ babel-plugin-minify-type-constructors@^0.4.3: dependencies: babel-helper-is-void-0 "^0.4.3" +babel-plugin-named-asset-import@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.2.3.tgz#b40ed50a848e7bb0a2a7e34d990d1f9d46fe9b38" + integrity sha512-9mx2Z9M4EGbutvXxoLV7aUBCY6ps3sqLFl094FeA2tFQzQffIh0XSsmwwQRxiSfpg3rnb5x/o46qRLxS/OzFTg== + babel-plugin-react-docgen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-2.0.0.tgz#039d90f5a1a37131c8cc3015017eecafa8d78882" @@ -1780,6 +2092,11 @@ babel-plugin-transform-property-literals@^6.9.4: dependencies: esutils "^2.0.2" +babel-plugin-transform-react-remove-prop-types@0.4.18: + version "0.4.18" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.18.tgz#85ff79d66047b34288c6f7cc986b8854ab384f8c" + integrity sha512-azed2nHo8vmOy7EY26KH+om5oOcWRs0r1U8wOmhwta+SBMMnmJ4H6yaBZRCcHBtMeWp9AVhvBTL/lpR1kEx+Xw== + babel-plugin-transform-regexp-constructors@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz#58b7775b63afcf33328fae9a5f88fbd4fb0b4965" @@ -1812,7 +2129,7 @@ babel-plugin-transform-undefined-to-void@^6.9.4: resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA= -babel-preset-minify@^0.5.0: +"babel-preset-minify@^0.5.0 || 0.6.0-alpha.5": version "0.5.0" resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.5.0.tgz#e25bb8d3590087af02b650967159a77c19bfb96b" integrity sha512-xj1s9Mon+RFubH569vrGCayA9Fm2GMsCgDRm1Jb8SgctOB7KFcrVc2o8K3YHUyMz+SWP8aea75BoS8YfsXXuiA== @@ -1841,6 +2158,31 @@ babel-preset-minify@^0.5.0: babel-plugin-transform-undefined-to-void "^6.9.4" lodash.isplainobject "^4.0.6" +babel-preset-react-app@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-6.1.0.tgz#477ae7f8557eb99ce26d179530127913b733310d" + integrity sha512-8PJ4N+acfYsjhDK4gMWkqJMVRMjDKb93D+nz7lWlNe73Jcv38FNu37i5K/dVQnFDdRYHbe1SjII+Y0mCgink9A== + dependencies: + "@babel/core" "7.1.0" + "@babel/plugin-proposal-class-properties" "7.1.0" + "@babel/plugin-proposal-decorators" "7.1.2" + "@babel/plugin-proposal-object-rest-spread" "7.0.0" + "@babel/plugin-syntax-dynamic-import" "7.0.0" + "@babel/plugin-transform-classes" "7.1.0" + "@babel/plugin-transform-destructuring" "7.0.0" + "@babel/plugin-transform-flow-strip-types" "7.0.0" + "@babel/plugin-transform-react-constant-elements" "7.0.0" + "@babel/plugin-transform-react-display-name" "7.0.0" + "@babel/plugin-transform-runtime" "7.1.0" + "@babel/preset-env" "7.1.0" + "@babel/preset-react" "7.0.0" + "@babel/preset-typescript" "7.1.0" + "@babel/runtime" "7.0.0" + babel-loader "8.0.4" + babel-plugin-dynamic-import-node "2.2.0" + babel-plugin-macros "2.4.2" + babel-plugin-transform-react-remove-prop-types "0.4.18" + babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.5.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -1849,6 +2191,11 @@ babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.23.0, babel-runtime core-js "^2.4.0" regenerator-runtime "^0.11.0" +bail@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3" + integrity sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1932,16 +2279,11 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bowser@^1.7.3: - version "1.9.4" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" - integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== - boxen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-2.0.0.tgz#46ba3953b1a3d99aaf89ad8c7104a32874934a58" @@ -2052,23 +2394,14 @@ browserslist@4.1.1: electron-to-chromium "^1.3.62" node-releases "^1.0.0-alpha.11" -browserslist@^4.1.0, browserslist@^4.3.3: - version "4.3.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.4.tgz#4477b737db6a1b07077275b24791e680d4300425" - integrity sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA== +browserslist@^4.1.0, browserslist@^4.3.4, browserslist@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.6.tgz#0f9d9081afc66b36f477c6bdf3813f784f42396a" + integrity sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw== dependencies: - caniuse-lite "^1.0.30000899" - electron-to-chromium "^1.3.82" - node-releases "^1.0.1" - -browserslist@^4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.5.tgz#1a917678acc07b55606748ea1adf9846ea8920f7" - integrity sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w== - dependencies: - caniuse-lite "^1.0.30000912" - electron-to-chromium "^1.3.86" - node-releases "^1.0.5" + caniuse-lite "^1.0.30000921" + electron-to-chromium "^1.3.92" + node-releases "^1.1.1" buffer-from@^1.0.0: version "1.1.1" @@ -2123,7 +2456,7 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" -cacache@^11.0.2, cacache@^11.2.0: +cacache@^11.0.2: version "11.3.1" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== @@ -2163,6 +2496,25 @@ call-me-maybe@^1.0.1: resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" @@ -2181,15 +2533,10 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -caniuse-lite@^1.0.30000884, caniuse-lite@^1.0.30000898, caniuse-lite@^1.0.30000899: - version "1.0.30000906" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000906.tgz#7c44e498a2504f7a5db3b4f91285bbc821157a77" - integrity sha512-ME7JFX6h0402om/nC/8Lw+q23QvPe2ust9U0ntLmkX9F2zaGwq47fZkjlyHKirFBuq1EM+T/LXBcDdW4bvkCTA== - -caniuse-lite@^1.0.30000912: - version "1.0.30000914" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000914.tgz#f802b4667c24d0255f54a95818dcf8e1aa41f624" - integrity sha512-qqj0CL1xANgg6iDOybiPTIxtsmAnfIky9mBC35qgWrnK4WwmhqfpmkDYMYgwXJ8LRZ3/2jXlCntulO8mBaAgSg== +caniuse-lite@^1.0.30000884, caniuse-lite@^1.0.30000921: + version "1.0.30000921" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000921.tgz#7a607c1623444b22351d834e093aedda3c42fbe8" + integrity sha512-Bu09ciy0lMWLgpYC77I0YGuI8eFRBPPzaSOYJK1jTI64txCphYCqnWbxJYjHABYVt/TYX/p3jNjLBR87u1Bfpw== case-sensitive-paths-webpack-plugin@^2.1.2: version "2.1.2" @@ -2201,6 +2548,11 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +ccount@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.3.tgz#f1cec43f332e2ea5a569fd46f9f5bde4e6102aff" + integrity sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw== + chalk@2.4.1, chalk@^2.0.0, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" @@ -2226,6 +2578,15 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +child-process-promise@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074" + integrity sha1-RzChHvYQ+tRQuPIjx50x172tgHQ= + dependencies: + cross-spawn "^4.0.2" + node-version "^1.0.0" + promise-polyfill "^6.0.1" + chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -2324,11 +2685,36 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@~2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -2355,9 +2741,14 @@ color-name@1.1.3: integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@^1.1.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" @@ -2366,6 +2757,13 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz#b13793131d9ea2d2431cf5b507ddec258f0ce0db" + integrity sha512-Cg90/fcK93n0ecgYTAz1jaA3zvnQ0ExlmKY1rdbyHqAx6BHxwoJc+J7HDu0iuQ7ixEs1qaa+WyQ6oeuBpYP1iA== + dependencies: + trim "0.0.1" + commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -2376,11 +2774,6 @@ commander@^2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -2517,9 +2910,9 @@ core-js@^1.0.0: integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.4.0, core-js@^2.5.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" - integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== + version "2.6.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.0.tgz#1e30793e9ee5782b307e37ffa22da0eacddd84d4" + integrity sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2536,11 +2929,12 @@ cosmiconfig@^4.0.0: parse-json "^4.0.0" require-from-string "^2.0.1" -cosmiconfig@^5.0.5: - version "5.0.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" - integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ== +cosmiconfig@^5.0.5, cosmiconfig@^5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04" + integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA== dependencies: + import-fresh "^2.0.0" is-directory "^0.3.1" js-yaml "^3.9.0" parse-json "^4.0.0" @@ -2596,6 +2990,14 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -2622,15 +3024,23 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-in-js-utils@^2.0.0: +css-loader@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" - integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.0.1.tgz#2e51a15449ab3f7195b7e1bc00a407460016a3b3" + integrity sha512-XIVwoIOzSFRVsafOKa060GJ/A70c0IP/C1oVPHEX4eHIFF39z0Jl7j8Kua1SUTiqWDupUnbY3/yQx9r7EUB35w== dependencies: - hyphenate-style-name "^1.0.2" - isobject "^3.0.1" + icss-utils "^4.0.0" + loader-utils "^1.0.2" + lodash "^4.17.11" + postcss "^7.0.6" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.2" + postcss-modules-scope "^2.0.0" + postcss-modules-values "^2.0.0" + postcss-value-parser "^3.3.0" + schema-utils "^1.0.0" -css-loader@1.0.1, css-loader@^1.0.1: +css-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe" integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw== @@ -2648,6 +3058,11 @@ css-loader@1.0.1, css-loader@^1.0.1: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" +css-select-base-adapter@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -2658,6 +3073,16 @@ css-select@^1.1.0: domutils "1.5.1" nth-check "~1.0.1" +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + css-selector-tokenizer@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" @@ -2667,7 +3092,28 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" -css-what@2.1: +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + +css-what@2.1, css-what@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== @@ -2677,6 +3123,13 @@ cssesc@^0.1.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= +csso@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -2715,6 +3168,18 @@ debug@^3.1.0, debug@^3.2.5: dependencies: ms "^2.1.1" +debug@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + decamelize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" @@ -2745,7 +3210,7 @@ default-gateway@^2.6.0: execa "^0.10.0" ip-regex "^2.1.0" -define-properties@^1.1.2: +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -2833,9 +3298,9 @@ detect-port-alt@1.1.6: debug "^2.6.0" detect-port@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.2.3.tgz#15bf49820d02deb84bfee0a74876b32d791bf610" - integrity sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug== + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== dependencies: address "^1.0.1" debug "^2.6.0" @@ -2917,9 +3382,9 @@ domain-browser@^1.1.1: integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479" - integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@~1.1.1: version "1.1.3" @@ -2948,6 +3413,14 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + dotenv-expand@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" @@ -2966,9 +3439,9 @@ dotenv@^5.0.1: integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== dotenv@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.1.0.tgz#9853b6ca98292acb7dec67a95018fa40bccff42c" - integrity sha512-/veDn2ztgRlB7gKmE3i9f6CmDIyXAy6d5nBq+whO9SLX+Zs1sXEgFLPi+aSuWqUuusMfbi84fT8j34fs1HaYUw== + version "6.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== duplexer@^0.1.1: version "0.1.1" @@ -3003,15 +3476,10 @@ ejs@^2.5.7, ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== -electron-to-chromium@^1.3.62, electron-to-chromium@^1.3.82: - version "1.3.83" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.83.tgz#74584eb0972bb6777811c5d68d988c722f5e6666" - integrity sha512-DqJoDarxq50dcHsOOlMLNoy+qQitlMNbYb6wwbE0oUw2veHdRkpNrhmngiUYKMErdJ8SJ48rpJsZTQgy5SoEAA== - -electron-to-chromium@^1.3.86: - version "1.3.88" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz#f36ab32634f49ef2b0fdc1e82e2d1cc17feb29e7" - integrity sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A== +electron-to-chromium@^1.3.62, electron-to-chromium@^1.3.92: + version "1.3.94" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.94.tgz#896dba14f6fefb431295b90543874925ee0cd46e" + integrity sha512-miQqXALb6eBD3OetCtg3UM5XTLMwHISux0l6mh14iiV5SE+qvftgOCXT9Vvp53fWaCLET4sfA/SmIMYHXkaNmw== elliptic@^6.0.0: version "6.4.1" @@ -3153,7 +3621,7 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter3@^3.0.0: +eventemitter3@^3.0.0, eventemitter3@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== @@ -3168,11 +3636,6 @@ events@1.1.1, events@1.1.x, events@^1.0.0, events@^1.1.0: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= -events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== - eventsource@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" @@ -3341,15 +3804,15 @@ fast-deep-equal@^2.0.1: integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-glob@^2.0.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.3.tgz#d09d378e9ef6b0076a0fa1ba7519d9d4d9699c28" - integrity sha512-NiX+JXjnx43RzvVFwRWfPKo4U+1BrK5pJPsHQdKMlLoFHrrGktXglQhHliSihWAq+m1z6fHk3uwGHrtRbS9vLA== + version "2.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.4.tgz#e54f4b66d378040e0e4d6a68ec36bbc5b04363c0" + integrity sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g== dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.0.1" + "@nodelib/fs.stat" "^1.1.2" glob-parent "^3.1.0" is-glob "^4.0.0" - merge2 "^1.2.1" + merge2 "^1.2.3" micromatch "^3.1.10" fast-json-stable-stringify@^2.0.0: @@ -3495,17 +3958,29 @@ flush-write-stream@^1.0.0: readable-stream "^2.0.4" follow-redirects@^1.0.0: - version "1.5.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" - integrity sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w== + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== dependencies: debug "=3.1.0" -for-in@^1.0.2: +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -3556,6 +4031,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3667,9 +4151,9 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: path-is-absolute "^1.0.0" global-modules-path@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" - integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag== + version "2.3.1" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931" + integrity sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg== global-modules@1.0.0, global-modules@^1.0.0: version "1.0.0" @@ -3700,9 +4184,9 @@ global@^4.3.2: process "~0.5.1" globals@^11.1.0: - version "11.8.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" - integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== + version "11.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" + integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg== globby@8.0.1: version "8.0.1" @@ -3764,9 +4248,9 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.2.tgz#a3891924f815c88e41c7f31112079cfef5e129e5" - integrity sha512-OFxb5MZXCUMx43X7O8LK4FKggEQx6yC5QPmOcBnYbJ9UjxEcMcrMbaR0af5HZpqeFopw2GwQRQi34ZXI7YLM5w== + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: ajv "^6.5.5" har-schema "^2.0.0" @@ -3840,13 +4324,39 @@ hash-base@^3.0.0: safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA== + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hast-util-from-parse5@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.0.tgz#a505a05766e0f96e389bfb0b1dd809eeefcef47b" + integrity sha512-A7ev5OseS/J15214cvDdcI62uwovJO2PB60Xhnq7kaxvvQRFDEccuqbkrFXU03GPBGopdPqlpQBRqIcDS/Fjbg== + dependencies: + ccount "^1.0.3" + hastscript "^5.0.0" + property-information "^5.0.0" + web-namespaces "^1.1.2" + xtend "^4.0.1" + +hast-util-parse-selector@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.1.tgz#4ddbae1ae12c124e3eb91b581d2556441766f0ab" + integrity sha512-Xyh0v+nHmQvrOqop2Jqd8gOdyQtE8sIP9IQf7mlVDqp924W4w/8Liuguk2L2qei9hARnQSG2m+wAOCxM7npJVw== + +hastscript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.0.0.tgz#fee10382c1bc4ba3f1be311521d368c047d2c43a" + integrity sha512-xJtuJ8D42Xtq5yJrnDg/KAIxl2cXBXKoiIJwmWX9XMf8113qHTGl/Bf7jEsxmENJ4w6q4Tfl8s/Y6mEZo8x8qw== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.2.0" + property-information "^5.0.1" + space-separated-tokens "^1.0.0" + hat@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/hat/-/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a" @@ -3936,9 +4446,9 @@ html-webpack-plugin@3.2.0: util.promisify "1.0.0" html-webpack-plugin@^4.0.0-beta.2: - version "4.0.0-beta.2" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.2.tgz#c3a212448ee198a17dacd06525678ee12f917420" - integrity sha512-153QgkvYPOc1X5/v1GFPcq7GTinNheGA1lMZUGRMFkwIQ4kegGna+wQ0ByJ8uNgw4u1aEg9FtsSKs4AzsYMi9g== + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz#2c53083c1151bfec20479b1f8aaf0039e77b5513" + integrity sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ== dependencies: html-minifier "^3.5.20" loader-utils "^1.1.0" @@ -4010,11 +4520,6 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -hyphenate-style-name@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b" - integrity sha1-MRYKNpMK2vH8BMYHT360FGXU7Es= - iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -4041,6 +4546,13 @@ icss-utils@^2.1.0: dependencies: postcss "^6.0.1" +icss-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.0.0.tgz#d52cf4bcdcfa1c45c2dbefb4ffdf6b00ef608098" + integrity sha512-bA/xGiwWM17qjllIs9X/y0EjsB7e0AV08F3OL8UPsoNkNRibIuu8f1eKTnQ8QO1DteKKTxTUAn+IEWUToIwGOA== + dependencies: + postcss "^7.0.5" + ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -4085,6 +4597,14 @@ import-cwd@^2.0.0: dependencies: import-from "^2.1.0" +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -4133,15 +4653,7 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inline-style-prefixer@^3.0.6: - version "3.0.8" - resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534" - integrity sha1-hVG45bTVcyROZqNLBPfTIHaitTQ= - dependencies: - bowser "^1.7.3" - css-in-js-utils "^2.0.0" - -inquirer@6.2.0, inquirer@^6.2.0: +inquirer@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== @@ -4160,6 +4672,25 @@ inquirer@6.2.0, inquirer@^6.2.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" + integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + internal-ip@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" @@ -4231,11 +4762,16 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5: +is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -4357,6 +4893,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -4463,7 +5004,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.9.0: +js-yaml@^3.12.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== @@ -4477,9 +5018,9 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" @@ -4530,6 +5071,13 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -4555,6 +5103,13 @@ killable@^1.0.0: resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + dependencies: + is-buffer "^1.0.2" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -4586,6 +5141,16 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + lazy-universal-dotenv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-2.0.0.tgz#e015ad9f77be9ef811956d53ea9519b1c0ab0214" @@ -4613,10 +5178,10 @@ less-loader@4.1.0: loader-utils "^1.1.0" pify "^3.0.0" -less@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" - integrity sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q== +less@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/less/-/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474" + integrity sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w== dependencies: clone "^2.1.2" optionalDependencies: @@ -4712,9 +5277,9 @@ lower-case@^1.1.1: integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -4732,9 +5297,9 @@ make-error@^1.3.5: integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== map-age-cleaner@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" - integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ== + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== dependencies: p-defer "^1.0.0" @@ -4759,6 +5324,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -4781,12 +5351,21 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +merge-deep@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" + integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge2@^1.2.1: +merge2@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== @@ -4846,9 +5425,9 @@ mime@^1.4.1: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.0.3, mime@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" - integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" + integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== mimic-fn@^1.0.0: version "1.2.0" @@ -4863,9 +5442,9 @@ min-document@^2.19.0: dom-walk "^0.1.0" mini-css-extract-plugin@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d" - integrity sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ== + version "0.4.5" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz#c99e9e78d54f3fa775633aee5933aeaa4e80719a" + integrity sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w== dependencies: loader-utils "^1.1.0" schema-utils "^1.0.0" @@ -4907,9 +5486,9 @@ minipass@^2.2.1, minipass@^2.3.4: yallist "^3.0.0" minizlib@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" - integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" @@ -4953,7 +5532,15 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -5001,9 +5588,9 @@ mute-stream@0.0.7: integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= nan@^2.9.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" - integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== + version "2.12.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.0.tgz#9d443fdb5e13a20770cc5e602eee59760a685885" + integrity sha512-zT5nC0JhbljmyEf+Z456nvm7iO7XgRV2hYxoBtPpnyp+0Q4aCoP6uWNn76v/I6k2kCYNLWqWbwBWQcjsNI/bjw== nanomatch@^1.2.9: version "1.2.13" @@ -5069,9 +5656,9 @@ node-fetch@^1.0.1: is-stream "^1.0.1" node-fetch@^2.1.2, node-fetch@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.1.tgz#1fe551e0ded6c45b3b3b937d0fb46f76df718d1e" - integrity sha512-ObXBpNCD3A/vYQiQtEWl7DuqjAXjfptYFuGHLdPl5U19/6kJuZV+8uMHLrkj3wJrJoyfg4nhgyFixZdaZoAiEQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== node-forge@0.7.5: version "0.7.5" @@ -5123,19 +5710,17 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.0.0-alpha.11, node-releases@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.3.tgz#3414ed84595096459c251699bfcb47d88324a9e4" - integrity sha512-ZaZWMsbuDcetpHmYeKWPO6e63pSXLb50M7lJgCbcM2nC/nQC3daNifmtp5a2kp7EWwYfhuvH6zLPWkrF8IiDdw== +node-releases@^1.0.0-alpha.11, node-releases@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.1.tgz#8fff8aea1cfcad1fb4205f805149054fbf73cafd" + integrity sha512-2UXrBr6gvaebo5TNF84C66qyJJ6r0kxBObgZIDX3D3/mt1ADKiHux3NJPWisq0wxvJJdkjECH+9IIKYViKj71Q== dependencies: semver "^5.3.0" -node-releases@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.5.tgz#a641adcc968b039a27345d92ef10b093e5cbd41d" - integrity sha512-Ky7q0BO1BBkG/rQz6PkEZ59rwo+aSfhczHP1wwq8IowoVdN/FpiP7qp0XW0P2+BVCWe5fQUBozdbVd54q1RbCQ== - dependencies: - semver "^5.3.0" +node-version@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" + integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ== nopt@^4.0.1: version "4.0.1" @@ -5187,7 +5772,7 @@ npmlog@^4.0.2, npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@~1.0.1: +nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== @@ -5223,7 +5808,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.12: +object-keys@^1.0.11, object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== @@ -5235,6 +5820,16 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.entries@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" @@ -5416,9 +6011,9 @@ p-try@^2.0.0: integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== + version "1.0.7" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" + integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== parallel-transform@^1.1.0: version "1.1.0" @@ -5460,6 +6055,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -5500,7 +6100,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -5592,9 +6192,9 @@ pkg-up@2.0.0: find-up "^2.1.0" portfinder@^1.0.9: - version "1.0.19" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.19.tgz#07e87914a55242dcda5b833d42f018d6875b595f" - integrity sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw== + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== dependencies: async "^1.5.2" debug "^2.2.0" @@ -5637,6 +6237,13 @@ postcss-modules-extract-imports@^1.2.0: dependencies: postcss "^6.0.1" +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + postcss-modules-local-by-default@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" @@ -5645,6 +6252,15 @@ postcss-modules-local-by-default@^1.2.0: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" +postcss-modules-local-by-default@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.2.tgz#edfd6a874d326b52daaa3014bfc11e9e4b0cfafc" + integrity sha512-qghHvHeydUBQ3EQic5NjYryZ5jzXzAYxHR7lZQlCNmjGpJtINRyX/ELnh/7fxBBmHNkEzNkq2l5cV6trfidYng== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^7.0.6" + postcss-value-parser "^3.3.1" + postcss-modules-scope@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" @@ -5653,6 +6269,14 @@ postcss-modules-scope@^1.1.0: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" +postcss-modules-scope@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.0.1.tgz#2c0f2394cde4cd09147db054c68917e38f6d43a4" + integrity sha512-7+6k9c3/AuZ5c596LJx9n923A/j3nF3ormewYBF1RrIQvjvjXe1xE8V8A1KFyFwXbvnshT6FBZFX0k/F1igneg== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^7.0.6" + postcss-modules-values@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" @@ -5661,6 +6285,14 @@ postcss-modules-values@^1.3.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" + postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" @@ -5675,19 +6307,10 @@ postcss@^6.0.1, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" - integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.5.0" - -postcss@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2" - integrity sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug== +postcss@^7.0.0, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.7" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.7.tgz#2754d073f77acb4ef08f1235c36c5721a7201614" + integrity sha512-HThWSJEPkupqew2fnuQMEI2YcTj/8gMV3n80cMdJsKxfIh5tHf7nM5JigNX6LxVMqo6zkgQNAI88hyFvBk41Pg== dependencies: chalk "^2.4.1" source-map "^0.6.1" @@ -5701,6 +6324,11 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + private@^0.1.6, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -5726,6 +6354,11 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise-polyfill@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.1.0.tgz#dfa96943ea9c121fca4de9b5868cb39d3472e057" + integrity sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc= + promise.prototype.finally@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" @@ -5750,6 +6383,13 @@ prop-types@15.6.2, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, loose-envify "^1.3.1" object-assign "^4.1.1" +property-information@^5.0.0, property-information@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.0.1.tgz#c3b09f4f5750b1634c0b24205adbf78f18bdf94f" + integrity sha512-nAtBDVeSwFM3Ot/YxT7s4NqZmqXI7lLzf46BThvotEtYf2uk2yH0ACYuWQkJ7gxKs49PPtKVY0UlDGkyN9aJlw== + dependencies: + xtend "^4.0.1" + proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" @@ -5769,9 +6409,9 @@ pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: - version "1.1.29" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" - integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== public-encrypt@^4.0.0: version "4.0.3" @@ -5825,11 +6465,21 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.5.2, qs@^6.5.2, qs@~6.5.2: +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@^6.5.2: + version "6.6.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" + integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -5938,15 +6588,15 @@ react-docgen@^3.0.0-rc.1: node-dir "^0.1.10" recast "^0.16.0" -react-dom@16.6.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.0.tgz#6375b8391e019a632a89a0988bce85f0cc87a92f" - integrity sha512-Stm2D9dXEUUAQdvpvhvFj/DEXwC2PAL/RwEMhoN4dvvD2ikTlJegEXf97xryg88VIAU22ZAP7n842l+9BTz6+w== +react-dom@16.6.3, react-dom@^16.6.0, react-dom@^16.6.3: + version "16.6.3" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0" + integrity sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.10.0" + scheduler "^0.11.2" react-error-overlay@^5.1.0: version "5.1.0" @@ -5964,12 +6614,13 @@ react-fuzzy@^0.5.2: prop-types "^15.5.9" react-inspector@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.3.0.tgz#fc9c1d38ab687fc0d190dcaf133ae40158968fc8" - integrity sha512-aIcbWb0fKFhEMB+RadoOYawlr1JoMMfrQ1oRgPUG/f/e4zERVJ6nYcIaQmrQmdHCZ63BOqe2cEkoeY0kyLBzNg== + version "2.3.1" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.3.1.tgz#f0eb7f520669b545b441af9d38ec6d706e5f649c" + integrity sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q== dependencies: babel-runtime "^6.26.0" is-dom "^1.0.9" + prop-types "^15.6.1" react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -5977,9 +6628,9 @@ react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-modal@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.6.1.tgz#54d27a1ec2b493bbc451c7efaa3557b6af82332d" - integrity sha512-vAhnawahH1fz8A5x/X/1X20KHMe6Q0mkfU5BKPgKSVPYhMhsxtRbNHSitsoJ7/oP27xZo3naZZlwYuuzuSO1xw== + version "3.7.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.7.1.tgz#342ed170133d0557e6c3e6fc40195bc45c8f09c3" + integrity sha512-eSgotXkqOCXi0b27AwLCoJ8yqLepKnbZdMp/zfUmZPnMNoe39pDT0mbAPq9rp+TToqM5GUTv8C36Cuja+ThbhA== dependencies: exenv "^1.2.0" prop-types "^15.5.10" @@ -6012,12 +6663,13 @@ react-router@4.3.1, react-router@^4.3.1: warning "^4.0.1" react-split-pane@^0.1.84: - version "0.1.84" - resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.84.tgz#b9c1499cbc40b09cf29953ee6f5ff1039d31906e" - integrity sha512-rso1dRAXX/WETyqF5C0fomIYzpF71Nothfr1R7pFkrJCPVJ20ok2e6wqF+JvUTyE/meiBvsbNPT1loZjyU+53w== + version "0.1.85" + resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.85.tgz#64819946a99b617ffa2d20f6f45a0056b6ee4faa" + integrity sha512-3GhaYs6+eVNrewgN4eQKJoNMQ4pcegNMTMhR5bO/NFO91K6/98qdD1sCuWPpsefCjzxNTjkvVYWQC0bMaC45mA== dependencies: - inline-style-prefixer "^3.0.6" prop-types "^15.5.10" + react "^16.6.3" + react-dom "^16.6.3" react-lifecycles-compat "^3.0.4" react-style-proptype "^3.0.0" @@ -6029,16 +6681,17 @@ react-style-proptype@^3.0.0: prop-types "^15.5.4" react-textarea-autosize@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.0.4.tgz#4e4be649b544a88713e7b5043f76950f35d3d503" - integrity sha512-1cC8pFSrIVH92aE+UKxGQ2Gqq43qdIcMscJKScEFeBNemn6gHa+NwKqdXkHxxg5H6uuvW+cPpJPTes6zh90M+A== + version "7.1.0" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz#3132cb77e65d94417558d37c0bfe415a5afd3445" + integrity sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg== dependencies: + "@babel/runtime" "^7.1.2" prop-types "^15.6.0" react-transition-group@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.0.tgz#70bca0e3546102c4dc5cf3f5f57f73447cce6874" - integrity sha512-qYB3JBF+9Y4sE4/Mg/9O6WFpdoYjeeYqx0AFb64PTazVy8RPMiE3A47CG9QmM4WJ/mzDiZYslV+Uly6O1Erlgw== + version "2.5.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.1.tgz#67fbd8d30ebb1c57a149d554dbb82eabefa61f0d" + integrity sha512-8x/CxUL9SjYFmUdzsBPTgtKeCxt7QArjNSte0wwiLtF/Ix/o1nWNJooNy5o9XbHIKS31pz7J5VF2l41TwlvbHQ== dependencies: dom-helpers "^3.3.1" loose-envify "^1.4.0" @@ -6058,15 +6711,15 @@ react-treebeard@^3.1.0: shallowequal "^1.1.0" velocity-react "^1.4.1" -react@16.6.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.6.0.tgz#b34761cfaf3e30f5508bc732fb4736730b7da246" - integrity sha512-zJPnx/jKtuOEXCbQ9BKaxDMxR0001/hzxXwYxG8septeyYGfsgAei6NgfbVgOhbY1WOP2o3VPs/E9HaN+9hV3Q== +react@16.6.3, react@^16.6.0, react@^16.6.3: + version "16.6.3" + resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c" + integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.10.0" + scheduler "^0.11.2" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" @@ -6101,9 +6754,9 @@ readdirp@^2.0.0: readable-stream "^2.0.2" recast@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.16.0.tgz#1eb1881cae1f8834b9290caa987349430d5e8526" - integrity sha512-cm2jw4gCBatvs404ZJrxmGirSgWswW+S1U3SQTPHKNqdlUMg+V3J2XAOUvdAAgD7Hg2th2nxZ4wmYUekHI2Qmg== + version "0.16.1" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.16.1.tgz#865f1800ef76e42e5d0375763b80f4d6a05f2069" + integrity sha512-ZUQm94F3AHozRaTo4Vz6yIgkSEZIL7p+BsWeGZ23rx+ZVRoqX+bvBA8br0xmCOU0DSR4qYGtV7Y5HxTsC4V78A== dependencies: ast-types "0.11.6" esprima "~4.0.0" @@ -6149,7 +6802,7 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.12.0: +regenerator-runtime@^0.12.0, regenerator-runtime@^0.12.1: version "0.12.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== @@ -6186,14 +6839,14 @@ regexpu-core@^1.0.0: regjsparser "^0.1.4" regexpu-core@^4.1.3, regexpu-core@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" - integrity sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw== + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^7.0.0" - regjsgen "^0.4.0" - regjsparser "^0.3.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.0.2" @@ -6202,10 +6855,10 @@ regjsgen@^0.2.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= -regjsgen@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" - integrity sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA== +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== regjsparser@^0.1.4: version "0.1.5" @@ -6214,13 +6867,22 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -regjsparser@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" - integrity sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA== +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" +rehype-parse@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.0.tgz#f681555f2598165bee2c778b39f9073d17b16bca" + integrity sha512-V2OjMD0xcSt39G4uRdMTqDXXm6HwkUbLMDayYKA/d037j8/OtVSQ+tqKwYWOuyBeoCs/3clXRe30VUjeMDTBSA== + dependencies: + hast-util-from-parse5 "^5.0.0" + parse5 "^5.0.0" + xtend "^4.0.1" + relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -6257,6 +6919,11 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + request@^2.83.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -6334,11 +7001,11 @@ resolve-url@^0.2.1: integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@^1.1.6, resolve@^1.3.2, resolve@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" + integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" restore-cursor@^2.0.0: version "2.0.0" @@ -6411,15 +7078,15 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.10.0.tgz#7988de90fe7edccc774ea175a783e69c40c521e1" - integrity sha512-+TSTVTCBAA3h8Anei3haDc1IRwMeDmtI/y/o3iBe3Mjl2vwYF9DtPDt929HyRmV/e7au7CLu8sc4C4W0VOs29w== +scheduler@^0.11.2: + version "0.11.3" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b" + integrity sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -6559,6 +7226,16 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -6587,9 +7264,9 @@ shell-quote@1.6.1: jsonify "~0.0.0" shelljs@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" - integrity sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ== + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -6696,7 +7373,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -6706,6 +7383,20 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +space-separated-tokens@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.2.tgz#e95ab9d19ae841e200808cd96bc7bd0adbbb3412" + integrity sha512-G3jprCEw+xFEs0ORweLmblJ3XLymGGr6hxZYTYZjIlvDti9vOBUjRQa1Rzjt012aRrocKstHwdNi+F7HguPsEA== + dependencies: + trim "0.0.1" + +spawn-promise@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/spawn-promise/-/spawn-promise-0.1.8.tgz#a5bea98814c48f52cbe02720e7fe2d6fc3b5119a" + integrity sha512-pTkEOFxvYLq9SaI1d8bwepj0yD9Yyz65+4e979YZLv/L3oYPxZpDTabcm6e+KIZniGK9mQ+LGrwB5s1v2z67nQ== + dependencies: + co "^4.6.0" + spdy-transport@^2.0.18: version "2.1.1" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.1.tgz#c54815d73858aadd06ce63001e7d25fa6441623b" @@ -6772,6 +7463,11 @@ ssri@^6.0.0: dependencies: figgy-pudding "^3.5.1" +stable@~0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -6916,11 +7612,11 @@ string-width@^1.0.1: strip-ansi "^4.0.0" string.prototype.matchall@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.0.tgz#66f4d8dd5c6c6cea4dffb55ec5f3184a8dd0dd59" - integrity sha512-/g0YW/cEfXASRHAaLR7VZbTUlxgP14fmCsfSRFG2gvlG2S1q9rBpjYnEy/EIIzY+bjzs2nTfAHJYXmQ+zTnXSQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.1.tgz#5a9e0b64bcbeb336aa4814820237c2006985646d" + integrity sha512-NSiU0ILQr9PQ1SZmM1X327U5LsM+KfDTassJfqN1al1+0iNpKzmQ4BfXOJwRnTEqv8nKJ67mFpqRoPaGWwvy5A== dependencies: - define-properties "^1.1.2" + define-properties "^1.1.3" es-abstract "^1.12.0" function-bind "^1.1.1" has-symbols "^1.0.0" @@ -6944,10 +7640,10 @@ string.prototype.padstart@^3.0.0: es-abstract "^1.4.3" function-bind "^1.0.2" -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string_decoder@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" @@ -6956,6 +7652,13 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@4.0.0, strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -6970,6 +7673,13 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" + integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== + dependencies: + ansi-regex "^4.0.0" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -7008,6 +7718,26 @@ svg-url-loader@^2.3.2: file-loader "1.1.11" loader-utils "1.1.0" +svgo@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz#12384b03335bcecd85cfa5f4e3375fed671cb985" + integrity sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g== + dependencies: + coa "~2.0.1" + colors "~1.1.2" + css-select "^2.0.0" + css-select-base-adapter "~0.1.0" + css-tree "1.0.0-alpha.28" + css-url-regex "^1.1.0" + csso "^3.5.0" + js-yaml "^3.12.0" + mkdirp "~0.5.1" + object.values "^1.0.4" + sax "~1.2.4" + stable "~0.1.6" + unquote "~1.1.1" + util.promisify "~1.0.0" + symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -7021,14 +7751,14 @@ symbol.prototype.description@^1.0.0: has-symbols "^1.0.0" tapable@^1.0.0, tapable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" - integrity sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== tar@^4: - version "4.4.7" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.7.tgz#14df45023ffdcd0c233befa2fc01ebb76ee39e7c" - integrity sha512-mR3MzsCdN0IEWjZRuF/J9gaWHnTwOvzjqPTcvi1xXgfKTDQRp39gRETPQEfPByAdEOGmZfx1HrRsn8estaEvtA== + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" @@ -7045,7 +7775,7 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -terser-webpack-plugin@1.1.0: +terser-webpack-plugin@1.1.0, terser-webpack-plugin@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== @@ -7060,9 +7790,9 @@ terser-webpack-plugin@1.1.0: worker-farm "^1.5.2" terser@^3.8.1: - version "3.10.11" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.10.11.tgz#e063da74b194dde9faf0a561f3a438c549d2da3f" - integrity sha512-iruZ7j14oBbRYJC5cP0/vTU7YOWjN+J1ZskEGoF78tFzXdkK2hbCL/3TRZN8XB+MuvFhvOHMp7WkOCBO4VEL5g== + version "3.11.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0" + integrity sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -7158,6 +7888,16 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.3.tgz#e29bd1614c6458d44869fc28b255ab7857ef7c24" + integrity sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw== + tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -7203,15 +7943,7 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglify-js@3.4.x, uglify-js@^3.0.0: +uglify-js@3.4.x: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== @@ -7219,34 +7951,6 @@ uglify-js@3.4.x, uglify-js@^3.0.0: commander "~2.17.1" source-map "~0.6.1" -uglifyjs-webpack-plugin@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.0.1.tgz#f346af53ed496ce72fef462517d417f62bec3010" - integrity sha512-1HhCHkOB6wRCcv7htcz1QRPVbWPEY074RP9vzt/X0LF4xXm9l4YGd0qja7z88abDixQlnVwBjXsTBs+Xsn/eeQ== - dependencies: - cacache "^11.2.0" - find-cache-dir "^2.0.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-js "^3.0.0" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -uglifyjs-webpack-plugin@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - underscore@1.8.x: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" @@ -7275,6 +7979,20 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== +unified@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13" + integrity sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw== + dependencies: + "@types/unist" "^2.0.0" + "@types/vfile" "^3.0.0" + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^3.0.0" + x-is-string "^0.1.0" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -7304,11 +8022,26 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" + integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -7374,7 +8107,7 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@1.0.0, util.promisify@^1.0.0: +util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -7450,6 +8183,23 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-message@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" + integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== + dependencies: + unist-util-stringify-position "^1.1.1" + +vfile@^3.0.0, vfile@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" + integrity sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ== + dependencies: + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + video-name-parser@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/video-name-parser/-/video-name-parser-1.4.6.tgz#8e7926ab2ba9253fed290b399e453d3b0702c687" @@ -7492,6 +8242,11 @@ wbuf@^1.1.0, wbuf@^1.7.2: dependencies: minimalistic-assert "^1.0.0" +web-namespaces@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.2.tgz#c8dc267ab639505276bae19e129dbd6ae72b22b4" + integrity sha512-II+n2ms4mPxK+RnIxRPOw3zwF2jRscdJIUE9BfkKHm4FYEg9+biIoTMnaZF5MpemE3T+VhMLrhbyD4ilkPCSbg== + webpack-cli@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" @@ -7578,10 +8333,10 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.25.1, webpack@^4.23.1: - version "4.25.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.25.1.tgz#4f459fbaea0f93440dc86c89f771bb3a837cfb6d" - integrity sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA== +webpack@4.27.1, webpack@^4.23.1: + version "4.27.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.27.1.tgz#5f2e2db446d2266376fa15d7d2277a1a9c2e12bb" + integrity sha512-WArHiLvHrlfyRM8i7f+2SFbr/XbQ0bXqTkPF8JpHOzub5482Y3wx7rEO8stuLGOKOgZJcqcisLhD7LrM/+fVMw== dependencies: "@webassemblyjs/ast" "1.7.11" "@webassemblyjs/helper-module-context" "1.7.11" @@ -7604,7 +8359,7 @@ webpack@4.25.1, webpack@^4.23.1: node-libs-browser "^2.0.0" schema-utils "^0.4.4" tapable "^1.1.0" - uglifyjs-webpack-plugin "^1.2.4" + terser-webpack-plugin "^1.1.0" watchpack "^1.5.0" webpack-sources "^1.3.0" @@ -7672,12 +8427,17 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +x-is-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" + integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= + xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= @@ -7693,9 +8453,9 @@ yallist@^2.1.2: integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== yargs-parser@^10.1.0: version "10.1.0" @@ -7704,7 +8464,15 @@ yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" -yargs@12.0.2, yargs@^12.0.2: +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== @@ -7721,3 +8489,21 @@ yargs@12.0.2, yargs@^12.0.2: which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" + +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" From cc83ac40cc1bd51226cd450d9025ef5a3e283e8d Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 18 Dec 2018 13:41:49 +0200 Subject: [PATCH 35/94] seekbar time/durtion labels center aligned vertical --- src/routes/Player/ControlBar/SeekBar/styles.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index 6edb6a2fc..6e88fb5a5 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -6,6 +6,7 @@ .label { font-size: calc(var(--seek-bar-thumb-size) * 0.7); color: var(--color-surfacelight); + padding-top: 0.013em; } .slider { From 1bb91b3db838745abf4e4e636463c9b44445030e Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 11:08:08 +0200 Subject: [PATCH 36/94] VolumeSlider combined with volume mute button in VolumeBar --- src/routes/Player/ControlBar/ControlBar.js | 66 +++++------ .../Player/ControlBar/VolumeBar/VolumeBar.js | 109 ++++++++++++++++++ .../Player/ControlBar/VolumeBar/index.js | 3 + .../Player/ControlBar/VolumeBar/styles.less | 15 +++ .../ControlBar/VolumeSlider/VolumeSlider.js | 74 ------------ .../Player/ControlBar/VolumeSlider/index.js | 3 - .../ControlBar/VolumeSlider/styles.less | 8 -- src/routes/Player/ControlBar/styles.less | 10 +- 8 files changed, 162 insertions(+), 126 deletions(-) create mode 100644 src/routes/Player/ControlBar/VolumeBar/VolumeBar.js create mode 100644 src/routes/Player/ControlBar/VolumeBar/index.js create mode 100644 src/routes/Player/ControlBar/VolumeBar/styles.less delete mode 100644 src/routes/Player/ControlBar/VolumeSlider/VolumeSlider.js delete mode 100644 src/routes/Player/ControlBar/VolumeSlider/index.js delete mode 100644 src/routes/Player/ControlBar/VolumeSlider/styles.less diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 8a5815f40..5691e2a39 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -1,13 +1,20 @@ -import React, { Component, Fragment } from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import Icon from 'stremio-icons/dom'; import { Popup } from 'stremio-common'; import SeekBar from './SeekBar'; -import VolumeSlider from './VolumeSlider'; +import VolumeBar from './VolumeBar'; import SubtitlesPicker from './SubtitlesPicker'; import styles from './styles'; +//TODO move this in separate file +const ControlBarButton = React.forwardRef(({ active, icon, onClick }, ref) => ( +
+ +
+)); + class ControlBar extends Component { constructor(props) { super(props); @@ -42,11 +49,15 @@ class ControlBar extends Component { this.props.setSelectedSubtitleTrackId(selectedSubtitleTrackId); } - toogleVolumeMute = () => { - this.props.volume === 0 ? this.props.unmute() : this.props.mute(); + mute = () => { + this.props.mute(); } - onPlayPauseButtonClick = () => { + unmute = () => { + this.props.unmute(); + } + + togglePaused = () => { this.props.paused ? this.props.play() : this.props.pause(); } @@ -84,32 +95,23 @@ class ControlBar extends Component { const icon = this.props.paused ? 'ic_play' : 'ic_pause'; return ( -
- -
+ ); } renderVolumeBar() { - if (this.props.volume === null) { - return null; - } - - const icon = this.props.volume === 0 ? 'ic_volume0' : - this.props.volume < 50 ? 'ic_volume1' : - this.props.volume < 100 ? 'ic_volume2' : - 'ic_volume3'; return ( - -
- -
- -
+ ); } @@ -117,9 +119,7 @@ class ControlBar extends Component { return ( -
- -
+
@@ -136,9 +136,7 @@ class ControlBar extends Component { return ( -
- -
+
this.props[propName] === null)) { - return null; - } - return (
{this.renderSeekBar()} diff --git a/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js b/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js new file mode 100644 index 000000000..51e83382f --- /dev/null +++ b/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js @@ -0,0 +1,109 @@ +import React, { Component, Fragment } from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import debounce from 'lodash.debounce'; +import { Slider } from 'stremio-common'; +import styles from './styles'; + +class VolumeBar extends Component { + constructor(props) { + super(props); + + this.state = { + volume: null + }; + } + + shouldComponentUpdate(nextProps, nextState) { + return nextState.volume !== this.state.volume || + nextProps.volume !== this.props.volume || + nextProps.className !== this.props.className; + } + + componentWillUnmount() { + this.resetVolumeDebounced.cancel(); + } + + toogleVolumeMute = () => { + this.props.volume === 0 ? this.props.unmute() : this.props.mute(); + } + + resetVolumeDebounced = debounce(() => { + this.setState({ volume: null }); + }, 100) + + onSlide = (volume) => { + this.resetVolumeDebounced.cancel(); + this.setState({ volume }); + } + + onComplete = (volume) => { + this.resetVolumeDebounced(); + this.setState({ volume }); + this.props.setVolume(volume); + } + + onCancel = () => { + this.resetVolumeDebounced.cancel(); + this.setState({ volume: null }); + } + + render() { + if (this.props.volume === null) { + return null; + } + + const volume = this.state.volume !== null ? this.state.volume : this.props.volume; + const icon = volume === 0 ? 'ic_volume0' : + volume < 30 ? 'ic_volume1' : + volume < 70 ? 'ic_volume2' : + 'ic_volume3'; + return ( +
+ {React.createElement(this.props.toggleButtonComponent, { icon, onClick: this.toogleVolumeMute }, null)} + +
+ ); + } +} + +VolumeBar.propTypes = { + className: PropTypes.string, + volume: PropTypes.number, + toggleButtonComponent: PropTypes.oneOfType([PropTypes.object, PropTypes.func]).isRequired, + setVolume: PropTypes.func.isRequired +}; + +export default VolumeBar; + + + +// if (this.props.volume === null) { +// return null; +// } + +// const icon = this.props.volume === 0 ? 'ic_volume0' : +// this.props.volume < 50 ? 'ic_volume1' : +// this.props.volume < 100 ? 'ic_volume2' : +// 'ic_volume3'; +// return ( +// +//
+// +//
+// +//
+// ); \ No newline at end of file diff --git a/src/routes/Player/ControlBar/VolumeBar/index.js b/src/routes/Player/ControlBar/VolumeBar/index.js new file mode 100644 index 000000000..ebf5bde87 --- /dev/null +++ b/src/routes/Player/ControlBar/VolumeBar/index.js @@ -0,0 +1,3 @@ +import VolumeBar from './VolumeBar'; + +export default VolumeBar; diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less new file mode 100644 index 000000000..d4b33b3d9 --- /dev/null +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -0,0 +1,15 @@ +.volume-bar-container { + display: flex; + flex-direction: row; + align-items: center; + + .slider { + --thumb-size: var(--volume-bar-thumb-size); + --track-color: var(--color-surfacelight); + --thumb-color: var(--color-surfacelight); + --thumb-active-color: var(--color-surfacelighter); + --track-active-color: var(--color-surfacelighter); + flex: 1; + margin: 0 calc(var(--volume-slider-thumb-size) * 0.5); + } +} \ No newline at end of file diff --git a/src/routes/Player/ControlBar/VolumeSlider/VolumeSlider.js b/src/routes/Player/ControlBar/VolumeSlider/VolumeSlider.js deleted file mode 100644 index 6f3b7c575..000000000 --- a/src/routes/Player/ControlBar/VolumeSlider/VolumeSlider.js +++ /dev/null @@ -1,74 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import classnames from 'classnames'; -import debounce from 'lodash.debounce'; -import { Slider } from 'stremio-common'; -import styles from './styles'; - -class VolumeSlider extends Component { - constructor(props) { - super(props); - - this.state = { - volume: null - }; - } - - shouldComponentUpdate(nextProps, nextState) { - return nextState.volume !== this.state.volume || - nextProps.volume !== this.props.volume || - nextProps.className !== this.props.className; - } - - componentWillUnmount() { - this.resetVolumeDebounced.cancel(); - } - - resetVolumeDebounced = debounce(() => { - this.setState({ volume: null }); - }, 100) - - onSlide = (volume) => { - this.resetVolumeDebounced.cancel(); - this.setState({ volume }); - } - - onComplete = (volume) => { - this.resetVolumeDebounced(); - this.setState({ volume }); - this.props.setVolume(volume); - } - - onCancel = () => { - this.resetVolumeDebounced.cancel(); - this.setState({ volume: null }); - } - - render() { - if (this.props.volume === null) { - return null; - } - - const volume = this.state.volume !== null ? this.state.volume : this.props.volume; - return ( - - ); - } -} - -VolumeSlider.propTypes = { - className: PropTypes.string, - volume: PropTypes.number, - setVolume: PropTypes.func.isRequired -}; - -export default VolumeSlider; diff --git a/src/routes/Player/ControlBar/VolumeSlider/index.js b/src/routes/Player/ControlBar/VolumeSlider/index.js deleted file mode 100644 index dbf4a9fba..000000000 --- a/src/routes/Player/ControlBar/VolumeSlider/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import VolumeSlider from './VolumeSlider'; - -export default VolumeSlider; diff --git a/src/routes/Player/ControlBar/VolumeSlider/styles.less b/src/routes/Player/ControlBar/VolumeSlider/styles.less deleted file mode 100644 index 87dd2286e..000000000 --- a/src/routes/Player/ControlBar/VolumeSlider/styles.less +++ /dev/null @@ -1,8 +0,0 @@ -.slider { - --thumb-size: var(--volume-slider-thumb-size); - --track-color: var(--color-surfacelight); - --thumb-color: var(--color-surfacelight); - --thumb-active-color: var(--color-surfacelighter); - --track-active-color: var(--color-surfacelighter); - margin: 0 calc(var(--volume-slider-thumb-size) * 0.5); -} \ No newline at end of file diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 3b983da5a..4cf6c4a8d 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -52,10 +52,10 @@ } } - .volume-slider { - --volume-slider-thumb-size: calc(var(--control-bar-button-height) * 0.3); - height: var(--volume-slider-thumb-size); - width: calc(var(--control-bar-button-height) * 3); + .volume-bar { + --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.3); + height: var(--control-bar-button-height); + width: calc(var(--control-bar-button-height) * 4); } .flex-spacing { @@ -69,7 +69,7 @@ bottom: 0; left: 0; z-index: -1; - box-shadow: 0 0 calc(var(--control-bar-button-height) * 2) calc(var(--control-bar-button-height) * 2) var(--color-backgrounddarker); + box-shadow: 0 0 calc(var(--control-bar-button-height) * 2) calc(var(--control-bar-button-height) * 2.3) var(--color-backgrounddarker); content: ""; } } From 8fbe21401683d36028a1314313fd64cc82e9b4bc Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 11:08:38 +0200 Subject: [PATCH 37/94] white list class names introdused in the build process --- webpack.config.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/webpack.config.js b/webpack.config.js index dd7c87ae3..465c9b331 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,6 +2,9 @@ const path = require('path'); const HtmlWebPackPlugin = require('html-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); +const cssUtils = require('css-loader/dist/utils'); + +const WHITE_LIST_CLASS_NAMES = ['active']; module.exports = { entry: './src/index.js', @@ -38,6 +41,12 @@ module.exports = { options: { modules: true, localIdentName: '[local]_[hash:base64:5]', + getLocalIdent: (context, localIdentName, localName, options) => { + return WHITE_LIST_CLASS_NAMES.includes(localName) ? + localName + : + cssUtils.getLocalIdent(context, localIdentName, localName, options); + }, importLoaders: 2 } }, From df5aab9ace932d4531450339248ecd01cb413d85 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 12:50:49 +0200 Subject: [PATCH 38/94] active styling removed from slider component --- src/common/Slider/Slider.js | 40 +++++-------------- src/common/Slider/styles.less | 10 ----- .../Player/ControlBar/SeekBar/SeekBar.js | 2 +- .../Player/ControlBar/SeekBar/styles.less | 5 ++- 4 files changed, 14 insertions(+), 43 deletions(-) diff --git a/src/common/Slider/Slider.js b/src/common/Slider/Slider.js index ae80f66da..cf4553a95 100644 --- a/src/common/Slider/Slider.js +++ b/src/common/Slider/Slider.js @@ -8,40 +8,18 @@ class Slider extends Component { super(props); this.orientation = props.orientation; - this.state = { - active: false - }; + this.onSlide = props.onSlide; + this.onComplete = props.onComplete; + this.onCancel = props.onCancel; } shouldComponentUpdate(nextProps, nextState) { - return nextState.active !== this.state.active || - nextProps.value !== this.props.value || + return nextProps.value !== this.props.value || nextProps.minimumValue !== this.props.minimumValue || nextProps.maximumValue !== this.props.maximumValue || nextProps.className !== this.props.className; } - onSlide = (...args) => { - this.setState({ active: true }); - if (typeof this.props.onSlide === 'function') { - this.props.onSlide(...args); - } - } - - onComplete = (...args) => { - this.setState({ active: false }); - if (typeof this.props.onComplete === 'function') { - this.props.onComplete(...args); - } - } - - onCancel = (...args) => { - this.setState({ active: false }); - if (typeof this.props.onCancel === 'function') { - this.props.onCancel(...args); - } - } - calculateSlidingValue = ({ mouseX, mouseY, sliderElement }) => { const { x: sliderX, y: sliderY, width: sliderWidth, height: sliderHeight } = sliderElement.getBoundingClientRect(); const sliderStart = this.orientation === 'horizontal' ? sliderX : sliderY; @@ -50,7 +28,7 @@ class Slider extends Component { const thumbStart = Math.min(Math.max(mouseStart - sliderStart, 0), sliderLength); const slidingValueCoef = this.orientation === 'horizontal' ? thumbStart / sliderLength : (sliderLength - thumbStart) / sliderLength; const slidingValue = slidingValueCoef * (this.props.maximumValue - this.props.minimumValue) + this.props.minimumValue; - return Math.floor(slidingValue); + return slidingValue; } onStartSliding = ({ currentTarget: sliderElement, clientX: mouseX, clientY: mouseY, button }) => { @@ -91,7 +69,7 @@ class Slider extends Component { const thumbStartProp = this.orientation === 'horizontal' ? 'left' : 'bottom'; const thumbStart = Math.min((this.props.value - this.props.minimumValue) / (this.props.maximumValue - this.props.minimumValue), 1); return ( -
+
@@ -105,9 +83,9 @@ Slider.propTypes = { minimumValue: PropTypes.number.isRequired, maximumValue: PropTypes.number.isRequired, orientation: PropTypes.oneOf(['horizontal', 'vertical']).isRequired, - onSlide: PropTypes.func, - onComplete: PropTypes.func, - onCancel: PropTypes.func + onSlide: PropTypes.func.isRequired, + onComplete: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired }; Slider.defaultProps = { value: 0, diff --git a/src/common/Slider/styles.less b/src/common/Slider/styles.less index e15296a5a..e13842a9d 100644 --- a/src/common/Slider/styles.less +++ b/src/common/Slider/styles.less @@ -52,14 +52,4 @@ margin-top: calc(0.5 * var(--thumb-size)); } } - - &:hover, &.active { - .track { - background-color: var(--track-active-color, var(--track-color)); - } - - .thumb::after { - background-color: var(--thumb-active-color, var(--thumb-color)); - } - } } \ No newline at end of file diff --git a/src/routes/Player/ControlBar/SeekBar/SeekBar.js b/src/routes/Player/ControlBar/SeekBar/SeekBar.js index be1b048af..a6a4ab5c6 100644 --- a/src/routes/Player/ControlBar/SeekBar/SeekBar.js +++ b/src/routes/Player/ControlBar/SeekBar/SeekBar.js @@ -99,7 +99,7 @@ class SeekBar extends Component { } return ( -
+
{this.renderTimeLabel()} {this.renderSlider()} {this.renderDurationLabel()} diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index 6e88fb5a5..806bff3f9 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -13,7 +13,6 @@ --thumb-size: var(--seek-bar-thumb-size); --track-color: var(--color-primarydark); --thumb-color: var(--color-primary); - --thumb-active-color: var(--color-primarylight); flex: 1; margin: 0 var(--seek-bar-thumb-size); } @@ -22,5 +21,9 @@ .label { color: var(--color-surfacelighter); } + + .slider { + --thumb-color: var(--color-primarylight); + } } } \ No newline at end of file From 3966b8094b4a6e5cd623697608691ffd93b79af4 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 17:01:01 +0200 Subject: [PATCH 39/94] slider component uses css transform again --- src/common/Slider/styles.less | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/common/Slider/styles.less b/src/common/Slider/styles.less index e13842a9d..0f8da9887 100644 --- a/src/common/Slider/styles.less +++ b/src/common/Slider/styles.less @@ -1,4 +1,5 @@ .slider-container { + display: inline-block; position: relative; z-index: 0; min-width: var(--thumb-size); @@ -16,15 +17,8 @@ z-index: 2; width: var(--thumb-size); height: var(--thumb-size); - - &::after { - display: block; - width: var(--thumb-size); - height: var(--thumb-size); - border-radius: 50%; - background-color: var(--thumb-color); - content: ""; - } + border-radius: 50%; + background-color: var(--thumb-color); } &.horizontal { @@ -35,8 +29,8 @@ bottom: 40%; } - .thumb::after { - margin-left: calc(-0.5 * var(--thumb-size)); + .thumb { + transform: translateX(-50%); } } @@ -48,8 +42,8 @@ bottom: 0; } - .thumb::after { - margin-top: calc(0.5 * var(--thumb-size)); + .thumb { + transform: translateY(50%); } } } \ No newline at end of file From 2b6b45fdfb6438d797f44aaf6985fbd3b0b351f5 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 17:01:38 +0200 Subject: [PATCH 40/94] fix error handling in HTMLVideo --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 327b61d74..ebd78d820 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -94,7 +94,7 @@ var HTMLVideo = function(container) { critical: critical }); - if (error.critical) { + if (critical) { self.dispatch('command', 'stop'); } }; From 623bae479423cfd57120d7d87b57cf0996465015 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 17:24:12 +0200 Subject: [PATCH 41/94] volume bar styles updated --- .../Player/ControlBar/VolumeBar/VolumeBar.js | 31 +++---------------- .../Player/ControlBar/VolumeBar/styles.less | 10 ++++-- src/routes/Player/ControlBar/styles.less | 11 +++++-- 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js b/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js index 51e83382f..d12a14248 100644 --- a/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js +++ b/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js @@ -1,4 +1,4 @@ -import React, { Component, Fragment } from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import debounce from 'lodash.debounce'; @@ -59,7 +59,7 @@ class VolumeBar extends Component { volume < 70 ? 'ic_volume2' : 'ic_volume3'; return ( -
+
{React.createElement(this.props.toggleButtonComponent, { icon, onClick: this.toogleVolumeMute }, null)} -//
-// -//
-// -// -// ); \ No newline at end of file diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less index d4b33b3d9..2e73079dd 100644 --- a/src/routes/Player/ControlBar/VolumeBar/styles.less +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -7,9 +7,13 @@ --thumb-size: var(--volume-bar-thumb-size); --track-color: var(--color-surfacelight); --thumb-color: var(--color-surfacelight); - --thumb-active-color: var(--color-surfacelighter); - --track-active-color: var(--color-surfacelighter); flex: 1; - margin: 0 calc(var(--volume-slider-thumb-size) * 0.5); + } + + &:hover, &.active { + .slider { + --track-color: var(--color-surfacelighter); + --thumb-color: var(--color-surfacelighter); + } } } \ No newline at end of file diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 4cf6c4a8d..277cc172d 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -7,17 +7,16 @@ display: flex; flex-direction: column; justify-content: flex-end; + align-items: stretch; overflow: hidden; .seek-bar { --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.4); height: var(--seek-bar-thumb-size); - width: 100%; } .control-bar-buttons-container { height: var(--control-bar-button-height); - width: 100%; display: flex; flex-direction: row; align-items: center; @@ -56,6 +55,14 @@ --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.3); height: var(--control-bar-button-height); width: calc(var(--control-bar-button-height) * 4); + + &:hover, &.active { + .control-bar-button { + .icon { + fill: var(--color-surfacelighter); + } + } + } } .flex-spacing { From e7e6732aa310e6d33a62eedcbd89d87b89adcfac Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 17:25:46 +0200 Subject: [PATCH 42/94] not use one time binding for slider's callbacks --- src/common/Slider/Slider.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/common/Slider/Slider.js b/src/common/Slider/Slider.js index cf4553a95..bfa65cda0 100644 --- a/src/common/Slider/Slider.js +++ b/src/common/Slider/Slider.js @@ -8,9 +8,6 @@ class Slider extends Component { super(props); this.orientation = props.orientation; - this.onSlide = props.onSlide; - this.onComplete = props.onComplete; - this.onCancel = props.onCancel; } shouldComponentUpdate(nextProps, nextState) { @@ -20,6 +17,18 @@ class Slider extends Component { nextProps.className !== this.props.className; } + onSlide = (value) => { + this.props.onSlide(value); + } + + onComplete = (value) => { + this.props.onComplete(value); + } + + onCancel = () => { + this.props.onCancel(); + } + calculateSlidingValue = ({ mouseX, mouseY, sliderElement }) => { const { x: sliderX, y: sliderY, width: sliderWidth, height: sliderHeight } = sliderElement.getBoundingClientRect(); const sliderStart = this.orientation === 'horizontal' ? sliderX : sliderY; From 848a756b05c3a770caed876678c3e232bc65a477 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 17:48:03 +0200 Subject: [PATCH 43/94] horizontal margin added to volume slider --- src/routes/Player/ControlBar/VolumeBar/styles.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less index 2e73079dd..1a4b35c12 100644 --- a/src/routes/Player/ControlBar/VolumeBar/styles.less +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -8,6 +8,7 @@ --track-color: var(--color-surfacelight); --thumb-color: var(--color-surfacelight); flex: 1; + margin: 0 calc(var(--volume-bar-thumb-size) * 0.5); } &:hover, &.active { From 0264d2feab820192ed12f38adc15f13ae43e2dc6 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 17:48:21 +0200 Subject: [PATCH 44/94] slider styles updated to not depend on width and height --- src/common/Slider/styles.less | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/Slider/styles.less b/src/common/Slider/styles.less index 0f8da9887..62d9602ee 100644 --- a/src/common/Slider/styles.less +++ b/src/common/Slider/styles.less @@ -25,25 +25,27 @@ .track { left: 0; right: 0; - top: 40%; - bottom: 40%; + top: calc(50% - var(--thumb-size) * 0.1); + bottom: calc(50% - var(--thumb-size) * 0.1); } .thumb { transform: translateX(-50%); + top: calc(50% - var(--thumb-size) * 0.5); } } &.vertical { .track { - left: 40%; - right: 40%; + left: calc(50% - var(--thumb-size) * 0.1); + right: calc(50% - var(--thumb-size) * 0.1); top: 0; bottom: 0; } .thumb { transform: translateY(50%); + left: calc(50% - var(--thumb-size) * 0.5); } } } \ No newline at end of file From 9a15393509c5f5ef035981ee6ac3169add7aa00b Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 18:18:43 +0200 Subject: [PATCH 45/94] track-size variable introduces for Slider component --- src/common/Slider/styles.less | 16 +++++++--------- src/routes/Player/ControlBar/SeekBar/styles.less | 2 ++ .../Player/ControlBar/VolumeBar/styles.less | 2 ++ src/routes/Player/ControlBar/styles.less | 3 ++- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/common/Slider/styles.less b/src/common/Slider/styles.less index 62d9602ee..e5b7cf06a 100644 --- a/src/common/Slider/styles.less +++ b/src/common/Slider/styles.less @@ -2,8 +2,6 @@ display: inline-block; position: relative; z-index: 0; - min-width: var(--thumb-size); - min-height: var(--thumb-size); cursor: pointer; .track { @@ -23,29 +21,29 @@ &.horizontal { .track { - left: 0; + top: calc(50% - var(--track-size) * 0.5); right: 0; - top: calc(50% - var(--thumb-size) * 0.1); - bottom: calc(50% - var(--thumb-size) * 0.1); + left: 0; + height: var(--track-size); } .thumb { - transform: translateX(-50%); top: calc(50% - var(--thumb-size) * 0.5); + transform: translateX(-50%); } } &.vertical { .track { - left: calc(50% - var(--thumb-size) * 0.1); - right: calc(50% - var(--thumb-size) * 0.1); top: 0; bottom: 0; + left: calc(50% - var(--track-size) * 0.1); + width: var(--track-size); } .thumb { - transform: translateY(50%); left: calc(50% - var(--thumb-size) * 0.5); + transform: translateY(50%); } } } \ No newline at end of file diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index 806bff3f9..d9ec6b303 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -11,9 +11,11 @@ .slider { --thumb-size: var(--seek-bar-thumb-size); + --track-size: var(--seek-bar-track-size); --track-color: var(--color-primarydark); --thumb-color: var(--color-primary); flex: 1; + align-self: stretch; margin: 0 var(--seek-bar-thumb-size); } diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less index 1a4b35c12..c4d5a8bb7 100644 --- a/src/routes/Player/ControlBar/VolumeBar/styles.less +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -5,9 +5,11 @@ .slider { --thumb-size: var(--volume-bar-thumb-size); + --track-size: var(--volume-bar-track-size); --track-color: var(--color-surfacelight); --thumb-color: var(--color-surfacelight); flex: 1; + align-self: stretch; margin: 0 calc(var(--volume-bar-thumb-size) * 0.5); } diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 277cc172d..4320b796b 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -12,6 +12,7 @@ .seek-bar { --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.4); + --seek-bar-track-size: calc(var(--control-bar-button-height) * 0.08); height: var(--seek-bar-thumb-size); } @@ -52,7 +53,7 @@ } .volume-bar { - --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.3); + --volume-bar-track-size: calc(var(--control-bar-button-height) * 0.06); height: var(--control-bar-button-height); width: calc(var(--control-bar-button-height) * 4); From 30bfbafb15eceb52da3da7d214edb60009967543 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 18:59:29 +0200 Subject: [PATCH 46/94] track-before introduced into Slider component --- src/common/Slider/Slider.js | 2 ++ src/common/Slider/styles.less | 20 ++++++++++++++++++- .../Player/ControlBar/VolumeBar/styles.less | 5 +---- src/routes/Player/ControlBar/styles.less | 2 +- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/common/Slider/Slider.js b/src/common/Slider/Slider.js index bfa65cda0..5e403064b 100644 --- a/src/common/Slider/Slider.js +++ b/src/common/Slider/Slider.js @@ -76,10 +76,12 @@ class Slider extends Component { render() { const thumbStartProp = this.orientation === 'horizontal' ? 'left' : 'bottom'; + const trackBeforeSizeProp = this.orientation === 'horizontal' ? 'width' : 'height'; const thumbStart = Math.min((this.props.value - this.props.minimumValue) / (this.props.maximumValue - this.props.minimumValue), 1); return (
+
); diff --git a/src/common/Slider/styles.less b/src/common/Slider/styles.less index e5b7cf06a..2e3acbf2a 100644 --- a/src/common/Slider/styles.less +++ b/src/common/Slider/styles.less @@ -10,9 +10,15 @@ background-color: var(--track-color); } - .thumb { + .track-before { position: absolute; z-index: 2; + background-color: var(--track-before-color); + } + + .thumb { + position: absolute; + z-index: 3; width: var(--thumb-size); height: var(--thumb-size); border-radius: 50%; @@ -27,6 +33,12 @@ height: var(--track-size); } + .track-before { + top: calc(50% - var(--track-size) * 0.5); + left: 0; + height: var(--track-size); + } + .thumb { top: calc(50% - var(--thumb-size) * 0.5); transform: translateX(-50%); @@ -41,6 +53,12 @@ width: var(--track-size); } + .track-before { + bottom: 0; + left: calc(50% - var(--track-size) * 0.1); + width: var(--track-size); + } + .thumb { left: calc(50% - var(--thumb-size) * 0.5); transform: translateY(50%); diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less index c4d5a8bb7..bbce9d4e0 100644 --- a/src/routes/Player/ControlBar/VolumeBar/styles.less +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -4,19 +4,16 @@ align-items: center; .slider { - --thumb-size: var(--volume-bar-thumb-size); --track-size: var(--volume-bar-track-size); --track-color: var(--color-surfacelight); - --thumb-color: var(--color-surfacelight); + --track-before-color: var(--color-primary); flex: 1; align-self: stretch; - margin: 0 calc(var(--volume-bar-thumb-size) * 0.5); } &:hover, &.active { .slider { --track-color: var(--color-surfacelighter); - --thumb-color: var(--color-surfacelighter); } } } \ No newline at end of file diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 4320b796b..d9d09b4e2 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -53,7 +53,7 @@ } .volume-bar { - --volume-bar-track-size: calc(var(--control-bar-button-height) * 0.06); + --volume-bar-track-size: calc(var(--control-bar-button-height) * 0.08); height: var(--control-bar-button-height); width: calc(var(--control-bar-button-height) * 4); From 8c09028df8492fe2576ba7c365a5de891066cbc6 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 20:16:44 +0200 Subject: [PATCH 47/94] track size of sliders in player set to 20% --- src/routes/Player/ControlBar/SeekBar/styles.less | 2 +- src/routes/Player/ControlBar/VolumeBar/styles.less | 6 ++++-- src/routes/Player/ControlBar/styles.less | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index d9ec6b303..57dabb6b5 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -11,7 +11,7 @@ .slider { --thumb-size: var(--seek-bar-thumb-size); - --track-size: var(--seek-bar-track-size); + --track-size: calc(var(--seek-bar-thumb-size) * 0.2); --track-color: var(--color-primarydark); --thumb-color: var(--color-primary); flex: 1; diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less index bbce9d4e0..4969315ee 100644 --- a/src/routes/Player/ControlBar/VolumeBar/styles.less +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -4,15 +4,17 @@ align-items: center; .slider { - --track-size: var(--volume-bar-track-size); + --thumb-size: var(--volume-bar-thumb-size); + --track-size: calc(var(--volume-bar-thumb-size) * 0.2); + --thumb-color: var(--color-surfacelight); --track-color: var(--color-surfacelight); - --track-before-color: var(--color-primary); flex: 1; align-self: stretch; } &:hover, &.active { .slider { + --thumb-color: var(--color-surfacelighter); --track-color: var(--color-surfacelighter); } } diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index d9d09b4e2..277cc172d 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -12,7 +12,6 @@ .seek-bar { --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.4); - --seek-bar-track-size: calc(var(--control-bar-button-height) * 0.08); height: var(--seek-bar-thumb-size); } @@ -53,7 +52,7 @@ } .volume-bar { - --volume-bar-track-size: calc(var(--control-bar-button-height) * 0.08); + --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.3); height: var(--control-bar-button-height); width: calc(var(--control-bar-button-height) * 4); From 51448189afbd0dcec0d8eea1c300a9b385860c48 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 20:19:02 +0200 Subject: [PATCH 48/94] slider sizes in Player increased --- src/routes/Player/ControlBar/styles.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 277cc172d..6086fc405 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -11,7 +11,7 @@ overflow: hidden; .seek-bar { - --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.4); + --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.5); height: var(--seek-bar-thumb-size); } @@ -52,7 +52,7 @@ } .volume-bar { - --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.3); + --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.4); height: var(--control-bar-button-height); width: calc(var(--control-bar-button-height) * 4); From 5f6623d066aea42ceae5c15a24ff2d3f9e6b0cce Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 19 Dec 2018 21:56:54 +0200 Subject: [PATCH 49/94] control bar height fixed to avoid ovelap other clickable components --- src/routes/Player/ControlBar/styles.less | 2 +- src/routes/Player/styles.less | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 6086fc405..bcc4ce1bb 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -3,12 +3,12 @@ } .control-bar-container { + top: initial !important; padding: 0 calc(var(--control-bar-button-height) * 0.4); display: flex; flex-direction: column; justify-content: flex-end; align-items: stretch; - overflow: hidden; .seek-bar { --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.5); diff --git a/src/routes/Player/styles.less b/src/routes/Player/styles.less index bb3a7af63..e8790b974 100644 --- a/src/routes/Player/styles.less +++ b/src/routes/Player/styles.less @@ -1,8 +1,9 @@ .player-container { position: relative; + z-index: 0; width: 100%; height: 100%; - z-index: 0; + overflow: hidden; .layer { position: absolute; From 53018e41016305520bed01208d3fb2d72dc63937 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Thu, 20 Dec 2018 16:05:21 +0200 Subject: [PATCH 50/94] vertical align of time labels dropped --- src/routes/Player/ControlBar/SeekBar/styles.less | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index 57dabb6b5..199d3432d 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -6,7 +6,6 @@ .label { font-size: calc(var(--seek-bar-thumb-size) * 0.7); color: var(--color-surfacelight); - padding-top: 0.013em; } .slider { From 82c2001ec60423ab48e1485972e7257127a74168 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 21 Dec 2018 12:21:36 +0200 Subject: [PATCH 51/94] styler styles in player updated --- src/routes/Player/ControlBar/SeekBar/styles.less | 12 +++++++----- src/routes/Player/ControlBar/VolumeBar/styles.less | 10 ++++++---- src/routes/Player/ControlBar/styles.less | 11 +++++++---- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index 199d3432d..73c15f89f 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -4,15 +4,16 @@ align-items: center; .label { - font-size: calc(var(--seek-bar-thumb-size) * 0.7); + font-size: var(--seek-bar-font-size); color: var(--color-surfacelight); } .slider { --thumb-size: var(--seek-bar-thumb-size); - --track-size: calc(var(--seek-bar-thumb-size) * 0.2); - --track-color: var(--color-primarydark); - --thumb-color: var(--color-primary); + --track-size: var(--seek-bar-track-size); + --track-before-color: var(--color-primary); + --track-color: var(--color-backgroundlighter); + --thumb-color: transparent; flex: 1; align-self: stretch; margin: 0 var(--seek-bar-thumb-size); @@ -24,7 +25,8 @@ } .slider { - --thumb-color: var(--color-primarylight); + --track-before-color: var(--color-primarylight); + --thumb-color: var(--color-surfacelighter); } } } \ No newline at end of file diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less index 4969315ee..e47a17ba4 100644 --- a/src/routes/Player/ControlBar/VolumeBar/styles.less +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -5,17 +5,19 @@ .slider { --thumb-size: var(--volume-bar-thumb-size); - --track-size: calc(var(--volume-bar-thumb-size) * 0.2); - --thumb-color: var(--color-surfacelight); - --track-color: var(--color-surfacelight); + --track-size: var(--volume-bar-track-size); + --track-before-color: var(--color-primary); + --track-color: var(--color-backgroundlighter); + --thumb-color: transparent; flex: 1; align-self: stretch; + margin: 0 calc(var(--volume-bar-thumb-size) / 2); } &:hover, &.active { .slider { + --track-before-color: var(--color-primarylight); --thumb-color: var(--color-surfacelighter); - --track-color: var(--color-surfacelighter); } } } \ No newline at end of file diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index bcc4ce1bb..30bf655b5 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -11,8 +11,10 @@ align-items: stretch; .seek-bar { - --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.5); - height: var(--seek-bar-thumb-size); + --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.40); + --seek-bar-track-size: calc(var(--control-bar-button-height) * 0.12); + --seek-bar-font-size: calc(var(--control-bar-button-height) * 0.35); + height: calc(var(--control-bar-button-height) * 0.6); } .control-bar-buttons-container { @@ -52,9 +54,10 @@ } .volume-bar { - --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.4); + --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.36); + --volume-bar-track-size: calc(var(--control-bar-button-height) * 0.10); height: var(--control-bar-button-height); - width: calc(var(--control-bar-button-height) * 4); + width: calc(var(--control-bar-button-height) * 5); &:hover, &.active { .control-bar-button { From 44b641e1b053c92a6ad914fbd443f379379886fb Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 21 Dec 2018 12:26:22 +0200 Subject: [PATCH 52/94] using global function of less preprocessor instead of a custom filter of white listed classes --- src/routes/Player/ControlBar/ControlBar.js | 2 +- src/routes/Player/ControlBar/SeekBar/styles.less | 2 +- src/routes/Player/ControlBar/VolumeBar/styles.less | 2 +- src/routes/Player/ControlBar/styles.less | 4 ++-- webpack.config.js | 9 --------- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 5691e2a39..646be59a5 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -10,7 +10,7 @@ import styles from './styles'; //TODO move this in separate file const ControlBarButton = React.forwardRef(({ active, icon, onClick }, ref) => ( -
+
)); diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index 73c15f89f..6e82c158f 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -19,7 +19,7 @@ margin: 0 var(--seek-bar-thumb-size); } - &:hover, &.active { + &:hover, &:global(.active) { .label { color: var(--color-surfacelighter); } diff --git a/src/routes/Player/ControlBar/VolumeBar/styles.less b/src/routes/Player/ControlBar/VolumeBar/styles.less index e47a17ba4..d58473c16 100644 --- a/src/routes/Player/ControlBar/VolumeBar/styles.less +++ b/src/routes/Player/ControlBar/VolumeBar/styles.less @@ -14,7 +14,7 @@ margin: 0 calc(var(--volume-bar-thumb-size) / 2); } - &:hover, &.active { + &:hover, &:global(.active) { .slider { --track-before-color: var(--color-primarylight); --thumb-color: var(--color-surfacelighter); diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 30bf655b5..31c354587 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -38,7 +38,7 @@ overflow: visible; } - &.active { + &:global(.active) { background-color: var(--color-backgrounddarker); .icon { @@ -59,7 +59,7 @@ height: var(--control-bar-button-height); width: calc(var(--control-bar-button-height) * 5); - &:hover, &.active { + &:hover, &:global(.active) { .control-bar-button { .icon { fill: var(--color-surfacelighter); diff --git a/webpack.config.js b/webpack.config.js index 465c9b331..dd7c87ae3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,9 +2,6 @@ const path = require('path'); const HtmlWebPackPlugin = require('html-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); -const cssUtils = require('css-loader/dist/utils'); - -const WHITE_LIST_CLASS_NAMES = ['active']; module.exports = { entry: './src/index.js', @@ -41,12 +38,6 @@ module.exports = { options: { modules: true, localIdentName: '[local]_[hash:base64:5]', - getLocalIdent: (context, localIdentName, localName, options) => { - return WHITE_LIST_CLASS_NAMES.includes(localName) ? - localName - : - cssUtils.getLocalIdent(context, localIdentName, localName, options); - }, importLoaders: 2 } }, From a0365d3f9ed6ed60cf26dcb2fabb0424e782f7be Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 21 Dec 2018 12:26:38 +0200 Subject: [PATCH 53/94] vtt.js installed --- package.json | 5 +++-- yarn.lock | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index cc8db0ae6..a0be620d9 100755 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "stremio-json-data": "git+ssh://git@github.com/stremio/stremio-json-data.git#v1.2.3", "stremio-models": "git+ssh://git@github.com/stremio/stremio-models.git#v1.51.5", "stremio-official-addons": "git+ssh://git@github.com/Stremio/stremio-official-addons.git#v1.1.1", - "stremio-translations": "git+ssh://git@github.com/Stremio/stremio-translations.git#v1.41.0" + "stremio-translations": "git+ssh://git@github.com/Stremio/stremio-translations.git#v1.41.0", + "vtt.js": "0.13.0" }, "devDependencies": { "@babel/core": "7.2.2", @@ -57,4 +58,4 @@ "webpack-cli": "3.1.2", "webpack-dev-server": "3.1.10" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index a9bb86fd2..9a17f123d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8212,6 +8212,11 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +vtt.js@0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/vtt.js/-/vtt.js-0.13.0.tgz#955c667b34d5325b2012cb9e8ba9bad6e0b11ff8" + integrity sha1-lVxmezTVMlsgEsuei6m61uCxH/g= + warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" From d9ada6d5c0ef605856ec03dc48b85ada921e09a6 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 21 Dec 2018 17:01:30 +0200 Subject: [PATCH 54/94] measure border fixed in Popup --- src/common/Popup/Popup.js | 4 +++- src/common/Popup/styles.less | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/common/Popup/Popup.js b/src/common/Popup/Popup.js index ab034daa4..c054a3ee8 100644 --- a/src/common/Popup/Popup.js +++ b/src/common/Popup/Popup.js @@ -10,6 +10,7 @@ class Popup extends Component { constructor(props) { super(props); + this.hiddenBorderRef = React.createRef(); this.labelRef = React.createRef(); this.labelBorderTopRef = React.createRef(); this.labelBorderRightRef = React.createRef(); @@ -60,7 +61,7 @@ class Popup extends Component { const bodyRect = document.body.getBoundingClientRect(); const menuRect = this.menuRef.current.getBoundingClientRect(); const labelRect = this.labelRef.current.getBoundingClientRect(); - const borderWidth = 1 / window.devicePixelRatio; + const borderWidth = parseFloat(window.getComputedStyle(this.hiddenBorderRef.current).getPropertyValue('border-top-width')); const labelPosition = { left: labelRect.x - bodyRect.x, top: labelRect.y - bodyRect.y, @@ -185,6 +186,7 @@ class Popup extends Component {
+
diff --git a/src/common/Popup/styles.less b/src/common/Popup/styles.less index 39ee5bfbb..9dbd79d5f 100644 --- a/src/common/Popup/styles.less +++ b/src/common/Popup/styles.less @@ -35,4 +35,9 @@ right: 0; bottom: 0; } +} + +.hidden-border { + display: none; + border: 1px solid; } \ No newline at end of file From 9251f6f70fe1d9dae1286ebfc6cfce803612af4d Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 28 Dec 2018 15:07:46 +0200 Subject: [PATCH 55/94] basic cuesForTime util func implemented --- .../Video/stremio-video/utils/cuesForTime.js | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/routes/Player/Video/stremio-video/utils/cuesForTime.js diff --git a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js new file mode 100644 index 000000000..88404fde4 --- /dev/null +++ b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js @@ -0,0 +1,39 @@ +module.exports = function(cues, time) { + var cuesForTime = []; + var middleCueIndex = -1; + var left = 0; + var right = cues.length - 1; + while (left <= right) { + var middle = Math.floor((left + right) / 2); + if (cues[middle].endTime < time) { + left = middle + 1; + } else if (cues[middle].startTime > time) { + right = middle - 1; + } else { + middleCueIndex = middle; + break; + } + } + + if (middleCueIndex !== -1) { + cuesForTime.push(cues[middleCueIndex]); + for (var i = cueIndex - 1; i >= 0; i--) { + if (cues[i].startTime > time || cues[i].endTime < time) { + break; + } + + cuesForTime.push(cues[i]); + } + + for (var i = cueIndex + 1; i < cues.length; i++) { + if (cues[i].startTime > time || cues[i].endTime < time) { + break; + } + + cuesForTime.push(cues[i]); + } + } + + return cuesForTime; +}; +//TODO sort the result \ No newline at end of file From 87a82497770bda6f2f778358585a261d8c5d7d1c Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 28 Dec 2018 15:31:51 +0200 Subject: [PATCH 56/94] fetch cues on change track id --- .../Player/Video/stremio-video/HTMLVideo.js | 31 +++++++++- .../Video/stremio-video/utils/fetchCues.js | 58 +++++++++++++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/routes/Player/Video/stremio-video/utils/fetchCues.js diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index ebd78d820..9f1d29d45 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -1,4 +1,6 @@ var EventEmitter = require('events'); +var cuesForTime = require('./utils/cuesForTime'); +var fetchCues = require('./utils/fetchCues'); var HTMLVideo = function(container) { if (!(container instanceof HTMLElement)) { @@ -10,6 +12,7 @@ var HTMLVideo = function(container) { var loaded = false; var destroyed = false; var dispatchArgsQueue = []; + var subtitleCues = []; var subtitleTracks = []; var selectedSubtitleTrackId = null; var styles = document.createElement('style'); @@ -22,6 +25,9 @@ var HTMLVideo = function(container) { video.crossOrigin = 'anonymous'; video.controls = false; + function onSubtitlesCuesChanged() { + + } function getPaused() { if (!loaded) { return null; @@ -195,7 +201,27 @@ var HTMLVideo = function(container) { break; } } - selectedSubtitleTrackId = subtitleTrack ? subtitleTrack.id : null; + + if (subtitleTrack) { + selectedSubtitleTrackId = subtitleTrack.id; + fetchCues(subtitleTrack.url) + .then(function(cues) { + if (selectedSubtitleTrackId === subtitleTrack.id) { + subtitleCues = cues; + } + }) + .catch(function() { + events.emit('error', { + code: 68, + message: 'Failed to fetch subtitles from ' + subtitleTrack.origin, + critical: false + }); + }); + } else { + selectedSubtitleTrackId = null; + subtitleCues = []; + } + onSelectedSubtitleTrackIdChanged(); } break; @@ -250,11 +276,11 @@ var HTMLVideo = function(container) { case 'stop': video.removeEventListener('ended', onEnded); video.removeEventListener('error', onError); + video.removeEventListener('timeupdate', onSubtitlesCuesChanged); loaded = false; dispatchArgsQueue = []; subtitleTracks = []; selectedSubtitleTrackId = null; - while (video.hasChildNodes()) video.removeChild(video.lastChild); video.removeAttribute('src'); video.load(); video.currentTime = 0; @@ -270,6 +296,7 @@ var HTMLVideo = function(container) { dispatchArgsQueue = dispatchArgsQueueCopy; video.addEventListener('ended', onEnded); video.addEventListener('error', onError); + video.addEventListener('timeupdate', onSubtitlesCuesChanged); video.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; video.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; video.src = arguments[2].url; diff --git a/src/routes/Player/Video/stremio-video/utils/fetchCues.js b/src/routes/Player/Video/stremio-video/utils/fetchCues.js new file mode 100644 index 000000000..a0766147b --- /dev/null +++ b/src/routes/Player/Video/stremio-video/utils/fetchCues.js @@ -0,0 +1,58 @@ +var VTTJS = require('vtt.js'); + +module.exports = function(url) { + return new Promise(function(resolve) { + var nativeVTTCue = VTTCue; + global.VTTCue = VTTJS.VTTCue; + var cues = []; + var parser = new VTTJS.WebVTT.Parser(window, VTTJS.WebVTT.StringDecoder()); + parser.oncue = function(cue) { + cues.push({ + startTime: cue.startTime, + endTime: cue.endTime, + text: cue.text + }); + }; + parser.parse(demoText); + parser.flush(); + cues = cues.sort(function(c1, c2) { + return c1.endTime - c2.endTime || + c2.startTime - c1.startTime; + }); + global.VTTCue = nativeVTTCue; + resolve(cues); + }); +}; + +var demoText = `WEBVTT + +00:00:20.000 --> 00:00:40.000 +20-40 + +00:00:05.000 --> 00:00:10.000 +5-10 + +00:00:02.000 --> 00:00:10.000 +2-10 + +00:00:00.000 --> 00:00:10.000 +0-10 + +00:00:00.000 --> 00:00:20.000 +0-20 + +00:00:00.000 --> 00:00:38.000 +0-38 + +00:00:00.000 --> 00:00:15.000 +0-15 + +00:00:50.000 --> 00:05:55.000 +50-5:55 + +00:02:50.000 --> 00:04:55.000 +2:50-4:55 + +00:00:50.000 --> 00:01:55.000 +50-1:55 +`; From 34b819227ba0c3524003228d6503bbeb63d217df Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 28 Dec 2018 17:15:25 +0200 Subject: [PATCH 57/94] cuesForTime works with time argument in ms --- .../Video/stremio-video/utils/cuesForTime.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js index 88404fde4..c4ce0592b 100644 --- a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js +++ b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js @@ -1,13 +1,14 @@ module.exports = function(cues, time) { + var timeInSeconds = time / 1000; var cuesForTime = []; var middleCueIndex = -1; var left = 0; var right = cues.length - 1; while (left <= right) { var middle = Math.floor((left + right) / 2); - if (cues[middle].endTime < time) { + if (cues[middle].endTime < timeInSeconds) { left = middle + 1; - } else if (cues[middle].startTime > time) { + } else if (cues[middle].startTime > timeInSeconds) { right = middle - 1; } else { middleCueIndex = middle; @@ -17,16 +18,16 @@ module.exports = function(cues, time) { if (middleCueIndex !== -1) { cuesForTime.push(cues[middleCueIndex]); - for (var i = cueIndex - 1; i >= 0; i--) { - if (cues[i].startTime > time || cues[i].endTime < time) { + for (var i = middleCueIndex - 1; i >= 0; i--) { + if (cues[i].startTime > timeInSeconds || cues[i].endTime < timeInSeconds) { break; } cuesForTime.push(cues[i]); } - for (var i = cueIndex + 1; i < cues.length; i++) { - if (cues[i].startTime > time || cues[i].endTime < time) { + for (var i = middleCueIndex + 1; i < cues.length; i++) { + if (cues[i].startTime > timeInSeconds || cues[i].endTime < timeInSeconds) { break; } @@ -36,4 +37,3 @@ module.exports = function(cues, time) { return cuesForTime; }; -//TODO sort the result \ No newline at end of file From 4e20b189e36c9a943d0c45a0582988bf20c16e86 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 28 Dec 2018 17:15:55 +0200 Subject: [PATCH 58/94] cuesForTime returns sorted cues --- src/routes/Player/Video/stremio-video/utils/cuesForTime.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js index c4ce0592b..ab53e3f22 100644 --- a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js +++ b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js @@ -35,5 +35,7 @@ module.exports = function(cues, time) { } } - return cuesForTime; + return cuesForTime.sort(function(c1, c2) { + return c1.startTime - c2.startTime; + }); }; From 67d130c43784806e39af8248341abf87bbf56748 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 28 Dec 2018 17:27:12 +0200 Subject: [PATCH 59/94] display subtitles ad the bottom of the video --- .../Player/Video/stremio-video/HTMLVideo.js | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 9f1d29d45..87bbee80e 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -1,4 +1,5 @@ var EventEmitter = require('events'); +var VTTJS = require('vtt.js'); var cuesForTime = require('./utils/cuesForTime'); var fetchCues = require('./utils/fetchCues'); @@ -17,17 +18,17 @@ var HTMLVideo = function(container) { var selectedSubtitleTrackId = null; var styles = document.createElement('style'); var video = document.createElement('video'); + var subtitles = document.createElement('div'); container.appendChild(styles); - styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; }', styles.sheet.cssRules.length); - styles.sheet.insertRule('#' + container.id + ' video::cue { font-size: 22px; }', styles.sheet.cssRules.length); + styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', styles.sheet.cssRules.length); + styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 120px; left: 0; font-size: 22px; color: white; text-align: center; }', styles.sheet.cssRules.length); container.appendChild(video); video.crossOrigin = 'anonymous'; video.controls = false; + container.appendChild(subtitles); + subtitles.classList.add('subtitles'); - function onSubtitlesCuesChanged() { - - } function getPaused() { if (!loaded) { return null; @@ -66,6 +67,22 @@ var HTMLVideo = function(container) { return selectedSubtitleTrackId; }; + function onSubtitlesCuesChanged() { + while (subtitles.hasChildNodes()) { + subtitles.removeChild(subtitles.lastChild); + } + + if (!loaded || subtitleCues.length === 0) { + return; + } + + var time = getTime(); + var cues = cuesForTime(subtitleCues, time); + for (var i = 0; i < cues.length; i++) { + var cue = VTTJS.WebVTT.convertCueToDOMTree(window, cues[i].text); + subtitles.appendChild(cue); + } + } function onEnded() { events.emit('ended'); }; @@ -208,6 +225,7 @@ var HTMLVideo = function(container) { .then(function(cues) { if (selectedSubtitleTrackId === subtitleTrack.id) { subtitleCues = cues; + console.log(subtitleCues) } }) .catch(function() { From 1bee5110554d6bf9be44f7f53bb7cebc8462feba Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 28 Dec 2018 17:37:31 +0200 Subject: [PATCH 60/94] sort cues for time improved --- src/routes/Player/Video/stremio-video/utils/cuesForTime.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js index ab53e3f22..3ffc5a0b8 100644 --- a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js +++ b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js @@ -36,6 +36,7 @@ module.exports = function(cues, time) { } return cuesForTime.sort(function(c1, c2) { - return c1.startTime - c2.startTime; + return c1.startTime - c2.startTime || + c1.endTime - c2.endTime; }); }; From 5a7604bc08a7820477b8d951d07d42ecebe4bf1a Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Sat, 29 Dec 2018 00:23:16 +0200 Subject: [PATCH 61/94] basic cues find alghorithm implemented --- .../Video/stremio-video/utils/cuesForTime.js | 29 +- .../Video/stremio-video/utils/fetchCues.js | 6815 ++++++++++++++++- 2 files changed, 6823 insertions(+), 21 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js index 3ffc5a0b8..444ade672 100644 --- a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js +++ b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js @@ -1,38 +1,29 @@ module.exports = function(cues, time) { var timeInSeconds = time / 1000; var cuesForTime = []; - var middleCueIndex = -1; var left = 0; var right = cues.length - 1; + var lastCueIndex = -1; while (left <= right) { var middle = Math.floor((left + right) / 2); - if (cues[middle].endTime < timeInSeconds) { + if (cues[middle].startTime === timeInSeconds) { + lastCueIndex = middle; left = middle + 1; } else if (cues[middle].startTime > timeInSeconds) { right = middle - 1; } else { - middleCueIndex = middle; - break; + left = middle + 1; } } - if (middleCueIndex !== -1) { - cuesForTime.push(cues[middleCueIndex]); - for (var i = middleCueIndex - 1; i >= 0; i--) { - if (cues[i].startTime > timeInSeconds || cues[i].endTime < timeInSeconds) { - break; - } - - cuesForTime.push(cues[i]); + var cueIndex = lastCueIndex !== -1 ? lastCueIndex : right; + while (cueIndex >= 0) { + if (cues[cueIndex].startTime > timeInSeconds || cues[cueIndex].endTime < timeInSeconds) { + break; } - for (var i = middleCueIndex + 1; i < cues.length; i++) { - if (cues[i].startTime > timeInSeconds || cues[i].endTime < timeInSeconds) { - break; - } - - cuesForTime.push(cues[i]); - } + cuesForTime.push(cues[cueIndex]); + cueIndex--; } return cuesForTime.sort(function(c1, c2) { diff --git a/src/routes/Player/Video/stremio-video/utils/fetchCues.js b/src/routes/Player/Video/stremio-video/utils/fetchCues.js index a0766147b..937ab3624 100644 --- a/src/routes/Player/Video/stremio-video/utils/fetchCues.js +++ b/src/routes/Player/Video/stremio-video/utils/fetchCues.js @@ -16,8 +16,8 @@ module.exports = function(url) { parser.parse(demoText); parser.flush(); cues = cues.sort(function(c1, c2) { - return c1.endTime - c2.endTime || - c2.startTime - c1.startTime; + return c1.startTime - c2.startTime || + c1.endTime - c2.endTime; }); global.VTTCue = nativeVTTCue; resolve(cues); @@ -56,3 +56,6814 @@ var demoText = `WEBVTT 00:00:50.000 --> 00:01:55.000 50-1:55 `; + +// demoText = `WEBVTT + +// 1 +// 00:00:11.000 --> 00:00:12.500 +// HAVE A GOOD TIME. + +// 2 +// 00:03:06.186 --> 00:03:09.982 +// They've killed your son Paolo! + +// 3 +// 00:03:10.315 --> 00:03:12.442 +// Murderers! Murderers! + +// 4 +// 00:03:23.287 --> 00:03:24.788 +// My son... + +// 5 +// 00:04:09.124 --> 00:04:11.543 +// All my respect, Don Ciccio. + +// 6 +// 00:04:15.714 --> 00:04:19.718 +// You killed my husband because +// he wouldn't give in to you. + +// 7 +// 00:04:20.344 --> 00:04:22.679 +// And his oldest son Paolo... + +// 8 +// 00:04:23.472 --> 00:04:25.974 +// ...because he swore revenge. + +// 9 +// 00:04:27.184 --> 00:04:30.771 +// But Vito is only nine. +// And dumb-witted. + +// 10 +// 00:04:31.647 --> 00:04:33.273 +// He never speaks. + +// 11 +// 00:04:33.357 --> 00:04:35.734 +// It's not his words I'm afraid of. + +// 12 +// 00:04:36.985 --> 00:04:40.906 +// He's weak. He couldn't hurt anyone. + +// 13 +// 00:04:41.865 --> 00:04:44.660 +// But when he grows, he'll grow strong. + +// 14 +// 00:04:45.077 --> 00:04:48.747 +// Don't worry. This little boy +// can't do a thing to you. + +// 15 +// 00:04:56.213 --> 00:04:59.633 +// When he's a man, he'll +// come for revenge. + +// 16 +// 00:05:01.468 --> 00:05:05.597 +// I beg you, Don Ciccio, +// spare my only son. + +// 17 +// 00:05:06.431 --> 00:05:08.517 +// He's all I have left. + +// 18 +// 00:05:08.809 --> 00:05:13.939 +// I swear to God he'll never do +// you any harm. Spare him! + +// 19 +// 00:05:23.240 --> 00:05:24.199 +// Vito, run! + +// 20 +// 00:05:24.283 --> 00:05:25.409 +// Move and I'll kill him! + +// 21 +// 00:05:27.411 --> 00:05:28.912 +// Run, Vito! + +// 22 +// 00:05:34.626 --> 00:05:35.878 +// Kill him! + +// 23 +// 00:05:45.220 --> 00:05:49.766 +// Any family who hides the boy +// Vito Andolini will regret it! + +// 24 +// 00:05:52.019 --> 00:05:53.353 +// You understand? + +// 25 +// 00:06:02.779 --> 00:06:07.618 +// Anybody who hides the boy +// Vito Andolini is in for trouble! + +// 26 +// 00:06:33.435 --> 00:06:35.729 +// Vito, we're praying for you! + +// 27 +// 00:06:41.318 --> 00:06:45.113 +// If anyone is hiding the boy +// Vito Andolini... + +// 28 +// 00:06:46.198 --> 00:06:48.033 +// ...turn him over to us. + +// 29 +// 00:06:48.784 --> 00:06:51.537 +// Don Ciccio will thank you for it! + +// 30 +// 00:06:52.913 --> 00:06:55.833 +// It'll be better for the boy, +// and better for you! + +// 31 +// 00:07:07.886 --> 00:07:12.558 +// Any family who hides the boy +// Vito Andolini will regret it! + +// 32 +// 00:08:45.859 --> 00:08:47.611 +// Nurse. + +// 33 +// 00:09:13.595 --> 00:09:15.347 +// Money? + +// 34 +// 00:09:16.640 --> 00:09:18.642 +// Interpreter! + +// 35 +// 00:09:24.940 --> 00:09:27.359 +// Where are you from? + +// 36 +// 00:09:27.693 --> 00:09:29.820 +// -What is your name? +// -Maria. + +// 37 +// 00:09:34.157 --> 00:09:36.368 +// What is your name? + +// 38 +// 00:09:37.661 --> 00:09:40.789 +// Come on, son. What is your name? + +// 39 +// 00:09:43.917 --> 00:09:46.879 +// Vito Andolini from Corleone. + +// 40 +// 00:09:47.671 --> 00:09:50.299 +// Corleone. Vito Corleone. + +// 41 +// 00:09:50.799 --> 00:09:53.427 +// Okay, over there. + +// 42 +// 00:09:54.344 --> 00:09:55.554 +// Next. + +// 43 +// 00:10:04.938 --> 00:10:09.318 +// Tell him he has smallpox. +// Quarantine three months. + +// 44 +// 00:10:18.368 --> 00:10:20.829 +// Vito Corleone! + +// 45 +// 00:10:21.455 --> 00:10:23.707 +// Vito Corleone! + +// 46 +// 00:10:25.417 --> 00:10:27.920 +// Here he is. This is him. + +// 47 +// 00:12:14.484 --> 00:12:16.653 +// Did you bring the car keys? + +// 48 +// 00:12:18.906 --> 00:12:21.491 +// Laurie! Laurie! + +// 49 +// 00:12:41.762 --> 00:12:43.847 +// Mama! + +// 50 +// 00:12:44.848 --> 00:12:46.642 +// Mama! + +// 51 +// 00:12:48.894 --> 00:12:51.563 +// -Look who's here. +// -Father Carmelo. + +// 52 +// 00:12:51.647 --> 00:12:54.900 +// -This is Father Carmelo. +// -I'm Merle Johnson. + +// 53 +// 00:12:56.693 --> 00:12:58.403 +// Mama! + +// 54 +// 00:12:59.321 --> 00:13:03.575 +// -Here I am. +// -Constanzia, after one week? + +// 55 +// 00:13:03.659 --> 00:13:07.704 +// I sent the car to the airport last week +// to pick you up. + +// 56 +// 00:13:07.788 --> 00:13:13.752 +// It was chaos. Anyway, here I am, just +// one week late. This is for my mama! + +// 57 +// 00:13:13.836 --> 00:13:17.047 +// -What is this? +// -You remember Merle? + +// 58 +// 00:13:17.214 --> 00:13:19.883 +// Hello. How are you? Thank you. + +// 59 +// 00:13:20.050 --> 00:13:25.514 +// Where's Michael? I've got to talk to him +// and I can't wait on line. + +// 60 +// 00:13:25.597 --> 00:13:27.975 +// You go see your children first. + +// 61 +// 00:13:28.100 --> 00:13:33.730 +// Then you worry about waiting on line to +// see your brother. Like everybody else. + +// 62 +// 00:13:38.569 --> 00:13:41.071 +// Ladies and gentlemen... + +// 63 +// 00:13:41.822 --> 00:13:45.450 +// A most distinguished guest +// would like to say a few words. + +// 64 +// 00:13:45.534 --> 00:13:49.621 +// Please welcome Senator Pat Geary +// of the State of Nevada. + +// 65 +// 00:13:49.705 --> 00:13:52.499 +// And there is Mrs. Geary. + +// 66 +// 00:14:02.885 --> 00:14:05.095 +// Thank you very much. + +// 67 +// 00:14:05.262 --> 00:14:11.977 +// This is a very, very happy day +// for me and my wife Mrs. Geary. + +// 68 +// 00:14:12.561 --> 00:14:15.689 +// We see Nevada far too seldom. + +// 69 +// 00:14:15.772 --> 00:14:20.694 +// But today we can join with old friends, +// we can make new friends + +// 70 +// 00:14:20.944 --> 00:14:24.740 +// and we help celebrate +// a young man's first Communion. + +// 71 +// 00:14:25.365 --> 00:14:32.289 +// And also to thank that boy's family for +// a magnificent contribution to the State. + +// 72 +// 00:14:32.372 --> 00:14:38.170 +// I have here in my hand a check +// made out to the university + +// 73 +// 00:14:38.253 --> 00:14:43.091 +// and it is a magnificent endowment +// in the name of + +// 74 +// 00:14:44.510 --> 00:14:47.262 +// Anthony Vito Corleone. + +// 75 +// 00:14:48.305 --> 00:14:51.433 +// The check is signed by +// that young man's parents + +// 76 +// 00:14:51.600 --> 00:14:54.353 +// whom I think we should recognize. + +// 77 +// 00:14:54.436 --> 00:14:58.899 +// Mike, Pat, Kay, stand up, please. +// Let the folks see you! + +// 78 +// 00:14:58.982 --> 00:15:01.026 +// Folks, I want you to join me + +// 79 +// 00:15:01.109 --> 00:15:06.865 +// in giving a real Nevada thank you +// to Mr. and Mrs. Michael Corleone! + +// 80 +// 00:15:12.746 --> 00:15:18.085 +// We also have, as a special added +// attraction, the Sierra Boys Choir + +// 81 +// 00:15:18.252 --> 00:15:24.591 +// who have chosen a certain special song +// and a special arrangement + +// 82 +// 00:15:24.675 --> 00:15:28.679 +// to honor their host, +// Mr. Michael Corleone. + +// 83 +// 00:15:28.846 --> 00:15:30.347 +// Boys. + +// 84 +// 00:15:46.864 --> 00:15:49.032 +// The plaque. + +// 85 +// 00:15:49.199 --> 00:15:51.743 +// Okay, fellows, did you get that one? + +// 86 +// 00:15:52.578 --> 00:15:54.705 +// Okay, that's good. + +// 87 +// 00:15:54.872 --> 00:15:58.917 +// Now, Senator, +// just you and Mrs. Corleone. + +// 88 +// 00:16:20.397 --> 00:16:23.400 +// My lawyer Tom Hagen. Senator Geary. + +// 89 +// 00:16:23.483 --> 00:16:26.612 +// He arranged everything +// through your man Turnbull. + +// 90 +// 00:16:26.737 --> 00:16:29.865 +// -Yes, yes. +// -Sit down. + +// 91 +// 00:16:33.035 --> 00:16:36.497 +// I thought that you and +// I would talk alone. + +// 92 +// 00:16:37.915 --> 00:16:43.754 +// I trust these men with my life, Senator. +// To ask them to leave would be an insult. + +// 93 +// 00:16:43.879 --> 00:16:46.840 +// Well, it's perfectly all right with me + +// 94 +// 00:16:46.924 --> 00:16:51.595 +// but I am a blunt man and I intend +// to speak very frankly to you. + +// 95 +// 00:16:51.720 --> 00:16:53.764 +// Maybe more frankly + +// 96 +// 00:16:53.847 --> 00:16:57.184 +// than anyone in my position +// has ever talked to you before. + +// 97 +// 00:16:57.351 --> 00:17:00.354 +// The Corleone family +// has done well in Nevada. + +// 98 +// 00:17:00.521 --> 00:17:05.651 +// You own, or control, +// two major hotels in Vegas + +// 99 +// 00:17:05.734 --> 00:17:10.280 +// and one in Reno. +// The licenses were grandfathered in + +// 100 +// 00:17:10.364 --> 00:17:13.784 +// so there was no problem +// with the Gaming Commission. + +// 101 +// 00:17:15.786 --> 00:17:18.747 +// Now my sources tell me + +// 102 +// 00:17:18.831 --> 00:17:22.918 +// that you plan to make a move +// against the Tropigala. + +// 103 +// 00:17:23.001 --> 00:17:28.048 +// They tell me that within a week, +// you're going to move Klingman out. + +// 104 +// 00:17:28.173 --> 00:17:33.929 +// Quite an expansion. However, it will +// leave you with a little technical problem. + +// 105 +// 00:17:36.473 --> 00:17:39.309 +// The license will still be +// in Klingman's name. + +// 106 +// 00:17:40.602 --> 00:17:45.148 +// -Turnbull is a good man. +// -Yeah, well, let's cut out the bullshit. + +// 107 +// 00:17:45.232 --> 00:17:48.402 +// I don't want to spend +// more time here than I have to. + +// 108 +// 00:17:48.485 --> 00:17:50.946 +// You can have the license. + +// 109 +// 00:17:51.029 --> 00:17:53.907 +// The price is 250,000 dollars. + +// 110 +// 00:17:53.991 --> 00:17:56.660 +// Plus five per cent of the gross monthly + +// 111 +// 00:17:56.743 --> 00:18:01.248 +// of all four hotels, Mr. Corleone. + +// 112 +// 00:18:04.835 --> 00:18:09.756 +// The price for the license +// is less than 20,000 dollars, right? + +// 113 +// 00:18:09.840 --> 00:18:12.259 +// That's right. + +// 114 +// 00:18:12.342 --> 00:18:17.890 +// -Why would I pay more than that? +// -Because I intend to squeeze you. + +// 115 +// 00:18:17.973 --> 00:18:20.601 +// I don't like your kind of people. + +// 116 +// 00:18:20.684 --> 00:18:26.231 +// I don't like to see you come out +// to this clean country in oily hair + +// 117 +// 00:18:26.315 --> 00:18:28.692 +// dressed up in those silk suits + +// 118 +// 00:18:28.775 --> 00:18:32.696 +// and try to pass yourselves off +// as decent Americans. + +// 119 +// 00:18:32.821 --> 00:18:38.452 +// I'll do business with you, but the fact is +// that I despise your masquerade, + +// 120 +// 00:18:38.535 --> 00:18:44.041 +// the dishonest way you pose yourself +// and your whole fucking family. + +// 121 +// 00:18:51.548 --> 00:18:53.383 +// Senator, + +// 122 +// 00:18:54.468 --> 00:18:57.554 +// we're both part of the same hypocrisy. + +// 123 +// 00:18:59.056 --> 00:19:02.559 +// But never think it applies to my family. + +// 124 +// 00:19:03.185 --> 00:19:05.687 +// All right, all right. + +// 125 +// 00:19:06.522 --> 00:19:11.652 +// Some people have to play little games. +// You play yours. + +// 126 +// 00:19:13.737 --> 00:19:17.824 +// Let's say that you'll pay me +// because it's in your interest. + +// 127 +// 00:19:18.575 --> 00:19:22.996 +// I want your answer and the money +// by noon tomorrow. One more thing. + +// 128 +// 00:19:23.080 --> 00:19:26.667 +// Don't you contact me again, ever. + +// 129 +// 00:19:26.750 --> 00:19:30.587 +// From now on you deal with Turnbull. +// Open that door, son. + +// 130 +// 00:19:31.088 --> 00:19:34.925 +// Senator, you can have my answer now +// if you like. + +// 131 +// 00:19:37.511 --> 00:19:40.347 +// My offer is this... + +// 132 +// 00:19:40.514 --> 00:19:42.099 +// Nothing. + +// 133 +// 00:19:43.767 --> 00:19:49.439 +// Not even the fee for the gaming license, +// which I would like you to put up. + +// 134 +// 00:19:54.695 --> 00:19:57.155 +// Good afternoon, gentlemen. + +// 135 +// 00:19:59.825 --> 00:20:02.536 +// Ladies! I didn't know you were out here. + +// 136 +// 00:20:02.619 --> 00:20:05.706 +// -Honey, we have to go. +// -Really? I'm sorry. + +// 137 +// 00:20:05.873 --> 00:20:09.209 +// -It's been delightful. +// -It was our pleasure. + +// 138 +// 00:20:09.376 --> 00:20:11.962 +// It was wonderful talking to you. + +// 139 +// 00:20:56.507 --> 00:21:01.678 +// Fredo! Fredo, you son-of-a-bitch, +// you look great! + +// 140 +// 00:21:01.762 --> 00:21:03.764 +// Frank Pentangeli! + +// 141 +// 00:21:03.847 --> 00:21:06.975 +// I thought you was +// never coming out west, you big bum! + +// 142 +// 00:21:07.976 --> 00:21:10.729 +// I've got to check on my boys. + +// 143 +// 00:21:11.897 --> 00:21:13.857 +// -What's with the food here? +// -What's the matter? + +// 144 +// 00:21:13.982 --> 00:21:19.821 +// A kid gives me a Ritz cracker +// with chopped liver and says, "canapés". + +// 145 +// 00:21:19.988 --> 00:21:25.202 +// I said, "Can of peas, my ass. That's +// a Ritz cracker and chopped liver!" + +// 146 +// 00:21:28.497 --> 00:21:31.625 +// Bring out the peppers and sardines! + +// 147 +// 00:21:32.251 --> 00:21:35.546 +// Seeing you reminds me of New York +// in the old days! + +// 148 +// 00:21:36.713 --> 00:21:42.219 +// You remember Willi Cicci, who was +// with old man Clemenza in Brooklyn? + +// 149 +// 00:21:44.555 --> 00:21:47.975 +// We were all upset about that. +// Heart attack, huh? + +// 150 +// 00:21:48.058 --> 00:21:51.144 +// No, that was no heart attack. + +// 151 +// 00:21:51.478 --> 00:21:55.482 +// That's what I'm here to see +// your brother Mike about. + +// 152 +// 00:21:55.566 --> 00:21:58.569 +// -But what's with him? +// -What do you mean? + +// 153 +// 00:21:58.694 --> 00:22:04.074 +// Do I have to get a letter of introduction +// to get a sit-down? + +// 154 +// 00:22:04.241 --> 00:22:08.787 +// -You can't get in to see Mike? +// -He's got me waiting in a lobby! + +// 155 +// 00:22:12.457 --> 00:22:15.544 +// -Johnny Ola. +// -Al Neri. + +// 156 +// 00:22:20.841 --> 00:22:26.388 +// -Do you know my lawyer Tom Hagen? +// -I remember Tom from the old days. + +// 157 +// 00:22:26.471 --> 00:22:28.056 +// Rocco. + +// 158 +// 00:22:28.140 --> 00:22:32.102 +// -What's this? +// -It's an orange from Miami. + +// 159 +// 00:22:32.186 --> 00:22:35.230 +// Take care of Johnny's men. +// They look like they might be hungry. + +// 160 +// 00:22:35.314 --> 00:22:36.315 +// Johnny? + +// 161 +// 00:22:39.443 --> 00:22:43.614 +// Tom won't stay. He only handles +// specific areas of the business. + +// 162 +// 00:22:44.448 --> 00:22:46.575 +// Sure, Mike. + +// 163 +// 00:22:50.537 --> 00:22:53.874 +// -What are you drinking, Johnny? +// -Anisette. + +// 164 +// 00:22:59.254 --> 00:23:04.468 +// -If you need anything, I'll be outside. +// -Just tell Rocco we're waiting, Tom. + +// 165 +// 00:23:09.556 --> 00:23:13.810 +// -I just left Mr. Roth in Miami. +// -How is his health? + +// 166 +// 00:23:13.894 --> 00:23:15.812 +// It's not good. + +// 167 +// 00:23:17.022 --> 00:23:19.525 +// Can I do anything or send anything? + +// 168 +// 00:23:19.608 --> 00:23:24.488 +// He appreciates your concern, Michael, +// and your respect. + +// 169 +// 00:23:24.780 --> 00:23:26.490 +// That casino... + +// 170 +// 00:23:26.573 --> 00:23:31.245 +// Registered owners. Jacob Lawrence, +// Allan Barclay. Beverly Hills attorneys. + +// 171 +// 00:23:31.995 --> 00:23:34.915 +// The real owners are +// the old Lakeville Road group + +// 172 +// 00:23:34.998 --> 00:23:37.292 +// and our friend in Miami. + +// 173 +// 00:23:37.668 --> 00:23:43.757 +// Klingman runs it and owns a piece of +// it too, but I've been instructed to tell you + +// 174 +// 00:23:43.841 --> 00:23:47.886 +// that if you move him out, +// our friend in Miami will go along. + +// 175 +// 00:23:50.180 --> 00:23:54.852 +// It's very kind of him. +// Tell him it's greatly appreciated. + +// 176 +// 00:23:56.019 --> 00:23:59.898 +// Hyman Roth always makes money +// for his partners. + +// 177 +// 00:24:01.441 --> 00:24:05.028 +// One by one, our old friends are gone. + +// 178 +// 00:24:05.529 --> 00:24:08.866 +// Death, natural or not, + +// 179 +// 00:24:08.949 --> 00:24:11.702 +// prison, deported... + +// 180 +// 00:24:12.953 --> 00:24:18.208 +// Only Hyman Roth is left, because he +// always made money for his partners. + +// 181 +// 00:24:20.127 --> 00:24:25.799 +// I can't believe it! Out of 30 professional +// musicians there isn't one Italian! + +// 182 +// 00:24:25.883 --> 00:24:28.594 +// Let's have a tarantella! + +// 183 +// 00:24:34.057 --> 00:24:36.351 +// You! Up, up, up! + +// 184 +// 00:24:45.986 --> 00:24:47.487 +// Questa mano! + +// 185 +// 00:24:48.697 --> 00:24:50.657 +// Questa mano! + +// 186 +// 00:24:56.288 --> 00:24:59.416 +// What the hell have we here? + +// 187 +// 00:25:10.385 --> 00:25:16.099 +// -I'll see my sister alone. +// -It concerns me too. May I stay? + +// 188 +// 00:25:16.183 --> 00:25:20.354 +// How are you, honey? You've met +// Merle, he was with me in Vegas. + +// 189 +// 00:25:20.437 --> 00:25:23.607 +// -I saw him with you. +// -Could I have a drink? + +// 190 +// 00:25:28.195 --> 00:25:30.531 +// Al, please get him a drink! + +// 191 +// 00:25:32.825 --> 00:25:36.620 +// We're going to Europe. I'd like to book +// passage on The Queen. + +// 192 +// 00:25:36.703 --> 00:25:39.540 +// Why don't you go to a travel agent? + +// 193 +// 00:25:39.623 --> 00:25:42.626 +// We're getting married first. + +// 194 +// 00:25:50.342 --> 00:25:54.513 +// The ink on your divorce isn't dry yet, +// and you're getting married? + +// 195 +// 00:25:56.640 --> 00:25:59.142 +// You see your children on weekends. + +// 196 +// 00:25:59.476 --> 00:26:04.398 +// Your oldest boy was picked up in Reno +// for a theft you don't even know about. + +// 197 +// 00:26:04.481 --> 00:26:07.860 +// You fly around the world +// with men who use you! + +// 198 +// 00:26:07.943 --> 00:26:10.487 +// -You're not my father! +// -So why come to me? + +// 199 +// 00:26:10.571 --> 00:26:11.989 +// I need money. + +// 200 +// 00:26:25.419 --> 00:26:28.172 +// Connie, Connie, Connie... + +// 201 +// 00:26:34.595 --> 00:26:37.181 +// I want to be reasonable with you. + +// 202 +// 00:26:38.432 --> 00:26:41.185 +// Why don't you stay with the family? + +// 203 +// 00:26:42.352 --> 00:26:44.980 +// You can live on the estate +// with your kids. + +// 204 +// 00:26:45.063 --> 00:26:48.734 +// You won't be deprived of anything. + +// 205 +// 00:26:53.197 --> 00:26:58.660 +// I don't know this Merle. I don't know +// what he does or what he lives on. + +// 206 +// 00:27:00.204 --> 00:27:05.209 +// Tell him marriage is out of the question +// and you don't want to see him anymore. + +// 207 +// 00:27:05.334 --> 00:27:07.503 +// He'll understand, believe me. + +// 208 +// 00:27:15.552 --> 00:27:17.596 +// Connie. + +// 209 +// 00:27:19.556 --> 00:27:23.227 +// If you don't listen to me +// and marry this man, + +// 210 +// 00:27:28.106 --> 00:27:30.442 +// you'll disappoint me. + +// 211 +// 00:28:02.015 --> 00:28:06.228 +// -Famiglia! +// -Cent' anni! + +// 212 +// 00:28:06.937 --> 00:28:09.022 +// What's "Chen dannay"? + +// 213 +// 00:28:09.106 --> 00:28:12.025 +// "Cent' anni". It means 100 years. + +// 214 +// 00:28:12.109 --> 00:28:16.446 +// It means we should all live happily +// for 100 years. The family. + +// 215 +// 00:28:16.530 --> 00:28:20.576 +// -It would be true if my father were alive. +// -Connie. + +// 216 +// 00:28:20.659 --> 00:28:22.286 +// Hey... + +// 217 +// 00:28:22.369 --> 00:28:26.165 +// Merle, you've met my sister-in-law, +// Deanna. + +// 218 +// 00:28:26.248 --> 00:28:27.916 +// -Fredo's wife. +// -My pleasure. + +// 219 +// 00:28:38.635 --> 00:28:42.472 +// With all respect, I didn't +// come here to eat dinner! + +// 220 +// 00:28:43.223 --> 00:28:44.725 +// I know, I know. + +// 221 +// 00:29:15.088 --> 00:29:20.177 +// -I just want to dance! +// -You're falling all over the floor. + +// 222 +// 00:29:20.344 --> 00:29:24.097 +// You're justjealous +// because he's a real man! + +// 223 +// 00:29:24.264 --> 00:29:28.977 +// -I'm going to belt you right in the teeth. +// -You couldn't belt your mama! + +// 224 +// 00:29:30.854 --> 00:29:33.023 +// These Dagos are crazy +// when it comes to their wives. + +// 225 +// 00:29:33.106 --> 00:29:38.028 +// Michael says that if you can't +// take care of this, I have to. + +// 226 +// 00:29:38.195 --> 00:29:41.031 +// -I think you'd better. +// -Never marry a Wop. + +// 227 +// 00:29:41.198 --> 00:29:46.703 +// They treat their wives like shit! +// I didn't mean to say Wop. Don't! + +// 228 +// 00:29:47.704 --> 00:29:53.001 +// What are you doing to me, +// you big slob? Help! + +// 229 +// 00:29:53.085 --> 00:29:54.294 +// Fredo! + +// 230 +// 00:29:54.378 --> 00:29:59.216 +// -I can't control her, Mikey. +// -You're my brother, don't apologize. + +// 231 +// 00:30:03.136 --> 00:30:07.224 +// Clemenza promised the Rosato +// brothers three territories after he died. + +// 232 +// 00:30:07.307 --> 00:30:08.809 +// You took over and didn't give it to them. + +// 233 +// 00:30:08.892 --> 00:30:10.143 +// I welched. + +// 234 +// 00:30:10.227 --> 00:30:14.690 +// Clemenza promised them lu cazzo. +// He promised them nothing. + +// 235 +// 00:30:15.232 --> 00:30:20.404 +// -He hated them more than I do. +// -Frankie, they feel cheated. + +// 236 +// 00:30:21.238 --> 00:30:25.492 +// You're sitting up in the Sierra Mountains +// and you're drinking... + +// 237 +// 00:30:25.576 --> 00:30:27.911 +// -What's he drinking? +// -Champagne. + +// 238 +// 00:30:27.995 --> 00:30:33.041 +// Champagne cocktails, and passing +// judgment on how I run my family. + +// 239 +// 00:30:35.294 --> 00:30:37.087 +// Your family's still called Corleone. + +// 240 +// 00:30:38.255 --> 00:30:41.341 +// And you'll run it like a Corleone. + +// 241 +// 00:30:41.758 --> 00:30:45.429 +// My family doesn't eat here, +// doesn't eat in Las Vegas... + +// 242 +// 00:30:46.013 --> 00:30:47.598 +// ...and doesn't eat in Miami... + +// 243 +// 00:30:48.140 --> 00:30:49.766 +// ...with Hyman Roth! + +// 244 +// 00:30:56.106 --> 00:31:00.652 +// You're a good old man and I like you. + +// 245 +// 00:31:00.736 --> 00:31:03.155 +// You were loyal to my father for years. + +// 246 +// 00:31:04.781 --> 00:31:08.785 +// The Rosato brothers +// are taking hostages. + +// 247 +// 00:31:10.037 --> 00:31:15.876 +// They spit right in my face, all because +// they're backed up by that Jew in Miami. + +// 248 +// 00:31:15.959 --> 00:31:18.837 +// I know. That's why +// I don't want them touched. + +// 249 +// 00:31:19.004 --> 00:31:22.758 +// -Not touched? +// -No, I want you to be fair with them. + +// 250 +// 00:31:22.841 --> 00:31:27.888 +// You want me to be fair with them? +// How can you be fair to animals? + +// 251 +// 00:31:28.055 --> 00:31:34.186 +// Tom, listen. They recruit spics, +// they recruit niggers. + +// 252 +// 00:31:34.311 --> 00:31:38.065 +// They do violence in their grandmothers' +// neighborhoods! + +// 253 +// 00:31:38.148 --> 00:31:44.655 +// And everything with them is whores! +// Andjunk, dope! + +// 254 +// 00:31:44.738 --> 00:31:47.366 +// And they leave the gambling to last. + +// 255 +// 00:31:47.491 --> 00:31:52.704 +// I want to run my family without you +// on my back. I want those Rosatos dead! + +// 256 +// 00:31:52.788 --> 00:31:55.624 +// -No. +// -Morte. + +// 257 +// 00:32:01.129 --> 00:32:05.968 +// I have business that's important with +// Hyman Roth. I don't want it disturbed. + +// 258 +// 00:32:07.845 --> 00:32:12.140 +// Then you give your loyalty to a Jew +// before your own blood. + +// 259 +// 00:32:15.060 --> 00:32:19.189 +// You know my father did business +// with Hyman Roth. He respected him. + +// 260 +// 00:32:19.398 --> 00:32:24.069 +// Your father did business with +// Hyman Roth, he respected Hyman Roth, + +// 261 +// 00:32:24.236 --> 00:32:27.406 +// but he never trusted Hyman Roth + +// 262 +// 00:32:27.531 --> 00:32:31.034 +// or his Sicilian messenger boy, +// Johnny Ola. + +// 263 +// 00:32:31.326 --> 00:32:36.665 +// You'll have to excuse me. I'm tired, +// and I'm a little drunk! + +// 264 +// 00:32:38.667 --> 00:32:43.797 +// I want everybody here to know, there's +// not going to be no trouble from me! + +// 265 +// 00:32:44.256 --> 00:32:46.091 +// Don Corleone. + +// 266 +// 00:32:46.300 --> 00:32:48.260 +// Cicci, the door... + +// 267 +// 00:32:56.768 --> 00:32:58.854 +// You want him to leave now? + +// 268 +// 00:33:01.398 --> 00:33:05.903 +// Let him go back to New York. +// I've already made my plans. + +// 269 +// 00:33:06.904 --> 00:33:09.573 +// The old man had too much wine. + +// 270 +// 00:33:13.785 --> 00:33:16.079 +// It's late. + +// 271 +// 00:33:27.674 --> 00:33:29.760 +// How's the baby? + +// 272 +// 00:33:29.843 --> 00:33:34.223 +// -Sleeping inside me. +// -Does it feel like a boy? + +// 273 +// 00:33:34.306 --> 00:33:37.476 +// Yes, it does, Michael. + +// 274 +// 00:33:39.853 --> 00:33:41.522 +// Kay? + +// 275 +// 00:33:41.605 --> 00:33:46.193 +// I'm sorry about all the people today. +// Bad timing. + +// 276 +// 00:33:46.276 --> 00:33:48.654 +// It couldn't be helped, though. + +// 277 +// 00:33:48.737 --> 00:33:51.949 +// It made me think +// of what you once told me. + +// 278 +// 00:33:53.992 --> 00:33:58.038 +// " In five years the Corleone family +// will be completely legitimate. " + +// 279 +// 00:33:58.121 --> 00:34:01.041 +// That was seven years ago. + +// 280 +// 00:34:03.627 --> 00:34:07.297 +// I know. I'm trying, darling. + +// 281 +// 00:35:11.278 --> 00:35:14.031 +// Did you see this? + +// 282 +// 00:35:27.711 --> 00:35:29.755 +// Why are the drapes open? + +// 283 +// 00:35:57.491 --> 00:35:59.326 +// Kay, are you all right? + +// 284 +// 00:35:59.409 --> 00:36:02.079 +// -Are you hit? +// -No. + +// 285 +// 00:36:04.414 --> 00:36:06.708 +// It's all right. + +// 286 +// 00:36:08.210 --> 00:36:10.504 +// Stop! Stop! + +// 287 +// 00:36:12.130 --> 00:36:13.799 +// Halt! + +// 288 +// 00:36:24.768 --> 00:36:28.564 +// They're still on the property. +// Please stay inside. + +// 289 +// 00:36:28.647 --> 00:36:30.816 +// -Keep them alive. +// -We'll try. + +// 290 +// 00:36:30.899 --> 00:36:32.442 +// Alive! + +// 291 +// 00:36:33.569 --> 00:36:35.654 +// Stay by the door. + +// 292 +// 00:37:55.025 --> 00:37:57.069 +// Yeah, come in. + +// 293 +// 00:38:04.201 --> 00:38:07.037 +// -Mike, are you all right? +// -Yeah. + +// 294 +// 00:38:11.333 --> 00:38:14.169 +// There's a lot I can't tell you, Tom. + +// 295 +// 00:38:15.879 --> 00:38:19.299 +// And I know that's upset you in the past. + +// 296 +// 00:38:20.425 --> 00:38:24.596 +// You felt it was because of +// some lack of trust or confidence. + +// 297 +// 00:38:25.806 --> 00:38:30.686 +// But it's because I admire you +// and love you + +// 298 +// 00:38:30.769 --> 00:38:33.605 +// that I kept things secret from you. + +// 299 +// 00:38:35.315 --> 00:38:38.235 +// Now you're the only one I can trust. + +// 300 +// 00:38:41.071 --> 00:38:42.948 +// Fredo? + +// 301 +// 00:38:43.031 --> 00:38:45.576 +// Well, he's got a good heart. + +// 302 +// 00:38:45.659 --> 00:38:50.247 +// But he's weak and he's stupid, +// and this is life and death. + +// 303 +// 00:38:51.081 --> 00:38:54.293 +// Tom, you're my brother. + +// 304 +// 00:38:59.882 --> 00:39:05.179 +// I always wanted to be thought of as +// a brother by you, Mikey. A real brother. + +// 305 +// 00:39:07.556 --> 00:39:09.641 +// I know that. + +// 306 +// 00:39:15.939 --> 00:39:18.025 +// You're going to take over. + +// 307 +// 00:39:19.067 --> 00:39:21.320 +// You're going to be the Don. + +// 308 +// 00:39:24.239 --> 00:39:29.745 +// If what I think has happened, +// has happened, I'm leaving here tonight. + +// 309 +// 00:39:30.579 --> 00:39:36.668 +// I give you complete power. Over Fredo +// and his men. Rocco, Neri, everyone. + +// 310 +// 00:39:38.420 --> 00:39:42.049 +// I'm trusting you +// with the lives of my wife + +// 311 +// 00:39:42.132 --> 00:39:45.135 +// and my children, +// the future of this family. + +// 312 +// 00:39:48.639 --> 00:39:53.477 +// -If we catch them, will we find out... +// -We won't catch them. + +// 313 +// 00:39:55.646 --> 00:39:58.982 +// Unless I'm very wrong, +// they're dead already. + +// 314 +// 00:40:00.484 --> 00:40:03.779 +// They were killed by somebody +// close to us. + +// 315 +// 00:40:03.946 --> 00:40:08.492 +// Inside. Very, very frightened +// that they botched it. + +// 316 +// 00:40:08.867 --> 00:40:13.163 +// You don't think that Rocco and Neri +// had something to do with this? + +// 317 +// 00:40:16.333 --> 00:40:20.712 +// See... All our people are businessmen. + +// 318 +// 00:40:22.381 --> 00:40:25.509 +// Their loyalty is based on that. + +// 319 +// 00:40:27.845 --> 00:40:30.514 +// One thing I learned from Pop + +// 320 +// 00:40:31.807 --> 00:40:35.352 +// was to try to think +// as people around you think. + +// 321 +// 00:40:37.396 --> 00:40:40.315 +// On that basis, anything is possible. + +// 322 +// 00:40:42.234 --> 00:40:46.029 +// Mike, they're dead! +// Right outside my window! + +// 323 +// 00:40:46.196 --> 00:40:49.366 +// I want to get out of here. +// They're lying there dead! + +// 324 +// 00:41:00.460 --> 00:41:03.213 +// Over here! There's two of them. + +// 325 +// 00:41:03.380 --> 00:41:07.551 +// Looks like they were hired +// out of New York. I don't recognize them. + +// 326 +// 00:41:07.968 --> 00:41:10.971 +// Won't get anything out of them now. + +// 327 +// 00:41:11.054 --> 00:41:13.223 +// Fish them out. + +// 328 +// 00:41:37.748 --> 00:41:40.042 +// Get rid of the bodies. + +// 329 +// 00:41:40.125 --> 00:41:43.086 +// -Where's Mike? +// -Rocco. + +// 330 +// 00:42:13.242 --> 00:42:18.580 +// Anthony, everything is going to be +// all right. Try to sleep. + +// 331 +// 00:42:34.638 --> 00:42:39.268 +// -Did you like your party? +// -I got lots of presents. + +// 332 +// 00:42:39.434 --> 00:42:42.771 +// I know. Did you like them? + +// 333 +// 00:42:42.938 --> 00:42:46.233 +// Yeah. I didn't know the people +// who gave them to me. + +// 334 +// 00:42:46.733 --> 00:42:49.570 +// Well, they were friends. + +// 335 +// 00:42:51.321 --> 00:42:55.826 +// -Did you see my present for you? +// -It was on my pillow. + +// 336 +// 00:42:58.328 --> 00:43:01.498 +// I'm going to be leaving +// very early tomorrow. + +// 337 +// 00:43:02.332 --> 00:43:06.670 +// -Will you take me? +// -No, I can't, Anthony. + +// 338 +// 00:43:06.837 --> 00:43:11.675 +// -Why do you have to go? +// -I have to do business. + +// 339 +// 00:43:12.342 --> 00:43:15.470 +// I could help you. + +// 340 +// 00:43:17.806 --> 00:43:20.934 +// I know. Some day you will. + +// 341 +// 00:43:22.186 --> 00:43:24.313 +// Get some sleep. + +// 342 +// 00:44:40.722 --> 00:44:43.892 +// She's really beautiful. +// You've got to see her. + +// 343 +// 00:45:04.371 --> 00:45:08.750 +// Wait till you see her. +// Words can't describe her. + +// 344 +// 00:45:18.302 --> 00:45:22.014 +// I left Naples. I left Mama. + +// 345 +// 00:45:23.348 --> 00:45:25.184 +// For a no-good tramp! + +// 346 +// 00:45:27.144 --> 00:45:31.523 +// Now here I am in America, +// in New York. + +// 347 +// 00:45:33.734 --> 00:45:36.987 +// Alone! Thinking of my mother. + +// 348 +// 00:45:39.364 --> 00:45:41.158 +// Without news from home. + +// 349 +// 00:45:50.209 --> 00:45:52.169 +// Finally, a letter from Naples! + +// 350 +// 00:45:55.214 --> 00:45:58.050 +// Vito, how do you like my little angel? +// Isn't she beautiful? + +// 351 +// 00:45:59.009 --> 00:46:00.928 +// She's very beautiful. + +// 352 +// 00:46:02.846 --> 00:46:06.433 +// To you, she's beautiful. For me, +// there's only my wife and son. + +// 353 +// 00:46:07.476 --> 00:46:09.019 +// Our dear mother - + +// 354 +// 00:46:11.313 --> 00:46:13.357 +// ...is dead! + +// 355 +// 00:47:09.997 --> 00:47:12.916 +// We'll go backstage later +// and take her to eat. + +// 356 +// 00:47:17.337 --> 00:47:19.339 +// Sit down, you bum! + +// 357 +// 00:47:26.096 --> 00:47:28.098 +// Oh, excuse me, Don Fanucci. + +// 358 +// 00:47:36.064 --> 00:47:38.275 +// We'll go see her backstage. + +// 359 +// 00:47:41.195 --> 00:47:42.821 +// Who was that? + +// 360 +// 00:47:43.780 --> 00:47:45.365 +// The Black Hand. + +// 361 +// 00:48:17.981 --> 00:48:20.359 +// That's Fanucci...the Black Hand. + +// 362 +// 00:48:20.859 --> 00:48:22.820 +// We'll talk about it tomorrow. + +// 363 +// 00:48:24.112 --> 00:48:27.032 +// Tomorrow! Always tomorrow! + +// 364 +// 00:48:28.116 --> 00:48:29.701 +// You'll pay me today! + +// 365 +// 00:48:40.003 --> 00:48:41.672 +// Let's go. + +// 366 +// 00:48:44.967 --> 00:48:47.094 +// Not my daughter! Let her go! + +// 367 +// 00:48:48.554 --> 00:48:50.681 +// Here, take all my money! + +// 368 +// 00:48:59.022 --> 00:49:01.358 +// Vito, come on. + +// 369 +// 00:49:07.781 --> 00:49:11.076 +// I know what you're thinking. But +// you don't know how things are. + +// 370 +// 00:49:11.702 --> 00:49:15.080 +// Fanucci's with the Black Hand. +// The whole neighborhood pays him. + +// 371 +// 00:49:15.747 --> 00:49:17.541 +// Even my father, in the grocery store. + +// 372 +// 00:49:17.875 --> 00:49:19.042 +// If he's Italian... + +// 373 +// 00:49:21.086 --> 00:49:23.547 +// ...why does he bother other Italians? + +// 374 +// 00:49:23.630 --> 00:49:26.049 +// He knows they have nobody +// to protect them. + +// 375 +// 00:49:26.592 --> 00:49:28.302 +// Forget that. Did you like my angel? + +// 376 +// 00:49:28.468 --> 00:49:30.262 +// If you're happy, I'm happy. + +// 377 +// 00:50:18.519 --> 00:50:20.354 +// Don't you feel well? + +// 378 +// 00:50:24.441 --> 00:50:26.235 +// Is your boss treating you all right? + +// 379 +// 00:50:28.278 --> 00:50:29.988 +// Forget it. + +// 380 +// 00:50:42.918 --> 00:50:45.921 +// Hey, you speak Italian? + +// 381 +// 00:50:51.510 --> 00:50:53.011 +// Hide this for me! + +// 382 +// 00:50:53.595 --> 00:50:55.681 +// Next week I'll come and get it! + +// 383 +// 00:51:35.512 --> 00:51:37.681 +// Abbandando, meet my nephew! + +// 384 +// 00:51:42.728 --> 00:51:44.688 +// How's business? + +// 385 +// 00:51:50.944 --> 00:51:52.905 +// It's good, it's good. + +// 386 +// 00:51:59.703 --> 00:52:02.956 +// Fanucci's mad. Says the +// neighborhood's getting sloppy. + +// 387 +// 00:52:03.248 --> 00:52:07.127 +// People don't pay on time, +// don't pay the full amount. + +// 388 +// 00:52:07.377 --> 00:52:09.546 +// Says he's been too nice to everyone. + +// 389 +// 00:52:15.719 --> 00:52:17.679 +// So Fanucci's changing? + +// 390 +// 00:52:18.138 --> 00:52:20.557 +// Sure. He wants double +// from everybody. + +// 391 +// 00:52:21.683 --> 00:52:23.727 +// Even from my father. + +// 392 +// 00:52:24.269 --> 00:52:27.815 +// I'm a friend, right? So you'll +// let him work here? + +// 393 +// 00:53:00.264 --> 00:53:02.182 +// I've got some bad news. + +// 394 +// 00:53:06.687 --> 00:53:08.939 +// I feel rotten about telling you this... + +// 395 +// 00:53:11.900 --> 00:53:15.779 +// But Fanucci...he's got a nephew... + +// 396 +// 00:53:23.537 --> 00:53:25.414 +// And you have to give him my job. + +// 397 +// 00:53:26.373 --> 00:53:29.668 +// You've always been good to me, +// ever since I came here. + +// 398 +// 00:53:30.878 --> 00:53:33.005 +// You looked after me like a father. + +// 399 +// 00:53:33.463 --> 00:53:34.882 +// I thank you. + +// 400 +// 00:53:36.383 --> 00:53:38.468 +// And I won't forget it. + +// 401 +// 00:53:51.899 --> 00:53:53.817 +// Vito! + +// 402 +// 00:53:58.113 --> 00:53:59.740 +// Oh, no! + +// 403 +// 00:54:01.158 --> 00:54:03.202 +// Take this to your family. + +// 404 +// 00:54:05.496 --> 00:54:07.915 +// Thanks anyway. But please, +// I can't accept. + +// 405 +// 00:54:43.325 --> 00:54:45.077 +// What a nice pear! + +// 406 +// 00:55:08.475 --> 00:55:11.103 +// I'm Clemenza, you still +// have my goods? + +// 407 +// 00:55:14.189 --> 00:55:16.233 +// Did you look inside? + +// 408 +// 00:55:17.985 --> 00:55:20.612 +// I'm not interested in things +// that don't concern me. + +// 409 +// 00:55:31.999 --> 00:55:36.253 +// A friend of mine has a nice rug. +// Maybe your wife would like it. + +// 410 +// 00:55:43.343 --> 00:55:46.805 +// Sure she would. But who has +// money for a rug? + +// 411 +// 00:55:47.598 --> 00:55:52.352 +// It would be a present. +// I know how to return a favor. + +// 412 +// 00:56:00.652 --> 00:56:02.529 +// Yeah, sure. + +// 413 +// 00:56:02.613 --> 00:56:04.615 +// My wife would like it. + +// 414 +// 00:56:29.056 --> 00:56:31.558 +// That son of a bitch! He isn't home! + +// 415 +// 00:56:35.270 --> 00:56:37.439 +// Damn, he didn't even leave the key. + +// 416 +// 00:56:42.152 --> 00:56:44.196 +// Well, he won't mind. + +// 417 +// 00:56:55.499 --> 00:56:56.875 +// Come on in. + +// 418 +// 00:56:57.918 --> 00:57:01.088 +// Hey, Vito, come on in! + +// 419 +// 00:57:23.110 --> 00:57:25.028 +// This is your friend's place? + +// 420 +// 00:57:27.739 --> 00:57:29.700 +// This is a real palace. + +// 421 +// 00:57:30.200 --> 00:57:31.910 +// One of the best. + +// 422 +// 00:57:38.500 --> 00:57:40.544 +// Vito, give me a hand, will you? + +// 423 +// 00:59:37.119 --> 00:59:40.038 +// Look how pretty it is, Santino! + +// 424 +// 01:02:08.479 --> 01:02:09.980 +// Come on in. + +// 425 +// 01:02:12.483 --> 01:02:15.360 +// It's all right. Hyman's in there. + +// 426 +// 01:02:15.444 --> 01:02:20.324 +// -Would you like a tuna sandwich? +// -No, thank you. + +// 427 +// 01:02:26.872 --> 01:02:30.375 +// ...pick up of two by Holden. +// Second and eight for S.C... + +// 428 +// 01:02:31.543 --> 01:02:35.214 +// -Mr. Roth? +// -Come in, Michael. + +// 429 +// 01:02:37.132 --> 01:02:39.718 +// Sit down, make yourself comfortable. + +// 430 +// 01:02:41.553 --> 01:02:43.639 +// It's almost over. + +// 431 +// 01:02:45.432 --> 01:02:50.270 +// -Do you follow the football game? +// -Not for a while I haven't. + +// 432 +// 01:02:50.813 --> 01:02:53.941 +// I enjoy watching football +// in the afternoon. + +// 433 +// 01:02:54.024 --> 01:02:59.112 +// One of the things I love +// about this country. Baseball too. + +// 434 +// 01:03:01.198 --> 01:03:06.453 +// Ever since Arnold Rothstein +// fixed the World Series in 1919. + +// 435 +// 01:03:11.041 --> 01:03:13.377 +// I heard you had some trouble. + +// 436 +// 01:03:16.129 --> 01:03:17.923 +// Stupid. + +// 437 +// 01:03:19.007 --> 01:03:22.052 +// People behaving like that with guns. + +// 438 +// 01:03:23.929 --> 01:03:26.723 +// The important thing is you're all right. + +// 439 +// 01:03:26.807 --> 01:03:29.935 +// Good health is the most important thing. + +// 440 +// 01:03:30.894 --> 01:03:33.814 +// More than success, more than money. + +// 441 +// 01:03:35.357 --> 01:03:37.025 +// More than power. + +// 442 +// 01:03:51.540 --> 01:03:55.377 +// I came here because +// there's going to be more bloodshed. + +// 443 +// 01:03:55.544 --> 01:03:59.548 +// I wanted you to know, +// so another war won't start. + +// 444 +// 01:04:00.757 --> 01:04:03.719 +// Nobody wants another war. + +// 445 +// 01:04:03.802 --> 01:04:09.641 +// Frank Pentangeli asked my permission +// to get rid of the Rosato brothers. + +// 446 +// 01:04:09.725 --> 01:04:13.520 +// When I refused he tried to have me +// killed. He was stupid, I was lucky. + +// 447 +// 01:04:13.604 --> 01:04:15.606 +// I'll visit him soon. + +// 448 +// 01:04:15.731 --> 01:04:20.527 +// The important thing is that nothing +// interferes with our plans for the future. + +// 449 +// 01:04:21.612 --> 01:04:24.114 +// Nothing is more important. + +// 450 +// 01:04:25.949 --> 01:04:31.079 +// -You're a wise and considerate man. +// -And you're a great man, Mr. Roth. + +// 451 +// 01:04:31.997 --> 01:04:37.002 +// -There's much I can learn from you. +// -Whatever I can do to help, Michael. + +// 452 +// 01:04:39.213 --> 01:04:41.924 +// -Excuse me. Lunch. +// -Come in. + +// 453 +// 01:04:42.049 --> 01:04:46.845 +// -Thank you, my dear. +// -You're going to break your eardrums. + +// 454 +// 01:04:47.888 --> 01:04:50.349 +// -Enjoy it. +// -Thank you. + +// 455 +// 01:04:55.979 --> 01:04:58.732 +// You're young, I'm old and sick. + +// 456 +// 01:04:59.817 --> 01:05:03.821 +// What we'll do in the next few months +// will make history. + +// 457 +// 01:05:05.989 --> 01:05:07.991 +// It's never been done before. + +// 458 +// 01:05:08.075 --> 01:05:12.746 +// Not even your father would dream +// that such a thing could be possible. + +// 459 +// 01:05:14.706 --> 01:05:19.294 +// Frank Pentangeli is a dead man. +// You don't object? + +// 460 +// 01:05:20.671 --> 01:05:23.674 +// He's small potatoes. + +// 461 +// 01:05:33.392 --> 01:05:35.853 +// What's up? + +// 462 +// 01:05:38.230 --> 01:05:40.607 +// We got company? + +// 463 +// 01:05:54.413 --> 01:05:55.706 +// What's going on? + +// 464 +// 01:05:55.873 --> 01:05:57.875 +// Michael Corleone is here. + +// 465 +// 01:06:00.294 --> 01:06:01.295 +// Where is he? + +// 466 +// 01:06:01.378 --> 01:06:03.213 +// He's in your den. You better hurry. + +// 467 +// 01:06:04.006 --> 01:06:05.966 +// He's been waiting a half hour. + +// 468 +// 01:06:13.182 --> 01:06:15.350 +// Is something wrong? + +// 469 +// 01:06:21.190 --> 01:06:23.233 +// I wish you would have let me know +// you were coming. + +// 470 +// 01:06:23.317 --> 01:06:27.237 +// -I could have prepared something. +// -I didn't want you to know. + +// 471 +// 01:06:34.912 --> 01:06:38.832 +// -You heard what happened? +// -I almost died. We were so relieved... + +// 472 +// 01:06:38.957 --> 01:06:41.084 +// In my home! + +// 473 +// 01:06:43.921 --> 01:06:47.007 +// In my bedroom where my wife sleeps! + +// 474 +// 01:06:49.801 --> 01:06:52.137 +// Where my children come to play. + +// 475 +// 01:06:53.806 --> 01:06:55.849 +// In my home. + +// 476 +// 01:07:12.908 --> 01:07:15.828 +// I want you to help me take my revenge. + +// 477 +// 01:07:15.911 --> 01:07:19.581 +// Michael, anything. What can I do? + +// 478 +// 01:07:22.793 --> 01:07:26.046 +// Settle these troubles +// with the Rosato brothers. + +// 479 +// 01:07:26.129 --> 01:07:28.715 +// I don't understand. I don't... + +// 480 +// 01:07:28.799 --> 01:07:33.804 +// I don't have your brain for big deals. +// But this is a street thing. + +// 481 +// 01:07:33.887 --> 01:07:38.684 +// That Hyman Roth in Miami. +// He's backing up those sons-of-bitches. + +// 482 +// 01:07:38.767 --> 01:07:43.564 +// -I know he is. +// -So why ask me to lay down to them? + +// 483 +// 01:07:49.653 --> 01:07:52.781 +// It was Hyman Roth +// that tried to have me killed. + +// 484 +// 01:07:54.533 --> 01:07:57.077 +// I know it was him. + +// 485 +// 01:07:58.078 --> 01:08:00.205 +// Jesus Christ, Mike. + +// 486 +// 01:08:00.289 --> 01:08:05.085 +// Jesus Christ, let's get them all. +// Now while we've got the muscle. + +// 487 +// 01:08:10.174 --> 01:08:13.051 +// This used to be my father's old study. + +// 488 +// 01:08:14.219 --> 01:08:16.513 +// It's changed. + +// 489 +// 01:08:17.514 --> 01:08:21.685 +// I remember there used to be +// a big desk here. + +// 490 +// 01:08:24.855 --> 01:08:30.068 +// I remember when I was a kid. We had +// to be quiet when we played near here. + +// 491 +// 01:08:37.868 --> 01:08:41.371 +// I was very happy that this house +// never went to strangers. + +// 492 +// 01:08:42.748 --> 01:08:46.460 +// First Clemenza took it over. Now you. + +// 493 +// 01:08:48.378 --> 01:08:52.799 +// My father taught me many things here. +// He taught me in this room. + +// 494 +// 01:08:57.137 --> 01:09:03.227 +// He taught me, "Keep your friends close, +// but your enemies closer. " + +// 495 +// 01:09:03.310 --> 01:09:09.483 +// If Hyman Roth sees that I interceded +// in this, in the Rosato brothers' favor, + +// 496 +// 01:09:09.566 --> 01:09:13.028 +// he'll think his relationship with me +// is still good. + +// 497 +// 01:09:15.906 --> 01:09:18.283 +// That's what I want him to think. + +// 498 +// 01:09:19.201 --> 01:09:23.121 +// I want him relaxed and confident +// in our friendship. + +// 499 +// 01:09:23.747 --> 01:09:27.751 +// Then I'll be able to find out +// who the traitor in my family was. + +// 500 +// 01:09:55.279 --> 01:09:58.740 +// -Yeah? +// -Fredo, this is Johnny Ola. + +// 501 +// 01:09:59.491 --> 01:10:03.287 +// -We need some more help. +// -Johnny? + +// 502 +// 01:10:04.413 --> 01:10:07.249 +// Jesus Christ, what the hell time is it? + +// 503 +// 01:10:07.332 --> 01:10:10.127 +// -Who's that, honey? +// -Listen good, Fredo. + +// 504 +// 01:10:10.294 --> 01:10:13.505 +// Why are you calling me? +// I don't want to talk to you. + +// 505 +// 01:10:13.672 --> 01:10:17.050 +// Pentangeli is going to accept +// the Rosato brothers' deal. + +// 506 +// 01:10:17.217 --> 01:10:19.303 +// -Oh, God. +// -Will he come alone? + +// 507 +// 01:10:19.469 --> 01:10:22.639 +// I don't know. You've got me in +// deep enough already. + +// 508 +// 01:10:22.806 --> 01:10:27.978 +// Everything will be all right. Pentangeli +// says he's willing to make a deal. + +// 509 +// 01:10:28.145 --> 01:10:32.566 +// All we want to know is if he's on +// the level, or if he'll bring his boys. + +// 510 +// 01:10:32.733 --> 01:10:35.861 +// You lied to me. I don't want you +// to call me anymore. + +// 511 +// 01:10:36.028 --> 01:10:40.908 +// -Your brother won't find out we talked. +// -I don't know what you're talking about. + +// 512 +// 01:10:51.460 --> 01:10:55.339 +// -Who was that? +// -Wrong number. + +// 513 +// 01:11:02.513 --> 01:11:06.725 +// -Frankie, I've got nobody here. +// -Wait in the car, Cicc'. + +// 514 +// 01:11:06.809 --> 01:11:09.520 +// -Frankie. +// -That's okay, Cicc'. + +// 515 +// 01:11:16.527 --> 01:11:20.823 +// -What's this? +// -A lucky C note for our new deal. + +// 516 +// 01:11:23.492 --> 01:11:26.328 +// Ritchie. Give us a taste. + +// 517 +// 01:11:31.124 --> 01:11:34.503 +// We were all real happy +// about your decision, Frankie. + +// 518 +// 01:11:34.586 --> 01:11:38.882 +// -You won't regret it. +// -I don't like the C note, Rosato. + +// 519 +// 01:11:38.966 --> 01:11:41.635 +// I take that as an insult. + +// 520 +// 01:11:41.718 --> 01:11:44.721 +// Michael Corleone says hello! + +// 521 +// 01:12:01.905 --> 01:12:04.241 +// Close the door! + +// 522 +// 01:12:04.324 --> 01:12:06.368 +// Your friend the cop... + +// 523 +// 01:12:06.451 --> 01:12:11.039 +// Hey, Ritch. It's dark in here. +// Are you open or closed? + +// 524 +// 01:12:11.123 --> 01:12:14.960 +// I just came in to clean up a little, +// you know? + +// 525 +// 01:12:17.337 --> 01:12:19.381 +// What's the matter? + +// 526 +// 01:12:19.464 --> 01:12:22.551 +// -Is that something on the floor? +// -Carmine, not here! + +// 527 +// 01:12:22.634 --> 01:12:24.136 +// Anthony! + +// 528 +// 01:12:27.389 --> 01:12:31.101 +// You open this bar +// and I'll blow your head in! + +// 529 +// 01:13:16.814 --> 01:13:19.274 +// Freddy, it's good to see you. + +// 530 +// 01:13:21.652 --> 01:13:26.448 +// -How is he? +// -He's okay. He's in the back. + +// 531 +// 01:13:30.160 --> 01:13:32.663 +// Girls, take a hike. + +// 532 +// 01:13:35.582 --> 01:13:37.835 +// In this room here. + +// 533 +// 01:13:40.546 --> 01:13:44.216 +// -I want to talk to him alone first. +// -Come on. + +// 534 +// 01:13:52.933 --> 01:13:55.686 +// I thought I could help you, Senator. + +// 535 +// 01:13:59.523 --> 01:14:01.358 +// Hagen? + +// 536 +// 01:14:02.484 --> 01:14:06.697 +// -Listen, I did not... +// -It's all right. + +// 537 +// 01:14:06.864 --> 01:14:11.618 +// -I didn't do anything. +// -It's okay. You're very lucky. + +// 538 +// 01:14:12.411 --> 01:14:17.082 +// My brother Fredo operates this place. +// He was called before anyone. + +// 539 +// 01:14:18.375 --> 01:14:22.212 +// Had this happened some place else, +// we couldn't have helped you. + +// 540 +// 01:14:25.090 --> 01:14:28.468 +// When I woke up, I was on the floor. + +// 541 +// 01:14:29.386 --> 01:14:33.807 +// -And I don't know how it happened. +// -You can't remember? + +// 542 +// 01:14:37.060 --> 01:14:39.229 +// I passed out. + +// 543 +// 01:14:55.329 --> 01:14:58.457 +// Just a game. Jesus. + +// 544 +// 01:15:09.092 --> 01:15:11.470 +// Jesus, Jesus! + +// 545 +// 01:15:16.016 --> 01:15:18.185 +// Jesus God! + +// 546 +// 01:15:18.268 --> 01:15:19.895 +// God! + +// 547 +// 01:15:22.898 --> 01:15:26.527 +// I don't know, and I don't understand +// why I can't remember. + +// 548 +// 01:15:26.610 --> 01:15:29.822 +// Doesn't matter, just do as I say. + +// 549 +// 01:15:29.905 --> 01:15:35.410 +// Put in a call to your office. +// Explain that you'll be there tomorrow. + +// 550 +// 01:15:36.453 --> 01:15:41.166 +// You decided to spend the night at +// Michael Corleone's house in Tahoe. + +// 551 +// 01:15:41.291 --> 01:15:45.879 +// -As his guest. +// -I do remember that she was laughing. + +// 552 +// 01:15:48.131 --> 01:15:53.637 +// We'd done it before, and I know +// that I could not have hurt that girl. + +// 553 +// 01:15:54.471 --> 01:15:58.559 +// This girl has no family. +// Nobody knows that she worked here. + +// 554 +// 01:15:58.642 --> 01:16:01.645 +// It'll be as though she never existed. + +// 555 +// 01:16:03.981 --> 01:16:06.942 +// All that's left is our friendship. + +// 556 +// 01:16:21.999 --> 01:16:25.210 +// -Yes? +// -Sorry, but we're not to let you through. + +// 557 +// 01:16:26.503 --> 01:16:30.591 +// -I'm just going to the market. +// -We'll pick up anything you want. + +// 558 +// 01:16:30.674 --> 01:16:33.760 +// -Whose orders are these? +// -Mr. Hagen's. He's coming. + +// 559 +// 01:16:33.844 --> 01:16:36.305 +// I'll speak to him. + +// 560 +// 01:16:42.102 --> 01:16:45.689 +// I wanted to explain, +// but I had business in Carson City. + +// 561 +// 01:16:45.856 --> 01:16:50.194 +// It's Michael's request for your safety. +// We'll get anything you need. + +// 562 +// 01:16:50.319 --> 01:16:55.616 +// -So I'm supposed to stay in my house? +// -No, within the compound will be fine. + +// 563 +// 01:16:55.699 --> 01:16:58.660 +// -We were going to New England. +// -That's off. + +// 564 +// 01:16:59.620 --> 01:17:02.623 +// -Am I a prisoner? +// -That's not how we see it, Kay. + +// 565 +// 01:17:03.582 --> 01:17:06.835 +// Come on, kids. +// We're going back to the house. + +// 566 +// 01:17:08.295 --> 01:17:10.214 +// Joe. + +// 567 +// 01:17:55.926 --> 01:17:57.719 +// Cuba, Cuba! + +// 568 +// 01:18:38.802 --> 01:18:41.847 +// Most respected gentlemen. + +// 569 +// 01:18:41.930 --> 01:18:44.141 +// Welcome to Havana. + +// 570 +// 01:18:46.226 --> 01:18:51.440 +// I want to thank this distinguished group +// of American industrialists + +// 571 +// 01:18:53.150 --> 01:18:56.111 +// for continuing to work with Cuba + +// 572 +// 01:18:56.820 --> 01:18:59.990 +// for the greatest period of prosperity + +// 573 +// 01:19:00.866 --> 01:19:03.660 +// in her entire history. + +// 574 +// 01:19:04.036 --> 01:19:06.079 +// Mr. William Shaw, + +// 575 +// 01:19:06.163 --> 01:19:08.999 +// representing +// the General Fruit Company. + +// 576 +// 01:19:09.917 --> 01:19:12.002 +// Messrs. Corngold and Dant, + +// 577 +// 01:19:12.878 --> 01:19:15.839 +// of United Telephone +// and Telegraph Company. + +// 578 +// 01:19:17.174 --> 01:19:18.634 +// Mr. Petty, + +// 579 +// 01:19:18.717 --> 01:19:22.679 +// Regional Vice President of +// the Pan American Mining Corporation. + +// 580 +// 01:19:24.515 --> 01:19:27.351 +// Mr. Robert Allen +// of South American Sugar. + +// 581 +// 01:19:29.228 --> 01:19:31.563 +// Mr. Michael Corleone of Nevada, + +// 582 +// 01:19:33.190 --> 01:19:37.736 +// representing our associates +// in tourism and leisure activities. + +// 583 +// 01:19:37.820 --> 01:19:41.448 +// And my old friend and associate +// from Florida, + +// 584 +// 01:19:43.075 --> 01:19:44.910 +// Mr. Hyman Roth. + +// 585 +// 01:19:45.202 --> 01:19:50.374 +// I would like to thank United Telephone +// and Telegraph for their Christmas gift. + +// 586 +// 01:19:55.629 --> 01:19:57.881 +// A solid gold telephone. + +// 587 +// 01:20:00.259 --> 01:20:03.762 +// Perhaps you gentlemen +// would like to look at it. + +// 588 +// 01:20:04.555 --> 01:20:06.390 +// -Mr. President? +// -Yes? + +// 589 +// 01:20:06.473 --> 01:20:12.146 +// Could you discuss the rebel activity and +// what this can mean to our businesses? + +// 590 +// 01:20:12.604 --> 01:20:13.856 +// -Of course. +// -Heavy stuff. + +// 591 +// 01:20:13.939 --> 01:20:19.611 +// I assure you that, although the rebels +// have started a campaign in Las Villas, + +// 592 +// 01:20:26.285 --> 01:20:32.040 +// my staff indicates, with assurance, +// that we'll drive them out of Santa Clara + +// 593 +// 01:20:32.124 --> 01:20:34.168 +// before the New Year. + +// 594 +// 01:20:35.961 --> 01:20:37.963 +// I want to put you all at ease. + +// 595 +// 01:20:38.839 --> 01:20:43.051 +// We will tolerate no guerrillas +// in the casinos or the swimming pools. + +// 596 +// 01:21:01.278 --> 01:21:03.530 +// He said that they're making an arrest, + +// 597 +// 01:21:03.614 --> 01:21:06.366 +// and in a few minutes +// he'll let us through. + +// 598 +// 01:21:06.450 --> 01:21:07.534 +// Johnny... + +// 599 +// 01:21:07.618 --> 01:21:08.660 +// It's nothing. + +// 600 +// 01:21:09.453 --> 01:21:12.122 +// Just some lousy bandits. +// The police are cleaning them up. + +// 601 +// 01:21:15.292 --> 01:21:16.668 +// Viva Fidel! + +// 602 +// 01:21:32.392 --> 01:21:37.356 +// I hope my age is correct. +// I'm always accurate about my age. + +// 603 +// 01:21:38.524 --> 01:21:42.361 +// Make sure that everybody +// sees the cake before we cut it. + +// 604 +// 01:21:45.405 --> 01:21:48.033 +// I'm very pleased + +// 605 +// 01:21:48.116 --> 01:21:52.746 +// you're all able to come from +// such distances to be with me today. + +// 606 +// 01:21:54.289 --> 01:21:57.167 +// When a man comes +// to this point in his life, + +// 607 +// 01:21:58.544 --> 01:22:01.922 +// he wants to turn over +// the things he's been blessed with. + +// 608 +// 01:22:02.005 --> 01:22:07.136 +// Turn them over to friends, +// as a reward for the friends he's had + +// 609 +// 01:22:08.387 --> 01:22:13.642 +// and to make sure that everything +// goes well after he's gone. + +// 610 +// 01:22:13.725 --> 01:22:16.395 +// -Not for years. +// -Hear, hear! + +// 611 +// 01:22:16.520 --> 01:22:20.691 +// We'll see. The doctors would disagree, +// but what do they know? + +// 612 +// 01:22:22.025 --> 01:22:26.947 +// These are wonderful things +// that we've achieved in Havana + +// 613 +// 01:22:27.030 --> 01:22:30.117 +// and there's no limit +// to where we can go from here. + +// 614 +// 01:22:30.200 --> 01:22:34.955 +// This kind of government knows +// how to help business, to encourage it. + +// 615 +// 01:22:35.038 --> 01:22:39.084 +// The hotels here are bigger +// and swankier + +// 616 +// 01:22:39.168 --> 01:22:41.545 +// than any of the joints in Vegas. + +// 617 +// 01:22:42.171 --> 01:22:45.132 +// We can thank our friends +// in the Cuban government + +// 618 +// 01:22:45.215 --> 01:22:49.970 +// which has put up half the cash with the +// Teamsters, on a dollar for dollar basis + +// 619 +// 01:22:50.053 --> 01:22:52.890 +// and has relaxed restrictions on imports. + +// 620 +// 01:22:52.973 --> 01:22:57.436 +// What I'm saying is that we have now +// what we have always needed... + +// 621 +// 01:22:57.519 --> 01:23:00.314 +// Real partnership with a government. + +// 622 +// 01:23:00.397 --> 01:23:02.399 +// Smaller piece. + +// 623 +// 01:23:03.192 --> 01:23:08.030 +// You all know Michael Corleone +// and we all remember his father. + +// 624 +// 01:23:08.113 --> 01:23:11.825 +// At the time of my retirement, or death, + +// 625 +// 01:23:11.909 --> 01:23:17.831 +// I turn over all my interests +// in the Havana operation to his control. + +// 626 +// 01:23:17.915 --> 01:23:21.752 +// But, all of you will share. + +// 627 +// 01:23:21.835 --> 01:23:25.714 +// The Nacionale will go +// to the Lakeville Road Boys, + +// 628 +// 01:23:25.797 --> 01:23:29.176 +// the Capri to the Corleone family, + +// 629 +// 01:23:29.259 --> 01:23:31.678 +// the Sevilla Biltmore also, + +// 630 +// 01:23:31.762 --> 01:23:35.349 +// but Eddie Levine will bring in the +// Pennino brothers, + +// 631 +// 01:23:35.432 --> 01:23:37.684 +// Dino and Eddie, for a piece + +// 632 +// 01:23:37.768 --> 01:23:40.521 +// and to handle the casino operations. + +// 633 +// 01:23:40.604 --> 01:23:44.066 +// We've saved a piece +// for some friends in Nevada + +// 634 +// 01:23:44.149 --> 01:23:47.903 +// to make sure that things go smoothly +// back home. + +// 635 +// 01:23:50.113 --> 01:23:55.035 +// I want all of you to enjoy your cake. +// So, enjoy! + +// 636 +// 01:23:55.118 --> 01:23:57.579 +// -Happy birthday! +// -L'chaim! + +// 637 +// 01:23:58.789 --> 01:24:01.542 +// I saw an interesting thing happen today. + +// 638 +// 01:24:02.835 --> 01:24:06.004 +// A rebel was being arrested +// by the military police. + +// 639 +// 01:24:06.129 --> 01:24:10.551 +// Rather than be taken alive, he exploded +// a grenade he had in his jacket. + +// 640 +// 01:24:10.634 --> 01:24:14.221 +// He killed himself and took a captain +// of the command with him. + +// 641 +// 01:24:14.304 --> 01:24:18.142 +// -Those rebels are lunatics. +// -Maybe so. + +// 642 +// 01:24:19.810 --> 01:24:24.731 +// But it occurred to me, that the soldiers +// are paid to fight, the rebels aren't. + +// 643 +// 01:24:24.815 --> 01:24:28.610 +// -What does that tell you? +// -They can win. + +// 644 +// 01:24:30.946 --> 01:24:34.658 +// This country has had rebels +// for 50 years. It's in their blood. + +// 645 +// 01:24:34.741 --> 01:24:38.537 +// I know, I've been coming here +// since the Twenties. + +// 646 +// 01:24:38.620 --> 01:24:42.416 +// We were running molasses +// from Havana when you were a baby. + +// 647 +// 01:24:42.499 --> 01:24:45.085 +// The trucks were owned by your father. + +// 648 +// 01:24:46.170 --> 01:24:47.796 +// Michael. + +// 649 +// 01:24:54.845 --> 01:24:59.016 +// I'd rather we talked about this +// when we're alone. + +// 650 +// 01:25:00.684 --> 01:25:03.770 +// The two million never got to the island. + +// 651 +// 01:25:09.359 --> 01:25:12.529 +// It mustn't be known +// that you held back the money + +// 652 +// 01:25:12.613 --> 01:25:15.115 +// because you worried about the rebels. + +// 653 +// 01:25:21.872 --> 01:25:25.209 +// Sit down, Michael. Sit down. + +// 654 +// 01:25:32.800 --> 01:25:36.678 +// If I could only live to see it, +// to be there with you. + +// 655 +// 01:25:39.181 --> 01:25:43.393 +// What I wouldn't give for 20 more years. + +// 656 +// 01:25:45.229 --> 01:25:49.483 +// Here we are, protected. Free to make +// our profits without Kefauver, + +// 657 +// 01:25:49.566 --> 01:25:53.320 +// the goddamn Justice Department +// and the FBI. + +// 658 +// 01:25:54.029 --> 01:25:57.574 +// 90 miles away, in partnership +// with a friendly government. + +// 659 +// 01:25:58.742 --> 01:26:02.204 +// 90 miles. It's nothing. + +// 660 +// 01:26:03.330 --> 01:26:08.418 +// Just one small step for a man looking +// to be President of the United States + +// 661 +// 01:26:09.169 --> 01:26:12.089 +// and having the cash +// to make it possible. + +// 662 +// 01:26:12.506 --> 01:26:14.049 +// Michael, + +// 663 +// 01:26:15.926 --> 01:26:18.345 +// we're bigger than U.S. Steel. + +// 664 +// 01:26:45.122 --> 01:26:48.125 +// Mikey, how are you? Okay? + +// 665 +// 01:26:49.418 --> 01:26:54.131 +// -Hi! Freddy Corleone. +// -Mio frati. + +// 666 +// 01:26:55.382 --> 01:26:57.426 +// Jesus Christ, what a trip! + +// 667 +// 01:26:57.885 --> 01:27:01.138 +// I thought, "What if somebody knows +// what I've got in here". + +// 668 +// 01:27:01.555 --> 01:27:06.059 +// Can you imagine that? Two million +// dollars on the seat next to me. + +// 669 +// 01:27:09.938 --> 01:27:12.107 +// -Excuse me. +// -It's okay. + +// 670 +// 01:27:14.151 --> 01:27:15.944 +// You want to count it? + +// 671 +// 01:27:19.990 --> 01:27:23.952 +// What's going on? I'm totally in the dark. + +// 672 +// 01:27:24.077 --> 01:27:28.832 +// The family is making an investment in +// Havana. This is a gift for the President. + +// 673 +// 01:27:29.791 --> 01:27:33.337 +// That's great! Havana's great. + +// 674 +// 01:27:34.880 --> 01:27:37.007 +// It's my kind of town. + +// 675 +// 01:27:38.300 --> 01:27:43.055 +// -Anybody I know in Havana? +// -Don't know. Hyman Roth, Johnny Ola? + +// 676 +// 01:27:45.974 --> 01:27:48.644 +// No. I've never met them. + +// 677 +// 01:27:52.231 --> 01:27:56.276 +// Listen, Mikey, I'm kind of... + +// 678 +// 01:28:00.322 --> 01:28:04.701 +// Kind of nervous from the trip. +// Can I get a drink or something? + +// 679 +// 01:28:05.369 --> 01:28:08.038 +// I thought maybe we'd go out together. + +// 680 +// 01:28:08.789 --> 01:28:12.251 +// I know a place where +// we can spend some time together. + +// 681 +// 01:28:14.294 --> 01:28:18.882 +// Sometimes I think I should have +// married a woman like you did. Like Kay. + +// 682 +// 01:28:19.925 --> 01:28:22.803 +// Have kids. Have a family. + +// 683 +// 01:28:25.013 --> 01:28:28.892 +// For once in my life, be more like + +// 684 +// 01:28:29.726 --> 01:28:31.436 +// Pop. + +// 685 +// 01:28:33.772 --> 01:28:38.360 +// It's not easy to be a son, Fredo. +// It's not easy. + +// 686 +// 01:28:38.527 --> 01:28:41.655 +// Mama used to say, +// "You don't belong to me. " + +// 687 +// 01:28:41.738 --> 01:28:45.284 +// "You were left on the doorstep +// by gypsies. " + +// 688 +// 01:28:45.367 --> 01:28:47.494 +// Sometimes I think it's true. + +// 689 +// 01:28:48.412 --> 01:28:50.581 +// You're no gypsy, Fredo. + +// 690 +// 01:28:51.915 --> 01:28:55.752 +// Mikey, I was mad at you. + +// 691 +// 01:29:03.427 --> 01:29:07.014 +// Why didn't we spend time +// like this before? + +// 692 +// 01:29:07.181 --> 01:29:09.766 +// You want a drink, right? Waiter! + +// 693 +// 01:29:13.896 --> 01:29:16.023 +// Por favor... + +// 694 +// 01:29:17.399 --> 01:29:20.277 +// -How do you say Banana Daiquiri? +// -Banana Daiquiri. + +// 695 +// 01:29:20.444 --> 01:29:22.738 +// -That's it? +// -That's it. + +// 696 +// 01:29:22.821 --> 01:29:24.907 +// Uno Banana Daiquiri + +// 697 +// 01:29:25.532 --> 01:29:28.202 +// and a club soda. + +// 698 +// 01:29:35.959 --> 01:29:38.712 +// Senator Geary flies in from Washington +// tomorrow + +// 699 +// 01:29:38.795 --> 01:29:41.340 +// with some government people. + +// 700 +// 01:29:41.423 --> 01:29:45.093 +// I want you to show them +// a good time in Havana. + +// 701 +// 01:29:46.970 --> 01:29:51.099 +// -That's my specialty, right? +// -Can I trust you with something? + +// 702 +// 01:29:51.809 --> 01:29:54.311 +// Of course, Mike. + +// 703 +// 01:29:56.480 --> 01:30:00.234 +// Later in the evening we're all invited +// to the Presidential Palace + +// 704 +// 01:30:00.317 --> 01:30:02.069 +// to bring in the New Year. + +// 705 +// 01:30:02.528 --> 01:30:08.242 +// After it's over they'll take me home +// in a military car, alone. + +// 706 +// 01:30:08.325 --> 01:30:10.077 +// For my protection. + +// 707 +// 01:30:11.078 --> 01:30:14.706 +// Before I reach my hotel, +// I'll be assassinated. + +// 708 +// 01:30:32.766 --> 01:30:35.644 +// -Who? +// -Roth. + +// 709 +// 01:30:41.525 --> 01:30:44.361 +// It was Roth who tried to kill me +// in my home. + +// 710 +// 01:30:46.280 --> 01:30:48.615 +// It was Roth all along. + +// 711 +// 01:30:48.699 --> 01:30:52.703 +// He acts like I'm his son, his successor. + +// 712 +// 01:30:53.745 --> 01:30:56.915 +// But he thinks he'll live forever +// and wants me out. + +// 713 +// 01:31:01.795 --> 01:31:06.425 +// -How can I help? +// -Just go along, as if you know nothing. + +// 714 +// 01:31:06.508 --> 01:31:09.219 +// -I've already made my move. +// -What move? + +// 715 +// 01:31:10.512 --> 01:31:12.890 +// Hyman Roth won't see the New Year. + +// 716 +// 01:31:30.407 --> 01:31:34.328 +// You're to take it easy, +// he'll be back tomorrow. + +// 717 +// 01:31:34.411 --> 01:31:36.788 +// Fly in my own doctor from Miami. + +// 718 +// 01:31:36.872 --> 01:31:39.291 +// I don't trust a doctor +// who can't speak English. + +// 719 +// 01:31:40.792 --> 01:31:43.670 +// -Gracias, señor. +// -Buenas noches. + +// 720 +// 01:31:45.506 --> 01:31:49.218 +// -Honey, go to the casino. +// -If you're feeling better. + +// 721 +// 01:31:49.384 --> 01:31:51.053 +// Feel fine. + +// 722 +// 01:31:52.888 --> 01:31:57.059 +// -Play the bingo game. +// -Okay. Nice to see you, Mr. Paul. + +// 723 +// 01:31:59.561 --> 01:32:04.566 +// My sixth sense tells me Fredo brought +// a bag full of money. Where is it? + +// 724 +// 01:32:07.027 --> 01:32:13.617 +// -You're pulling out? +// -Just want to... Just want to wait. + +// 725 +// 01:32:17.204 --> 01:32:20.707 +// -How do you feel? +// -Terrible. + +// 726 +// 01:32:20.874 --> 01:32:24.461 +// I'd give four million to be able to take +// a painless piss. + +// 727 +// 01:32:25.087 --> 01:32:30.843 +// -Who had Frank Pentangeli killed? +// -The Rosato brothers. + +// 728 +// 01:32:31.009 --> 01:32:34.179 +// I know, but who gave the go-ahead? + +// 729 +// 01:32:35.139 --> 01:32:36.723 +// I know I didn't. + +// 730 +// 01:32:44.648 --> 01:32:49.736 +// There was this kid I grew up with. +// He was younger than me. + +// 731 +// 01:32:49.820 --> 01:32:56.368 +// Sort of looked up to me, you know. +// We did our first work together. + +// 732 +// 01:32:56.451 --> 01:33:00.289 +// Worked our way out of the street. +// Things were good. + +// 733 +// 01:33:01.540 --> 01:33:06.170 +// During Prohibition +// we ran molasses into Canada. + +// 734 +// 01:33:06.253 --> 01:33:09.339 +// Made a fortune. Your father, too. + +// 735 +// 01:33:11.008 --> 01:33:17.014 +// As much as anyone, +// I loved him and trusted him. + +// 736 +// 01:33:19.725 --> 01:33:25.647 +// Later on he had an idea to build a city + +// 737 +// 01:33:25.731 --> 01:33:29.526 +// out of a desert stop-over +// for G. I.s going to the West Coast. + +// 738 +// 01:33:31.403 --> 01:33:35.157 +// That kid's name was Moe Greene + +// 739 +// 01:33:35.240 --> 01:33:38.911 +// and the city he invented was Las Vegas. + +// 740 +// 01:33:40.329 --> 01:33:42.789 +// This was a great man. + +// 741 +// 01:33:42.873 --> 01:33:45.292 +// A man of vision and guts. + +// 742 +// 01:33:45.417 --> 01:33:51.632 +// And there isn't even a plaque, +// signpost or statue of him in that town. + +// 743 +// 01:33:53.634 --> 01:33:57.262 +// Someone put a bullet through his eye. + +// 744 +// 01:33:58.472 --> 01:34:00.808 +// No one knows who gave the order. + +// 745 +// 01:34:01.809 --> 01:34:05.103 +// When I heard it, I wasn't angry. + +// 746 +// 01:34:05.229 --> 01:34:11.151 +// I knew Moe, I knew he was headstrong. +// Talking loud, saying stupid things. + +// 747 +// 01:34:11.235 --> 01:34:16.073 +// So when he turned up dead, I let it go. + +// 748 +// 01:34:17.825 --> 01:34:20.994 +// And I said to myself, + +// 749 +// 01:34:21.078 --> 01:34:25.082 +// "This is the business we've chosen. " + +// 750 +// 01:34:25.165 --> 01:34:27.417 +// I didn't ask + +// 751 +// 01:34:27.960 --> 01:34:33.173 +// who gave the order, because it had +// nothing to do with business. + +// 752 +// 01:34:41.723 --> 01:34:46.228 +// That two million in a bag in your room... + +// 753 +// 01:34:48.480 --> 01:34:52.151 +// I'm going in to take a nap. + +// 754 +// 01:34:52.776 --> 01:34:58.073 +// When I wake, if the money +// is on the table, I know I have a partner. + +// 755 +// 01:34:58.657 --> 01:35:01.785 +// If it isn't, I know I don't. + +// 756 +// 01:35:56.799 --> 01:36:00.969 +// Does everybody know everybody? +// You know Senator Geary. + +// 757 +// 01:36:01.136 --> 01:36:04.306 +// Good to see you, Mike. +// I'm glad we spend this time together. + +// 758 +// 01:36:04.389 --> 01:36:07.351 +// Senator Payton from Florida... + +// 759 +// 01:36:07.643 --> 01:36:10.813 +// Judge DeMalco from New York... + +// 760 +// 01:36:10.979 --> 01:36:13.816 +// Senator Ream from Maryland... + +// 761 +// 01:36:13.941 --> 01:36:16.443 +// Fred Corngold from UTT. + +// 762 +// 01:36:16.527 --> 01:36:20.447 +// -That Fred does a mean cha-cha-cha! +// -He does? + +// 763 +// 01:36:20.531 --> 01:36:22.908 +// Gentlemen, it's refill time! + +// 764 +// 01:36:22.991 --> 01:36:27.454 +// You might try some of the local drinks. +// Cuba Libre, Piña Colada... + +// 765 +// 01:36:27.538 --> 01:36:31.416 +// I think I'll try +// one of those redheaded Yolandas. + +// 766 +// 01:36:31.500 --> 01:36:34.336 +// -That you got! Con gusto... +// -Johnny! + +// 767 +// 01:36:35.504 --> 01:36:39.091 +// You don't know my brother Fredo. +// Johnny Ola, Fredo. + +// 768 +// 01:36:39.258 --> 01:36:42.886 +// -We never met. Johnny Ola. +// -Pleasure. + +// 769 +// 01:36:44.096 --> 01:36:46.557 +// Gentlemen, to a night in Havana! + +// 770 +// 01:36:46.723 --> 01:36:48.350 +// -Happy New Year! +// -Happy New Year! + +// 771 +// 01:36:48.517 --> 01:36:51.436 +// -Feliz Año Nuevo! +// -Happy New Year. + +// 772 +// 01:37:03.115 --> 01:37:07.244 +// -Hey, Freddy, why are we standing? +// -Everybody stands. + +// 773 +// 01:37:07.411 --> 01:37:11.999 +// -It's worth it. You won't believe this. +// -I don't believe it already. + +// 774 +// 01:37:12.082 --> 01:37:15.252 +// -50 dollars, right? +// -You've got a bet, mister. + +// 775 +// 01:37:23.427 --> 01:37:24.928 +// That's Superman. + +// 776 +// 01:37:58.921 --> 01:38:01.173 +// Did I tell you or did I tell you? + +// 777 +// 01:38:02.883 --> 01:38:05.511 +// -I don't believe it! +// -It's got to be fake. + +// 778 +// 01:38:05.677 --> 01:38:08.972 +// It's real. That's why +// he's called Superman. + +// 779 +// 01:38:09.473 --> 01:38:13.519 +// Hey, Freddy, where did you find +// this place? + +// 780 +// 01:38:13.602 --> 01:38:18.023 +// Johnny Ola brought me here. I didn't +// believe it, but seeing is believing! + +// 781 +// 01:38:18.106 --> 01:38:21.568 +// -I see it, but still don't believe it! +// -50 bucks, Pat. + +// 782 +// 01:38:21.652 --> 01:38:25.239 +// Roth won't go here, +// but Johnny knows these places! + +// 783 +// 01:38:26.156 --> 01:38:31.119 +// -Watch, he'll break a cracker with it. +// -I want to see him break a brick! + +// 784 +// 01:39:53.076 --> 01:39:56.455 +// Relax, we're taking you to the hospital. + +// 785 +// 01:40:45.587 --> 01:40:48.006 +// ...and you'll continue to get those. + +// 786 +// 01:40:48.173 --> 01:40:52.594 +// I don't believe that President +// Eisenhower would ever pull out of Cuba + +// 787 +// 01:40:52.678 --> 01:40:56.390 +// as we have over one billion dollars +// invested in this country. + +// 788 +// 01:40:59.893 --> 01:41:03.188 +// The American public +// believe in non-intervention... + +// 789 +// 01:41:03.272 --> 01:41:06.191 +// Fredo! Where are you going? + +// 790 +// 01:41:06.275 --> 01:41:09.903 +// I'm getting a real drink, +// because I can't... + +// 791 +// 01:42:05.459 --> 01:42:09.004 +// What kept Mr. Roth? +// I understood he was coming. + +// 792 +// 01:42:09.087 --> 01:42:12.633 +// Reeves, what's the protocol? +// How long should we stay? + +// 793 +// 01:42:14.051 --> 01:42:18.972 +// I think a half hour ought to do it. Just +// long enough to bring in the New Year. + +// 794 +// 01:42:34.404 --> 01:42:37.741 +// It's New Year's Eve. Come on, +// just for a minute. + +// 795 +// 01:43:52.649 --> 01:43:56.820 +// There's a plane waiting to take us +// to Miami in an hour. + +// 796 +// 01:43:56.987 --> 01:43:59.615 +// Don't make a big thing about it. + +// 797 +// 01:44:02.993 --> 01:44:06.830 +// I know it was you, Fredo. +// You broke my heart. + +// 798 +// 01:44:08.332 --> 01:44:10.125 +// You broke my heart! + +// 799 +// 01:44:50.332 --> 01:44:54.878 +// Due to serious setbacks to our +// troops in Guantanamo and Santiago... + +// 800 +// 01:44:55.796 --> 01:44:58.132 +// ...my position in Cuba is untenable. + +// 801 +// 01:45:00.509 --> 01:45:04.680 +// I am resigning from office +// to avoid further bloodshed. + +// 802 +// 01:45:05.389 --> 01:45:08.559 +// And I shall leave the city immediately. + +// 803 +// 01:45:12.813 --> 01:45:15.816 +// I wish all of you good luck. + +// 804 +// 01:45:23.198 --> 01:45:26.243 +// Salud! + +// 805 +// 01:45:27.452 --> 01:45:30.873 +// Viva la revolución! Viva Fidel! + +// 806 +// 01:45:52.728 --> 01:45:54.271 +// Fredo! + +// 807 +// 01:45:54.938 --> 01:45:58.901 +// Come on. Come with me. +// It's the only way out of here tonight. + +// 808 +// 01:45:59.485 --> 01:46:01.445 +// Roth is dead. + +// 809 +// 01:46:02.237 --> 01:46:06.450 +// Fredo, come with me! +// You're still my brother. + +// 810 +// 01:46:07.576 --> 01:46:09.077 +// Fredo! + +// 811 +// 01:46:33.685 --> 01:46:36.522 +// I'm Pat Geary, United States Senator. + +// 812 +// 01:47:07.553 --> 01:47:09.513 +// Fidel! Fidel! Fidel! + +// 813 +// 01:47:49.803 --> 01:47:53.390 +// Al. Get me a wet towel. + +// 814 +// 01:47:59.855 --> 01:48:02.733 +// Does Kay know I'm back? + +// 815 +// 01:48:06.820 --> 01:48:09.907 +// My boy? Did you get him +// something for Christmas? + +// 816 +// 01:48:09.990 --> 01:48:13.410 +// -I took care of it. +// -What was it, so I'll know. + +// 817 +// 01:48:13.577 --> 01:48:18.624 +// It was a little car with an electric motor +// that he can ride in. It's nice. + +// 818 +// 01:48:21.126 --> 01:48:23.253 +// Thank you, Al. + +// 819 +// 01:48:24.338 --> 01:48:27.883 +// Fellows, could you step outside +// for a minute? + +// 820 +// 01:48:44.942 --> 01:48:46.693 +// Where's my brother? + +// 821 +// 01:48:47.611 --> 01:48:50.823 +// Roth got out on a private boat. +// He's in a hospital in Miami. + +// 822 +// 01:48:50.906 --> 01:48:55.577 +// He had a stroke, but recovered okay. +// Your bodyguard is dead. + +// 823 +// 01:48:55.661 --> 01:48:57.579 +// I asked about Fredo. + +// 824 +// 01:48:58.580 --> 01:49:01.959 +// I think he got out. +// He must be somewhere in New York. + +// 825 +// 01:49:04.962 --> 01:49:06.380 +// All right. + +// 826 +// 01:49:07.631 --> 01:49:10.425 +// I want you to get in touch with him. + +// 827 +// 01:49:10.509 --> 01:49:13.345 +// I know he's scared. +// Tell him everything is all right. + +// 828 +// 01:49:13.470 --> 01:49:18.809 +// Tell him I know Roth misled him. That +// he didn't know they would try to kill me. + +// 829 +// 01:49:19.726 --> 01:49:23.981 +// -They can come in now. +// -There was something else. + +// 830 +// 01:49:24.982 --> 01:49:26.483 +// What? + +// 831 +// 01:49:33.490 --> 01:49:35.284 +// What? Come on. + +// 832 +// 01:49:37.327 --> 01:49:39.621 +// Kay had a miscarriage. + +// 833 +// 01:49:52.551 --> 01:49:54.928 +// -Was it a boy? +// -At three and a half months... + +// 834 +// 01:49:55.012 --> 01:49:57.931 +// Can't you give me a straight answer? +// Was it a boy? + +// 835 +// 01:50:02.060 --> 01:50:04.646 +// I really don't know. + +// 836 +// 01:50:19.870 --> 01:50:22.873 +// Poor little Fredo, he's got pneumonia. + +// 837 +// 01:51:08.252 --> 01:51:11.964 +// Young man, I hear you and +// your friends are stealing goods. + +// 838 +// 01:51:12.297 --> 01:51:16.093 +// But you don't even send a +// dress to my house. No respect! + +// 839 +// 01:51:16.677 --> 01:51:18.720 +// You know I've got three daughters. + +// 840 +// 01:51:19.221 --> 01:51:20.848 +// This is my neighborhood. + +// 841 +// 01:51:21.723 --> 01:51:25.102 +// You and your friends should +// show me some respect. + +// 842 +// 01:51:26.228 --> 01:51:29.940 +// You should let me wet +// my beak a little. + +// 843 +// 01:51:32.276 --> 01:51:35.946 +// I hear you and your friends +// cleared $600 each. + +// 844 +// 01:51:36.613 --> 01:51:41.118 +// Give me $200 each, for your own +// protection. And I'll forget the insult. + +// 845 +// 01:51:41.493 --> 01:51:46.582 +// You young punks have to learn +// to respect a man like me! + +// 846 +// 01:51:48.876 --> 01:51:51.295 +// Otherwise the cops will +// come to your house. + +// 847 +// 01:51:51.753 --> 01:51:54.298 +// And your family will be ruined. + +// 848 +// 01:51:55.466 --> 01:52:00.804 +// Of course if I'm wrong about how much +// you stole - I'll take a little less. + +// 849 +// 01:52:01.472 --> 01:52:05.476 +// And by less, I only mean - +// a hundred bucks less. + +// 850 +// 01:52:05.809 --> 01:52:07.644 +// Now don't refuse me. + +// 851 +// 01:52:09.605 --> 01:52:11.315 +// Understand, paisan? + +// 852 +// 01:52:17.821 --> 01:52:19.281 +// I understand. + +// 853 +// 01:52:21.700 --> 01:52:26.371 +// My friends and I share all the money. +// So first, I have to talk to them. + +// 854 +// 01:52:27.790 --> 01:52:32.127 +// Tell your friends I don't want a lot. +// Just enough to wet my beak. + +// 855 +// 01:52:36.340 --> 01:52:38.634 +// Don't be afraid to tell them! + +// 856 +// 01:52:41.011 --> 01:52:42.805 +// 600 bucks... + +// 857 +// 01:52:43.096 --> 01:52:45.349 +// Suppose we don't pay? + +// 858 +// 01:52:46.517 --> 01:52:49.978 +// You know his gang, Tessio. +// Real animals. + +// 859 +// 01:52:50.729 --> 01:52:54.149 +// Maranzalla himself let Fanucci +// work this neighborhood. + +// 860 +// 01:52:55.025 --> 01:52:58.529 +// He's got connections with the cops, too. +// We have to pay him. + +// 861 +// 01:52:59.238 --> 01:53:01.198 +// $200 each...everybody agreed? + +// 862 +// 01:53:05.702 --> 01:53:07.204 +// Why do we have to pay him? + +// 863 +// 01:53:07.830 --> 01:53:10.124 +// Vito, leave this to us. + +// 864 +// 01:53:11.708 --> 01:53:14.211 +// He's one person, we're three. + +// 865 +// 01:53:14.503 --> 01:53:17.172 +// He's got guns, we've got guns. + +// 866 +// 01:53:17.714 --> 01:53:21.051 +// Why should we give him the +// money we sweated for? + +// 867 +// 01:53:21.301 --> 01:53:23.512 +// This is his neighborhood! + +// 868 +// 01:53:25.222 --> 01:53:29.726 +// I know two bookies who don't give +// anything to Fanucci. + +// 869 +// 01:53:30.227 --> 01:53:31.770 +// Who? + +// 870 +// 01:53:32.146 --> 01:53:36.150 +// Joe The Greek and Frank Pignattaro. + +// 871 +// 01:53:36.233 --> 01:53:37.734 +// They don't pay Fanucci. + +// 872 +// 01:53:39.528 --> 01:53:44.408 +// If they don't pay Fanucci, then +// somebody else collects for Maranzalla! + +// 873 +// 01:53:45.576 --> 01:53:49.580 +// We'll all be better off if we +// pay him. Don't worry. + +// 874 +// 01:54:05.095 --> 01:54:07.931 +// Now what I say stays in this room. + +// 875 +// 01:54:08.140 --> 01:54:12.978 +// If you both like, why not give me +// $50 each to pay Fanucci? + +// 876 +// 01:54:16.148 --> 01:54:19.485 +// I guarantee he'll accept +// what I give him. + +// 877 +// 01:54:22.112 --> 01:54:24.448 +// If Fanucci says $200... + +// 878 +// 01:54:24.531 --> 01:54:25.949 +// ...he means it, Vito! + +// 879 +// 01:54:26.450 --> 01:54:29.411 +// I'll reason with him. + +// 880 +// 01:54:31.538 --> 01:54:33.540 +// Leave everything to me. + +// 881 +// 01:54:34.166 --> 01:54:36.251 +// I'll take care of everything. + +// 882 +// 01:54:37.920 --> 01:54:40.464 +// I never lie to my friends. + +// 883 +// 01:54:41.298 --> 01:54:44.218 +// Tomorrow you both go talk to Fanucci. + +// 884 +// 01:54:45.260 --> 01:54:47.095 +// He'll ask for the money. + +// 885 +// 01:54:48.013 --> 01:54:52.643 +// Tell him you'll pay whatever +// he wants. Don't argue with him. + +// 886 +// 01:54:53.811 --> 01:54:56.480 +// Then I'll go and get him to agree. + +// 887 +// 01:54:58.690 --> 01:55:01.485 +// Don't argue with him, since +// he's so tough. + +// 888 +// 01:55:02.277 --> 01:55:04.822 +// How can you get him to take less? + +// 889 +// 01:55:05.572 --> 01:55:07.699 +// That's my business. + +// 890 +// 01:55:08.033 --> 01:55:11.411 +// Just remember that I did you a favor. + +// 891 +// 01:55:15.833 --> 01:55:17.417 +// Is it a deal? + +// 892 +// 01:55:18.502 --> 01:55:19.503 +// Yes. + +// 893 +// 01:56:07.384 --> 01:56:09.761 +// His family's out of the house. + +// 894 +// 01:56:10.137 --> 01:56:12.431 +// Fanucci's alone in the cafe. + +// 895 +// 01:56:17.352 --> 01:56:21.064 +// Vito, here's my 50 dollars. +// Buona fortuna. + +// 896 +// 01:56:32.117 --> 01:56:34.703 +// Are you sure he's going to go for it? + +// 897 +// 01:56:38.123 --> 01:56:42.419 +// I'll make an offer he don't refuse. +// Don't worry. + +// 898 +// 01:57:15.452 --> 01:57:20.165 +// It looks like there's - +// $ 100 under my hat. + +// 899 +// 01:57:32.010 --> 01:57:34.221 +// I was right. + +// 900 +// 01:57:35.639 --> 01:57:37.432 +// Only $ 100... + +// 901 +// 01:57:40.811 --> 01:57:43.063 +// I'm short of money right now. + +// 902 +// 01:57:44.940 --> 01:57:49.528 +// I've been out of work...so just +// give me a little time. + +// 903 +// 01:57:50.404 --> 01:57:52.614 +// You understand, don't you? + +// 904 +// 01:58:00.831 --> 01:58:03.459 +// You've got balls, young man! + +// 905 +// 01:58:05.461 --> 01:58:08.505 +// How come I never heard +// of you before? + +// 906 +// 01:58:15.012 --> 01:58:17.431 +// You've got a lot of guts. + +// 907 +// 01:58:21.393 --> 01:58:24.354 +// I'll find you some work +// for good money. + +// 908 +// 01:58:35.741 --> 01:58:39.995 +// No hard feelings, right? If I can +// help you, let me know. + +// 909 +// 01:58:42.790 --> 01:58:45.209 +// You've done well for yourself. + +// 910 +// 01:58:49.129 --> 01:58:51.215 +// Enjoy the festa! + +// 911 +// 02:01:00.511 --> 02:01:02.846 +// Oh, this is too violent for me! + +// 912 +// 02:03:24.863 --> 02:03:26.323 +// What've you got there? + +// 913 +// 02:06:04.982 --> 02:06:08.944 +// Michael, your father loves you +// very much. + +// 914 +// 02:09:34.024 --> 02:09:37.653 +// Mr. Cicci, from the year 1942 +// to the present time, + +// 915 +// 02:09:37.736 --> 02:09:41.240 +// you were an employee +// of the Genco Olive Oil Company? + +// 916 +// 02:09:41.698 --> 02:09:43.325 +// That's right. + +// 917 +// 02:09:44.201 --> 02:09:48.413 +// But in actuality you were a member +// of the Corleone crime organization. + +// 918 +// 02:09:51.375 --> 02:09:55.212 +// No, we called it +// the Corleone family, Senator. + +// 919 +// 02:09:55.587 --> 02:09:58.090 +// What was your position? + +// 920 +// 02:09:59.007 --> 02:10:02.261 +// At first, like everybody else, +// I was a soldier. + +// 921 +// 02:10:02.344 --> 02:10:05.264 +// -What is that? +// -A button, you know, Senator. + +// 922 +// 02:10:05.347 --> 02:10:07.766 +// No, I don't know. Tell me. + +// 923 +// 02:10:09.309 --> 02:10:14.898 +// When the boss says "push a button" on +// a guy, I push a button. See, Senator? + +// 924 +// 02:10:14.982 --> 02:10:16.358 +// Mr. Questadt. + +// 925 +// 02:10:16.900 --> 02:10:19.069 +// -You mean you kill people? +// -What? + +// 926 +// 02:10:19.153 --> 02:10:24.283 +// You kill people at +// the behest of your superiors. + +// 927 +// 02:10:28.078 --> 02:10:29.580 +// Yeah, that's right. + +// 928 +// 02:10:29.663 --> 02:10:35.002 +// And the head of your family +// is Michael Corleone? + +// 929 +// 02:10:35.085 --> 02:10:38.213 +// Yeah, Counselor. Michael Corleone. + +// 930 +// 02:10:38.297 --> 02:10:42.134 +// Did you ever get such an order +// directly from Michael Corleone? + +// 931 +// 02:10:42.926 --> 02:10:45.012 +// No, I never talked to him. + +// 932 +// 02:10:45.095 --> 02:10:49.016 +// Mr. Cicci, could you amplify +// your answer a bit? + +// 933 +// 02:10:49.099 --> 02:10:52.436 +// -Do what? +// -Could you expand on your answer? + +// 934 +// 02:10:52.519 --> 02:10:58.317 +// I'm particularly interested in knowing, +// was there always a buffer involved? + +// 935 +// 02:10:58.442 --> 02:11:02.988 +// Someone in between you +// and your superiors who gave the order. + +// 936 +// 02:11:03.071 --> 02:11:07.534 +// Right, a buffer. +// The family had a lot of buffers! + +// 937 +// 02:11:09.411 --> 02:11:13.582 +// You may find this very amusing, but +// the members of this committee do not. + +// 938 +// 02:11:41.819 --> 02:11:43.987 +// Tell me something, Ma. + +// 939 +// 02:11:48.117 --> 02:11:51.787 +// What did Papa think... +// deep in his heart? + +// 940 +// 02:11:58.377 --> 02:12:00.254 +// He was being strong... + +// 941 +// 02:12:06.718 --> 02:12:08.345 +// Strong for his family. + +// 942 +// 02:12:18.147 --> 02:12:20.816 +// But by being strong for his family... + +// 943 +// 02:12:22.317 --> 02:12:24.153 +// ...could he... + +// 944 +// 02:12:26.071 --> 02:12:27.364 +// ...lose it? + +// 945 +// 02:12:29.324 --> 02:12:34.705 +// You're thinking about your wife... +// about the baby you lost. + +// 946 +// 02:12:36.540 --> 02:12:39.835 +// But you and your wife can +// always have another baby. + +// 947 +// 02:12:41.545 --> 02:12:43.380 +// No, I meant...lose his family + +// 948 +// 02:12:47.718 --> 02:12:51.221 +// But you can never lose your family. + +// 949 +// 02:13:00.731 --> 02:13:02.566 +// Times are changing. + +// 950 +// 02:13:25.088 --> 02:13:27.549 +// It's my pleasure. +// I don't want money. + +// 951 +// 02:13:28.342 --> 02:13:30.052 +// Take it as a gift. + +// 952 +// 02:13:32.971 --> 02:13:37.142 +// If there's something I can do for you, +// you come, we talk. + +// 953 +// 02:13:53.784 --> 02:13:56.662 +// Signora Colombo, why did you +// come to see me? + +// 954 +// 02:13:59.623 --> 02:14:03.127 +// Your wife told me to ask +// if you could help me. + +// 955 +// 02:14:05.796 --> 02:14:07.798 +// She's in bad trouble. + +// 956 +// 02:14:08.465 --> 02:14:12.469 +// Her neighbors complained to the +// landlord about her dog. + +// 957 +// 02:14:13.929 --> 02:14:16.181 +// He told her to get rid of the animal. + +// 958 +// 02:14:17.808 --> 02:14:21.979 +// But her little boy loves that dog. +// So she hid it. + +// 959 +// 02:14:22.604 --> 02:14:26.400 +// When the landlord found out, he +// got mad and told her to leave. + +// 960 +// 02:14:29.278 --> 02:14:32.114 +// Now she can't stay even if she +// gets rid of it. + +// 961 +// 02:14:32.781 --> 02:14:34.450 +// I'm so ashamed! + +// 962 +// 02:14:34.825 --> 02:14:39.288 +// He said he'd get the police to +// throw us out on the street. + +// 963 +// 02:14:42.124 --> 02:14:43.709 +// I'm sorry, but... + +// 964 +// 02:14:45.711 --> 02:14:49.173 +// I could give you a couple dollars +// to help you move. + +// 965 +// 02:14:50.007 --> 02:14:51.467 +// I can't move! + +// 966 +// 02:14:52.843 --> 02:14:54.761 +// I want you to talk to him! + +// 967 +// 02:14:55.345 --> 02:14:58.015 +// Tell him I want to stay here! + +// 968 +// 02:15:05.814 --> 02:15:07.399 +// What's your landlord's name? + +// 969 +// 02:15:07.858 --> 02:15:09.902 +// His name is Signor Roberto. + +// 970 +// 02:15:10.486 --> 02:15:12.905 +// He lives on Fourth Street, near here. + +// 971 +// 02:15:13.530 --> 02:15:16.450 +// They break the windows, +// they dirty the floors... + +// 972 +// 02:15:17.534 --> 02:15:19.077 +// A real pig-sty, eh? + +// 973 +// 02:15:38.180 --> 02:15:42.142 +// My name is Vito Corleone. +// Signora Colombo is a friend of my wife. + +// 974 +// 02:15:43.060 --> 02:15:46.355 +// She says she's been evicted +// for no good reason. + +// 975 +// 02:15:46.897 --> 02:15:51.151 +// She's a poor widow, she has nobody +// to take care of her. + +// 976 +// 02:15:51.401 --> 02:15:55.447 +// She has no relatives, no money. +// All she has is this neighborhood. + +// 977 +// 02:15:55.823 --> 02:15:59.451 +// I already rented the place +// to another family. + +// 978 +// 02:16:04.998 --> 02:16:09.628 +// I told her that I'd talk to you. +// That you're a reasonable man. + +// 979 +// 02:16:10.879 --> 02:16:14.758 +// She got rid of the animal that +// caused all the trouble. + +// 980 +// 02:16:15.300 --> 02:16:17.219 +// So let her stay. + +// 981 +// 02:16:17.302 --> 02:16:18.929 +// Impossible. + +// 982 +// 02:16:19.805 --> 02:16:21.140 +// Are you Sicilian? + +// 983 +// 02:16:21.557 --> 02:16:23.225 +// No, I'm Calabrese. + +// 984 +// 02:16:23.892 --> 02:16:27.187 +// We're practically paisan, +// do me this favor. + +// 985 +// 02:16:27.771 --> 02:16:30.440 +// I already rented it! +// I'll look like an idiot. + +// 986 +// 02:16:31.441 --> 02:16:33.735 +// Besides, the new tenants +// pay more rent. + +// 987 +// 02:16:34.278 --> 02:16:36.697 +// How much more a month? + +// 988 +// 02:16:37.823 --> 02:16:38.907 +// Five bucks. + +// 989 +// 02:16:43.787 --> 02:16:46.832 +// Here's six months increase in advance. + +// 990 +// 02:16:47.708 --> 02:16:50.794 +// But don't tell her about it. +// She's very proud. + +// 991 +// 02:16:51.253 --> 02:16:53.839 +// Come see me in another six months. + +// 992 +// 02:16:55.299 --> 02:16:58.302 +// Of course, the dog stays. Right? + +// 993 +// 02:16:59.094 --> 02:17:00.220 +// The dog stays. + +// 994 +// 02:17:04.808 --> 02:17:08.145 +// Who the hell are you +// to come give me orders? + +// 995 +// 02:17:08.520 --> 02:17:12.566 +// Watch out or I'll kick your Sicilian ass +// right into the street! + +// 996 +// 02:17:15.027 --> 02:17:16.779 +// Do me this favor. + +// 997 +// 02:17:17.654 --> 02:17:19.740 +// I won't forget it. + +// 998 +// 02:17:20.574 --> 02:17:23.869 +// Ask your friends in the +// neighborhood about me. + +// 999 +// 02:17:24.995 --> 02:17:27.664 +// They'll tell you I know how +// to return a favor. + +// 1000 +// 02:17:34.505 --> 02:17:36.423 +// What a character! + +// 1001 +// 02:17:44.348 --> 02:17:49.269 +// That landlord is here... Roberto, +// the one who owns those ratholes. + +// 1002 +// 02:17:56.860 --> 02:18:00.197 +// He's been asking all around +// the neighborhood about you. + +// 1003 +// 02:18:08.205 --> 02:18:10.999 +// I hope I'm not disturbing you, +// Don Vito. + +// 1004 +// 02:18:12.126 --> 02:18:14.378 +// What can I do for you, Don Roberto? + +// 1005 +// 02:18:16.296 --> 02:18:18.340 +// What a misunderstanding! Holy Mary! + +// 1006 +// 02:18:19.675 --> 02:18:22.594 +// Of course Signora Colombo can stay! + +// 1007 +// 02:18:28.809 --> 02:18:31.728 +// I'm giving back the money you gave me. + +// 1008 +// 02:18:33.438 --> 02:18:39.194 +// Un, due, three, four, five, six, tutt'! + +// 1009 +// 02:18:40.070 --> 02:18:44.825 +// Because after all, Don Vito, +// money isn't everything. + +// 1010 +// 02:18:53.417 --> 02:18:55.169 +// Can I sit down? + +// 1011 +// 02:18:58.213 --> 02:19:01.216 +// Your kindness to that widow +// made me ashamed of myself. + +// 1012 +// 02:19:02.259 --> 02:19:05.262 +// The rent stays like before! + +// 1013 +// 02:19:14.855 --> 02:19:16.315 +// I'll even lower it. + +// 1014 +// 02:19:19.151 --> 02:19:20.444 +// I'll lower it $5. + +// 1015 +// 02:19:24.782 --> 02:19:26.325 +// I'll lower it $ 10! + +// 1016 +// 02:19:32.790 --> 02:19:34.875 +// Can I offer you some coffee? + +// 1017 +// 02:19:37.252 --> 02:19:41.882 +// I'm late for an appointment! I can't +// this time! Ask me another time! + +// 1018 +// 02:19:47.304 --> 02:19:49.765 +// You'll have to excuse me for now. + +// 1019 +// 02:19:55.145 --> 02:19:57.272 +// I wish I could stay longer! + +// 1020 +// 02:20:03.237 --> 02:20:05.656 +// Just call me and I'll be here! + +// 1021 +// 02:20:16.667 --> 02:20:19.503 +// He won't be back. He'll hide out +// in the Bronx! + +// 1022 +// 02:20:35.185 --> 02:20:40.023 +// -Vito, what do you think? +// -We'll make a big business! + +// 1023 +// 02:20:47.030 --> 02:20:50.200 +// -New York City. +// -Would you speak up, please? + +// 1024 +// 02:20:50.909 --> 02:20:52.578 +// New York City. + +// 1025 +// 02:20:52.661 --> 02:20:56.290 +// -Are you the son of Vito CorIeone? +// -Yes, I am. + +// 1026 +// 02:20:56.373 --> 02:21:00.043 +// -Where was he born? +// -CorIeone, SiciIy. + +// 1027 +// 02:21:00.210 --> 02:21:06.133 +// Did he at times use an aIias that was +// known in certain circIes as Godfather? + +// 1028 +// 02:21:06.925 --> 02:21:13.098 +// Godfather is a term used by his friends. +// One of affection and respect. + +// 1029 +// 02:21:13.932 --> 02:21:18.395 +// Mr. Chairman, I wouId Iike to verify +// the witness' statement. + +// 1030 +// 02:21:18.479 --> 02:21:23.567 +// For years many of my constituents +// have been of ItaIian descent. + +// 1031 +// 02:21:23.901 --> 02:21:26.320 +// I've come to know them weII. + +// 1032 +// 02:21:26.445 --> 02:21:30.657 +// They have honored me +// with their support and their friendship. + +// 1033 +// 02:21:30.783 --> 02:21:35.996 +// I can proudly say that some of my +// very best friends are ItaIian-Americans. + +// 1034 +// 02:21:37.247 --> 02:21:42.252 +// However, Mr. Chairman, unfortunateIy +// I have to Ieave these proceedings + +// 1035 +// 02:21:42.419 --> 02:21:46.632 +// in order to preside over a very important +// meeting of my own committee. + +// 1036 +// 02:21:47.758 --> 02:21:50.761 +// Before I Ieave, I do want to say this, + +// 1037 +// 02:21:50.844 --> 02:21:55.140 +// that these hearings on the Mafia +// are in no way whatsoever + +// 1038 +// 02:21:55.224 --> 02:21:57.851 +// a sIur upon the great ItaIian peopIe. + +// 1039 +// 02:21:57.935 --> 02:22:01.104 +// I can state from my own knowIedge +// and experience + +// 1040 +// 02:22:01.188 --> 02:22:06.360 +// that ItaIian-Americans are among +// the most IoyaI, most Iaw-abiding, + +// 1041 +// 02:22:06.443 --> 02:22:09.947 +// patriotic, hard-working +// American citizens in this Iand. + +// 1042 +// 02:22:11.031 --> 02:22:16.036 +// It wouId be a shame, Mr. Chairman, +// if we aIIowed a few rotten appIes + +// 1043 +// 02:22:16.120 --> 02:22:18.372 +// to give a bad name to the whoIe barreI. + +// 1044 +// 02:22:18.455 --> 02:22:24.044 +// Because from the time of Christopher +// CoIumbus to the time of Enrico Fermi + +// 1045 +// 02:22:24.128 --> 02:22:26.255 +// to the present day, + +// 1046 +// 02:22:26.421 --> 02:22:30.676 +// ItaIian-Americans have been pioneers +// in buiIding and defending our nation. + +// 1047 +// 02:22:31.135 --> 02:22:36.348 +// They are the saIt of the earth, and +// one of the backbones of this country. + +// 1048 +// 02:22:42.437 --> 02:22:46.233 +// I'm sure we aII agree +// with our esteemed coIIeague. + +// 1049 +// 02:22:46.316 --> 02:22:50.612 +// Mr. CorIeone, you have been advised +// as to your IegaI rights. + +// 1050 +// 02:22:50.696 --> 02:22:56.160 +// We have testimony from +// a previous witness, one WiIIi Cicci. + +// 1051 +// 02:22:57.161 --> 02:23:01.582 +// He stated that you are head of the most +// powerfuI Mafia famiIy in the country. + +// 1052 +// 02:23:01.665 --> 02:23:03.959 +// -Are you? +// -No, I'm not. + +// 1053 +// 02:23:04.042 --> 02:23:07.337 +// He testified that you are +// personaIIy responsibIe + +// 1054 +// 02:23:07.421 --> 02:23:11.425 +// for the murder of a New York +// poIice captain in 1947 + +// 1055 +// 02:23:11.508 --> 02:23:15.095 +// and with him a man +// named VirgiI SoIIozzo. + +// 1056 +// 02:23:15.262 --> 02:23:17.764 +// -Do you deny this? +// -Yes, I do. + +// 1057 +// 02:23:17.931 --> 02:23:21.018 +// Is it true that in the year 1950 + +// 1058 +// 02:23:21.101 --> 02:23:26.482 +// you devised the murder of the heads +// of "the Five FamiIies" in New York + +// 1059 +// 02:23:26.565 --> 02:23:30.152 +// to assume and consoIidate +// your nefarious power? + +// 1060 +// 02:23:30.235 --> 02:23:33.572 +// -It's a compIete faIsehood. +// -Mr. Questadt. + +// 1061 +// 02:23:33.697 --> 02:23:38.410 +// Is it true you have a controIIing interest +// in three major hoteIs in Las Vegas? + +// 1062 +// 02:23:39.536 --> 02:23:44.708 +// No, it's not true. I own some stock in +// some of the hoteIs there, but very IittIe. + +// 1063 +// 02:23:47.336 --> 02:23:51.590 +// I aIso have stock in IBM and IT&T. + +// 1064 +// 02:23:52.674 --> 02:23:58.931 +// Do you have any controI over gambIing +// and narcotics in New York State? + +// 1065 +// 02:23:59.014 --> 02:24:00.557 +// No, I do not. + +// 1066 +// 02:24:00.641 --> 02:24:04.228 +// Senator, my cIient +// wouId Iike to read a statement. + +// 1067 +// 02:24:04.311 --> 02:24:09.900 +// Mr. Chairman, I think this statement +// is totaIIy out of order at this time. + +// 1068 +// 02:24:10.067 --> 02:24:15.906 +// Sir, my cIient has answered this +// committee's questions with sincerity. + +// 1069 +// 02:24:16.073 --> 02:24:21.954 +// He hasn't taken the Fifth Amendment, +// so this statement shouId be heard! + +// 1070 +// 02:24:23.914 --> 02:24:28.877 +// No, I'll allow Mr. Corleone to read +// his statement. I'II put it in the record. + +// 1071 +// 02:24:30.712 --> 02:24:33.841 +// In the hopes of cIearing +// my famiIy name + +// 1072 +// 02:24:33.924 --> 02:24:37.886 +// to give my chiIdren their share +// of the American way of Iife + +// 1073 +// 02:24:37.970 --> 02:24:41.014 +// without a bIemish on their name +// and background, + +// 1074 +// 02:24:41.140 --> 02:24:46.353 +// I have appeared before this committee +// and given it aII my cooperation. + +// 1075 +// 02:24:47.688 --> 02:24:53.235 +// I consider it a great personaI dishonor +// to have to deny that I am a criminaI. + +// 1076 +// 02:24:54.278 --> 02:24:57.614 +// I wish to have the foIIowing noted +// for the record... + +// 1077 +// 02:24:57.781 --> 02:25:01.827 +// That I served my country faithfully +// in WorId War Two + +// 1078 +// 02:25:01.910 --> 02:25:07.124 +// and was awarded the Navy Cross +// for actions in defense of my country. + +// 1079 +// 02:25:07.958 --> 02:25:12.254 +// That I have never been arrested +// or indicted for any crime. + +// 1080 +// 02:25:12.421 --> 02:25:16.383 +// That no proof Iinking me to any +// criminaI conspiracy + +// 1081 +// 02:25:16.467 --> 02:25:21.346 +// whether it is caIIed Mafia +// or Cosa Nostra or any other name + +// 1082 +// 02:25:21.430 --> 02:25:23.765 +// has ever been made pubIic. + +// 1083 +// 02:25:23.932 --> 02:25:25.893 +// I have not taken refuge +// behind the Fifth Amendment, + +// 1084 +// 02:25:25.976 --> 02:25:29.146 +// aIthough it's my right to do so. + +// 1085 +// 02:25:31.982 --> 02:25:37.571 +// I chaIIenge this committee to produce +// any witness or evidence against me + +// 1086 +// 02:25:37.696 --> 02:25:43.619 +// and if they do not, I hope they wiII have +// the decency to cIear my name + +// 1087 +// 02:25:43.702 --> 02:25:47.331 +// with the same pubIicity +// with which they have besmirched it. + +// 1088 +// 02:25:48.707 --> 02:25:54.254 +// I'm sure we're impressed. ParticuIarIy +// with your Iove for our country. + +// 1089 +// 02:25:54.421 --> 02:25:57.174 +// We'II be in recess +// untiI 10:00 a.m. Monday + +// 1090 +// 02:25:57.341 --> 02:26:02.095 +// when we wiII produce a witness who'II +// corroborate the charges against you. + +// 1091 +// 02:26:02.262 --> 02:26:07.267 +// At which time you may very well +// be subject to indictment for perjury. + +// 1092 +// 02:26:07.351 --> 02:26:11.855 +// I remind you that you're stiII +// under subpoena. Adjourned! + +// 1093 +// 02:26:16.944 --> 02:26:18.654 +// Ten-to-one shot, you said. + +// 1094 +// 02:26:18.737 --> 02:26:23.492 +// A ten-to-one shot +// he would take the Fifth, and I'd lose! + +// 1095 +// 02:26:23.575 --> 02:26:28.247 +// You sound like my bookie. +// I owe that monkey my life. + +// 1096 +// 02:26:29.289 --> 02:26:32.835 +// -Well, just get a good night's sleep. +// -Yeah. + +// 1097 +// 02:26:32.918 --> 02:26:35.087 +// You've got a big day tomorrow. + +// 1098 +// 02:26:35.170 --> 02:26:38.799 +// I've got you a new suit, +// new shirt, new tie. + +// 1099 +// 02:26:39.466 --> 02:26:42.761 +// I'll shave you myself in the morning. + +// 1100 +// 02:26:42.928 --> 02:26:46.974 +// You'll look respectable for 50 million +// of your fellow Americans. + +// 1101 +// 02:26:47.057 --> 02:26:52.271 +// Tomorrow... My life won't be worth +// a nickel after tomorrow. + +// 1102 +// 02:26:53.272 --> 02:26:56.900 +// Come on! I saw this 19 times. + +// 1103 +// 02:26:57.985 --> 02:27:01.780 +// You've got a great home here, +// for the rest of your life. + +// 1104 +// 02:27:01.947 --> 02:27:05.075 +// Nobody gets near you, +// you're not going anywhere. + +// 1105 +// 02:27:05.242 --> 02:27:10.164 +// That's great. Beautiful. +// Some deal I made. + +// 1106 +// 02:27:10.247 --> 02:27:13.083 +// You'll live like a king. You'll be a hero. + +// 1107 +// 02:27:13.167 --> 02:27:15.961 +// You'll live better here +// than most people outside. + +// 1108 +// 02:27:16.128 --> 02:27:18.422 +// Some deal! + +// 1109 +// 02:27:21.008 --> 02:27:24.887 +// Alive. Pentangeli is alive. + +// 1110 +// 02:27:26.638 --> 02:27:31.935 +// -How did they get their hands on him? +// -Roth. He engineered it, Michael. + +// 1111 +// 02:27:32.811 --> 02:27:35.189 +// When Frankie went to make a deal with +// the Rosato brothers + +// 1112 +// 02:27:35.272 --> 02:27:37.316 +// they tried to kill him. + +// 1113 +// 02:27:37.399 --> 02:27:39.651 +// He thought you double-crossed him. + +// 1114 +// 02:27:40.694 --> 02:27:44.031 +// Our people with the detectives +// said he was half dead, scared + +// 1115 +// 02:27:44.114 --> 02:27:46.825 +// and shouted that you'd turned on him. + +// 1116 +// 02:27:47.117 --> 02:27:51.288 +// They already had him on possession, +// bookmaking, murder one and more. + +// 1117 +// 02:27:53.123 --> 02:27:58.837 +// The FBI has him airtight. +// He's on an army base, 24 hour guards. + +// 1118 +// 02:27:59.004 --> 02:28:01.632 +// We can't get to him. You've opened +// yourself to five counts of perjury. + +// 1119 +// 02:28:06.386 --> 02:28:09.389 +// What about Fredo? +// What does he know? + +// 1120 +// 02:28:09.473 --> 02:28:13.143 +// He says he doesn't know anything, +// and I believe him. + +// 1121 +// 02:28:13.310 --> 02:28:17.606 +// Roth, he played this one beautifully. + +// 1122 +// 02:28:24.905 --> 02:28:27.699 +// I'm going to talk to Fredo. + +// 1123 +// 02:29:06.947 --> 02:29:09.658 +// I haven't got a lot to say, Mike. + +// 1124 +// 02:29:11.201 --> 02:29:13.704 +// We have time. + +// 1125 +// 02:29:13.871 --> 02:29:17.040 +// I was kept pretty much in the dark. + +// 1126 +// 02:29:18.375 --> 02:29:20.502 +// I didn't know all that much. + +// 1127 +// 02:29:21.420 --> 02:29:26.258 +// What about now? Is there anything +// you can help me out with? + +// 1128 +// 02:29:26.884 --> 02:29:29.094 +// Anything you can tell me now? + +// 1129 +// 02:29:31.054 --> 02:29:33.724 +// They've got Pentangeli. + +// 1130 +// 02:29:48.363 --> 02:29:52.075 +// I didn't know +// it was going to be a hit, Mike. + +// 1131 +// 02:29:52.242 --> 02:29:54.536 +// I swear to God I didn't know. + +// 1132 +// 02:29:57.289 --> 02:30:01.627 +// Johnny Ola bumped into me +// in Beverly Hills. + +// 1133 +// 02:30:03.462 --> 02:30:06.548 +// He said that he wanted to talk. + +// 1134 +// 02:30:08.091 --> 02:30:14.264 +// He said that you and Roth +// were in on a big deal together. + +// 1135 +// 02:30:16.809 --> 02:30:21.146 +// And that there was something in it +// for me if I could help him out. + +// 1136 +// 02:30:21.230 --> 02:30:25.150 +// He said that you were being tough +// on the negotiations + +// 1137 +// 02:30:25.234 --> 02:30:29.613 +// but if they could get a little help +// and close the deal fast, + +// 1138 +// 02:30:31.156 --> 02:30:33.742 +// it would be good for the family. + +// 1139 +// 02:30:35.285 --> 02:30:39.790 +// And you believed that story? +// You believed that? + +// 1140 +// 02:30:39.957 --> 02:30:44.044 +// He said there was something in it +// for me, on my own! + +// 1141 +// 02:30:44.128 --> 02:30:48.257 +// -I've always taken care of you, Fredo. +// -Taken care of me? + +// 1142 +// 02:30:49.591 --> 02:30:52.386 +// You're my kid brother! +// You take care of me? + +// 1143 +// 02:30:53.387 --> 02:30:57.474 +// Did you ever think about that? +// Did you ever once think about that? + +// 1144 +// 02:30:58.559 --> 02:31:02.729 +// "Send Fredo off to do this, +// send Fredo off to do that!" + +// 1145 +// 02:31:03.355 --> 02:31:07.901 +// "Let Fredo take care of some +// Mickey Mouse nightclub somewhere. " + +// 1146 +// 02:31:07.985 --> 02:31:11.071 +// "Let Fredo fetch somebody +// at the airport!" + +// 1147 +// 02:31:11.155 --> 02:31:14.241 +// I'm your older brother, +// but was stepped over! + +// 1148 +// 02:31:14.408 --> 02:31:18.162 +// -It's the way Pop wanted it. +// -It's not the way I wanted it! + +// 1149 +// 02:31:18.954 --> 02:31:23.834 +// I can handle things, I'm smart! +// Not like everybody says. + +// 1150 +// 02:31:24.001 --> 02:31:27.921 +// Like dumb. I'm smart +// and I want respect! + +// 1151 +// 02:31:35.596 --> 02:31:40.809 +// Is there anything you can tell me about +// this investigation? Anything more? + +// 1152 +// 02:31:48.817 --> 02:31:54.865 +// The Senate lawyer, Questadt. +// He belongs to Roth. + +// 1153 +// 02:32:04.541 --> 02:32:06.293 +// Fredo, + +// 1154 +// 02:32:08.754 --> 02:32:11.381 +// you're nothing to me now. + +// 1155 +// 02:32:13.217 --> 02:32:15.677 +// Not a brother, not a friend. + +// 1156 +// 02:32:17.471 --> 02:32:20.474 +// I don't want to know you, +// or what you do. + +// 1157 +// 02:32:21.558 --> 02:32:24.561 +// I don't want to see you at the hotels. + +// 1158 +// 02:32:24.645 --> 02:32:27.231 +// I don't want you near my house. + +// 1159 +// 02:32:29.191 --> 02:32:33.862 +// When you see our mother, I want +// to know in advance, so I won't be there. + +// 1160 +// 02:32:35.447 --> 02:32:37.074 +// You understand? + +// 1161 +// 02:32:46.875 --> 02:32:48.836 +// Mikey. + +// 1162 +// 02:32:55.425 --> 02:32:59.263 +// I don't want anything to happen to him +// while my mother's alive. + +// 1163 +// 02:33:49.146 --> 02:33:52.649 +// There's more people +// than at a ballgame in here. + +// 1164 +// 02:33:52.816 --> 02:33:56.987 +// -Hey, there's Willi Cicci! +// -Frankie Five-Angels... + +// 1165 +// 02:34:16.381 --> 02:34:18.967 +// This committee wiII come to order! + +// 1166 +// 02:34:21.720 --> 02:34:24.515 +// -State your name, pIease. +// -Frank PentangeIi. + +// 1167 +// 02:34:24.598 --> 02:34:28.352 +// -Where were you born? +// -Partinico, it's outside of Palermo. + +// 1168 +// 02:34:28.519 --> 02:34:30.562 +// Where do you Iive now? + +// 1169 +// 02:34:30.729 --> 02:34:35.943 +// I Iive in an army barracks +// with the FBI guys. + +// 1170 +// 02:34:36.985 --> 02:34:41.448 +// We have here a witness +// that wiII further testify + +// 1171 +// 02:34:41.573 --> 02:34:47.955 +// to MichaeI CorIeone's ruIe of a criminaI +// empire that controIs aII gambIing. + +// 1172 +// 02:34:48.205 --> 02:34:53.127 +// This witness has had no buffer +// between himseIf and MichaeI CorIeone. + +// 1173 +// 02:34:53.210 --> 02:34:56.421 +// He can corroborate enough charges + +// 1174 +// 02:34:56.505 --> 02:35:01.176 +// for us to recommend a charge +// of perjury against MichaeI CorIeone. + +// 1175 +// 02:35:01.343 --> 02:35:03.303 +// -Senator. +// -Thank you, Chairman. + +// 1176 +// 02:35:04.680 --> 02:35:06.223 +// Mr. PentangeIi. + +// 1177 +// 02:35:07.432 --> 02:35:13.105 +// Mr. PentangeIi. Were you a member +// of the CorIeone famiIy? + +// 1178 +// 02:35:13.272 --> 02:35:18.318 +// Did you serve under Caporegime, +// Peter Clemenza, + +// 1179 +// 02:35:18.402 --> 02:35:22.948 +// and under Vito Corleone, +// aIso known as the Godfather? + +// 1180 +// 02:35:28.662 --> 02:35:31.290 +// I never knew any Godfather. + +// 1181 +// 02:35:33.834 --> 02:35:35.961 +// I have my own famiIy. + +// 1182 +// 02:35:39.381 --> 02:35:41.925 +// Mr. PentangeIi, you... + +// 1183 +// 02:35:42.092 --> 02:35:46.472 +// You are contradicting +// your own sworn statement. + +// 1184 +// 02:35:46.597 --> 02:35:50.350 +// I ask you again, sir, +// here and now under oath... + +// 1185 +// 02:35:50.434 --> 02:35:54.688 +// were you at any time a member of +// a crime organization + +// 1186 +// 02:35:54.772 --> 02:35:56.648 +// Ied by MichaeI CorIeone? + +// 1187 +// 02:35:56.732 --> 02:35:59.735 +// I don't know nothing about that! + +// 1188 +// 02:36:02.738 --> 02:36:06.700 +// I was in the olive oil business +// with his father + +// 1189 +// 02:36:06.784 --> 02:36:09.453 +// but that was a long time ago. + +// 1190 +// 02:36:10.496 --> 02:36:13.582 +// We have a sworn affidavit. + +// 1191 +// 02:36:15.250 --> 02:36:19.963 +// Your sworn affidavit, that you murdered +// on the orders of MichaeI CorIeone. + +// 1192 +// 02:36:20.088 --> 02:36:24.593 +// Do you deny this confession, and do +// you reaIize what wiII happen if you do? + +// 1193 +// 02:36:24.676 --> 02:36:27.846 +// The FBI guys promised me a deaI + +// 1194 +// 02:36:27.971 --> 02:36:33.644 +// so I made up a Iot of stuff about +// MichaeI CorIeone, just to pIease them. + +// 1195 +// 02:36:33.811 --> 02:36:37.815 +// But it was aII Iies. Everything! + +// 1196 +// 02:36:38.482 --> 02:36:40.651 +// They kept saying, + +// 1197 +// 02:36:40.734 --> 02:36:45.781 +// "MichaeI CorIeone did this" +// and "MichaeI CorIeone did that". + +// 1198 +// 02:36:47.324 --> 02:36:51.328 +// So I said, "Yeah, sure. Why not?" + +// 1199 +// 02:36:51.495 --> 02:36:57.709 +// Mr. Corleone, would you kindly identify +// the gentIeman sitting to your left? + +// 1200 +// 02:36:57.793 --> 02:37:00.003 +// I can answer that. + +// 1201 +// 02:37:00.170 --> 02:37:02.548 +// His name is Vincenzo Pentangeli. + +// 1202 +// 02:37:03.549 --> 02:37:07.886 +// -Is he reIated to the witness? +// -He is, I believe, his brother. + +// 1203 +// 02:37:08.220 --> 02:37:12.850 +// -WiII he come forward and be sworn? +// -He doesn't understand EngIish. + +// 1204 +// 02:37:13.016 --> 02:37:16.061 +// He came at his own expense +// to aid his brother. + +// 1205 +// 02:37:16.895 --> 02:37:20.607 +// He's not under subpoena +// and has an impeccable reputation. + +// 1206 +// 02:37:20.691 --> 02:37:24.486 +// -He knows nothing about this? +// -To my knowledge, nothing. + +// 1207 +// 02:37:24.570 --> 02:37:28.824 +// I'm going to find out what happened! +// This committee is now adjourned. + +// 1208 +// 02:37:29.533 --> 02:37:31.618 +// -The witness is excused. +// -Senator! + +// 1209 +// 02:37:32.703 --> 02:37:36.373 +// Senator! This committee +// owes an apology! + +// 1210 +// 02:37:36.874 --> 02:37:40.878 +// This committee owes an apology. +// Apology, Senator! + +// 1211 +// 02:38:08.489 --> 02:38:12.493 +// -Michael, excuse me. +// -Hello, darling. + +// 1212 +// 02:38:12.910 --> 02:38:16.413 +// The children are outside. We're going. + +// 1213 +// 02:38:17.748 --> 02:38:20.417 +// What do you mean? +// We're leaving tomorrow. + +// 1214 +// 02:38:21.251 --> 02:38:23.670 +// Rocco? + +// 1215 +// 02:38:24.713 --> 02:38:27.299 +// I'll be in my room, Mike. + +// 1216 +// 02:38:30.052 --> 02:38:33.138 +// Michael, I'm not going back to Nevada. + +// 1217 +// 02:38:33.222 --> 02:38:36.642 +// I brought the children +// to say goodbye to you. + +// 1218 +// 02:38:39.728 --> 02:38:42.272 +// I'm very happy for you. + +// 1219 +// 02:38:42.439 --> 02:38:46.944 +// I always knew you were too smart +// to let any of them beat you. + +// 1220 +// 02:38:48.403 --> 02:38:52.991 +// -Why don't you sit down? +// -No, I'm not going to stay long. + +// 1221 +// 02:38:53.158 --> 02:38:56.912 +// There are some things +// I'd like to talk to you about. + +// 1222 +// 02:38:57.079 --> 02:39:02.126 +// Things that have been on my mind, +// changes I want to make. + +// 1223 +// 02:39:02.292 --> 02:39:05.337 +// I think it's too late for changes, Michael. + +// 1224 +// 02:39:06.505 --> 02:39:11.218 +// -I wasn't going to say anything... +// -What do you mean, "too late"? + +// 1225 +// 02:39:16.640 --> 02:39:19.309 +// What really happened with Pentangeli? + +// 1226 +// 02:39:25.107 --> 02:39:30.320 +// -His brother came and helped him. +// -I didn't even know he had a brother. + +// 1227 +// 02:39:30.487 --> 02:39:32.281 +// Where is he now? + +// 1228 +// 02:39:33.615 --> 02:39:36.285 +// He's on a plane, back to Sicily. + +// 1229 +// 02:39:36.952 --> 02:39:39.496 +// All he had to do was show his face. + +// 1230 +// 02:39:41.165 --> 02:39:46.003 +// It was between the brothers, Kay. +// I had nothing to do with it. + +// 1231 +// 02:39:53.844 --> 02:39:57.723 +// I don't want you going! +// Not you, not the kids. No. + +// 1232 +// 02:39:58.849 --> 02:40:02.853 +// You're my wife and my children. +// I love you and won't allow it. + +// 1233 +// 02:40:04.146 --> 02:40:07.983 +// You say you love me, +// but talk about allowing me to leave! + +// 1234 +// 02:40:08.150 --> 02:40:11.862 +// Things between men and women +// will not change. + +// 1235 +// 02:40:12.029 --> 02:40:15.908 +// You've become blind! +// Look what's happened to us. + +// 1236 +// 02:40:16.074 --> 02:40:21.246 +// -Look what's happened to our son! +// -Nothing's happened to him. He's fine! + +// 1237 +// 02:40:21.413 --> 02:40:24.625 +// -Anthony is not fine! +// -I don't want to hear about it. + +// 1238 +// 02:40:24.792 --> 02:40:28.712 +// -Anthony is... +// -I don't want to hear about it! + +// 1239 +// 02:40:30.047 --> 02:40:32.090 +// Over! + +// 1240 +// 02:40:44.103 --> 02:40:47.731 +// At this moment +// I feel no love for you at all. + +// 1241 +// 02:40:48.816 --> 02:40:53.821 +// I never thought that would ever happen, +// but it has. + +// 1242 +// 02:41:08.168 --> 02:41:10.254 +// Kay... + +// 1243 +// 02:41:13.090 --> 02:41:15.259 +// We're leaving tomorrow. + +// 1244 +// 02:41:15.968 --> 02:41:19.138 +// Why don't you take the kids +// back to their room? + +// 1245 +// 02:41:19.221 --> 02:41:25.060 +// -Michael, you haven't heard me. +// -Kay, what do you want from me? + +// 1246 +// 02:41:25.310 --> 02:41:31.692 +// Do you expect me to let you go, +// to let you take my children from me? + +// 1247 +// 02:41:32.484 --> 02:41:38.073 +// Don't you know me? Don't you know +// that that's an impossibility? + +// 1248 +// 02:41:38.157 --> 02:41:42.077 +// That I'd use all my power +// to keep that from happening? + +// 1249 +// 02:41:42.911 --> 02:41:45.289 +// Don't you know that? + +// 1250 +// 02:41:46.957 --> 02:41:48.834 +// Kay... + +// 1251 +// 02:41:51.712 --> 02:41:56.341 +// In time, you'll feel differently. + +// 1252 +// 02:41:57.926 --> 02:42:00.846 +// You'll be glad I stopped you now. + +// 1253 +// 02:42:02.764 --> 02:42:04.767 +// I know that. + +// 1254 +// 02:42:06.769 --> 02:42:10.189 +// I know you blame me +// for losing the baby. + +// 1255 +// 02:42:12.024 --> 02:42:13.108 +// Yes. + +// 1256 +// 02:42:14.359 --> 02:42:17.112 +// I know what that meant to you. + +// 1257 +// 02:42:19.156 --> 02:42:21.283 +// I'll make it up to you, Kay. + +// 1258 +// 02:42:22.159 --> 02:42:24.995 +// I swear I'll make it up to you. I'll... + +// 1259 +// 02:42:26.288 --> 02:42:28.207 +// I'm going to change. + +// 1260 +// 02:42:29.666 --> 02:42:33.837 +// I'll change. I've learned that I have +// the strength to change. + +// 1261 +// 02:42:36.006 --> 02:42:39.009 +// Then you'll forget about +// this miscarriage + +// 1262 +// 02:42:39.843 --> 02:42:44.723 +// and we'll have another child. +// And we'll go on, you and I. + +// 1263 +// 02:42:46.058 --> 02:42:50.229 +// -We'll go on. +// -Oh, Michael! + +// 1264 +// 02:42:51.355 --> 02:42:53.732 +// Michael, you are blind. + +// 1265 +// 02:42:55.567 --> 02:42:57.903 +// It wasn't a miscarriage. + +// 1266 +// 02:42:59.947 --> 02:43:01.490 +// It was an abortion. + +// 1267 +// 02:43:03.367 --> 02:43:08.539 +// An abortion, Michael. +// Just like our marriage is an abortion. + +// 1268 +// 02:43:09.456 --> 02:43:12.918 +// Something that's unholy and evil! + +// 1269 +// 02:43:14.545 --> 02:43:16.880 +// I didn't want your son, Michael! + +// 1270 +// 02:43:17.714 --> 02:43:21.552 +// I wouldn't bring another one +// of your sons into this world! + +// 1271 +// 02:43:23.470 --> 02:43:25.973 +// It was an abortion, Michael. + +// 1272 +// 02:43:26.056 --> 02:43:31.728 +// It was a son and I had it killed +// because this must all end! + +// 1273 +// 02:43:33.313 --> 02:43:37.401 +// I know now that it's over. I knew it then. + +// 1274 +// 02:43:38.819 --> 02:43:43.782 +// There would be no way, Michael, +// no way you could ever forgive me. + +// 1275 +// 02:43:44.241 --> 02:43:48.912 +// Not with this Sicilian thing +// that's been going on for 2,000... + +// 1276 +// 02:43:56.837 --> 02:43:59.715 +// -You won't take my children. +// -I will. + +// 1277 +// 02:43:59.798 --> 02:44:04.178 +// -You won't take my children! +// -They're my children too. + +// 1278 +// 02:45:33.976 --> 02:45:37.521 +// Fredo, give this to Grandmother. + +// 1279 +// 02:47:52.322 --> 02:47:54.324 +// Don Ciccio, it's Tommasino. + +// 1280 +// 02:47:58.245 --> 02:48:01.290 +// Allow me the honor of +// introducing someone. + +// 1281 +// 02:48:01.623 --> 02:48:04.460 +// My partner in America, in New York. + +// 1282 +// 02:48:05.127 --> 02:48:06.962 +// His name is Vito Corleone. + +// 1283 +// 02:48:07.671 --> 02:48:10.215 +// We'll send him olive oil from here. + +// 1284 +// 02:48:11.008 --> 02:48:12.468 +// To his company in America. + +// 1285 +// 02:48:17.264 --> 02:48:20.559 +// They're olive oil importers, Don Ciccio. + +// 1286 +// 02:48:30.277 --> 02:48:35.866 +// We'd like your blessing, and your +// permission to start work. + +// 1287 +// 02:48:36.992 --> 02:48:39.870 +// Where is this young man +// from New York? + +// 1288 +// 02:48:43.207 --> 02:48:46.376 +// Have him come closer. + +// 1289 +// 02:48:47.377 --> 02:48:50.214 +// I can't see him so good. + +// 1290 +// 02:48:57.221 --> 02:49:00.891 +// My respects, Don Ciccio. +// Give me your blessing. + +// 1291 +// 02:49:03.393 --> 02:49:05.104 +// Bless you! + +// 1292 +// 02:49:06.980 --> 02:49:08.565 +// What's your name? + +// 1293 +// 02:49:13.987 --> 02:49:17.157 +// You took the name of this town! + +// 1294 +// 02:49:17.699 --> 02:49:19.451 +// And what's your father's name? + +// 1295 +// 02:49:19.576 --> 02:49:23.247 +// His name was...Antonio Andolini. + +// 1296 +// 02:49:23.622 --> 02:49:27.251 +// Louder, I don't hear so good. + +// 1297 +// 02:49:30.712 --> 02:49:33.924 +// My father's name was +// Antonio Andolini... + +// 1298 +// 02:49:34.258 --> 02:49:36.969 +// ...and this is for you! + +// 1299 +// 02:50:58.884 --> 02:51:01.512 +// Michael, say goodbye. + +// 1300 +// 02:52:04.741 --> 02:52:06.160 +// Hi, Al. + +// 1301 +// 02:52:18.213 --> 02:52:21.216 +// Can I speak with you +// for a second, Tom? + +// 1302 +// 02:52:29.141 --> 02:52:30.851 +// Tom, where's Mike? + +// 1303 +// 02:52:32.102 --> 02:52:34.146 +// Waiting for you to leave. + +// 1304 +// 02:52:36.732 --> 02:52:41.278 +// -Can I talk with him? +// -Sorry, Fredo. No chance. + +// 1305 +// 02:52:41.862 --> 02:52:45.157 +// -Can I see him? +// -He's in the boathouse. + +// 1306 +// 02:52:58.253 --> 02:53:00.631 +// Michael, it's Connie. + +// 1307 +// 02:53:21.902 --> 02:53:23.487 +// Michael... + +// 1308 +// 02:53:26.490 --> 02:53:29.993 +// I'd like to stay close to home now, +// if it's all right. + +// 1309 +// 02:53:38.502 --> 02:53:40.754 +// Is Kay coming? + +// 1310 +// 02:53:43.215 --> 02:53:44.883 +// No. + +// 1311 +// 02:53:53.016 --> 02:53:55.853 +// Fredo's in the house with Mama. + +// 1312 +// 02:53:55.936 --> 02:53:59.857 +// He asked for you +// and Tom said you wouldn't see him. + +// 1313 +// 02:54:03.527 --> 02:54:05.362 +// That's right. + +// 1314 +// 02:54:08.198 --> 02:54:11.577 +// Kids, why don't you go outside +// for a while? + +// 1315 +// 02:54:15.164 --> 02:54:17.541 +// Please, I want to talk to you. + +// 1316 +// 02:54:29.052 --> 02:54:33.056 +// Michael, I hated you for so many years. + +// 1317 +// 02:54:33.515 --> 02:54:38.854 +// I think I did things to myself, +// to hurt myself, so that you'd know + +// 1318 +// 02:54:42.065 --> 02:54:44.193 +// that I could hurt you. + +// 1319 +// 02:54:50.282 --> 02:54:54.703 +// You were just being strong for all of us, +// the way Papa was. + +// 1320 +// 02:54:55.287 --> 02:54:57.164 +// And I forgive you. + +// 1321 +// 02:55:01.835 --> 02:55:03.796 +// Can't you forgive Fredo? + +// 1322 +// 02:55:04.838 --> 02:55:09.468 +// He's so sweet, +// and helpless without you. + +// 1323 +// 02:55:15.808 --> 02:55:19.645 +// You need me. +// I want to take care of you now. + +// 1324 +// 02:55:29.488 --> 02:55:31.031 +// Connie. + +// 1325 +// 02:57:13.258 --> 02:57:15.886 +// Tom, sit down. + +// 1326 +// 02:57:27.606 --> 02:57:31.360 +// Our friend and business partner, +// Hyman Roth, is in the news. + +// 1327 +// 02:57:32.736 --> 02:57:37.366 +// -Did you hear about it? +// -I hear that he's in Israel. + +// 1328 +// 02:57:37.908 --> 02:57:42.538 +// The High Court in Israel +// turned down his request to live there. + +// 1329 +// 02:57:42.704 --> 02:57:46.291 +// His passport's been invalidated, +// except to return here. + +// 1330 +// 02:57:46.375 --> 02:57:49.128 +// He landed in Buenos Aires yesterday. + +// 1331 +// 02:57:49.419 --> 02:57:53.340 +// He offered them a million dollars +// if they'd let him live there. + +// 1332 +// 02:57:54.299 --> 02:57:58.303 +// -They turned him down. +// -He's going to try Panama. + +// 1333 +// 02:57:58.429 --> 02:58:03.100 +// Panama won't take him. +// Not for a million, not for ten million. + +// 1334 +// 02:58:03.475 --> 02:58:08.188 +// His condition is reported as terminal. +// He's only got six months left. + +// 1335 +// 02:58:08.355 --> 02:58:11.358 +// He's had the same heart attack +// for 20 years. + +// 1336 +// 02:58:11.525 --> 02:58:15.696 +// -That plane goes to Miami. +// -That's right. That's where I want it met. + +// 1337 +// 02:58:16.822 --> 02:58:22.202 +// Impossible. They'll turn him over to the +// Internal Revenue, Customs and FBI. + +// 1338 +// 02:58:22.369 --> 02:58:25.581 +// It's not impossible. +// Nothing's impossible. + +// 1339 +// 02:58:25.664 --> 02:58:27.124 +// It would be +// like trying to kill the President. + +// 1340 +// 02:58:27.207 --> 02:58:31.712 +// -There's no way we can get to him! +// -Tom, you surprise me. + +// 1341 +// 02:58:34.506 --> 02:58:38.135 +// If anything in this life is certain, + +// 1342 +// 02:58:38.218 --> 02:58:41.430 +// if history has taught us anything, + +// 1343 +// 02:58:41.513 --> 02:58:44.141 +// it's that you can kill anyone. + +// 1344 +// 02:58:49.480 --> 02:58:54.401 +// -Rocco? +// -Difficult. Not impossible. + +// 1345 +// 02:58:54.735 --> 02:58:56.445 +// Good. + +// 1346 +// 02:58:58.906 --> 02:59:02.493 +// Why did you ask me if something +// was wrong when I came in? + +// 1347 +// 02:59:06.163 --> 02:59:12.085 +// I thought you were going to tell me that +// you were moving your family to Vegas + +// 1348 +// 02:59:13.462 --> 02:59:17.341 +// and that you'd been offered the Vice +// Presidency of the Houstan hotels there. + +// 1349 +// 02:59:19.468 --> 02:59:24.306 +// -I thought you'd tell me that. +// -Must I tell you every offer I turn down? + +// 1350 +// 02:59:28.519 --> 02:59:31.313 +// -Let's do business. +// -All right. + +// 1351 +// 02:59:33.190 --> 02:59:36.193 +// Just consider this, Michael. +// Just consider it. + +// 1352 +// 02:59:37.444 --> 02:59:39.571 +// Roth and the Rosatos are on the run. + +// 1353 +// 02:59:39.655 --> 02:59:42.199 +// Are they worth it, +// are they strong enough? + +// 1354 +// 02:59:42.699 --> 02:59:47.579 +// Is it worth it? You've won. +// Do you want to wipe everybody out? + +// 1355 +// 02:59:47.663 --> 02:59:53.001 +// I don't feel I have to wipe everybody +// out, Tom. Just my enemies, that's all. + +// 1356 +// 03:00:00.717 --> 03:00:03.387 +// Are you with me in these things, +// or what? + +// 1357 +// 03:00:05.514 --> 03:00:10.936 +// Because if not, you can take your wife, +// your family and your mistress + +// 1358 +// 03:00:11.103 --> 03:00:14.231 +// and move them all to Las Vegas. + +// 1359 +// 03:00:17.359 --> 03:00:22.406 +// Why do you hurt me, Michael? I've +// always been loyal to you. What is this? + +// 1360 +// 03:00:26.994 --> 03:00:28.662 +// So...you're staying? + +// 1361 +// 03:00:30.706 --> 03:00:33.041 +// Yes, I'm staying. + +// 1362 +// 03:00:35.627 --> 03:00:37.754 +// What do you want me to do? + +// 1363 +// 03:00:38.255 --> 03:00:40.257 +// Hey, Anthony. + +// 1364 +// 03:00:40.799 --> 03:00:45.429 +// How would you like it if I taught you +// how to catch the really big fish? + +// 1365 +// 03:00:45.512 --> 03:00:48.015 +// -Would you like that? +// -Okay. + +// 1366 +// 03:00:48.182 --> 03:00:50.809 +// You know, when I was your age, + +// 1367 +// 03:00:51.268 --> 03:00:58.150 +// I went out fishing with all my brothers +// and my father. Everybody. + +// 1368 +// 03:00:59.318 --> 03:01:02.821 +// I was the only one that caught a fish. + +// 1369 +// 03:01:04.823 --> 03:01:07.868 +// Nobody else could catch one. +// Do you know how I did it? + +// 1370 +// 03:01:09.453 --> 03:01:13.248 +// Every time I put the line in the water +// I said a Hail Mary + +// 1371 +// 03:01:13.415 --> 03:01:17.044 +// and every time I said a Hail Mary, +// I caught a fish. + +// 1372 +// 03:01:19.463 --> 03:01:23.634 +// Do you believe that? It's true. +// That's the secret. + +// 1373 +// 03:01:25.719 --> 03:01:29.556 +// -Do you want to try it out on the lake? +// -Okay. + +// 1374 +// 03:01:31.350 --> 03:01:32.684 +// What else have you got? + +// 1375 +// 03:01:59.253 --> 03:02:01.839 +// Everything will be okay. + +// 1376 +// 03:02:02.005 --> 03:02:05.926 +// -Did my brother go back? +// -Yeah, don't worry. + +// 1377 +// 03:02:06.093 --> 03:02:11.014 +// He's ten times tougher than me, +// my brother. He's old-fashioned. + +// 1378 +// 03:02:12.057 --> 03:02:15.352 +// He didn't want dinner, +// just wanted to go home. + +// 1379 +// 03:02:15.436 --> 03:02:20.482 +// That's my brother! Nothing could get +// him away from that two-mule town. + +// 1380 +// 03:02:20.649 --> 03:02:24.486 +// He could have been big here. +// He could have had his own family. + +// 1381 +// 03:02:29.700 --> 03:02:31.660 +// Tom, + +// 1382 +// 03:02:32.369 --> 03:02:34.955 +// what do I do now? + +// 1383 +// 03:02:35.664 --> 03:02:37.666 +// Frankie. + +// 1384 +// 03:02:42.212 --> 03:02:46.216 +// You were always interested +// in politics and history. + +// 1385 +// 03:02:47.718 --> 03:02:51.180 +// I remember you talking about Hitler +// back in '33. + +// 1386 +// 03:02:51.346 --> 03:02:54.975 +// Yeah, I still read a lot. +// I get good stuff in there. + +// 1387 +// 03:02:57.519 --> 03:03:03.275 +// You were around the old-timers, who +// built the organization of the families, + +// 1388 +// 03:03:03.400 --> 03:03:08.822 +// basing them on the old Roman legions, +// with "regimes," "capos" and "soldiers". + +// 1389 +// 03:03:10.073 --> 03:03:14.077 +// -And it worked. +// -Yeah, it worked. + +// 1390 +// 03:03:14.870 --> 03:03:18.373 +// Those were the great old days, +// you know. + +// 1391 +// 03:03:18.540 --> 03:03:21.668 +// We was like the Roman Empire. + +// 1392 +// 03:03:21.752 --> 03:03:25.255 +// The Corleone family +// was like the Roman Empire. + +// 1393 +// 03:03:27.633 --> 03:03:29.593 +// Yeah, + +// 1394 +// 03:03:29.760 --> 03:03:32.137 +// it was once. + +// 1395 +// 03:03:36.558 --> 03:03:38.102 +// Frankie. + +// 1396 +// 03:03:48.570 --> 03:03:52.116 +// When a plot +// against the Emperor failed + +// 1397 +// 03:03:53.367 --> 03:03:56.829 +// the plotters were always +// given a chance + +// 1398 +// 03:03:58.789 --> 03:04:02.376 +// to let their families keep their fortunes. +// Right? + +// 1399 +// 03:04:02.459 --> 03:04:04.586 +// Only the rich guys. + +// 1400 +// 03:04:04.670 --> 03:04:09.675 +// The little guys got knocked off and all +// their estates went to the Emperors. + +// 1401 +// 03:04:09.842 --> 03:04:15.055 +// Unless they went home and killed +// themselves, then nothing happened. + +// 1402 +// 03:04:16.223 --> 03:04:20.519 +// And their families were taken care of. + +// 1403 +// 03:04:22.146 --> 03:04:25.524 +// That was a good break, a nice deal. + +// 1404 +// 03:04:26.150 --> 03:04:27.609 +// Yeah. + +// 1405 +// 03:04:28.569 --> 03:04:30.654 +// They went home + +// 1406 +// 03:04:31.864 --> 03:04:34.825 +// and sat in a hot bath + +// 1407 +// 03:04:34.992 --> 03:04:37.536 +// opened up their veins + +// 1408 +// 03:04:37.703 --> 03:04:40.414 +// and bled to death. + +// 1409 +// 03:04:41.582 --> 03:04:45.752 +// And sometimes they had a little party +// before they did it. + +// 1410 +// 03:04:51.091 --> 03:04:53.427 +// Don't worry about anything, +// Frankie Five-Angels. + +// 1411 +// 03:04:54.887 --> 03:04:58.182 +// Thanks, Tom. Thanks. + +// 1412 +// 03:05:16.658 --> 03:05:19.787 +// -See you, Tom. +// -Addio, Frankie. + +// 1413 +// 03:05:30.714 --> 03:05:33.842 +// Kay. You have to go. + +// 1414 +// 03:05:35.636 --> 03:05:38.972 +// -So pretty... +// -Kay, please hurry. He's coming. + +// 1415 +// 03:05:47.773 --> 03:05:51.568 +// Anthony. Kiss Mama goodbye. + +// 1416 +// 03:05:54.196 --> 03:05:56.990 +// Anthony, kiss your mother goodbye! + +// 1417 +// 03:05:57.157 --> 03:06:02.246 +// Anthony, say goodbye to Mama. +// Anthony. I love you, Anthony. + +// 1418 +// 03:06:03.372 --> 03:06:05.749 +// Kay, please. + +// 1419 +// 03:06:08.669 --> 03:06:10.629 +// All right. + +// 1420 +// 03:06:23.892 --> 03:06:26.270 +// Mary, come here. + +// 1421 +// 03:06:33.444 --> 03:06:35.028 +// Anthony. + +// 1422 +// 03:06:35.112 --> 03:06:38.115 +// Anthony, please. Kiss me once. + +// 1423 +// 03:08:17.214 --> 03:08:19.299 +// Easy. + +// 1424 +// 03:08:25.013 --> 03:08:28.100 +// Anthony! Anthony! + +// 1425 +// 03:08:28.225 --> 03:08:31.270 +// -He's here, we're going fishing. +// -No! + +// 1426 +// 03:08:31.437 --> 03:08:34.773 +// Michael wants to take him to Reno now. + +// 1427 +// 03:08:34.857 --> 03:08:36.859 +// Shit! + +// 1428 +// 03:08:38.068 --> 03:08:41.530 +// Okay, kid, you have to go to Reno +// with your pop. + +// 1429 +// 03:08:42.489 --> 03:08:46.452 +// -I'll take you fishing tomorrow, okay? +// -Okay. + +// 1430 +// 03:08:50.080 --> 03:08:51.665 +// Hey, Anthony. + +// 1431 +// 03:08:51.748 --> 03:08:56.086 +// Listen, I'll catch one for you in secret. + +// 1432 +// 03:09:00.132 --> 03:09:01.508 +// Let's go. + +// 1433 +// 03:09:40.672 --> 03:09:44.843 +// -Mr. Roth, I must take you into custody. +// -I understand. + +// 1434 +// 03:09:45.010 --> 03:09:48.138 +// What's your reaction +// to the Israeli High Court ruling? + +// 1435 +// 03:09:48.305 --> 03:09:51.100 +// I'm a retired investor on a pension. + +// 1436 +// 03:09:51.266 --> 03:09:56.146 +// I went to Israel to live there as a Jew, +// in the twilight of my life. + +// 1437 +// 03:10:02.486 --> 03:10:06.115 +// Hey, Frankie! Come on out, +// let's play some Hearts. + +// 1438 +// 03:10:14.289 --> 03:10:15.999 +// Frankie! + +// 1439 +// 03:10:31.890 --> 03:10:34.768 +// Is it true you're worth +// over 300 million dollars? + +// 1440 +// 03:10:34.935 --> 03:10:38.564 +// I'm a retired investor, +// living on a pension. + +// 1441 +// 03:10:38.730 --> 03:10:42.276 +// I came home to vote +// in the presidential election + +// 1442 +// 03:10:42.443 --> 03:10:45.863 +// because they wouldn't give me +// an absentee ballot. + +// 1443 +// 03:10:58.208 --> 03:11:00.627 +// Jesus Christ. + +// 1444 +// 03:11:01.670 --> 03:11:06.300 +// Hail Mary, full of grace. +// The Lord is with thee. + +// 1445 +// 03:11:07.760 --> 03:11:10.387 +// Blessed art thou amongst women. + +// 1446 +// 03:11:11.180 --> 03:11:14.308 +// Blessed is the fruit of thy womb, Jesus. + +// 1447 +// 03:11:15.517 --> 03:11:19.730 +// Holy Mary, Mother of God, +// pray for us sinners. + +// 1448 +// 03:12:01.605 --> 03:12:06.777 +// Hey! Everybody, pay attention. +// This is my friend Carlo Rizzi. + +// 1449 +// 03:12:07.569 --> 03:12:10.322 +// -You know my brother Fredo. +// -Sure. + +// 1450 +// 03:12:10.489 --> 03:12:15.244 +// This is my stepbrother Tom, +// and that's his girl Theresa. + +// 1451 +// 03:12:15.327 --> 03:12:18.664 +// This cute little thing is my sister Connie. + +// 1452 +// 03:12:18.747 --> 03:12:21.583 +// Say hello to Carlo. +// He's good-looking, isn't he? + +// 1453 +// 03:12:21.667 --> 03:12:23.252 +// Yes. + +// 1454 +// 03:12:23.418 --> 03:12:27.464 +// The droopy thing is Mike. +// We call him Joe College. + +// 1455 +// 03:12:27.965 --> 03:12:31.844 +// Sit down. Talk to each other. + +// 1456 +// 03:12:32.010 --> 03:12:34.263 +// Hey, Mr. Einstein... + +// 1457 +// 03:12:37.599 --> 03:12:40.102 +// -The cake. +// -Sally, get in here! + +// 1458 +// 03:12:40.269 --> 03:12:42.396 +// -I was scared. +// -Come on. + +// 1459 +// 03:12:43.063 --> 03:12:46.400 +// -Where's your father? +// -Christmas shopping. + +// 1460 +// 03:12:46.567 --> 03:12:48.944 +// Let's see that thing. + +// 1461 +// 03:12:50.654 --> 03:12:52.573 +// That's nice! + +// 1462 +// 03:12:52.656 --> 03:12:56.493 +// -Should I put the candles on now? +// -Yeah. You help her, Carlo. + +// 1463 +// 03:12:57.619 --> 03:13:00.747 +// -What is that? Rum? +// -Yeah. + +// 1464 +// 03:13:05.753 --> 03:13:09.006 +// Don't touch the antipasto +// until Pop sees it. + +// 1465 +// 03:13:09.173 --> 03:13:11.842 +// He's not ugly... + +// 1466 +// 03:13:17.347 --> 03:13:23.604 +// What do you think of the nerve of those +// Japs? Bombing us on Pop's birthday. + +// 1467 +// 03:13:23.687 --> 03:13:27.107 +// They didn't know it was Pop's birthday. + +// 1468 +// 03:13:27.191 --> 03:13:29.860 +// Not surprising after the oil embargo. + +// 1469 +// 03:13:30.027 --> 03:13:34.490 +// They've got no right dropping bombs! +// Are you a Jap-lover? + +// 1470 +// 03:13:34.698 --> 03:13:38.368 +// -30,000 enlisted this morning. +// -Bunch of saps... + +// 1471 +// 03:13:38.535 --> 03:13:42.039 +// -Why are they saps? +// -Let's not talk about the war. + +// 1472 +// 03:13:43.165 --> 03:13:45.000 +// You talk to Carlo. + +// 1473 +// 03:13:46.960 --> 03:13:50.547 +// Only saps risk their lives for strangers. + +// 1474 +// 03:13:50.631 --> 03:13:54.093 +// -That's Pop talking. +// -You're right, that's Pop talking! + +// 1475 +// 03:13:54.218 --> 03:13:58.013 +// -They risk their lives for their country. +// -Country isn't your blood. + +// 1476 +// 03:13:58.097 --> 03:14:04.019 +// -I don't feel that way. +// -Then quit college andjoin the army! + +// 1477 +// 03:14:04.103 --> 03:14:05.604 +// I did. + +// 1478 +// 03:14:06.563 --> 03:14:09.525 +// I've enlisted in the Marines. + +// 1479 +// 03:14:11.735 --> 03:14:14.988 +// -Why didn't you come to us? +// -What do you mean? + +// 1480 +// 03:14:15.072 --> 03:14:19.326 +// -Pop managed to get you a deferment. +// -I didn't ask for it. + +// 1481 +// 03:14:20.077 --> 03:14:22.162 +// I didn't want it. + +// 1482 +// 03:14:23.330 --> 03:14:25.749 +// Come on! Knock it off! + +// 1483 +// 03:14:25.916 --> 03:14:29.670 +// -Punk! +// -Sonny, sit down. + +// 1484 +// 03:14:32.673 --> 03:14:36.176 +// Mommy, Daddy's fighting again! + +// 1485 +// 03:14:39.263 --> 03:14:42.015 +// Go and show Carlo the tree. + +// 1486 +// 03:14:52.317 --> 03:14:53.944 +// Nice. + +// 1487 +// 03:14:55.779 --> 03:14:57.322 +// Nice. + +// 1488 +// 03:14:57.948 --> 03:15:00.617 +// Break your father's heart +// on his birthday. + +// 1489 +// 03:15:01.743 --> 03:15:04.496 +// That's swell, Mike. Congratulations. + +// 1490 +// 03:15:04.580 --> 03:15:06.707 +// Don't encourage him! + +// 1491 +// 03:15:06.790 --> 03:15:09.460 +// Get me a drink. Go on! + +// 1492 +// 03:15:13.338 --> 03:15:16.800 +// You don't understand. +// Your father has plans for you. + +// 1493 +// 03:15:16.967 --> 03:15:21.180 +// Many times he and I have talked +// about your future. + +// 1494 +// 03:15:22.973 --> 03:15:26.810 +// You've talked to my father +// about my future? + +// 1495 +// 03:15:28.103 --> 03:15:32.399 +// -My future. +// -Mikey, he has high hopes for you. + +// 1496 +// 03:15:32.483 --> 03:15:38.030 +// -I have my own plans for my future. +// -Did you go to college to get stupid? + +// 1497 +// 03:15:38.113 --> 03:15:39.990 +// He's here! + +// 1498 +// 03:15:41.950 --> 03:15:43.911 +// Come on. + +// 1499 +// 03:15:46.163 --> 03:15:48.123 +// Stupid! + +// 1500 +// 03:16:05.390 --> 03:16:07.768 +// Surprise! + +// 1501 +// 03:16:10.854 --> 03:16:16.527 +// For he's a joIIy good feIIow +// For he's a joIIy good feIIow + +// 1502 +// 03:16:16.735 --> 03:16:20.531 +// That nobody can deny +// Nobody can deny... +// `; From 3e99085f9b624be931582812bbb1cb6f4c53d2d0 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Sat, 29 Dec 2018 02:30:59 +0200 Subject: [PATCH 62/94] parse/search cues reimplemented --- .../Video/stremio-video/utils/cuesForTime.js | 24 ++++---- .../Video/stremio-video/utils/parseVtt.js | 55 +++++++++++++++++++ 2 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 src/routes/Player/Video/stremio-video/utils/parseVtt.js diff --git a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js index 444ade672..b18a8dc6a 100644 --- a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js +++ b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js @@ -1,29 +1,25 @@ module.exports = function(cues, time) { - var timeInSeconds = time / 1000; var cuesForTime = []; + var cueBoundTimes = Object.keys(cues).map(function(time) { + return parseInt(time); + }); var left = 0; - var right = cues.length - 1; - var lastCueIndex = -1; + var right = cueBoundTimes.length - 1; + var index = -1; while (left <= right) { var middle = Math.floor((left + right) / 2); - if (cues[middle].startTime === timeInSeconds) { - lastCueIndex = middle; + if (cueBoundTimes[middle] < time) { left = middle + 1; - } else if (cues[middle].startTime > timeInSeconds) { + } else if (cueBoundTimes[middle] > time) { right = middle - 1; } else { + index = middle; left = middle + 1; } } - var cueIndex = lastCueIndex !== -1 ? lastCueIndex : right; - while (cueIndex >= 0) { - if (cues[cueIndex].startTime > timeInSeconds || cues[cueIndex].endTime < timeInSeconds) { - break; - } - - cuesForTime.push(cues[cueIndex]); - cueIndex--; + if (index !== -1) { + cuesForTime = cues[cueBoundTimes[index]]; } return cuesForTime.sort(function(c1, c2) { diff --git a/src/routes/Player/Video/stremio-video/utils/parseVtt.js b/src/routes/Player/Video/stremio-video/utils/parseVtt.js new file mode 100644 index 000000000..58445c11d --- /dev/null +++ b/src/routes/Player/Video/stremio-video/utils/parseVtt.js @@ -0,0 +1,55 @@ +var VTTJS = require('vtt.js'); + +function binarySearch(array, element) { + var left = 0; + var right = array.length - 1; + while (left <= right) { + var middle = Math.floor((left + right) / 2); + if (array[middle] < element) { + left = middle + 1; + } else if (array[middle] > element) { + right = middle - 1; + } else { + return middle; + } + } + + return -1; +} + +module.exports = function(text) { + var nativeVTTCue = VTTCue; + global.VTTCue = VTTJS.VTTCue; + var cuesTree = {}; + var cues = []; + var parser = new VTTJS.WebVTT.Parser(window, VTTJS.WebVTT.StringDecoder()); + parser.oncue = function(cue) { + cues.push({ + startTime: cue.startTime * 1000, + endTime: cue.endTime * 1000, + text: cue.text + }); + }; + parser.parse(text); + parser.flush(); + var cueBoundTimes = Object.keys(cuesTree).map(function(time) { + return parseInt(time); + }); + for (var i = 0; i < cues.length; i++) { + var cue = cues[i]; + cuesTree[cue.startTime] = cuesTree[cue.startTime] || []; + cuesTree[cue.startTime].push(cue); + var startTimeBoundIndex = binarySearch(cueBoundTimes, cue.startTime); + for (var j = startTimeBoundIndex + 1; j < cueBoundTimes.length; j++) { + if (cue.endTime <= cueBoundTimes[j]) { + break; + } + + cuesTree[cueBoundTimes[j]] = cuesTree[cueBoundTimes[j]] || []; + cuesTree[cueBoundTimes[j]].push(cue); + } + } + + global.VTTCue = nativeVTTCue; + return cuesTree; +}; From 7532dfa7a19c83cb15c354579125927050562567 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Sun, 30 Dec 2018 13:15:31 +0200 Subject: [PATCH 63/94] subtitles cues rendered properly in the dom --- .../Player/Video/stremio-video/HTMLVideo.js | 120 +- .../Video/stremio-video/utils/cuesForTime.js | 29 - .../Video/stremio-video/utils/fetchCues.js | 6869 ----------------- .../Video/stremio-video/utils/parseVtt.js | 55 - .../Video/stremio-video/utils/subtitles.js | 85 + 5 files changed, 144 insertions(+), 7014 deletions(-) delete mode 100644 src/routes/Player/Video/stremio-video/utils/cuesForTime.js delete mode 100644 src/routes/Player/Video/stremio-video/utils/fetchCues.js delete mode 100644 src/routes/Player/Video/stremio-video/utils/parseVtt.js create mode 100644 src/routes/Player/Video/stremio-video/utils/subtitles.js diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 87bbee80e..541b33c88 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -1,7 +1,5 @@ var EventEmitter = require('events'); -var VTTJS = require('vtt.js'); -var cuesForTime = require('./utils/cuesForTime'); -var fetchCues = require('./utils/fetchCues'); +var subtitleUtils = require('./utils/subtitles'); var HTMLVideo = function(container) { if (!(container instanceof HTMLElement)) { @@ -13,7 +11,7 @@ var HTMLVideo = function(container) { var loaded = false; var destroyed = false; var dispatchArgsQueue = []; - var subtitleCues = []; + var subtitleCues = {}; var subtitleTracks = []; var selectedSubtitleTrackId = null; var styles = document.createElement('style'); @@ -35,57 +33,41 @@ var HTMLVideo = function(container) { } return !!video.paused; - }; + } function getTime() { if (!loaded) { return null; } return Math.floor(video.currentTime * 1000); - }; + } function getDuration() { if (!loaded || isNaN(video.duration)) { return null; } return Math.floor(video.duration * 1000); - }; + } function getVolume() { return video.muted ? 0 : Math.floor(video.volume * 100); - }; + } function getSubtitleTracks() { if (!loaded) { return []; } return subtitleTracks.slice(); - }; + } function getSelectedSubtitleTrackId() { if (!loaded) { return null; } return selectedSubtitleTrackId; - }; - function onSubtitlesCuesChanged() { - while (subtitles.hasChildNodes()) { - subtitles.removeChild(subtitles.lastChild); - } - - if (!loaded || subtitleCues.length === 0) { - return; - } - - var time = getTime(); - var cues = cuesForTime(subtitleCues, time); - for (var i = 0; i < cues.length; i++) { - var cue = VTTJS.WebVTT.convertCueToDOMTree(window, cues[i].text); - subtitles.appendChild(cue); - } } function onEnded() { events.emit('ended'); - }; + } function onError() { var message; var critical; @@ -120,32 +102,48 @@ var HTMLVideo = function(container) { if (critical) { self.dispatch('command', 'stop'); } - }; + } function onPausedChanged() { events.emit('propChanged', 'paused', getPaused()); - }; + } function onTimeChanged() { events.emit('propChanged', 'time', getTime()); - }; + } function onDurationChanged() { events.emit('propChanged', 'duration', getDuration()); - }; + } function onVolumeChanged() { events.emit('propChanged', 'volume', getVolume()); - }; + } function onSubtitleTracksChanged() { events.emit('propChanged', 'subtitleTracks', getSubtitleTracks()); - }; + } function onSelectedSubtitleTrackIdChanged() { events.emit('propChanged', 'selectedSubtitleTrackId', getSelectedSubtitleTrackId()); - }; + } + function updateSubtitlesText() { + while (subtitles.hasChildNodes()) { + subtitles.removeChild(subtitles.lastChild); + } + + if (!loaded || !Array.isArray(subtitleCues.times)) { + return; + } + + var time = getTime(); + var cuesForTime = subtitleUtils.cuesForTime(subtitleCues, time); + for (var i = 0; i < cuesForTime.length; i++) { + const cue = subtitleUtils.render(cuesForTime[i]); + subtitles.appendChild(cue); + } + } function flushArgsQueue() { for (var i = 0; i < dispatchArgsQueue.length; i++) { self.dispatch.apply(self, dispatchArgsQueue[i]); } dispatchArgsQueue = []; - }; + } this.on = function(eventName, listener) { if (destroyed) { @@ -194,7 +192,6 @@ var HTMLVideo = function(container) { default: throw new Error('observeProp not supported: ' + arguments[1]); } - break; case 'setProp': switch (arguments[1]) { case 'paused': @@ -211,35 +208,32 @@ var HTMLVideo = function(container) { break; case 'selectedSubtitleTrackId': if (loaded) { - var subtitleTrack; + selectedSubtitleTrackId = null; + subtitleCues = {}; for (var i = 0; i < subtitleTracks.length; i++) { - if (subtitleTracks[i].id === arguments[2]) { - subtitleTrack = subtitleTracks[i]; + var subtitleTrack = subtitleTracks[i]; + if (subtitleTrack.id === arguments[2]) { + selectedSubtitleTrackId = subtitleTrack.id; + fetch(subtitleTrack.url) + .then(function(resp) { + return resp.text(); + }) + .then(function(text) { + if (selectedSubtitleTrackId === subtitleTrack.id) { + subtitleCues = subtitleUtils.parse(text); + } + }) + .catch(function() { + events.emit('error', { + code: 68, + message: 'Failed to fetch subtitles from ' + subtitleTrack.origin, + critical: false + }); + }); break; } } - if (subtitleTrack) { - selectedSubtitleTrackId = subtitleTrack.id; - fetchCues(subtitleTrack.url) - .then(function(cues) { - if (selectedSubtitleTrackId === subtitleTrack.id) { - subtitleCues = cues; - console.log(subtitleCues) - } - }) - .catch(function() { - events.emit('error', { - code: 68, - message: 'Failed to fetch subtitles from ' + subtitleTrack.origin, - critical: false - }); - }); - } else { - selectedSubtitleTrackId = null; - subtitleCues = []; - } - onSelectedSubtitleTrackIdChanged(); } break; @@ -294,9 +288,10 @@ var HTMLVideo = function(container) { case 'stop': video.removeEventListener('ended', onEnded); video.removeEventListener('error', onError); - video.removeEventListener('timeupdate', onSubtitlesCuesChanged); + video.removeEventListener('timeupdate', updateSubtitlesText); loaded = false; dispatchArgsQueue = []; + subtitleCues = {}; subtitleTracks = []; selectedSubtitleTrackId = null; video.removeAttribute('src'); @@ -307,6 +302,7 @@ var HTMLVideo = function(container) { onDurationChanged(); onSubtitleTracksChanged(); onSelectedSubtitleTrackIdChanged(); + updateSubtitlesText(); return; case 'load': var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); @@ -314,7 +310,7 @@ var HTMLVideo = function(container) { dispatchArgsQueue = dispatchArgsQueueCopy; video.addEventListener('ended', onEnded); video.addEventListener('error', onError); - video.addEventListener('timeupdate', onSubtitlesCuesChanged); + video.addEventListener('timeupdate', updateSubtitlesText); video.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; video.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; video.src = arguments[2].url; @@ -324,6 +320,7 @@ var HTMLVideo = function(container) { onDurationChanged(); onSubtitleTracksChanged(); onSelectedSubtitleTrackIdChanged(); + updateSubtitlesText(); flushArgsQueue(); return; case 'destroy': @@ -336,6 +333,7 @@ var HTMLVideo = function(container) { video.removeEventListener('volumechange', onVolumeChanged); container.removeChild(video); container.removeChild(styles); + container.removeChild(subtitles); destroyed = true; return; default: diff --git a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js b/src/routes/Player/Video/stremio-video/utils/cuesForTime.js deleted file mode 100644 index b18a8dc6a..000000000 --- a/src/routes/Player/Video/stremio-video/utils/cuesForTime.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = function(cues, time) { - var cuesForTime = []; - var cueBoundTimes = Object.keys(cues).map(function(time) { - return parseInt(time); - }); - var left = 0; - var right = cueBoundTimes.length - 1; - var index = -1; - while (left <= right) { - var middle = Math.floor((left + right) / 2); - if (cueBoundTimes[middle] < time) { - left = middle + 1; - } else if (cueBoundTimes[middle] > time) { - right = middle - 1; - } else { - index = middle; - left = middle + 1; - } - } - - if (index !== -1) { - cuesForTime = cues[cueBoundTimes[index]]; - } - - return cuesForTime.sort(function(c1, c2) { - return c1.startTime - c2.startTime || - c1.endTime - c2.endTime; - }); -}; diff --git a/src/routes/Player/Video/stremio-video/utils/fetchCues.js b/src/routes/Player/Video/stremio-video/utils/fetchCues.js deleted file mode 100644 index 937ab3624..000000000 --- a/src/routes/Player/Video/stremio-video/utils/fetchCues.js +++ /dev/null @@ -1,6869 +0,0 @@ -var VTTJS = require('vtt.js'); - -module.exports = function(url) { - return new Promise(function(resolve) { - var nativeVTTCue = VTTCue; - global.VTTCue = VTTJS.VTTCue; - var cues = []; - var parser = new VTTJS.WebVTT.Parser(window, VTTJS.WebVTT.StringDecoder()); - parser.oncue = function(cue) { - cues.push({ - startTime: cue.startTime, - endTime: cue.endTime, - text: cue.text - }); - }; - parser.parse(demoText); - parser.flush(); - cues = cues.sort(function(c1, c2) { - return c1.startTime - c2.startTime || - c1.endTime - c2.endTime; - }); - global.VTTCue = nativeVTTCue; - resolve(cues); - }); -}; - -var demoText = `WEBVTT - -00:00:20.000 --> 00:00:40.000 -20-40 - -00:00:05.000 --> 00:00:10.000 -5-10 - -00:00:02.000 --> 00:00:10.000 -2-10 - -00:00:00.000 --> 00:00:10.000 -0-10 - -00:00:00.000 --> 00:00:20.000 -0-20 - -00:00:00.000 --> 00:00:38.000 -0-38 - -00:00:00.000 --> 00:00:15.000 -0-15 - -00:00:50.000 --> 00:05:55.000 -50-5:55 - -00:02:50.000 --> 00:04:55.000 -2:50-4:55 - -00:00:50.000 --> 00:01:55.000 -50-1:55 -`; - -// demoText = `WEBVTT - -// 1 -// 00:00:11.000 --> 00:00:12.500 -// HAVE A GOOD TIME. - -// 2 -// 00:03:06.186 --> 00:03:09.982 -// They've killed your son Paolo! - -// 3 -// 00:03:10.315 --> 00:03:12.442 -// Murderers! Murderers! - -// 4 -// 00:03:23.287 --> 00:03:24.788 -// My son... - -// 5 -// 00:04:09.124 --> 00:04:11.543 -// All my respect, Don Ciccio. - -// 6 -// 00:04:15.714 --> 00:04:19.718 -// You killed my husband because -// he wouldn't give in to you. - -// 7 -// 00:04:20.344 --> 00:04:22.679 -// And his oldest son Paolo... - -// 8 -// 00:04:23.472 --> 00:04:25.974 -// ...because he swore revenge. - -// 9 -// 00:04:27.184 --> 00:04:30.771 -// But Vito is only nine. -// And dumb-witted. - -// 10 -// 00:04:31.647 --> 00:04:33.273 -// He never speaks. - -// 11 -// 00:04:33.357 --> 00:04:35.734 -// It's not his words I'm afraid of. - -// 12 -// 00:04:36.985 --> 00:04:40.906 -// He's weak. He couldn't hurt anyone. - -// 13 -// 00:04:41.865 --> 00:04:44.660 -// But when he grows, he'll grow strong. - -// 14 -// 00:04:45.077 --> 00:04:48.747 -// Don't worry. This little boy -// can't do a thing to you. - -// 15 -// 00:04:56.213 --> 00:04:59.633 -// When he's a man, he'll -// come for revenge. - -// 16 -// 00:05:01.468 --> 00:05:05.597 -// I beg you, Don Ciccio, -// spare my only son. - -// 17 -// 00:05:06.431 --> 00:05:08.517 -// He's all I have left. - -// 18 -// 00:05:08.809 --> 00:05:13.939 -// I swear to God he'll never do -// you any harm. Spare him! - -// 19 -// 00:05:23.240 --> 00:05:24.199 -// Vito, run! - -// 20 -// 00:05:24.283 --> 00:05:25.409 -// Move and I'll kill him! - -// 21 -// 00:05:27.411 --> 00:05:28.912 -// Run, Vito! - -// 22 -// 00:05:34.626 --> 00:05:35.878 -// Kill him! - -// 23 -// 00:05:45.220 --> 00:05:49.766 -// Any family who hides the boy -// Vito Andolini will regret it! - -// 24 -// 00:05:52.019 --> 00:05:53.353 -// You understand? - -// 25 -// 00:06:02.779 --> 00:06:07.618 -// Anybody who hides the boy -// Vito Andolini is in for trouble! - -// 26 -// 00:06:33.435 --> 00:06:35.729 -// Vito, we're praying for you! - -// 27 -// 00:06:41.318 --> 00:06:45.113 -// If anyone is hiding the boy -// Vito Andolini... - -// 28 -// 00:06:46.198 --> 00:06:48.033 -// ...turn him over to us. - -// 29 -// 00:06:48.784 --> 00:06:51.537 -// Don Ciccio will thank you for it! - -// 30 -// 00:06:52.913 --> 00:06:55.833 -// It'll be better for the boy, -// and better for you! - -// 31 -// 00:07:07.886 --> 00:07:12.558 -// Any family who hides the boy -// Vito Andolini will regret it! - -// 32 -// 00:08:45.859 --> 00:08:47.611 -// Nurse. - -// 33 -// 00:09:13.595 --> 00:09:15.347 -// Money? - -// 34 -// 00:09:16.640 --> 00:09:18.642 -// Interpreter! - -// 35 -// 00:09:24.940 --> 00:09:27.359 -// Where are you from? - -// 36 -// 00:09:27.693 --> 00:09:29.820 -// -What is your name? -// -Maria. - -// 37 -// 00:09:34.157 --> 00:09:36.368 -// What is your name? - -// 38 -// 00:09:37.661 --> 00:09:40.789 -// Come on, son. What is your name? - -// 39 -// 00:09:43.917 --> 00:09:46.879 -// Vito Andolini from Corleone. - -// 40 -// 00:09:47.671 --> 00:09:50.299 -// Corleone. Vito Corleone. - -// 41 -// 00:09:50.799 --> 00:09:53.427 -// Okay, over there. - -// 42 -// 00:09:54.344 --> 00:09:55.554 -// Next. - -// 43 -// 00:10:04.938 --> 00:10:09.318 -// Tell him he has smallpox. -// Quarantine three months. - -// 44 -// 00:10:18.368 --> 00:10:20.829 -// Vito Corleone! - -// 45 -// 00:10:21.455 --> 00:10:23.707 -// Vito Corleone! - -// 46 -// 00:10:25.417 --> 00:10:27.920 -// Here he is. This is him. - -// 47 -// 00:12:14.484 --> 00:12:16.653 -// Did you bring the car keys? - -// 48 -// 00:12:18.906 --> 00:12:21.491 -// Laurie! Laurie! - -// 49 -// 00:12:41.762 --> 00:12:43.847 -// Mama! - -// 50 -// 00:12:44.848 --> 00:12:46.642 -// Mama! - -// 51 -// 00:12:48.894 --> 00:12:51.563 -// -Look who's here. -// -Father Carmelo. - -// 52 -// 00:12:51.647 --> 00:12:54.900 -// -This is Father Carmelo. -// -I'm Merle Johnson. - -// 53 -// 00:12:56.693 --> 00:12:58.403 -// Mama! - -// 54 -// 00:12:59.321 --> 00:13:03.575 -// -Here I am. -// -Constanzia, after one week? - -// 55 -// 00:13:03.659 --> 00:13:07.704 -// I sent the car to the airport last week -// to pick you up. - -// 56 -// 00:13:07.788 --> 00:13:13.752 -// It was chaos. Anyway, here I am, just -// one week late. This is for my mama! - -// 57 -// 00:13:13.836 --> 00:13:17.047 -// -What is this? -// -You remember Merle? - -// 58 -// 00:13:17.214 --> 00:13:19.883 -// Hello. How are you? Thank you. - -// 59 -// 00:13:20.050 --> 00:13:25.514 -// Where's Michael? I've got to talk to him -// and I can't wait on line. - -// 60 -// 00:13:25.597 --> 00:13:27.975 -// You go see your children first. - -// 61 -// 00:13:28.100 --> 00:13:33.730 -// Then you worry about waiting on line to -// see your brother. Like everybody else. - -// 62 -// 00:13:38.569 --> 00:13:41.071 -// Ladies and gentlemen... - -// 63 -// 00:13:41.822 --> 00:13:45.450 -// A most distinguished guest -// would like to say a few words. - -// 64 -// 00:13:45.534 --> 00:13:49.621 -// Please welcome Senator Pat Geary -// of the State of Nevada. - -// 65 -// 00:13:49.705 --> 00:13:52.499 -// And there is Mrs. Geary. - -// 66 -// 00:14:02.885 --> 00:14:05.095 -// Thank you very much. - -// 67 -// 00:14:05.262 --> 00:14:11.977 -// This is a very, very happy day -// for me and my wife Mrs. Geary. - -// 68 -// 00:14:12.561 --> 00:14:15.689 -// We see Nevada far too seldom. - -// 69 -// 00:14:15.772 --> 00:14:20.694 -// But today we can join with old friends, -// we can make new friends - -// 70 -// 00:14:20.944 --> 00:14:24.740 -// and we help celebrate -// a young man's first Communion. - -// 71 -// 00:14:25.365 --> 00:14:32.289 -// And also to thank that boy's family for -// a magnificent contribution to the State. - -// 72 -// 00:14:32.372 --> 00:14:38.170 -// I have here in my hand a check -// made out to the university - -// 73 -// 00:14:38.253 --> 00:14:43.091 -// and it is a magnificent endowment -// in the name of - -// 74 -// 00:14:44.510 --> 00:14:47.262 -// Anthony Vito Corleone. - -// 75 -// 00:14:48.305 --> 00:14:51.433 -// The check is signed by -// that young man's parents - -// 76 -// 00:14:51.600 --> 00:14:54.353 -// whom I think we should recognize. - -// 77 -// 00:14:54.436 --> 00:14:58.899 -// Mike, Pat, Kay, stand up, please. -// Let the folks see you! - -// 78 -// 00:14:58.982 --> 00:15:01.026 -// Folks, I want you to join me - -// 79 -// 00:15:01.109 --> 00:15:06.865 -// in giving a real Nevada thank you -// to Mr. and Mrs. Michael Corleone! - -// 80 -// 00:15:12.746 --> 00:15:18.085 -// We also have, as a special added -// attraction, the Sierra Boys Choir - -// 81 -// 00:15:18.252 --> 00:15:24.591 -// who have chosen a certain special song -// and a special arrangement - -// 82 -// 00:15:24.675 --> 00:15:28.679 -// to honor their host, -// Mr. Michael Corleone. - -// 83 -// 00:15:28.846 --> 00:15:30.347 -// Boys. - -// 84 -// 00:15:46.864 --> 00:15:49.032 -// The plaque. - -// 85 -// 00:15:49.199 --> 00:15:51.743 -// Okay, fellows, did you get that one? - -// 86 -// 00:15:52.578 --> 00:15:54.705 -// Okay, that's good. - -// 87 -// 00:15:54.872 --> 00:15:58.917 -// Now, Senator, -// just you and Mrs. Corleone. - -// 88 -// 00:16:20.397 --> 00:16:23.400 -// My lawyer Tom Hagen. Senator Geary. - -// 89 -// 00:16:23.483 --> 00:16:26.612 -// He arranged everything -// through your man Turnbull. - -// 90 -// 00:16:26.737 --> 00:16:29.865 -// -Yes, yes. -// -Sit down. - -// 91 -// 00:16:33.035 --> 00:16:36.497 -// I thought that you and -// I would talk alone. - -// 92 -// 00:16:37.915 --> 00:16:43.754 -// I trust these men with my life, Senator. -// To ask them to leave would be an insult. - -// 93 -// 00:16:43.879 --> 00:16:46.840 -// Well, it's perfectly all right with me - -// 94 -// 00:16:46.924 --> 00:16:51.595 -// but I am a blunt man and I intend -// to speak very frankly to you. - -// 95 -// 00:16:51.720 --> 00:16:53.764 -// Maybe more frankly - -// 96 -// 00:16:53.847 --> 00:16:57.184 -// than anyone in my position -// has ever talked to you before. - -// 97 -// 00:16:57.351 --> 00:17:00.354 -// The Corleone family -// has done well in Nevada. - -// 98 -// 00:17:00.521 --> 00:17:05.651 -// You own, or control, -// two major hotels in Vegas - -// 99 -// 00:17:05.734 --> 00:17:10.280 -// and one in Reno. -// The licenses were grandfathered in - -// 100 -// 00:17:10.364 --> 00:17:13.784 -// so there was no problem -// with the Gaming Commission. - -// 101 -// 00:17:15.786 --> 00:17:18.747 -// Now my sources tell me - -// 102 -// 00:17:18.831 --> 00:17:22.918 -// that you plan to make a move -// against the Tropigala. - -// 103 -// 00:17:23.001 --> 00:17:28.048 -// They tell me that within a week, -// you're going to move Klingman out. - -// 104 -// 00:17:28.173 --> 00:17:33.929 -// Quite an expansion. However, it will -// leave you with a little technical problem. - -// 105 -// 00:17:36.473 --> 00:17:39.309 -// The license will still be -// in Klingman's name. - -// 106 -// 00:17:40.602 --> 00:17:45.148 -// -Turnbull is a good man. -// -Yeah, well, let's cut out the bullshit. - -// 107 -// 00:17:45.232 --> 00:17:48.402 -// I don't want to spend -// more time here than I have to. - -// 108 -// 00:17:48.485 --> 00:17:50.946 -// You can have the license. - -// 109 -// 00:17:51.029 --> 00:17:53.907 -// The price is 250,000 dollars. - -// 110 -// 00:17:53.991 --> 00:17:56.660 -// Plus five per cent of the gross monthly - -// 111 -// 00:17:56.743 --> 00:18:01.248 -// of all four hotels, Mr. Corleone. - -// 112 -// 00:18:04.835 --> 00:18:09.756 -// The price for the license -// is less than 20,000 dollars, right? - -// 113 -// 00:18:09.840 --> 00:18:12.259 -// That's right. - -// 114 -// 00:18:12.342 --> 00:18:17.890 -// -Why would I pay more than that? -// -Because I intend to squeeze you. - -// 115 -// 00:18:17.973 --> 00:18:20.601 -// I don't like your kind of people. - -// 116 -// 00:18:20.684 --> 00:18:26.231 -// I don't like to see you come out -// to this clean country in oily hair - -// 117 -// 00:18:26.315 --> 00:18:28.692 -// dressed up in those silk suits - -// 118 -// 00:18:28.775 --> 00:18:32.696 -// and try to pass yourselves off -// as decent Americans. - -// 119 -// 00:18:32.821 --> 00:18:38.452 -// I'll do business with you, but the fact is -// that I despise your masquerade, - -// 120 -// 00:18:38.535 --> 00:18:44.041 -// the dishonest way you pose yourself -// and your whole fucking family. - -// 121 -// 00:18:51.548 --> 00:18:53.383 -// Senator, - -// 122 -// 00:18:54.468 --> 00:18:57.554 -// we're both part of the same hypocrisy. - -// 123 -// 00:18:59.056 --> 00:19:02.559 -// But never think it applies to my family. - -// 124 -// 00:19:03.185 --> 00:19:05.687 -// All right, all right. - -// 125 -// 00:19:06.522 --> 00:19:11.652 -// Some people have to play little games. -// You play yours. - -// 126 -// 00:19:13.737 --> 00:19:17.824 -// Let's say that you'll pay me -// because it's in your interest. - -// 127 -// 00:19:18.575 --> 00:19:22.996 -// I want your answer and the money -// by noon tomorrow. One more thing. - -// 128 -// 00:19:23.080 --> 00:19:26.667 -// Don't you contact me again, ever. - -// 129 -// 00:19:26.750 --> 00:19:30.587 -// From now on you deal with Turnbull. -// Open that door, son. - -// 130 -// 00:19:31.088 --> 00:19:34.925 -// Senator, you can have my answer now -// if you like. - -// 131 -// 00:19:37.511 --> 00:19:40.347 -// My offer is this... - -// 132 -// 00:19:40.514 --> 00:19:42.099 -// Nothing. - -// 133 -// 00:19:43.767 --> 00:19:49.439 -// Not even the fee for the gaming license, -// which I would like you to put up. - -// 134 -// 00:19:54.695 --> 00:19:57.155 -// Good afternoon, gentlemen. - -// 135 -// 00:19:59.825 --> 00:20:02.536 -// Ladies! I didn't know you were out here. - -// 136 -// 00:20:02.619 --> 00:20:05.706 -// -Honey, we have to go. -// -Really? I'm sorry. - -// 137 -// 00:20:05.873 --> 00:20:09.209 -// -It's been delightful. -// -It was our pleasure. - -// 138 -// 00:20:09.376 --> 00:20:11.962 -// It was wonderful talking to you. - -// 139 -// 00:20:56.507 --> 00:21:01.678 -// Fredo! Fredo, you son-of-a-bitch, -// you look great! - -// 140 -// 00:21:01.762 --> 00:21:03.764 -// Frank Pentangeli! - -// 141 -// 00:21:03.847 --> 00:21:06.975 -// I thought you was -// never coming out west, you big bum! - -// 142 -// 00:21:07.976 --> 00:21:10.729 -// I've got to check on my boys. - -// 143 -// 00:21:11.897 --> 00:21:13.857 -// -What's with the food here? -// -What's the matter? - -// 144 -// 00:21:13.982 --> 00:21:19.821 -// A kid gives me a Ritz cracker -// with chopped liver and says, "canapés". - -// 145 -// 00:21:19.988 --> 00:21:25.202 -// I said, "Can of peas, my ass. That's -// a Ritz cracker and chopped liver!" - -// 146 -// 00:21:28.497 --> 00:21:31.625 -// Bring out the peppers and sardines! - -// 147 -// 00:21:32.251 --> 00:21:35.546 -// Seeing you reminds me of New York -// in the old days! - -// 148 -// 00:21:36.713 --> 00:21:42.219 -// You remember Willi Cicci, who was -// with old man Clemenza in Brooklyn? - -// 149 -// 00:21:44.555 --> 00:21:47.975 -// We were all upset about that. -// Heart attack, huh? - -// 150 -// 00:21:48.058 --> 00:21:51.144 -// No, that was no heart attack. - -// 151 -// 00:21:51.478 --> 00:21:55.482 -// That's what I'm here to see -// your brother Mike about. - -// 152 -// 00:21:55.566 --> 00:21:58.569 -// -But what's with him? -// -What do you mean? - -// 153 -// 00:21:58.694 --> 00:22:04.074 -// Do I have to get a letter of introduction -// to get a sit-down? - -// 154 -// 00:22:04.241 --> 00:22:08.787 -// -You can't get in to see Mike? -// -He's got me waiting in a lobby! - -// 155 -// 00:22:12.457 --> 00:22:15.544 -// -Johnny Ola. -// -Al Neri. - -// 156 -// 00:22:20.841 --> 00:22:26.388 -// -Do you know my lawyer Tom Hagen? -// -I remember Tom from the old days. - -// 157 -// 00:22:26.471 --> 00:22:28.056 -// Rocco. - -// 158 -// 00:22:28.140 --> 00:22:32.102 -// -What's this? -// -It's an orange from Miami. - -// 159 -// 00:22:32.186 --> 00:22:35.230 -// Take care of Johnny's men. -// They look like they might be hungry. - -// 160 -// 00:22:35.314 --> 00:22:36.315 -// Johnny? - -// 161 -// 00:22:39.443 --> 00:22:43.614 -// Tom won't stay. He only handles -// specific areas of the business. - -// 162 -// 00:22:44.448 --> 00:22:46.575 -// Sure, Mike. - -// 163 -// 00:22:50.537 --> 00:22:53.874 -// -What are you drinking, Johnny? -// -Anisette. - -// 164 -// 00:22:59.254 --> 00:23:04.468 -// -If you need anything, I'll be outside. -// -Just tell Rocco we're waiting, Tom. - -// 165 -// 00:23:09.556 --> 00:23:13.810 -// -I just left Mr. Roth in Miami. -// -How is his health? - -// 166 -// 00:23:13.894 --> 00:23:15.812 -// It's not good. - -// 167 -// 00:23:17.022 --> 00:23:19.525 -// Can I do anything or send anything? - -// 168 -// 00:23:19.608 --> 00:23:24.488 -// He appreciates your concern, Michael, -// and your respect. - -// 169 -// 00:23:24.780 --> 00:23:26.490 -// That casino... - -// 170 -// 00:23:26.573 --> 00:23:31.245 -// Registered owners. Jacob Lawrence, -// Allan Barclay. Beverly Hills attorneys. - -// 171 -// 00:23:31.995 --> 00:23:34.915 -// The real owners are -// the old Lakeville Road group - -// 172 -// 00:23:34.998 --> 00:23:37.292 -// and our friend in Miami. - -// 173 -// 00:23:37.668 --> 00:23:43.757 -// Klingman runs it and owns a piece of -// it too, but I've been instructed to tell you - -// 174 -// 00:23:43.841 --> 00:23:47.886 -// that if you move him out, -// our friend in Miami will go along. - -// 175 -// 00:23:50.180 --> 00:23:54.852 -// It's very kind of him. -// Tell him it's greatly appreciated. - -// 176 -// 00:23:56.019 --> 00:23:59.898 -// Hyman Roth always makes money -// for his partners. - -// 177 -// 00:24:01.441 --> 00:24:05.028 -// One by one, our old friends are gone. - -// 178 -// 00:24:05.529 --> 00:24:08.866 -// Death, natural or not, - -// 179 -// 00:24:08.949 --> 00:24:11.702 -// prison, deported... - -// 180 -// 00:24:12.953 --> 00:24:18.208 -// Only Hyman Roth is left, because he -// always made money for his partners. - -// 181 -// 00:24:20.127 --> 00:24:25.799 -// I can't believe it! Out of 30 professional -// musicians there isn't one Italian! - -// 182 -// 00:24:25.883 --> 00:24:28.594 -// Let's have a tarantella! - -// 183 -// 00:24:34.057 --> 00:24:36.351 -// You! Up, up, up! - -// 184 -// 00:24:45.986 --> 00:24:47.487 -// Questa mano! - -// 185 -// 00:24:48.697 --> 00:24:50.657 -// Questa mano! - -// 186 -// 00:24:56.288 --> 00:24:59.416 -// What the hell have we here? - -// 187 -// 00:25:10.385 --> 00:25:16.099 -// -I'll see my sister alone. -// -It concerns me too. May I stay? - -// 188 -// 00:25:16.183 --> 00:25:20.354 -// How are you, honey? You've met -// Merle, he was with me in Vegas. - -// 189 -// 00:25:20.437 --> 00:25:23.607 -// -I saw him with you. -// -Could I have a drink? - -// 190 -// 00:25:28.195 --> 00:25:30.531 -// Al, please get him a drink! - -// 191 -// 00:25:32.825 --> 00:25:36.620 -// We're going to Europe. I'd like to book -// passage on The Queen. - -// 192 -// 00:25:36.703 --> 00:25:39.540 -// Why don't you go to a travel agent? - -// 193 -// 00:25:39.623 --> 00:25:42.626 -// We're getting married first. - -// 194 -// 00:25:50.342 --> 00:25:54.513 -// The ink on your divorce isn't dry yet, -// and you're getting married? - -// 195 -// 00:25:56.640 --> 00:25:59.142 -// You see your children on weekends. - -// 196 -// 00:25:59.476 --> 00:26:04.398 -// Your oldest boy was picked up in Reno -// for a theft you don't even know about. - -// 197 -// 00:26:04.481 --> 00:26:07.860 -// You fly around the world -// with men who use you! - -// 198 -// 00:26:07.943 --> 00:26:10.487 -// -You're not my father! -// -So why come to me? - -// 199 -// 00:26:10.571 --> 00:26:11.989 -// I need money. - -// 200 -// 00:26:25.419 --> 00:26:28.172 -// Connie, Connie, Connie... - -// 201 -// 00:26:34.595 --> 00:26:37.181 -// I want to be reasonable with you. - -// 202 -// 00:26:38.432 --> 00:26:41.185 -// Why don't you stay with the family? - -// 203 -// 00:26:42.352 --> 00:26:44.980 -// You can live on the estate -// with your kids. - -// 204 -// 00:26:45.063 --> 00:26:48.734 -// You won't be deprived of anything. - -// 205 -// 00:26:53.197 --> 00:26:58.660 -// I don't know this Merle. I don't know -// what he does or what he lives on. - -// 206 -// 00:27:00.204 --> 00:27:05.209 -// Tell him marriage is out of the question -// and you don't want to see him anymore. - -// 207 -// 00:27:05.334 --> 00:27:07.503 -// He'll understand, believe me. - -// 208 -// 00:27:15.552 --> 00:27:17.596 -// Connie. - -// 209 -// 00:27:19.556 --> 00:27:23.227 -// If you don't listen to me -// and marry this man, - -// 210 -// 00:27:28.106 --> 00:27:30.442 -// you'll disappoint me. - -// 211 -// 00:28:02.015 --> 00:28:06.228 -// -Famiglia! -// -Cent' anni! - -// 212 -// 00:28:06.937 --> 00:28:09.022 -// What's "Chen dannay"? - -// 213 -// 00:28:09.106 --> 00:28:12.025 -// "Cent' anni". It means 100 years. - -// 214 -// 00:28:12.109 --> 00:28:16.446 -// It means we should all live happily -// for 100 years. The family. - -// 215 -// 00:28:16.530 --> 00:28:20.576 -// -It would be true if my father were alive. -// -Connie. - -// 216 -// 00:28:20.659 --> 00:28:22.286 -// Hey... - -// 217 -// 00:28:22.369 --> 00:28:26.165 -// Merle, you've met my sister-in-law, -// Deanna. - -// 218 -// 00:28:26.248 --> 00:28:27.916 -// -Fredo's wife. -// -My pleasure. - -// 219 -// 00:28:38.635 --> 00:28:42.472 -// With all respect, I didn't -// come here to eat dinner! - -// 220 -// 00:28:43.223 --> 00:28:44.725 -// I know, I know. - -// 221 -// 00:29:15.088 --> 00:29:20.177 -// -I just want to dance! -// -You're falling all over the floor. - -// 222 -// 00:29:20.344 --> 00:29:24.097 -// You're justjealous -// because he's a real man! - -// 223 -// 00:29:24.264 --> 00:29:28.977 -// -I'm going to belt you right in the teeth. -// -You couldn't belt your mama! - -// 224 -// 00:29:30.854 --> 00:29:33.023 -// These Dagos are crazy -// when it comes to their wives. - -// 225 -// 00:29:33.106 --> 00:29:38.028 -// Michael says that if you can't -// take care of this, I have to. - -// 226 -// 00:29:38.195 --> 00:29:41.031 -// -I think you'd better. -// -Never marry a Wop. - -// 227 -// 00:29:41.198 --> 00:29:46.703 -// They treat their wives like shit! -// I didn't mean to say Wop. Don't! - -// 228 -// 00:29:47.704 --> 00:29:53.001 -// What are you doing to me, -// you big slob? Help! - -// 229 -// 00:29:53.085 --> 00:29:54.294 -// Fredo! - -// 230 -// 00:29:54.378 --> 00:29:59.216 -// -I can't control her, Mikey. -// -You're my brother, don't apologize. - -// 231 -// 00:30:03.136 --> 00:30:07.224 -// Clemenza promised the Rosato -// brothers three territories after he died. - -// 232 -// 00:30:07.307 --> 00:30:08.809 -// You took over and didn't give it to them. - -// 233 -// 00:30:08.892 --> 00:30:10.143 -// I welched. - -// 234 -// 00:30:10.227 --> 00:30:14.690 -// Clemenza promised them lu cazzo. -// He promised them nothing. - -// 235 -// 00:30:15.232 --> 00:30:20.404 -// -He hated them more than I do. -// -Frankie, they feel cheated. - -// 236 -// 00:30:21.238 --> 00:30:25.492 -// You're sitting up in the Sierra Mountains -// and you're drinking... - -// 237 -// 00:30:25.576 --> 00:30:27.911 -// -What's he drinking? -// -Champagne. - -// 238 -// 00:30:27.995 --> 00:30:33.041 -// Champagne cocktails, and passing -// judgment on how I run my family. - -// 239 -// 00:30:35.294 --> 00:30:37.087 -// Your family's still called Corleone. - -// 240 -// 00:30:38.255 --> 00:30:41.341 -// And you'll run it like a Corleone. - -// 241 -// 00:30:41.758 --> 00:30:45.429 -// My family doesn't eat here, -// doesn't eat in Las Vegas... - -// 242 -// 00:30:46.013 --> 00:30:47.598 -// ...and doesn't eat in Miami... - -// 243 -// 00:30:48.140 --> 00:30:49.766 -// ...with Hyman Roth! - -// 244 -// 00:30:56.106 --> 00:31:00.652 -// You're a good old man and I like you. - -// 245 -// 00:31:00.736 --> 00:31:03.155 -// You were loyal to my father for years. - -// 246 -// 00:31:04.781 --> 00:31:08.785 -// The Rosato brothers -// are taking hostages. - -// 247 -// 00:31:10.037 --> 00:31:15.876 -// They spit right in my face, all because -// they're backed up by that Jew in Miami. - -// 248 -// 00:31:15.959 --> 00:31:18.837 -// I know. That's why -// I don't want them touched. - -// 249 -// 00:31:19.004 --> 00:31:22.758 -// -Not touched? -// -No, I want you to be fair with them. - -// 250 -// 00:31:22.841 --> 00:31:27.888 -// You want me to be fair with them? -// How can you be fair to animals? - -// 251 -// 00:31:28.055 --> 00:31:34.186 -// Tom, listen. They recruit spics, -// they recruit niggers. - -// 252 -// 00:31:34.311 --> 00:31:38.065 -// They do violence in their grandmothers' -// neighborhoods! - -// 253 -// 00:31:38.148 --> 00:31:44.655 -// And everything with them is whores! -// Andjunk, dope! - -// 254 -// 00:31:44.738 --> 00:31:47.366 -// And they leave the gambling to last. - -// 255 -// 00:31:47.491 --> 00:31:52.704 -// I want to run my family without you -// on my back. I want those Rosatos dead! - -// 256 -// 00:31:52.788 --> 00:31:55.624 -// -No. -// -Morte. - -// 257 -// 00:32:01.129 --> 00:32:05.968 -// I have business that's important with -// Hyman Roth. I don't want it disturbed. - -// 258 -// 00:32:07.845 --> 00:32:12.140 -// Then you give your loyalty to a Jew -// before your own blood. - -// 259 -// 00:32:15.060 --> 00:32:19.189 -// You know my father did business -// with Hyman Roth. He respected him. - -// 260 -// 00:32:19.398 --> 00:32:24.069 -// Your father did business with -// Hyman Roth, he respected Hyman Roth, - -// 261 -// 00:32:24.236 --> 00:32:27.406 -// but he never trusted Hyman Roth - -// 262 -// 00:32:27.531 --> 00:32:31.034 -// or his Sicilian messenger boy, -// Johnny Ola. - -// 263 -// 00:32:31.326 --> 00:32:36.665 -// You'll have to excuse me. I'm tired, -// and I'm a little drunk! - -// 264 -// 00:32:38.667 --> 00:32:43.797 -// I want everybody here to know, there's -// not going to be no trouble from me! - -// 265 -// 00:32:44.256 --> 00:32:46.091 -// Don Corleone. - -// 266 -// 00:32:46.300 --> 00:32:48.260 -// Cicci, the door... - -// 267 -// 00:32:56.768 --> 00:32:58.854 -// You want him to leave now? - -// 268 -// 00:33:01.398 --> 00:33:05.903 -// Let him go back to New York. -// I've already made my plans. - -// 269 -// 00:33:06.904 --> 00:33:09.573 -// The old man had too much wine. - -// 270 -// 00:33:13.785 --> 00:33:16.079 -// It's late. - -// 271 -// 00:33:27.674 --> 00:33:29.760 -// How's the baby? - -// 272 -// 00:33:29.843 --> 00:33:34.223 -// -Sleeping inside me. -// -Does it feel like a boy? - -// 273 -// 00:33:34.306 --> 00:33:37.476 -// Yes, it does, Michael. - -// 274 -// 00:33:39.853 --> 00:33:41.522 -// Kay? - -// 275 -// 00:33:41.605 --> 00:33:46.193 -// I'm sorry about all the people today. -// Bad timing. - -// 276 -// 00:33:46.276 --> 00:33:48.654 -// It couldn't be helped, though. - -// 277 -// 00:33:48.737 --> 00:33:51.949 -// It made me think -// of what you once told me. - -// 278 -// 00:33:53.992 --> 00:33:58.038 -// " In five years the Corleone family -// will be completely legitimate. " - -// 279 -// 00:33:58.121 --> 00:34:01.041 -// That was seven years ago. - -// 280 -// 00:34:03.627 --> 00:34:07.297 -// I know. I'm trying, darling. - -// 281 -// 00:35:11.278 --> 00:35:14.031 -// Did you see this? - -// 282 -// 00:35:27.711 --> 00:35:29.755 -// Why are the drapes open? - -// 283 -// 00:35:57.491 --> 00:35:59.326 -// Kay, are you all right? - -// 284 -// 00:35:59.409 --> 00:36:02.079 -// -Are you hit? -// -No. - -// 285 -// 00:36:04.414 --> 00:36:06.708 -// It's all right. - -// 286 -// 00:36:08.210 --> 00:36:10.504 -// Stop! Stop! - -// 287 -// 00:36:12.130 --> 00:36:13.799 -// Halt! - -// 288 -// 00:36:24.768 --> 00:36:28.564 -// They're still on the property. -// Please stay inside. - -// 289 -// 00:36:28.647 --> 00:36:30.816 -// -Keep them alive. -// -We'll try. - -// 290 -// 00:36:30.899 --> 00:36:32.442 -// Alive! - -// 291 -// 00:36:33.569 --> 00:36:35.654 -// Stay by the door. - -// 292 -// 00:37:55.025 --> 00:37:57.069 -// Yeah, come in. - -// 293 -// 00:38:04.201 --> 00:38:07.037 -// -Mike, are you all right? -// -Yeah. - -// 294 -// 00:38:11.333 --> 00:38:14.169 -// There's a lot I can't tell you, Tom. - -// 295 -// 00:38:15.879 --> 00:38:19.299 -// And I know that's upset you in the past. - -// 296 -// 00:38:20.425 --> 00:38:24.596 -// You felt it was because of -// some lack of trust or confidence. - -// 297 -// 00:38:25.806 --> 00:38:30.686 -// But it's because I admire you -// and love you - -// 298 -// 00:38:30.769 --> 00:38:33.605 -// that I kept things secret from you. - -// 299 -// 00:38:35.315 --> 00:38:38.235 -// Now you're the only one I can trust. - -// 300 -// 00:38:41.071 --> 00:38:42.948 -// Fredo? - -// 301 -// 00:38:43.031 --> 00:38:45.576 -// Well, he's got a good heart. - -// 302 -// 00:38:45.659 --> 00:38:50.247 -// But he's weak and he's stupid, -// and this is life and death. - -// 303 -// 00:38:51.081 --> 00:38:54.293 -// Tom, you're my brother. - -// 304 -// 00:38:59.882 --> 00:39:05.179 -// I always wanted to be thought of as -// a brother by you, Mikey. A real brother. - -// 305 -// 00:39:07.556 --> 00:39:09.641 -// I know that. - -// 306 -// 00:39:15.939 --> 00:39:18.025 -// You're going to take over. - -// 307 -// 00:39:19.067 --> 00:39:21.320 -// You're going to be the Don. - -// 308 -// 00:39:24.239 --> 00:39:29.745 -// If what I think has happened, -// has happened, I'm leaving here tonight. - -// 309 -// 00:39:30.579 --> 00:39:36.668 -// I give you complete power. Over Fredo -// and his men. Rocco, Neri, everyone. - -// 310 -// 00:39:38.420 --> 00:39:42.049 -// I'm trusting you -// with the lives of my wife - -// 311 -// 00:39:42.132 --> 00:39:45.135 -// and my children, -// the future of this family. - -// 312 -// 00:39:48.639 --> 00:39:53.477 -// -If we catch them, will we find out... -// -We won't catch them. - -// 313 -// 00:39:55.646 --> 00:39:58.982 -// Unless I'm very wrong, -// they're dead already. - -// 314 -// 00:40:00.484 --> 00:40:03.779 -// They were killed by somebody -// close to us. - -// 315 -// 00:40:03.946 --> 00:40:08.492 -// Inside. Very, very frightened -// that they botched it. - -// 316 -// 00:40:08.867 --> 00:40:13.163 -// You don't think that Rocco and Neri -// had something to do with this? - -// 317 -// 00:40:16.333 --> 00:40:20.712 -// See... All our people are businessmen. - -// 318 -// 00:40:22.381 --> 00:40:25.509 -// Their loyalty is based on that. - -// 319 -// 00:40:27.845 --> 00:40:30.514 -// One thing I learned from Pop - -// 320 -// 00:40:31.807 --> 00:40:35.352 -// was to try to think -// as people around you think. - -// 321 -// 00:40:37.396 --> 00:40:40.315 -// On that basis, anything is possible. - -// 322 -// 00:40:42.234 --> 00:40:46.029 -// Mike, they're dead! -// Right outside my window! - -// 323 -// 00:40:46.196 --> 00:40:49.366 -// I want to get out of here. -// They're lying there dead! - -// 324 -// 00:41:00.460 --> 00:41:03.213 -// Over here! There's two of them. - -// 325 -// 00:41:03.380 --> 00:41:07.551 -// Looks like they were hired -// out of New York. I don't recognize them. - -// 326 -// 00:41:07.968 --> 00:41:10.971 -// Won't get anything out of them now. - -// 327 -// 00:41:11.054 --> 00:41:13.223 -// Fish them out. - -// 328 -// 00:41:37.748 --> 00:41:40.042 -// Get rid of the bodies. - -// 329 -// 00:41:40.125 --> 00:41:43.086 -// -Where's Mike? -// -Rocco. - -// 330 -// 00:42:13.242 --> 00:42:18.580 -// Anthony, everything is going to be -// all right. Try to sleep. - -// 331 -// 00:42:34.638 --> 00:42:39.268 -// -Did you like your party? -// -I got lots of presents. - -// 332 -// 00:42:39.434 --> 00:42:42.771 -// I know. Did you like them? - -// 333 -// 00:42:42.938 --> 00:42:46.233 -// Yeah. I didn't know the people -// who gave them to me. - -// 334 -// 00:42:46.733 --> 00:42:49.570 -// Well, they were friends. - -// 335 -// 00:42:51.321 --> 00:42:55.826 -// -Did you see my present for you? -// -It was on my pillow. - -// 336 -// 00:42:58.328 --> 00:43:01.498 -// I'm going to be leaving -// very early tomorrow. - -// 337 -// 00:43:02.332 --> 00:43:06.670 -// -Will you take me? -// -No, I can't, Anthony. - -// 338 -// 00:43:06.837 --> 00:43:11.675 -// -Why do you have to go? -// -I have to do business. - -// 339 -// 00:43:12.342 --> 00:43:15.470 -// I could help you. - -// 340 -// 00:43:17.806 --> 00:43:20.934 -// I know. Some day you will. - -// 341 -// 00:43:22.186 --> 00:43:24.313 -// Get some sleep. - -// 342 -// 00:44:40.722 --> 00:44:43.892 -// She's really beautiful. -// You've got to see her. - -// 343 -// 00:45:04.371 --> 00:45:08.750 -// Wait till you see her. -// Words can't describe her. - -// 344 -// 00:45:18.302 --> 00:45:22.014 -// I left Naples. I left Mama. - -// 345 -// 00:45:23.348 --> 00:45:25.184 -// For a no-good tramp! - -// 346 -// 00:45:27.144 --> 00:45:31.523 -// Now here I am in America, -// in New York. - -// 347 -// 00:45:33.734 --> 00:45:36.987 -// Alone! Thinking of my mother. - -// 348 -// 00:45:39.364 --> 00:45:41.158 -// Without news from home. - -// 349 -// 00:45:50.209 --> 00:45:52.169 -// Finally, a letter from Naples! - -// 350 -// 00:45:55.214 --> 00:45:58.050 -// Vito, how do you like my little angel? -// Isn't she beautiful? - -// 351 -// 00:45:59.009 --> 00:46:00.928 -// She's very beautiful. - -// 352 -// 00:46:02.846 --> 00:46:06.433 -// To you, she's beautiful. For me, -// there's only my wife and son. - -// 353 -// 00:46:07.476 --> 00:46:09.019 -// Our dear mother - - -// 354 -// 00:46:11.313 --> 00:46:13.357 -// ...is dead! - -// 355 -// 00:47:09.997 --> 00:47:12.916 -// We'll go backstage later -// and take her to eat. - -// 356 -// 00:47:17.337 --> 00:47:19.339 -// Sit down, you bum! - -// 357 -// 00:47:26.096 --> 00:47:28.098 -// Oh, excuse me, Don Fanucci. - -// 358 -// 00:47:36.064 --> 00:47:38.275 -// We'll go see her backstage. - -// 359 -// 00:47:41.195 --> 00:47:42.821 -// Who was that? - -// 360 -// 00:47:43.780 --> 00:47:45.365 -// The Black Hand. - -// 361 -// 00:48:17.981 --> 00:48:20.359 -// That's Fanucci...the Black Hand. - -// 362 -// 00:48:20.859 --> 00:48:22.820 -// We'll talk about it tomorrow. - -// 363 -// 00:48:24.112 --> 00:48:27.032 -// Tomorrow! Always tomorrow! - -// 364 -// 00:48:28.116 --> 00:48:29.701 -// You'll pay me today! - -// 365 -// 00:48:40.003 --> 00:48:41.672 -// Let's go. - -// 366 -// 00:48:44.967 --> 00:48:47.094 -// Not my daughter! Let her go! - -// 367 -// 00:48:48.554 --> 00:48:50.681 -// Here, take all my money! - -// 368 -// 00:48:59.022 --> 00:49:01.358 -// Vito, come on. - -// 369 -// 00:49:07.781 --> 00:49:11.076 -// I know what you're thinking. But -// you don't know how things are. - -// 370 -// 00:49:11.702 --> 00:49:15.080 -// Fanucci's with the Black Hand. -// The whole neighborhood pays him. - -// 371 -// 00:49:15.747 --> 00:49:17.541 -// Even my father, in the grocery store. - -// 372 -// 00:49:17.875 --> 00:49:19.042 -// If he's Italian... - -// 373 -// 00:49:21.086 --> 00:49:23.547 -// ...why does he bother other Italians? - -// 374 -// 00:49:23.630 --> 00:49:26.049 -// He knows they have nobody -// to protect them. - -// 375 -// 00:49:26.592 --> 00:49:28.302 -// Forget that. Did you like my angel? - -// 376 -// 00:49:28.468 --> 00:49:30.262 -// If you're happy, I'm happy. - -// 377 -// 00:50:18.519 --> 00:50:20.354 -// Don't you feel well? - -// 378 -// 00:50:24.441 --> 00:50:26.235 -// Is your boss treating you all right? - -// 379 -// 00:50:28.278 --> 00:50:29.988 -// Forget it. - -// 380 -// 00:50:42.918 --> 00:50:45.921 -// Hey, you speak Italian? - -// 381 -// 00:50:51.510 --> 00:50:53.011 -// Hide this for me! - -// 382 -// 00:50:53.595 --> 00:50:55.681 -// Next week I'll come and get it! - -// 383 -// 00:51:35.512 --> 00:51:37.681 -// Abbandando, meet my nephew! - -// 384 -// 00:51:42.728 --> 00:51:44.688 -// How's business? - -// 385 -// 00:51:50.944 --> 00:51:52.905 -// It's good, it's good. - -// 386 -// 00:51:59.703 --> 00:52:02.956 -// Fanucci's mad. Says the -// neighborhood's getting sloppy. - -// 387 -// 00:52:03.248 --> 00:52:07.127 -// People don't pay on time, -// don't pay the full amount. - -// 388 -// 00:52:07.377 --> 00:52:09.546 -// Says he's been too nice to everyone. - -// 389 -// 00:52:15.719 --> 00:52:17.679 -// So Fanucci's changing? - -// 390 -// 00:52:18.138 --> 00:52:20.557 -// Sure. He wants double -// from everybody. - -// 391 -// 00:52:21.683 --> 00:52:23.727 -// Even from my father. - -// 392 -// 00:52:24.269 --> 00:52:27.815 -// I'm a friend, right? So you'll -// let him work here? - -// 393 -// 00:53:00.264 --> 00:53:02.182 -// I've got some bad news. - -// 394 -// 00:53:06.687 --> 00:53:08.939 -// I feel rotten about telling you this... - -// 395 -// 00:53:11.900 --> 00:53:15.779 -// But Fanucci...he's got a nephew... - -// 396 -// 00:53:23.537 --> 00:53:25.414 -// And you have to give him my job. - -// 397 -// 00:53:26.373 --> 00:53:29.668 -// You've always been good to me, -// ever since I came here. - -// 398 -// 00:53:30.878 --> 00:53:33.005 -// You looked after me like a father. - -// 399 -// 00:53:33.463 --> 00:53:34.882 -// I thank you. - -// 400 -// 00:53:36.383 --> 00:53:38.468 -// And I won't forget it. - -// 401 -// 00:53:51.899 --> 00:53:53.817 -// Vito! - -// 402 -// 00:53:58.113 --> 00:53:59.740 -// Oh, no! - -// 403 -// 00:54:01.158 --> 00:54:03.202 -// Take this to your family. - -// 404 -// 00:54:05.496 --> 00:54:07.915 -// Thanks anyway. But please, -// I can't accept. - -// 405 -// 00:54:43.325 --> 00:54:45.077 -// What a nice pear! - -// 406 -// 00:55:08.475 --> 00:55:11.103 -// I'm Clemenza, you still -// have my goods? - -// 407 -// 00:55:14.189 --> 00:55:16.233 -// Did you look inside? - -// 408 -// 00:55:17.985 --> 00:55:20.612 -// I'm not interested in things -// that don't concern me. - -// 409 -// 00:55:31.999 --> 00:55:36.253 -// A friend of mine has a nice rug. -// Maybe your wife would like it. - -// 410 -// 00:55:43.343 --> 00:55:46.805 -// Sure she would. But who has -// money for a rug? - -// 411 -// 00:55:47.598 --> 00:55:52.352 -// It would be a present. -// I know how to return a favor. - -// 412 -// 00:56:00.652 --> 00:56:02.529 -// Yeah, sure. - -// 413 -// 00:56:02.613 --> 00:56:04.615 -// My wife would like it. - -// 414 -// 00:56:29.056 --> 00:56:31.558 -// That son of a bitch! He isn't home! - -// 415 -// 00:56:35.270 --> 00:56:37.439 -// Damn, he didn't even leave the key. - -// 416 -// 00:56:42.152 --> 00:56:44.196 -// Well, he won't mind. - -// 417 -// 00:56:55.499 --> 00:56:56.875 -// Come on in. - -// 418 -// 00:56:57.918 --> 00:57:01.088 -// Hey, Vito, come on in! - -// 419 -// 00:57:23.110 --> 00:57:25.028 -// This is your friend's place? - -// 420 -// 00:57:27.739 --> 00:57:29.700 -// This is a real palace. - -// 421 -// 00:57:30.200 --> 00:57:31.910 -// One of the best. - -// 422 -// 00:57:38.500 --> 00:57:40.544 -// Vito, give me a hand, will you? - -// 423 -// 00:59:37.119 --> 00:59:40.038 -// Look how pretty it is, Santino! - -// 424 -// 01:02:08.479 --> 01:02:09.980 -// Come on in. - -// 425 -// 01:02:12.483 --> 01:02:15.360 -// It's all right. Hyman's in there. - -// 426 -// 01:02:15.444 --> 01:02:20.324 -// -Would you like a tuna sandwich? -// -No, thank you. - -// 427 -// 01:02:26.872 --> 01:02:30.375 -// ...pick up of two by Holden. -// Second and eight for S.C... - -// 428 -// 01:02:31.543 --> 01:02:35.214 -// -Mr. Roth? -// -Come in, Michael. - -// 429 -// 01:02:37.132 --> 01:02:39.718 -// Sit down, make yourself comfortable. - -// 430 -// 01:02:41.553 --> 01:02:43.639 -// It's almost over. - -// 431 -// 01:02:45.432 --> 01:02:50.270 -// -Do you follow the football game? -// -Not for a while I haven't. - -// 432 -// 01:02:50.813 --> 01:02:53.941 -// I enjoy watching football -// in the afternoon. - -// 433 -// 01:02:54.024 --> 01:02:59.112 -// One of the things I love -// about this country. Baseball too. - -// 434 -// 01:03:01.198 --> 01:03:06.453 -// Ever since Arnold Rothstein -// fixed the World Series in 1919. - -// 435 -// 01:03:11.041 --> 01:03:13.377 -// I heard you had some trouble. - -// 436 -// 01:03:16.129 --> 01:03:17.923 -// Stupid. - -// 437 -// 01:03:19.007 --> 01:03:22.052 -// People behaving like that with guns. - -// 438 -// 01:03:23.929 --> 01:03:26.723 -// The important thing is you're all right. - -// 439 -// 01:03:26.807 --> 01:03:29.935 -// Good health is the most important thing. - -// 440 -// 01:03:30.894 --> 01:03:33.814 -// More than success, more than money. - -// 441 -// 01:03:35.357 --> 01:03:37.025 -// More than power. - -// 442 -// 01:03:51.540 --> 01:03:55.377 -// I came here because -// there's going to be more bloodshed. - -// 443 -// 01:03:55.544 --> 01:03:59.548 -// I wanted you to know, -// so another war won't start. - -// 444 -// 01:04:00.757 --> 01:04:03.719 -// Nobody wants another war. - -// 445 -// 01:04:03.802 --> 01:04:09.641 -// Frank Pentangeli asked my permission -// to get rid of the Rosato brothers. - -// 446 -// 01:04:09.725 --> 01:04:13.520 -// When I refused he tried to have me -// killed. He was stupid, I was lucky. - -// 447 -// 01:04:13.604 --> 01:04:15.606 -// I'll visit him soon. - -// 448 -// 01:04:15.731 --> 01:04:20.527 -// The important thing is that nothing -// interferes with our plans for the future. - -// 449 -// 01:04:21.612 --> 01:04:24.114 -// Nothing is more important. - -// 450 -// 01:04:25.949 --> 01:04:31.079 -// -You're a wise and considerate man. -// -And you're a great man, Mr. Roth. - -// 451 -// 01:04:31.997 --> 01:04:37.002 -// -There's much I can learn from you. -// -Whatever I can do to help, Michael. - -// 452 -// 01:04:39.213 --> 01:04:41.924 -// -Excuse me. Lunch. -// -Come in. - -// 453 -// 01:04:42.049 --> 01:04:46.845 -// -Thank you, my dear. -// -You're going to break your eardrums. - -// 454 -// 01:04:47.888 --> 01:04:50.349 -// -Enjoy it. -// -Thank you. - -// 455 -// 01:04:55.979 --> 01:04:58.732 -// You're young, I'm old and sick. - -// 456 -// 01:04:59.817 --> 01:05:03.821 -// What we'll do in the next few months -// will make history. - -// 457 -// 01:05:05.989 --> 01:05:07.991 -// It's never been done before. - -// 458 -// 01:05:08.075 --> 01:05:12.746 -// Not even your father would dream -// that such a thing could be possible. - -// 459 -// 01:05:14.706 --> 01:05:19.294 -// Frank Pentangeli is a dead man. -// You don't object? - -// 460 -// 01:05:20.671 --> 01:05:23.674 -// He's small potatoes. - -// 461 -// 01:05:33.392 --> 01:05:35.853 -// What's up? - -// 462 -// 01:05:38.230 --> 01:05:40.607 -// We got company? - -// 463 -// 01:05:54.413 --> 01:05:55.706 -// What's going on? - -// 464 -// 01:05:55.873 --> 01:05:57.875 -// Michael Corleone is here. - -// 465 -// 01:06:00.294 --> 01:06:01.295 -// Where is he? - -// 466 -// 01:06:01.378 --> 01:06:03.213 -// He's in your den. You better hurry. - -// 467 -// 01:06:04.006 --> 01:06:05.966 -// He's been waiting a half hour. - -// 468 -// 01:06:13.182 --> 01:06:15.350 -// Is something wrong? - -// 469 -// 01:06:21.190 --> 01:06:23.233 -// I wish you would have let me know -// you were coming. - -// 470 -// 01:06:23.317 --> 01:06:27.237 -// -I could have prepared something. -// -I didn't want you to know. - -// 471 -// 01:06:34.912 --> 01:06:38.832 -// -You heard what happened? -// -I almost died. We were so relieved... - -// 472 -// 01:06:38.957 --> 01:06:41.084 -// In my home! - -// 473 -// 01:06:43.921 --> 01:06:47.007 -// In my bedroom where my wife sleeps! - -// 474 -// 01:06:49.801 --> 01:06:52.137 -// Where my children come to play. - -// 475 -// 01:06:53.806 --> 01:06:55.849 -// In my home. - -// 476 -// 01:07:12.908 --> 01:07:15.828 -// I want you to help me take my revenge. - -// 477 -// 01:07:15.911 --> 01:07:19.581 -// Michael, anything. What can I do? - -// 478 -// 01:07:22.793 --> 01:07:26.046 -// Settle these troubles -// with the Rosato brothers. - -// 479 -// 01:07:26.129 --> 01:07:28.715 -// I don't understand. I don't... - -// 480 -// 01:07:28.799 --> 01:07:33.804 -// I don't have your brain for big deals. -// But this is a street thing. - -// 481 -// 01:07:33.887 --> 01:07:38.684 -// That Hyman Roth in Miami. -// He's backing up those sons-of-bitches. - -// 482 -// 01:07:38.767 --> 01:07:43.564 -// -I know he is. -// -So why ask me to lay down to them? - -// 483 -// 01:07:49.653 --> 01:07:52.781 -// It was Hyman Roth -// that tried to have me killed. - -// 484 -// 01:07:54.533 --> 01:07:57.077 -// I know it was him. - -// 485 -// 01:07:58.078 --> 01:08:00.205 -// Jesus Christ, Mike. - -// 486 -// 01:08:00.289 --> 01:08:05.085 -// Jesus Christ, let's get them all. -// Now while we've got the muscle. - -// 487 -// 01:08:10.174 --> 01:08:13.051 -// This used to be my father's old study. - -// 488 -// 01:08:14.219 --> 01:08:16.513 -// It's changed. - -// 489 -// 01:08:17.514 --> 01:08:21.685 -// I remember there used to be -// a big desk here. - -// 490 -// 01:08:24.855 --> 01:08:30.068 -// I remember when I was a kid. We had -// to be quiet when we played near here. - -// 491 -// 01:08:37.868 --> 01:08:41.371 -// I was very happy that this house -// never went to strangers. - -// 492 -// 01:08:42.748 --> 01:08:46.460 -// First Clemenza took it over. Now you. - -// 493 -// 01:08:48.378 --> 01:08:52.799 -// My father taught me many things here. -// He taught me in this room. - -// 494 -// 01:08:57.137 --> 01:09:03.227 -// He taught me, "Keep your friends close, -// but your enemies closer. " - -// 495 -// 01:09:03.310 --> 01:09:09.483 -// If Hyman Roth sees that I interceded -// in this, in the Rosato brothers' favor, - -// 496 -// 01:09:09.566 --> 01:09:13.028 -// he'll think his relationship with me -// is still good. - -// 497 -// 01:09:15.906 --> 01:09:18.283 -// That's what I want him to think. - -// 498 -// 01:09:19.201 --> 01:09:23.121 -// I want him relaxed and confident -// in our friendship. - -// 499 -// 01:09:23.747 --> 01:09:27.751 -// Then I'll be able to find out -// who the traitor in my family was. - -// 500 -// 01:09:55.279 --> 01:09:58.740 -// -Yeah? -// -Fredo, this is Johnny Ola. - -// 501 -// 01:09:59.491 --> 01:10:03.287 -// -We need some more help. -// -Johnny? - -// 502 -// 01:10:04.413 --> 01:10:07.249 -// Jesus Christ, what the hell time is it? - -// 503 -// 01:10:07.332 --> 01:10:10.127 -// -Who's that, honey? -// -Listen good, Fredo. - -// 504 -// 01:10:10.294 --> 01:10:13.505 -// Why are you calling me? -// I don't want to talk to you. - -// 505 -// 01:10:13.672 --> 01:10:17.050 -// Pentangeli is going to accept -// the Rosato brothers' deal. - -// 506 -// 01:10:17.217 --> 01:10:19.303 -// -Oh, God. -// -Will he come alone? - -// 507 -// 01:10:19.469 --> 01:10:22.639 -// I don't know. You've got me in -// deep enough already. - -// 508 -// 01:10:22.806 --> 01:10:27.978 -// Everything will be all right. Pentangeli -// says he's willing to make a deal. - -// 509 -// 01:10:28.145 --> 01:10:32.566 -// All we want to know is if he's on -// the level, or if he'll bring his boys. - -// 510 -// 01:10:32.733 --> 01:10:35.861 -// You lied to me. I don't want you -// to call me anymore. - -// 511 -// 01:10:36.028 --> 01:10:40.908 -// -Your brother won't find out we talked. -// -I don't know what you're talking about. - -// 512 -// 01:10:51.460 --> 01:10:55.339 -// -Who was that? -// -Wrong number. - -// 513 -// 01:11:02.513 --> 01:11:06.725 -// -Frankie, I've got nobody here. -// -Wait in the car, Cicc'. - -// 514 -// 01:11:06.809 --> 01:11:09.520 -// -Frankie. -// -That's okay, Cicc'. - -// 515 -// 01:11:16.527 --> 01:11:20.823 -// -What's this? -// -A lucky C note for our new deal. - -// 516 -// 01:11:23.492 --> 01:11:26.328 -// Ritchie. Give us a taste. - -// 517 -// 01:11:31.124 --> 01:11:34.503 -// We were all real happy -// about your decision, Frankie. - -// 518 -// 01:11:34.586 --> 01:11:38.882 -// -You won't regret it. -// -I don't like the C note, Rosato. - -// 519 -// 01:11:38.966 --> 01:11:41.635 -// I take that as an insult. - -// 520 -// 01:11:41.718 --> 01:11:44.721 -// Michael Corleone says hello! - -// 521 -// 01:12:01.905 --> 01:12:04.241 -// Close the door! - -// 522 -// 01:12:04.324 --> 01:12:06.368 -// Your friend the cop... - -// 523 -// 01:12:06.451 --> 01:12:11.039 -// Hey, Ritch. It's dark in here. -// Are you open or closed? - -// 524 -// 01:12:11.123 --> 01:12:14.960 -// I just came in to clean up a little, -// you know? - -// 525 -// 01:12:17.337 --> 01:12:19.381 -// What's the matter? - -// 526 -// 01:12:19.464 --> 01:12:22.551 -// -Is that something on the floor? -// -Carmine, not here! - -// 527 -// 01:12:22.634 --> 01:12:24.136 -// Anthony! - -// 528 -// 01:12:27.389 --> 01:12:31.101 -// You open this bar -// and I'll blow your head in! - -// 529 -// 01:13:16.814 --> 01:13:19.274 -// Freddy, it's good to see you. - -// 530 -// 01:13:21.652 --> 01:13:26.448 -// -How is he? -// -He's okay. He's in the back. - -// 531 -// 01:13:30.160 --> 01:13:32.663 -// Girls, take a hike. - -// 532 -// 01:13:35.582 --> 01:13:37.835 -// In this room here. - -// 533 -// 01:13:40.546 --> 01:13:44.216 -// -I want to talk to him alone first. -// -Come on. - -// 534 -// 01:13:52.933 --> 01:13:55.686 -// I thought I could help you, Senator. - -// 535 -// 01:13:59.523 --> 01:14:01.358 -// Hagen? - -// 536 -// 01:14:02.484 --> 01:14:06.697 -// -Listen, I did not... -// -It's all right. - -// 537 -// 01:14:06.864 --> 01:14:11.618 -// -I didn't do anything. -// -It's okay. You're very lucky. - -// 538 -// 01:14:12.411 --> 01:14:17.082 -// My brother Fredo operates this place. -// He was called before anyone. - -// 539 -// 01:14:18.375 --> 01:14:22.212 -// Had this happened some place else, -// we couldn't have helped you. - -// 540 -// 01:14:25.090 --> 01:14:28.468 -// When I woke up, I was on the floor. - -// 541 -// 01:14:29.386 --> 01:14:33.807 -// -And I don't know how it happened. -// -You can't remember? - -// 542 -// 01:14:37.060 --> 01:14:39.229 -// I passed out. - -// 543 -// 01:14:55.329 --> 01:14:58.457 -// Just a game. Jesus. - -// 544 -// 01:15:09.092 --> 01:15:11.470 -// Jesus, Jesus! - -// 545 -// 01:15:16.016 --> 01:15:18.185 -// Jesus God! - -// 546 -// 01:15:18.268 --> 01:15:19.895 -// God! - -// 547 -// 01:15:22.898 --> 01:15:26.527 -// I don't know, and I don't understand -// why I can't remember. - -// 548 -// 01:15:26.610 --> 01:15:29.822 -// Doesn't matter, just do as I say. - -// 549 -// 01:15:29.905 --> 01:15:35.410 -// Put in a call to your office. -// Explain that you'll be there tomorrow. - -// 550 -// 01:15:36.453 --> 01:15:41.166 -// You decided to spend the night at -// Michael Corleone's house in Tahoe. - -// 551 -// 01:15:41.291 --> 01:15:45.879 -// -As his guest. -// -I do remember that she was laughing. - -// 552 -// 01:15:48.131 --> 01:15:53.637 -// We'd done it before, and I know -// that I could not have hurt that girl. - -// 553 -// 01:15:54.471 --> 01:15:58.559 -// This girl has no family. -// Nobody knows that she worked here. - -// 554 -// 01:15:58.642 --> 01:16:01.645 -// It'll be as though she never existed. - -// 555 -// 01:16:03.981 --> 01:16:06.942 -// All that's left is our friendship. - -// 556 -// 01:16:21.999 --> 01:16:25.210 -// -Yes? -// -Sorry, but we're not to let you through. - -// 557 -// 01:16:26.503 --> 01:16:30.591 -// -I'm just going to the market. -// -We'll pick up anything you want. - -// 558 -// 01:16:30.674 --> 01:16:33.760 -// -Whose orders are these? -// -Mr. Hagen's. He's coming. - -// 559 -// 01:16:33.844 --> 01:16:36.305 -// I'll speak to him. - -// 560 -// 01:16:42.102 --> 01:16:45.689 -// I wanted to explain, -// but I had business in Carson City. - -// 561 -// 01:16:45.856 --> 01:16:50.194 -// It's Michael's request for your safety. -// We'll get anything you need. - -// 562 -// 01:16:50.319 --> 01:16:55.616 -// -So I'm supposed to stay in my house? -// -No, within the compound will be fine. - -// 563 -// 01:16:55.699 --> 01:16:58.660 -// -We were going to New England. -// -That's off. - -// 564 -// 01:16:59.620 --> 01:17:02.623 -// -Am I a prisoner? -// -That's not how we see it, Kay. - -// 565 -// 01:17:03.582 --> 01:17:06.835 -// Come on, kids. -// We're going back to the house. - -// 566 -// 01:17:08.295 --> 01:17:10.214 -// Joe. - -// 567 -// 01:17:55.926 --> 01:17:57.719 -// Cuba, Cuba! - -// 568 -// 01:18:38.802 --> 01:18:41.847 -// Most respected gentlemen. - -// 569 -// 01:18:41.930 --> 01:18:44.141 -// Welcome to Havana. - -// 570 -// 01:18:46.226 --> 01:18:51.440 -// I want to thank this distinguished group -// of American industrialists - -// 571 -// 01:18:53.150 --> 01:18:56.111 -// for continuing to work with Cuba - -// 572 -// 01:18:56.820 --> 01:18:59.990 -// for the greatest period of prosperity - -// 573 -// 01:19:00.866 --> 01:19:03.660 -// in her entire history. - -// 574 -// 01:19:04.036 --> 01:19:06.079 -// Mr. William Shaw, - -// 575 -// 01:19:06.163 --> 01:19:08.999 -// representing -// the General Fruit Company. - -// 576 -// 01:19:09.917 --> 01:19:12.002 -// Messrs. Corngold and Dant, - -// 577 -// 01:19:12.878 --> 01:19:15.839 -// of United Telephone -// and Telegraph Company. - -// 578 -// 01:19:17.174 --> 01:19:18.634 -// Mr. Petty, - -// 579 -// 01:19:18.717 --> 01:19:22.679 -// Regional Vice President of -// the Pan American Mining Corporation. - -// 580 -// 01:19:24.515 --> 01:19:27.351 -// Mr. Robert Allen -// of South American Sugar. - -// 581 -// 01:19:29.228 --> 01:19:31.563 -// Mr. Michael Corleone of Nevada, - -// 582 -// 01:19:33.190 --> 01:19:37.736 -// representing our associates -// in tourism and leisure activities. - -// 583 -// 01:19:37.820 --> 01:19:41.448 -// And my old friend and associate -// from Florida, - -// 584 -// 01:19:43.075 --> 01:19:44.910 -// Mr. Hyman Roth. - -// 585 -// 01:19:45.202 --> 01:19:50.374 -// I would like to thank United Telephone -// and Telegraph for their Christmas gift. - -// 586 -// 01:19:55.629 --> 01:19:57.881 -// A solid gold telephone. - -// 587 -// 01:20:00.259 --> 01:20:03.762 -// Perhaps you gentlemen -// would like to look at it. - -// 588 -// 01:20:04.555 --> 01:20:06.390 -// -Mr. President? -// -Yes? - -// 589 -// 01:20:06.473 --> 01:20:12.146 -// Could you discuss the rebel activity and -// what this can mean to our businesses? - -// 590 -// 01:20:12.604 --> 01:20:13.856 -// -Of course. -// -Heavy stuff. - -// 591 -// 01:20:13.939 --> 01:20:19.611 -// I assure you that, although the rebels -// have started a campaign in Las Villas, - -// 592 -// 01:20:26.285 --> 01:20:32.040 -// my staff indicates, with assurance, -// that we'll drive them out of Santa Clara - -// 593 -// 01:20:32.124 --> 01:20:34.168 -// before the New Year. - -// 594 -// 01:20:35.961 --> 01:20:37.963 -// I want to put you all at ease. - -// 595 -// 01:20:38.839 --> 01:20:43.051 -// We will tolerate no guerrillas -// in the casinos or the swimming pools. - -// 596 -// 01:21:01.278 --> 01:21:03.530 -// He said that they're making an arrest, - -// 597 -// 01:21:03.614 --> 01:21:06.366 -// and in a few minutes -// he'll let us through. - -// 598 -// 01:21:06.450 --> 01:21:07.534 -// Johnny... - -// 599 -// 01:21:07.618 --> 01:21:08.660 -// It's nothing. - -// 600 -// 01:21:09.453 --> 01:21:12.122 -// Just some lousy bandits. -// The police are cleaning them up. - -// 601 -// 01:21:15.292 --> 01:21:16.668 -// Viva Fidel! - -// 602 -// 01:21:32.392 --> 01:21:37.356 -// I hope my age is correct. -// I'm always accurate about my age. - -// 603 -// 01:21:38.524 --> 01:21:42.361 -// Make sure that everybody -// sees the cake before we cut it. - -// 604 -// 01:21:45.405 --> 01:21:48.033 -// I'm very pleased - -// 605 -// 01:21:48.116 --> 01:21:52.746 -// you're all able to come from -// such distances to be with me today. - -// 606 -// 01:21:54.289 --> 01:21:57.167 -// When a man comes -// to this point in his life, - -// 607 -// 01:21:58.544 --> 01:22:01.922 -// he wants to turn over -// the things he's been blessed with. - -// 608 -// 01:22:02.005 --> 01:22:07.136 -// Turn them over to friends, -// as a reward for the friends he's had - -// 609 -// 01:22:08.387 --> 01:22:13.642 -// and to make sure that everything -// goes well after he's gone. - -// 610 -// 01:22:13.725 --> 01:22:16.395 -// -Not for years. -// -Hear, hear! - -// 611 -// 01:22:16.520 --> 01:22:20.691 -// We'll see. The doctors would disagree, -// but what do they know? - -// 612 -// 01:22:22.025 --> 01:22:26.947 -// These are wonderful things -// that we've achieved in Havana - -// 613 -// 01:22:27.030 --> 01:22:30.117 -// and there's no limit -// to where we can go from here. - -// 614 -// 01:22:30.200 --> 01:22:34.955 -// This kind of government knows -// how to help business, to encourage it. - -// 615 -// 01:22:35.038 --> 01:22:39.084 -// The hotels here are bigger -// and swankier - -// 616 -// 01:22:39.168 --> 01:22:41.545 -// than any of the joints in Vegas. - -// 617 -// 01:22:42.171 --> 01:22:45.132 -// We can thank our friends -// in the Cuban government - -// 618 -// 01:22:45.215 --> 01:22:49.970 -// which has put up half the cash with the -// Teamsters, on a dollar for dollar basis - -// 619 -// 01:22:50.053 --> 01:22:52.890 -// and has relaxed restrictions on imports. - -// 620 -// 01:22:52.973 --> 01:22:57.436 -// What I'm saying is that we have now -// what we have always needed... - -// 621 -// 01:22:57.519 --> 01:23:00.314 -// Real partnership with a government. - -// 622 -// 01:23:00.397 --> 01:23:02.399 -// Smaller piece. - -// 623 -// 01:23:03.192 --> 01:23:08.030 -// You all know Michael Corleone -// and we all remember his father. - -// 624 -// 01:23:08.113 --> 01:23:11.825 -// At the time of my retirement, or death, - -// 625 -// 01:23:11.909 --> 01:23:17.831 -// I turn over all my interests -// in the Havana operation to his control. - -// 626 -// 01:23:17.915 --> 01:23:21.752 -// But, all of you will share. - -// 627 -// 01:23:21.835 --> 01:23:25.714 -// The Nacionale will go -// to the Lakeville Road Boys, - -// 628 -// 01:23:25.797 --> 01:23:29.176 -// the Capri to the Corleone family, - -// 629 -// 01:23:29.259 --> 01:23:31.678 -// the Sevilla Biltmore also, - -// 630 -// 01:23:31.762 --> 01:23:35.349 -// but Eddie Levine will bring in the -// Pennino brothers, - -// 631 -// 01:23:35.432 --> 01:23:37.684 -// Dino and Eddie, for a piece - -// 632 -// 01:23:37.768 --> 01:23:40.521 -// and to handle the casino operations. - -// 633 -// 01:23:40.604 --> 01:23:44.066 -// We've saved a piece -// for some friends in Nevada - -// 634 -// 01:23:44.149 --> 01:23:47.903 -// to make sure that things go smoothly -// back home. - -// 635 -// 01:23:50.113 --> 01:23:55.035 -// I want all of you to enjoy your cake. -// So, enjoy! - -// 636 -// 01:23:55.118 --> 01:23:57.579 -// -Happy birthday! -// -L'chaim! - -// 637 -// 01:23:58.789 --> 01:24:01.542 -// I saw an interesting thing happen today. - -// 638 -// 01:24:02.835 --> 01:24:06.004 -// A rebel was being arrested -// by the military police. - -// 639 -// 01:24:06.129 --> 01:24:10.551 -// Rather than be taken alive, he exploded -// a grenade he had in his jacket. - -// 640 -// 01:24:10.634 --> 01:24:14.221 -// He killed himself and took a captain -// of the command with him. - -// 641 -// 01:24:14.304 --> 01:24:18.142 -// -Those rebels are lunatics. -// -Maybe so. - -// 642 -// 01:24:19.810 --> 01:24:24.731 -// But it occurred to me, that the soldiers -// are paid to fight, the rebels aren't. - -// 643 -// 01:24:24.815 --> 01:24:28.610 -// -What does that tell you? -// -They can win. - -// 644 -// 01:24:30.946 --> 01:24:34.658 -// This country has had rebels -// for 50 years. It's in their blood. - -// 645 -// 01:24:34.741 --> 01:24:38.537 -// I know, I've been coming here -// since the Twenties. - -// 646 -// 01:24:38.620 --> 01:24:42.416 -// We were running molasses -// from Havana when you were a baby. - -// 647 -// 01:24:42.499 --> 01:24:45.085 -// The trucks were owned by your father. - -// 648 -// 01:24:46.170 --> 01:24:47.796 -// Michael. - -// 649 -// 01:24:54.845 --> 01:24:59.016 -// I'd rather we talked about this -// when we're alone. - -// 650 -// 01:25:00.684 --> 01:25:03.770 -// The two million never got to the island. - -// 651 -// 01:25:09.359 --> 01:25:12.529 -// It mustn't be known -// that you held back the money - -// 652 -// 01:25:12.613 --> 01:25:15.115 -// because you worried about the rebels. - -// 653 -// 01:25:21.872 --> 01:25:25.209 -// Sit down, Michael. Sit down. - -// 654 -// 01:25:32.800 --> 01:25:36.678 -// If I could only live to see it, -// to be there with you. - -// 655 -// 01:25:39.181 --> 01:25:43.393 -// What I wouldn't give for 20 more years. - -// 656 -// 01:25:45.229 --> 01:25:49.483 -// Here we are, protected. Free to make -// our profits without Kefauver, - -// 657 -// 01:25:49.566 --> 01:25:53.320 -// the goddamn Justice Department -// and the FBI. - -// 658 -// 01:25:54.029 --> 01:25:57.574 -// 90 miles away, in partnership -// with a friendly government. - -// 659 -// 01:25:58.742 --> 01:26:02.204 -// 90 miles. It's nothing. - -// 660 -// 01:26:03.330 --> 01:26:08.418 -// Just one small step for a man looking -// to be President of the United States - -// 661 -// 01:26:09.169 --> 01:26:12.089 -// and having the cash -// to make it possible. - -// 662 -// 01:26:12.506 --> 01:26:14.049 -// Michael, - -// 663 -// 01:26:15.926 --> 01:26:18.345 -// we're bigger than U.S. Steel. - -// 664 -// 01:26:45.122 --> 01:26:48.125 -// Mikey, how are you? Okay? - -// 665 -// 01:26:49.418 --> 01:26:54.131 -// -Hi! Freddy Corleone. -// -Mio frati. - -// 666 -// 01:26:55.382 --> 01:26:57.426 -// Jesus Christ, what a trip! - -// 667 -// 01:26:57.885 --> 01:27:01.138 -// I thought, "What if somebody knows -// what I've got in here". - -// 668 -// 01:27:01.555 --> 01:27:06.059 -// Can you imagine that? Two million -// dollars on the seat next to me. - -// 669 -// 01:27:09.938 --> 01:27:12.107 -// -Excuse me. -// -It's okay. - -// 670 -// 01:27:14.151 --> 01:27:15.944 -// You want to count it? - -// 671 -// 01:27:19.990 --> 01:27:23.952 -// What's going on? I'm totally in the dark. - -// 672 -// 01:27:24.077 --> 01:27:28.832 -// The family is making an investment in -// Havana. This is a gift for the President. - -// 673 -// 01:27:29.791 --> 01:27:33.337 -// That's great! Havana's great. - -// 674 -// 01:27:34.880 --> 01:27:37.007 -// It's my kind of town. - -// 675 -// 01:27:38.300 --> 01:27:43.055 -// -Anybody I know in Havana? -// -Don't know. Hyman Roth, Johnny Ola? - -// 676 -// 01:27:45.974 --> 01:27:48.644 -// No. I've never met them. - -// 677 -// 01:27:52.231 --> 01:27:56.276 -// Listen, Mikey, I'm kind of... - -// 678 -// 01:28:00.322 --> 01:28:04.701 -// Kind of nervous from the trip. -// Can I get a drink or something? - -// 679 -// 01:28:05.369 --> 01:28:08.038 -// I thought maybe we'd go out together. - -// 680 -// 01:28:08.789 --> 01:28:12.251 -// I know a place where -// we can spend some time together. - -// 681 -// 01:28:14.294 --> 01:28:18.882 -// Sometimes I think I should have -// married a woman like you did. Like Kay. - -// 682 -// 01:28:19.925 --> 01:28:22.803 -// Have kids. Have a family. - -// 683 -// 01:28:25.013 --> 01:28:28.892 -// For once in my life, be more like - -// 684 -// 01:28:29.726 --> 01:28:31.436 -// Pop. - -// 685 -// 01:28:33.772 --> 01:28:38.360 -// It's not easy to be a son, Fredo. -// It's not easy. - -// 686 -// 01:28:38.527 --> 01:28:41.655 -// Mama used to say, -// "You don't belong to me. " - -// 687 -// 01:28:41.738 --> 01:28:45.284 -// "You were left on the doorstep -// by gypsies. " - -// 688 -// 01:28:45.367 --> 01:28:47.494 -// Sometimes I think it's true. - -// 689 -// 01:28:48.412 --> 01:28:50.581 -// You're no gypsy, Fredo. - -// 690 -// 01:28:51.915 --> 01:28:55.752 -// Mikey, I was mad at you. - -// 691 -// 01:29:03.427 --> 01:29:07.014 -// Why didn't we spend time -// like this before? - -// 692 -// 01:29:07.181 --> 01:29:09.766 -// You want a drink, right? Waiter! - -// 693 -// 01:29:13.896 --> 01:29:16.023 -// Por favor... - -// 694 -// 01:29:17.399 --> 01:29:20.277 -// -How do you say Banana Daiquiri? -// -Banana Daiquiri. - -// 695 -// 01:29:20.444 --> 01:29:22.738 -// -That's it? -// -That's it. - -// 696 -// 01:29:22.821 --> 01:29:24.907 -// Uno Banana Daiquiri - -// 697 -// 01:29:25.532 --> 01:29:28.202 -// and a club soda. - -// 698 -// 01:29:35.959 --> 01:29:38.712 -// Senator Geary flies in from Washington -// tomorrow - -// 699 -// 01:29:38.795 --> 01:29:41.340 -// with some government people. - -// 700 -// 01:29:41.423 --> 01:29:45.093 -// I want you to show them -// a good time in Havana. - -// 701 -// 01:29:46.970 --> 01:29:51.099 -// -That's my specialty, right? -// -Can I trust you with something? - -// 702 -// 01:29:51.809 --> 01:29:54.311 -// Of course, Mike. - -// 703 -// 01:29:56.480 --> 01:30:00.234 -// Later in the evening we're all invited -// to the Presidential Palace - -// 704 -// 01:30:00.317 --> 01:30:02.069 -// to bring in the New Year. - -// 705 -// 01:30:02.528 --> 01:30:08.242 -// After it's over they'll take me home -// in a military car, alone. - -// 706 -// 01:30:08.325 --> 01:30:10.077 -// For my protection. - -// 707 -// 01:30:11.078 --> 01:30:14.706 -// Before I reach my hotel, -// I'll be assassinated. - -// 708 -// 01:30:32.766 --> 01:30:35.644 -// -Who? -// -Roth. - -// 709 -// 01:30:41.525 --> 01:30:44.361 -// It was Roth who tried to kill me -// in my home. - -// 710 -// 01:30:46.280 --> 01:30:48.615 -// It was Roth all along. - -// 711 -// 01:30:48.699 --> 01:30:52.703 -// He acts like I'm his son, his successor. - -// 712 -// 01:30:53.745 --> 01:30:56.915 -// But he thinks he'll live forever -// and wants me out. - -// 713 -// 01:31:01.795 --> 01:31:06.425 -// -How can I help? -// -Just go along, as if you know nothing. - -// 714 -// 01:31:06.508 --> 01:31:09.219 -// -I've already made my move. -// -What move? - -// 715 -// 01:31:10.512 --> 01:31:12.890 -// Hyman Roth won't see the New Year. - -// 716 -// 01:31:30.407 --> 01:31:34.328 -// You're to take it easy, -// he'll be back tomorrow. - -// 717 -// 01:31:34.411 --> 01:31:36.788 -// Fly in my own doctor from Miami. - -// 718 -// 01:31:36.872 --> 01:31:39.291 -// I don't trust a doctor -// who can't speak English. - -// 719 -// 01:31:40.792 --> 01:31:43.670 -// -Gracias, señor. -// -Buenas noches. - -// 720 -// 01:31:45.506 --> 01:31:49.218 -// -Honey, go to the casino. -// -If you're feeling better. - -// 721 -// 01:31:49.384 --> 01:31:51.053 -// Feel fine. - -// 722 -// 01:31:52.888 --> 01:31:57.059 -// -Play the bingo game. -// -Okay. Nice to see you, Mr. Paul. - -// 723 -// 01:31:59.561 --> 01:32:04.566 -// My sixth sense tells me Fredo brought -// a bag full of money. Where is it? - -// 724 -// 01:32:07.027 --> 01:32:13.617 -// -You're pulling out? -// -Just want to... Just want to wait. - -// 725 -// 01:32:17.204 --> 01:32:20.707 -// -How do you feel? -// -Terrible. - -// 726 -// 01:32:20.874 --> 01:32:24.461 -// I'd give four million to be able to take -// a painless piss. - -// 727 -// 01:32:25.087 --> 01:32:30.843 -// -Who had Frank Pentangeli killed? -// -The Rosato brothers. - -// 728 -// 01:32:31.009 --> 01:32:34.179 -// I know, but who gave the go-ahead? - -// 729 -// 01:32:35.139 --> 01:32:36.723 -// I know I didn't. - -// 730 -// 01:32:44.648 --> 01:32:49.736 -// There was this kid I grew up with. -// He was younger than me. - -// 731 -// 01:32:49.820 --> 01:32:56.368 -// Sort of looked up to me, you know. -// We did our first work together. - -// 732 -// 01:32:56.451 --> 01:33:00.289 -// Worked our way out of the street. -// Things were good. - -// 733 -// 01:33:01.540 --> 01:33:06.170 -// During Prohibition -// we ran molasses into Canada. - -// 734 -// 01:33:06.253 --> 01:33:09.339 -// Made a fortune. Your father, too. - -// 735 -// 01:33:11.008 --> 01:33:17.014 -// As much as anyone, -// I loved him and trusted him. - -// 736 -// 01:33:19.725 --> 01:33:25.647 -// Later on he had an idea to build a city - -// 737 -// 01:33:25.731 --> 01:33:29.526 -// out of a desert stop-over -// for G. I.s going to the West Coast. - -// 738 -// 01:33:31.403 --> 01:33:35.157 -// That kid's name was Moe Greene - -// 739 -// 01:33:35.240 --> 01:33:38.911 -// and the city he invented was Las Vegas. - -// 740 -// 01:33:40.329 --> 01:33:42.789 -// This was a great man. - -// 741 -// 01:33:42.873 --> 01:33:45.292 -// A man of vision and guts. - -// 742 -// 01:33:45.417 --> 01:33:51.632 -// And there isn't even a plaque, -// signpost or statue of him in that town. - -// 743 -// 01:33:53.634 --> 01:33:57.262 -// Someone put a bullet through his eye. - -// 744 -// 01:33:58.472 --> 01:34:00.808 -// No one knows who gave the order. - -// 745 -// 01:34:01.809 --> 01:34:05.103 -// When I heard it, I wasn't angry. - -// 746 -// 01:34:05.229 --> 01:34:11.151 -// I knew Moe, I knew he was headstrong. -// Talking loud, saying stupid things. - -// 747 -// 01:34:11.235 --> 01:34:16.073 -// So when he turned up dead, I let it go. - -// 748 -// 01:34:17.825 --> 01:34:20.994 -// And I said to myself, - -// 749 -// 01:34:21.078 --> 01:34:25.082 -// "This is the business we've chosen. " - -// 750 -// 01:34:25.165 --> 01:34:27.417 -// I didn't ask - -// 751 -// 01:34:27.960 --> 01:34:33.173 -// who gave the order, because it had -// nothing to do with business. - -// 752 -// 01:34:41.723 --> 01:34:46.228 -// That two million in a bag in your room... - -// 753 -// 01:34:48.480 --> 01:34:52.151 -// I'm going in to take a nap. - -// 754 -// 01:34:52.776 --> 01:34:58.073 -// When I wake, if the money -// is on the table, I know I have a partner. - -// 755 -// 01:34:58.657 --> 01:35:01.785 -// If it isn't, I know I don't. - -// 756 -// 01:35:56.799 --> 01:36:00.969 -// Does everybody know everybody? -// You know Senator Geary. - -// 757 -// 01:36:01.136 --> 01:36:04.306 -// Good to see you, Mike. -// I'm glad we spend this time together. - -// 758 -// 01:36:04.389 --> 01:36:07.351 -// Senator Payton from Florida... - -// 759 -// 01:36:07.643 --> 01:36:10.813 -// Judge DeMalco from New York... - -// 760 -// 01:36:10.979 --> 01:36:13.816 -// Senator Ream from Maryland... - -// 761 -// 01:36:13.941 --> 01:36:16.443 -// Fred Corngold from UTT. - -// 762 -// 01:36:16.527 --> 01:36:20.447 -// -That Fred does a mean cha-cha-cha! -// -He does? - -// 763 -// 01:36:20.531 --> 01:36:22.908 -// Gentlemen, it's refill time! - -// 764 -// 01:36:22.991 --> 01:36:27.454 -// You might try some of the local drinks. -// Cuba Libre, Piña Colada... - -// 765 -// 01:36:27.538 --> 01:36:31.416 -// I think I'll try -// one of those redheaded Yolandas. - -// 766 -// 01:36:31.500 --> 01:36:34.336 -// -That you got! Con gusto... -// -Johnny! - -// 767 -// 01:36:35.504 --> 01:36:39.091 -// You don't know my brother Fredo. -// Johnny Ola, Fredo. - -// 768 -// 01:36:39.258 --> 01:36:42.886 -// -We never met. Johnny Ola. -// -Pleasure. - -// 769 -// 01:36:44.096 --> 01:36:46.557 -// Gentlemen, to a night in Havana! - -// 770 -// 01:36:46.723 --> 01:36:48.350 -// -Happy New Year! -// -Happy New Year! - -// 771 -// 01:36:48.517 --> 01:36:51.436 -// -Feliz Año Nuevo! -// -Happy New Year. - -// 772 -// 01:37:03.115 --> 01:37:07.244 -// -Hey, Freddy, why are we standing? -// -Everybody stands. - -// 773 -// 01:37:07.411 --> 01:37:11.999 -// -It's worth it. You won't believe this. -// -I don't believe it already. - -// 774 -// 01:37:12.082 --> 01:37:15.252 -// -50 dollars, right? -// -You've got a bet, mister. - -// 775 -// 01:37:23.427 --> 01:37:24.928 -// That's Superman. - -// 776 -// 01:37:58.921 --> 01:38:01.173 -// Did I tell you or did I tell you? - -// 777 -// 01:38:02.883 --> 01:38:05.511 -// -I don't believe it! -// -It's got to be fake. - -// 778 -// 01:38:05.677 --> 01:38:08.972 -// It's real. That's why -// he's called Superman. - -// 779 -// 01:38:09.473 --> 01:38:13.519 -// Hey, Freddy, where did you find -// this place? - -// 780 -// 01:38:13.602 --> 01:38:18.023 -// Johnny Ola brought me here. I didn't -// believe it, but seeing is believing! - -// 781 -// 01:38:18.106 --> 01:38:21.568 -// -I see it, but still don't believe it! -// -50 bucks, Pat. - -// 782 -// 01:38:21.652 --> 01:38:25.239 -// Roth won't go here, -// but Johnny knows these places! - -// 783 -// 01:38:26.156 --> 01:38:31.119 -// -Watch, he'll break a cracker with it. -// -I want to see him break a brick! - -// 784 -// 01:39:53.076 --> 01:39:56.455 -// Relax, we're taking you to the hospital. - -// 785 -// 01:40:45.587 --> 01:40:48.006 -// ...and you'll continue to get those. - -// 786 -// 01:40:48.173 --> 01:40:52.594 -// I don't believe that President -// Eisenhower would ever pull out of Cuba - -// 787 -// 01:40:52.678 --> 01:40:56.390 -// as we have over one billion dollars -// invested in this country. - -// 788 -// 01:40:59.893 --> 01:41:03.188 -// The American public -// believe in non-intervention... - -// 789 -// 01:41:03.272 --> 01:41:06.191 -// Fredo! Where are you going? - -// 790 -// 01:41:06.275 --> 01:41:09.903 -// I'm getting a real drink, -// because I can't... - -// 791 -// 01:42:05.459 --> 01:42:09.004 -// What kept Mr. Roth? -// I understood he was coming. - -// 792 -// 01:42:09.087 --> 01:42:12.633 -// Reeves, what's the protocol? -// How long should we stay? - -// 793 -// 01:42:14.051 --> 01:42:18.972 -// I think a half hour ought to do it. Just -// long enough to bring in the New Year. - -// 794 -// 01:42:34.404 --> 01:42:37.741 -// It's New Year's Eve. Come on, -// just for a minute. - -// 795 -// 01:43:52.649 --> 01:43:56.820 -// There's a plane waiting to take us -// to Miami in an hour. - -// 796 -// 01:43:56.987 --> 01:43:59.615 -// Don't make a big thing about it. - -// 797 -// 01:44:02.993 --> 01:44:06.830 -// I know it was you, Fredo. -// You broke my heart. - -// 798 -// 01:44:08.332 --> 01:44:10.125 -// You broke my heart! - -// 799 -// 01:44:50.332 --> 01:44:54.878 -// Due to serious setbacks to our -// troops in Guantanamo and Santiago... - -// 800 -// 01:44:55.796 --> 01:44:58.132 -// ...my position in Cuba is untenable. - -// 801 -// 01:45:00.509 --> 01:45:04.680 -// I am resigning from office -// to avoid further bloodshed. - -// 802 -// 01:45:05.389 --> 01:45:08.559 -// And I shall leave the city immediately. - -// 803 -// 01:45:12.813 --> 01:45:15.816 -// I wish all of you good luck. - -// 804 -// 01:45:23.198 --> 01:45:26.243 -// Salud! - -// 805 -// 01:45:27.452 --> 01:45:30.873 -// Viva la revolución! Viva Fidel! - -// 806 -// 01:45:52.728 --> 01:45:54.271 -// Fredo! - -// 807 -// 01:45:54.938 --> 01:45:58.901 -// Come on. Come with me. -// It's the only way out of here tonight. - -// 808 -// 01:45:59.485 --> 01:46:01.445 -// Roth is dead. - -// 809 -// 01:46:02.237 --> 01:46:06.450 -// Fredo, come with me! -// You're still my brother. - -// 810 -// 01:46:07.576 --> 01:46:09.077 -// Fredo! - -// 811 -// 01:46:33.685 --> 01:46:36.522 -// I'm Pat Geary, United States Senator. - -// 812 -// 01:47:07.553 --> 01:47:09.513 -// Fidel! Fidel! Fidel! - -// 813 -// 01:47:49.803 --> 01:47:53.390 -// Al. Get me a wet towel. - -// 814 -// 01:47:59.855 --> 01:48:02.733 -// Does Kay know I'm back? - -// 815 -// 01:48:06.820 --> 01:48:09.907 -// My boy? Did you get him -// something for Christmas? - -// 816 -// 01:48:09.990 --> 01:48:13.410 -// -I took care of it. -// -What was it, so I'll know. - -// 817 -// 01:48:13.577 --> 01:48:18.624 -// It was a little car with an electric motor -// that he can ride in. It's nice. - -// 818 -// 01:48:21.126 --> 01:48:23.253 -// Thank you, Al. - -// 819 -// 01:48:24.338 --> 01:48:27.883 -// Fellows, could you step outside -// for a minute? - -// 820 -// 01:48:44.942 --> 01:48:46.693 -// Where's my brother? - -// 821 -// 01:48:47.611 --> 01:48:50.823 -// Roth got out on a private boat. -// He's in a hospital in Miami. - -// 822 -// 01:48:50.906 --> 01:48:55.577 -// He had a stroke, but recovered okay. -// Your bodyguard is dead. - -// 823 -// 01:48:55.661 --> 01:48:57.579 -// I asked about Fredo. - -// 824 -// 01:48:58.580 --> 01:49:01.959 -// I think he got out. -// He must be somewhere in New York. - -// 825 -// 01:49:04.962 --> 01:49:06.380 -// All right. - -// 826 -// 01:49:07.631 --> 01:49:10.425 -// I want you to get in touch with him. - -// 827 -// 01:49:10.509 --> 01:49:13.345 -// I know he's scared. -// Tell him everything is all right. - -// 828 -// 01:49:13.470 --> 01:49:18.809 -// Tell him I know Roth misled him. That -// he didn't know they would try to kill me. - -// 829 -// 01:49:19.726 --> 01:49:23.981 -// -They can come in now. -// -There was something else. - -// 830 -// 01:49:24.982 --> 01:49:26.483 -// What? - -// 831 -// 01:49:33.490 --> 01:49:35.284 -// What? Come on. - -// 832 -// 01:49:37.327 --> 01:49:39.621 -// Kay had a miscarriage. - -// 833 -// 01:49:52.551 --> 01:49:54.928 -// -Was it a boy? -// -At three and a half months... - -// 834 -// 01:49:55.012 --> 01:49:57.931 -// Can't you give me a straight answer? -// Was it a boy? - -// 835 -// 01:50:02.060 --> 01:50:04.646 -// I really don't know. - -// 836 -// 01:50:19.870 --> 01:50:22.873 -// Poor little Fredo, he's got pneumonia. - -// 837 -// 01:51:08.252 --> 01:51:11.964 -// Young man, I hear you and -// your friends are stealing goods. - -// 838 -// 01:51:12.297 --> 01:51:16.093 -// But you don't even send a -// dress to my house. No respect! - -// 839 -// 01:51:16.677 --> 01:51:18.720 -// You know I've got three daughters. - -// 840 -// 01:51:19.221 --> 01:51:20.848 -// This is my neighborhood. - -// 841 -// 01:51:21.723 --> 01:51:25.102 -// You and your friends should -// show me some respect. - -// 842 -// 01:51:26.228 --> 01:51:29.940 -// You should let me wet -// my beak a little. - -// 843 -// 01:51:32.276 --> 01:51:35.946 -// I hear you and your friends -// cleared $600 each. - -// 844 -// 01:51:36.613 --> 01:51:41.118 -// Give me $200 each, for your own -// protection. And I'll forget the insult. - -// 845 -// 01:51:41.493 --> 01:51:46.582 -// You young punks have to learn -// to respect a man like me! - -// 846 -// 01:51:48.876 --> 01:51:51.295 -// Otherwise the cops will -// come to your house. - -// 847 -// 01:51:51.753 --> 01:51:54.298 -// And your family will be ruined. - -// 848 -// 01:51:55.466 --> 01:52:00.804 -// Of course if I'm wrong about how much -// you stole - I'll take a little less. - -// 849 -// 01:52:01.472 --> 01:52:05.476 -// And by less, I only mean - -// a hundred bucks less. - -// 850 -// 01:52:05.809 --> 01:52:07.644 -// Now don't refuse me. - -// 851 -// 01:52:09.605 --> 01:52:11.315 -// Understand, paisan? - -// 852 -// 01:52:17.821 --> 01:52:19.281 -// I understand. - -// 853 -// 01:52:21.700 --> 01:52:26.371 -// My friends and I share all the money. -// So first, I have to talk to them. - -// 854 -// 01:52:27.790 --> 01:52:32.127 -// Tell your friends I don't want a lot. -// Just enough to wet my beak. - -// 855 -// 01:52:36.340 --> 01:52:38.634 -// Don't be afraid to tell them! - -// 856 -// 01:52:41.011 --> 01:52:42.805 -// 600 bucks... - -// 857 -// 01:52:43.096 --> 01:52:45.349 -// Suppose we don't pay? - -// 858 -// 01:52:46.517 --> 01:52:49.978 -// You know his gang, Tessio. -// Real animals. - -// 859 -// 01:52:50.729 --> 01:52:54.149 -// Maranzalla himself let Fanucci -// work this neighborhood. - -// 860 -// 01:52:55.025 --> 01:52:58.529 -// He's got connections with the cops, too. -// We have to pay him. - -// 861 -// 01:52:59.238 --> 01:53:01.198 -// $200 each...everybody agreed? - -// 862 -// 01:53:05.702 --> 01:53:07.204 -// Why do we have to pay him? - -// 863 -// 01:53:07.830 --> 01:53:10.124 -// Vito, leave this to us. - -// 864 -// 01:53:11.708 --> 01:53:14.211 -// He's one person, we're three. - -// 865 -// 01:53:14.503 --> 01:53:17.172 -// He's got guns, we've got guns. - -// 866 -// 01:53:17.714 --> 01:53:21.051 -// Why should we give him the -// money we sweated for? - -// 867 -// 01:53:21.301 --> 01:53:23.512 -// This is his neighborhood! - -// 868 -// 01:53:25.222 --> 01:53:29.726 -// I know two bookies who don't give -// anything to Fanucci. - -// 869 -// 01:53:30.227 --> 01:53:31.770 -// Who? - -// 870 -// 01:53:32.146 --> 01:53:36.150 -// Joe The Greek and Frank Pignattaro. - -// 871 -// 01:53:36.233 --> 01:53:37.734 -// They don't pay Fanucci. - -// 872 -// 01:53:39.528 --> 01:53:44.408 -// If they don't pay Fanucci, then -// somebody else collects for Maranzalla! - -// 873 -// 01:53:45.576 --> 01:53:49.580 -// We'll all be better off if we -// pay him. Don't worry. - -// 874 -// 01:54:05.095 --> 01:54:07.931 -// Now what I say stays in this room. - -// 875 -// 01:54:08.140 --> 01:54:12.978 -// If you both like, why not give me -// $50 each to pay Fanucci? - -// 876 -// 01:54:16.148 --> 01:54:19.485 -// I guarantee he'll accept -// what I give him. - -// 877 -// 01:54:22.112 --> 01:54:24.448 -// If Fanucci says $200... - -// 878 -// 01:54:24.531 --> 01:54:25.949 -// ...he means it, Vito! - -// 879 -// 01:54:26.450 --> 01:54:29.411 -// I'll reason with him. - -// 880 -// 01:54:31.538 --> 01:54:33.540 -// Leave everything to me. - -// 881 -// 01:54:34.166 --> 01:54:36.251 -// I'll take care of everything. - -// 882 -// 01:54:37.920 --> 01:54:40.464 -// I never lie to my friends. - -// 883 -// 01:54:41.298 --> 01:54:44.218 -// Tomorrow you both go talk to Fanucci. - -// 884 -// 01:54:45.260 --> 01:54:47.095 -// He'll ask for the money. - -// 885 -// 01:54:48.013 --> 01:54:52.643 -// Tell him you'll pay whatever -// he wants. Don't argue with him. - -// 886 -// 01:54:53.811 --> 01:54:56.480 -// Then I'll go and get him to agree. - -// 887 -// 01:54:58.690 --> 01:55:01.485 -// Don't argue with him, since -// he's so tough. - -// 888 -// 01:55:02.277 --> 01:55:04.822 -// How can you get him to take less? - -// 889 -// 01:55:05.572 --> 01:55:07.699 -// That's my business. - -// 890 -// 01:55:08.033 --> 01:55:11.411 -// Just remember that I did you a favor. - -// 891 -// 01:55:15.833 --> 01:55:17.417 -// Is it a deal? - -// 892 -// 01:55:18.502 --> 01:55:19.503 -// Yes. - -// 893 -// 01:56:07.384 --> 01:56:09.761 -// His family's out of the house. - -// 894 -// 01:56:10.137 --> 01:56:12.431 -// Fanucci's alone in the cafe. - -// 895 -// 01:56:17.352 --> 01:56:21.064 -// Vito, here's my 50 dollars. -// Buona fortuna. - -// 896 -// 01:56:32.117 --> 01:56:34.703 -// Are you sure he's going to go for it? - -// 897 -// 01:56:38.123 --> 01:56:42.419 -// I'll make an offer he don't refuse. -// Don't worry. - -// 898 -// 01:57:15.452 --> 01:57:20.165 -// It looks like there's - -// $ 100 under my hat. - -// 899 -// 01:57:32.010 --> 01:57:34.221 -// I was right. - -// 900 -// 01:57:35.639 --> 01:57:37.432 -// Only $ 100... - -// 901 -// 01:57:40.811 --> 01:57:43.063 -// I'm short of money right now. - -// 902 -// 01:57:44.940 --> 01:57:49.528 -// I've been out of work...so just -// give me a little time. - -// 903 -// 01:57:50.404 --> 01:57:52.614 -// You understand, don't you? - -// 904 -// 01:58:00.831 --> 01:58:03.459 -// You've got balls, young man! - -// 905 -// 01:58:05.461 --> 01:58:08.505 -// How come I never heard -// of you before? - -// 906 -// 01:58:15.012 --> 01:58:17.431 -// You've got a lot of guts. - -// 907 -// 01:58:21.393 --> 01:58:24.354 -// I'll find you some work -// for good money. - -// 908 -// 01:58:35.741 --> 01:58:39.995 -// No hard feelings, right? If I can -// help you, let me know. - -// 909 -// 01:58:42.790 --> 01:58:45.209 -// You've done well for yourself. - -// 910 -// 01:58:49.129 --> 01:58:51.215 -// Enjoy the festa! - -// 911 -// 02:01:00.511 --> 02:01:02.846 -// Oh, this is too violent for me! - -// 912 -// 02:03:24.863 --> 02:03:26.323 -// What've you got there? - -// 913 -// 02:06:04.982 --> 02:06:08.944 -// Michael, your father loves you -// very much. - -// 914 -// 02:09:34.024 --> 02:09:37.653 -// Mr. Cicci, from the year 1942 -// to the present time, - -// 915 -// 02:09:37.736 --> 02:09:41.240 -// you were an employee -// of the Genco Olive Oil Company? - -// 916 -// 02:09:41.698 --> 02:09:43.325 -// That's right. - -// 917 -// 02:09:44.201 --> 02:09:48.413 -// But in actuality you were a member -// of the Corleone crime organization. - -// 918 -// 02:09:51.375 --> 02:09:55.212 -// No, we called it -// the Corleone family, Senator. - -// 919 -// 02:09:55.587 --> 02:09:58.090 -// What was your position? - -// 920 -// 02:09:59.007 --> 02:10:02.261 -// At first, like everybody else, -// I was a soldier. - -// 921 -// 02:10:02.344 --> 02:10:05.264 -// -What is that? -// -A button, you know, Senator. - -// 922 -// 02:10:05.347 --> 02:10:07.766 -// No, I don't know. Tell me. - -// 923 -// 02:10:09.309 --> 02:10:14.898 -// When the boss says "push a button" on -// a guy, I push a button. See, Senator? - -// 924 -// 02:10:14.982 --> 02:10:16.358 -// Mr. Questadt. - -// 925 -// 02:10:16.900 --> 02:10:19.069 -// -You mean you kill people? -// -What? - -// 926 -// 02:10:19.153 --> 02:10:24.283 -// You kill people at -// the behest of your superiors. - -// 927 -// 02:10:28.078 --> 02:10:29.580 -// Yeah, that's right. - -// 928 -// 02:10:29.663 --> 02:10:35.002 -// And the head of your family -// is Michael Corleone? - -// 929 -// 02:10:35.085 --> 02:10:38.213 -// Yeah, Counselor. Michael Corleone. - -// 930 -// 02:10:38.297 --> 02:10:42.134 -// Did you ever get such an order -// directly from Michael Corleone? - -// 931 -// 02:10:42.926 --> 02:10:45.012 -// No, I never talked to him. - -// 932 -// 02:10:45.095 --> 02:10:49.016 -// Mr. Cicci, could you amplify -// your answer a bit? - -// 933 -// 02:10:49.099 --> 02:10:52.436 -// -Do what? -// -Could you expand on your answer? - -// 934 -// 02:10:52.519 --> 02:10:58.317 -// I'm particularly interested in knowing, -// was there always a buffer involved? - -// 935 -// 02:10:58.442 --> 02:11:02.988 -// Someone in between you -// and your superiors who gave the order. - -// 936 -// 02:11:03.071 --> 02:11:07.534 -// Right, a buffer. -// The family had a lot of buffers! - -// 937 -// 02:11:09.411 --> 02:11:13.582 -// You may find this very amusing, but -// the members of this committee do not. - -// 938 -// 02:11:41.819 --> 02:11:43.987 -// Tell me something, Ma. - -// 939 -// 02:11:48.117 --> 02:11:51.787 -// What did Papa think... -// deep in his heart? - -// 940 -// 02:11:58.377 --> 02:12:00.254 -// He was being strong... - -// 941 -// 02:12:06.718 --> 02:12:08.345 -// Strong for his family. - -// 942 -// 02:12:18.147 --> 02:12:20.816 -// But by being strong for his family... - -// 943 -// 02:12:22.317 --> 02:12:24.153 -// ...could he... - -// 944 -// 02:12:26.071 --> 02:12:27.364 -// ...lose it? - -// 945 -// 02:12:29.324 --> 02:12:34.705 -// You're thinking about your wife... -// about the baby you lost. - -// 946 -// 02:12:36.540 --> 02:12:39.835 -// But you and your wife can -// always have another baby. - -// 947 -// 02:12:41.545 --> 02:12:43.380 -// No, I meant...lose his family - -// 948 -// 02:12:47.718 --> 02:12:51.221 -// But you can never lose your family. - -// 949 -// 02:13:00.731 --> 02:13:02.566 -// Times are changing. - -// 950 -// 02:13:25.088 --> 02:13:27.549 -// It's my pleasure. -// I don't want money. - -// 951 -// 02:13:28.342 --> 02:13:30.052 -// Take it as a gift. - -// 952 -// 02:13:32.971 --> 02:13:37.142 -// If there's something I can do for you, -// you come, we talk. - -// 953 -// 02:13:53.784 --> 02:13:56.662 -// Signora Colombo, why did you -// come to see me? - -// 954 -// 02:13:59.623 --> 02:14:03.127 -// Your wife told me to ask -// if you could help me. - -// 955 -// 02:14:05.796 --> 02:14:07.798 -// She's in bad trouble. - -// 956 -// 02:14:08.465 --> 02:14:12.469 -// Her neighbors complained to the -// landlord about her dog. - -// 957 -// 02:14:13.929 --> 02:14:16.181 -// He told her to get rid of the animal. - -// 958 -// 02:14:17.808 --> 02:14:21.979 -// But her little boy loves that dog. -// So she hid it. - -// 959 -// 02:14:22.604 --> 02:14:26.400 -// When the landlord found out, he -// got mad and told her to leave. - -// 960 -// 02:14:29.278 --> 02:14:32.114 -// Now she can't stay even if she -// gets rid of it. - -// 961 -// 02:14:32.781 --> 02:14:34.450 -// I'm so ashamed! - -// 962 -// 02:14:34.825 --> 02:14:39.288 -// He said he'd get the police to -// throw us out on the street. - -// 963 -// 02:14:42.124 --> 02:14:43.709 -// I'm sorry, but... - -// 964 -// 02:14:45.711 --> 02:14:49.173 -// I could give you a couple dollars -// to help you move. - -// 965 -// 02:14:50.007 --> 02:14:51.467 -// I can't move! - -// 966 -// 02:14:52.843 --> 02:14:54.761 -// I want you to talk to him! - -// 967 -// 02:14:55.345 --> 02:14:58.015 -// Tell him I want to stay here! - -// 968 -// 02:15:05.814 --> 02:15:07.399 -// What's your landlord's name? - -// 969 -// 02:15:07.858 --> 02:15:09.902 -// His name is Signor Roberto. - -// 970 -// 02:15:10.486 --> 02:15:12.905 -// He lives on Fourth Street, near here. - -// 971 -// 02:15:13.530 --> 02:15:16.450 -// They break the windows, -// they dirty the floors... - -// 972 -// 02:15:17.534 --> 02:15:19.077 -// A real pig-sty, eh? - -// 973 -// 02:15:38.180 --> 02:15:42.142 -// My name is Vito Corleone. -// Signora Colombo is a friend of my wife. - -// 974 -// 02:15:43.060 --> 02:15:46.355 -// She says she's been evicted -// for no good reason. - -// 975 -// 02:15:46.897 --> 02:15:51.151 -// She's a poor widow, she has nobody -// to take care of her. - -// 976 -// 02:15:51.401 --> 02:15:55.447 -// She has no relatives, no money. -// All she has is this neighborhood. - -// 977 -// 02:15:55.823 --> 02:15:59.451 -// I already rented the place -// to another family. - -// 978 -// 02:16:04.998 --> 02:16:09.628 -// I told her that I'd talk to you. -// That you're a reasonable man. - -// 979 -// 02:16:10.879 --> 02:16:14.758 -// She got rid of the animal that -// caused all the trouble. - -// 980 -// 02:16:15.300 --> 02:16:17.219 -// So let her stay. - -// 981 -// 02:16:17.302 --> 02:16:18.929 -// Impossible. - -// 982 -// 02:16:19.805 --> 02:16:21.140 -// Are you Sicilian? - -// 983 -// 02:16:21.557 --> 02:16:23.225 -// No, I'm Calabrese. - -// 984 -// 02:16:23.892 --> 02:16:27.187 -// We're practically paisan, -// do me this favor. - -// 985 -// 02:16:27.771 --> 02:16:30.440 -// I already rented it! -// I'll look like an idiot. - -// 986 -// 02:16:31.441 --> 02:16:33.735 -// Besides, the new tenants -// pay more rent. - -// 987 -// 02:16:34.278 --> 02:16:36.697 -// How much more a month? - -// 988 -// 02:16:37.823 --> 02:16:38.907 -// Five bucks. - -// 989 -// 02:16:43.787 --> 02:16:46.832 -// Here's six months increase in advance. - -// 990 -// 02:16:47.708 --> 02:16:50.794 -// But don't tell her about it. -// She's very proud. - -// 991 -// 02:16:51.253 --> 02:16:53.839 -// Come see me in another six months. - -// 992 -// 02:16:55.299 --> 02:16:58.302 -// Of course, the dog stays. Right? - -// 993 -// 02:16:59.094 --> 02:17:00.220 -// The dog stays. - -// 994 -// 02:17:04.808 --> 02:17:08.145 -// Who the hell are you -// to come give me orders? - -// 995 -// 02:17:08.520 --> 02:17:12.566 -// Watch out or I'll kick your Sicilian ass -// right into the street! - -// 996 -// 02:17:15.027 --> 02:17:16.779 -// Do me this favor. - -// 997 -// 02:17:17.654 --> 02:17:19.740 -// I won't forget it. - -// 998 -// 02:17:20.574 --> 02:17:23.869 -// Ask your friends in the -// neighborhood about me. - -// 999 -// 02:17:24.995 --> 02:17:27.664 -// They'll tell you I know how -// to return a favor. - -// 1000 -// 02:17:34.505 --> 02:17:36.423 -// What a character! - -// 1001 -// 02:17:44.348 --> 02:17:49.269 -// That landlord is here... Roberto, -// the one who owns those ratholes. - -// 1002 -// 02:17:56.860 --> 02:18:00.197 -// He's been asking all around -// the neighborhood about you. - -// 1003 -// 02:18:08.205 --> 02:18:10.999 -// I hope I'm not disturbing you, -// Don Vito. - -// 1004 -// 02:18:12.126 --> 02:18:14.378 -// What can I do for you, Don Roberto? - -// 1005 -// 02:18:16.296 --> 02:18:18.340 -// What a misunderstanding! Holy Mary! - -// 1006 -// 02:18:19.675 --> 02:18:22.594 -// Of course Signora Colombo can stay! - -// 1007 -// 02:18:28.809 --> 02:18:31.728 -// I'm giving back the money you gave me. - -// 1008 -// 02:18:33.438 --> 02:18:39.194 -// Un, due, three, four, five, six, tutt'! - -// 1009 -// 02:18:40.070 --> 02:18:44.825 -// Because after all, Don Vito, -// money isn't everything. - -// 1010 -// 02:18:53.417 --> 02:18:55.169 -// Can I sit down? - -// 1011 -// 02:18:58.213 --> 02:19:01.216 -// Your kindness to that widow -// made me ashamed of myself. - -// 1012 -// 02:19:02.259 --> 02:19:05.262 -// The rent stays like before! - -// 1013 -// 02:19:14.855 --> 02:19:16.315 -// I'll even lower it. - -// 1014 -// 02:19:19.151 --> 02:19:20.444 -// I'll lower it $5. - -// 1015 -// 02:19:24.782 --> 02:19:26.325 -// I'll lower it $ 10! - -// 1016 -// 02:19:32.790 --> 02:19:34.875 -// Can I offer you some coffee? - -// 1017 -// 02:19:37.252 --> 02:19:41.882 -// I'm late for an appointment! I can't -// this time! Ask me another time! - -// 1018 -// 02:19:47.304 --> 02:19:49.765 -// You'll have to excuse me for now. - -// 1019 -// 02:19:55.145 --> 02:19:57.272 -// I wish I could stay longer! - -// 1020 -// 02:20:03.237 --> 02:20:05.656 -// Just call me and I'll be here! - -// 1021 -// 02:20:16.667 --> 02:20:19.503 -// He won't be back. He'll hide out -// in the Bronx! - -// 1022 -// 02:20:35.185 --> 02:20:40.023 -// -Vito, what do you think? -// -We'll make a big business! - -// 1023 -// 02:20:47.030 --> 02:20:50.200 -// -New York City. -// -Would you speak up, please? - -// 1024 -// 02:20:50.909 --> 02:20:52.578 -// New York City. - -// 1025 -// 02:20:52.661 --> 02:20:56.290 -// -Are you the son of Vito CorIeone? -// -Yes, I am. - -// 1026 -// 02:20:56.373 --> 02:21:00.043 -// -Where was he born? -// -CorIeone, SiciIy. - -// 1027 -// 02:21:00.210 --> 02:21:06.133 -// Did he at times use an aIias that was -// known in certain circIes as Godfather? - -// 1028 -// 02:21:06.925 --> 02:21:13.098 -// Godfather is a term used by his friends. -// One of affection and respect. - -// 1029 -// 02:21:13.932 --> 02:21:18.395 -// Mr. Chairman, I wouId Iike to verify -// the witness' statement. - -// 1030 -// 02:21:18.479 --> 02:21:23.567 -// For years many of my constituents -// have been of ItaIian descent. - -// 1031 -// 02:21:23.901 --> 02:21:26.320 -// I've come to know them weII. - -// 1032 -// 02:21:26.445 --> 02:21:30.657 -// They have honored me -// with their support and their friendship. - -// 1033 -// 02:21:30.783 --> 02:21:35.996 -// I can proudly say that some of my -// very best friends are ItaIian-Americans. - -// 1034 -// 02:21:37.247 --> 02:21:42.252 -// However, Mr. Chairman, unfortunateIy -// I have to Ieave these proceedings - -// 1035 -// 02:21:42.419 --> 02:21:46.632 -// in order to preside over a very important -// meeting of my own committee. - -// 1036 -// 02:21:47.758 --> 02:21:50.761 -// Before I Ieave, I do want to say this, - -// 1037 -// 02:21:50.844 --> 02:21:55.140 -// that these hearings on the Mafia -// are in no way whatsoever - -// 1038 -// 02:21:55.224 --> 02:21:57.851 -// a sIur upon the great ItaIian peopIe. - -// 1039 -// 02:21:57.935 --> 02:22:01.104 -// I can state from my own knowIedge -// and experience - -// 1040 -// 02:22:01.188 --> 02:22:06.360 -// that ItaIian-Americans are among -// the most IoyaI, most Iaw-abiding, - -// 1041 -// 02:22:06.443 --> 02:22:09.947 -// patriotic, hard-working -// American citizens in this Iand. - -// 1042 -// 02:22:11.031 --> 02:22:16.036 -// It wouId be a shame, Mr. Chairman, -// if we aIIowed a few rotten appIes - -// 1043 -// 02:22:16.120 --> 02:22:18.372 -// to give a bad name to the whoIe barreI. - -// 1044 -// 02:22:18.455 --> 02:22:24.044 -// Because from the time of Christopher -// CoIumbus to the time of Enrico Fermi - -// 1045 -// 02:22:24.128 --> 02:22:26.255 -// to the present day, - -// 1046 -// 02:22:26.421 --> 02:22:30.676 -// ItaIian-Americans have been pioneers -// in buiIding and defending our nation. - -// 1047 -// 02:22:31.135 --> 02:22:36.348 -// They are the saIt of the earth, and -// one of the backbones of this country. - -// 1048 -// 02:22:42.437 --> 02:22:46.233 -// I'm sure we aII agree -// with our esteemed coIIeague. - -// 1049 -// 02:22:46.316 --> 02:22:50.612 -// Mr. CorIeone, you have been advised -// as to your IegaI rights. - -// 1050 -// 02:22:50.696 --> 02:22:56.160 -// We have testimony from -// a previous witness, one WiIIi Cicci. - -// 1051 -// 02:22:57.161 --> 02:23:01.582 -// He stated that you are head of the most -// powerfuI Mafia famiIy in the country. - -// 1052 -// 02:23:01.665 --> 02:23:03.959 -// -Are you? -// -No, I'm not. - -// 1053 -// 02:23:04.042 --> 02:23:07.337 -// He testified that you are -// personaIIy responsibIe - -// 1054 -// 02:23:07.421 --> 02:23:11.425 -// for the murder of a New York -// poIice captain in 1947 - -// 1055 -// 02:23:11.508 --> 02:23:15.095 -// and with him a man -// named VirgiI SoIIozzo. - -// 1056 -// 02:23:15.262 --> 02:23:17.764 -// -Do you deny this? -// -Yes, I do. - -// 1057 -// 02:23:17.931 --> 02:23:21.018 -// Is it true that in the year 1950 - -// 1058 -// 02:23:21.101 --> 02:23:26.482 -// you devised the murder of the heads -// of "the Five FamiIies" in New York - -// 1059 -// 02:23:26.565 --> 02:23:30.152 -// to assume and consoIidate -// your nefarious power? - -// 1060 -// 02:23:30.235 --> 02:23:33.572 -// -It's a compIete faIsehood. -// -Mr. Questadt. - -// 1061 -// 02:23:33.697 --> 02:23:38.410 -// Is it true you have a controIIing interest -// in three major hoteIs in Las Vegas? - -// 1062 -// 02:23:39.536 --> 02:23:44.708 -// No, it's not true. I own some stock in -// some of the hoteIs there, but very IittIe. - -// 1063 -// 02:23:47.336 --> 02:23:51.590 -// I aIso have stock in IBM and IT&T. - -// 1064 -// 02:23:52.674 --> 02:23:58.931 -// Do you have any controI over gambIing -// and narcotics in New York State? - -// 1065 -// 02:23:59.014 --> 02:24:00.557 -// No, I do not. - -// 1066 -// 02:24:00.641 --> 02:24:04.228 -// Senator, my cIient -// wouId Iike to read a statement. - -// 1067 -// 02:24:04.311 --> 02:24:09.900 -// Mr. Chairman, I think this statement -// is totaIIy out of order at this time. - -// 1068 -// 02:24:10.067 --> 02:24:15.906 -// Sir, my cIient has answered this -// committee's questions with sincerity. - -// 1069 -// 02:24:16.073 --> 02:24:21.954 -// He hasn't taken the Fifth Amendment, -// so this statement shouId be heard! - -// 1070 -// 02:24:23.914 --> 02:24:28.877 -// No, I'll allow Mr. Corleone to read -// his statement. I'II put it in the record. - -// 1071 -// 02:24:30.712 --> 02:24:33.841 -// In the hopes of cIearing -// my famiIy name - -// 1072 -// 02:24:33.924 --> 02:24:37.886 -// to give my chiIdren their share -// of the American way of Iife - -// 1073 -// 02:24:37.970 --> 02:24:41.014 -// without a bIemish on their name -// and background, - -// 1074 -// 02:24:41.140 --> 02:24:46.353 -// I have appeared before this committee -// and given it aII my cooperation. - -// 1075 -// 02:24:47.688 --> 02:24:53.235 -// I consider it a great personaI dishonor -// to have to deny that I am a criminaI. - -// 1076 -// 02:24:54.278 --> 02:24:57.614 -// I wish to have the foIIowing noted -// for the record... - -// 1077 -// 02:24:57.781 --> 02:25:01.827 -// That I served my country faithfully -// in WorId War Two - -// 1078 -// 02:25:01.910 --> 02:25:07.124 -// and was awarded the Navy Cross -// for actions in defense of my country. - -// 1079 -// 02:25:07.958 --> 02:25:12.254 -// That I have never been arrested -// or indicted for any crime. - -// 1080 -// 02:25:12.421 --> 02:25:16.383 -// That no proof Iinking me to any -// criminaI conspiracy - -// 1081 -// 02:25:16.467 --> 02:25:21.346 -// whether it is caIIed Mafia -// or Cosa Nostra or any other name - -// 1082 -// 02:25:21.430 --> 02:25:23.765 -// has ever been made pubIic. - -// 1083 -// 02:25:23.932 --> 02:25:25.893 -// I have not taken refuge -// behind the Fifth Amendment, - -// 1084 -// 02:25:25.976 --> 02:25:29.146 -// aIthough it's my right to do so. - -// 1085 -// 02:25:31.982 --> 02:25:37.571 -// I chaIIenge this committee to produce -// any witness or evidence against me - -// 1086 -// 02:25:37.696 --> 02:25:43.619 -// and if they do not, I hope they wiII have -// the decency to cIear my name - -// 1087 -// 02:25:43.702 --> 02:25:47.331 -// with the same pubIicity -// with which they have besmirched it. - -// 1088 -// 02:25:48.707 --> 02:25:54.254 -// I'm sure we're impressed. ParticuIarIy -// with your Iove for our country. - -// 1089 -// 02:25:54.421 --> 02:25:57.174 -// We'II be in recess -// untiI 10:00 a.m. Monday - -// 1090 -// 02:25:57.341 --> 02:26:02.095 -// when we wiII produce a witness who'II -// corroborate the charges against you. - -// 1091 -// 02:26:02.262 --> 02:26:07.267 -// At which time you may very well -// be subject to indictment for perjury. - -// 1092 -// 02:26:07.351 --> 02:26:11.855 -// I remind you that you're stiII -// under subpoena. Adjourned! - -// 1093 -// 02:26:16.944 --> 02:26:18.654 -// Ten-to-one shot, you said. - -// 1094 -// 02:26:18.737 --> 02:26:23.492 -// A ten-to-one shot -// he would take the Fifth, and I'd lose! - -// 1095 -// 02:26:23.575 --> 02:26:28.247 -// You sound like my bookie. -// I owe that monkey my life. - -// 1096 -// 02:26:29.289 --> 02:26:32.835 -// -Well, just get a good night's sleep. -// -Yeah. - -// 1097 -// 02:26:32.918 --> 02:26:35.087 -// You've got a big day tomorrow. - -// 1098 -// 02:26:35.170 --> 02:26:38.799 -// I've got you a new suit, -// new shirt, new tie. - -// 1099 -// 02:26:39.466 --> 02:26:42.761 -// I'll shave you myself in the morning. - -// 1100 -// 02:26:42.928 --> 02:26:46.974 -// You'll look respectable for 50 million -// of your fellow Americans. - -// 1101 -// 02:26:47.057 --> 02:26:52.271 -// Tomorrow... My life won't be worth -// a nickel after tomorrow. - -// 1102 -// 02:26:53.272 --> 02:26:56.900 -// Come on! I saw this 19 times. - -// 1103 -// 02:26:57.985 --> 02:27:01.780 -// You've got a great home here, -// for the rest of your life. - -// 1104 -// 02:27:01.947 --> 02:27:05.075 -// Nobody gets near you, -// you're not going anywhere. - -// 1105 -// 02:27:05.242 --> 02:27:10.164 -// That's great. Beautiful. -// Some deal I made. - -// 1106 -// 02:27:10.247 --> 02:27:13.083 -// You'll live like a king. You'll be a hero. - -// 1107 -// 02:27:13.167 --> 02:27:15.961 -// You'll live better here -// than most people outside. - -// 1108 -// 02:27:16.128 --> 02:27:18.422 -// Some deal! - -// 1109 -// 02:27:21.008 --> 02:27:24.887 -// Alive. Pentangeli is alive. - -// 1110 -// 02:27:26.638 --> 02:27:31.935 -// -How did they get their hands on him? -// -Roth. He engineered it, Michael. - -// 1111 -// 02:27:32.811 --> 02:27:35.189 -// When Frankie went to make a deal with -// the Rosato brothers - -// 1112 -// 02:27:35.272 --> 02:27:37.316 -// they tried to kill him. - -// 1113 -// 02:27:37.399 --> 02:27:39.651 -// He thought you double-crossed him. - -// 1114 -// 02:27:40.694 --> 02:27:44.031 -// Our people with the detectives -// said he was half dead, scared - -// 1115 -// 02:27:44.114 --> 02:27:46.825 -// and shouted that you'd turned on him. - -// 1116 -// 02:27:47.117 --> 02:27:51.288 -// They already had him on possession, -// bookmaking, murder one and more. - -// 1117 -// 02:27:53.123 --> 02:27:58.837 -// The FBI has him airtight. -// He's on an army base, 24 hour guards. - -// 1118 -// 02:27:59.004 --> 02:28:01.632 -// We can't get to him. You've opened -// yourself to five counts of perjury. - -// 1119 -// 02:28:06.386 --> 02:28:09.389 -// What about Fredo? -// What does he know? - -// 1120 -// 02:28:09.473 --> 02:28:13.143 -// He says he doesn't know anything, -// and I believe him. - -// 1121 -// 02:28:13.310 --> 02:28:17.606 -// Roth, he played this one beautifully. - -// 1122 -// 02:28:24.905 --> 02:28:27.699 -// I'm going to talk to Fredo. - -// 1123 -// 02:29:06.947 --> 02:29:09.658 -// I haven't got a lot to say, Mike. - -// 1124 -// 02:29:11.201 --> 02:29:13.704 -// We have time. - -// 1125 -// 02:29:13.871 --> 02:29:17.040 -// I was kept pretty much in the dark. - -// 1126 -// 02:29:18.375 --> 02:29:20.502 -// I didn't know all that much. - -// 1127 -// 02:29:21.420 --> 02:29:26.258 -// What about now? Is there anything -// you can help me out with? - -// 1128 -// 02:29:26.884 --> 02:29:29.094 -// Anything you can tell me now? - -// 1129 -// 02:29:31.054 --> 02:29:33.724 -// They've got Pentangeli. - -// 1130 -// 02:29:48.363 --> 02:29:52.075 -// I didn't know -// it was going to be a hit, Mike. - -// 1131 -// 02:29:52.242 --> 02:29:54.536 -// I swear to God I didn't know. - -// 1132 -// 02:29:57.289 --> 02:30:01.627 -// Johnny Ola bumped into me -// in Beverly Hills. - -// 1133 -// 02:30:03.462 --> 02:30:06.548 -// He said that he wanted to talk. - -// 1134 -// 02:30:08.091 --> 02:30:14.264 -// He said that you and Roth -// were in on a big deal together. - -// 1135 -// 02:30:16.809 --> 02:30:21.146 -// And that there was something in it -// for me if I could help him out. - -// 1136 -// 02:30:21.230 --> 02:30:25.150 -// He said that you were being tough -// on the negotiations - -// 1137 -// 02:30:25.234 --> 02:30:29.613 -// but if they could get a little help -// and close the deal fast, - -// 1138 -// 02:30:31.156 --> 02:30:33.742 -// it would be good for the family. - -// 1139 -// 02:30:35.285 --> 02:30:39.790 -// And you believed that story? -// You believed that? - -// 1140 -// 02:30:39.957 --> 02:30:44.044 -// He said there was something in it -// for me, on my own! - -// 1141 -// 02:30:44.128 --> 02:30:48.257 -// -I've always taken care of you, Fredo. -// -Taken care of me? - -// 1142 -// 02:30:49.591 --> 02:30:52.386 -// You're my kid brother! -// You take care of me? - -// 1143 -// 02:30:53.387 --> 02:30:57.474 -// Did you ever think about that? -// Did you ever once think about that? - -// 1144 -// 02:30:58.559 --> 02:31:02.729 -// "Send Fredo off to do this, -// send Fredo off to do that!" - -// 1145 -// 02:31:03.355 --> 02:31:07.901 -// "Let Fredo take care of some -// Mickey Mouse nightclub somewhere. " - -// 1146 -// 02:31:07.985 --> 02:31:11.071 -// "Let Fredo fetch somebody -// at the airport!" - -// 1147 -// 02:31:11.155 --> 02:31:14.241 -// I'm your older brother, -// but was stepped over! - -// 1148 -// 02:31:14.408 --> 02:31:18.162 -// -It's the way Pop wanted it. -// -It's not the way I wanted it! - -// 1149 -// 02:31:18.954 --> 02:31:23.834 -// I can handle things, I'm smart! -// Not like everybody says. - -// 1150 -// 02:31:24.001 --> 02:31:27.921 -// Like dumb. I'm smart -// and I want respect! - -// 1151 -// 02:31:35.596 --> 02:31:40.809 -// Is there anything you can tell me about -// this investigation? Anything more? - -// 1152 -// 02:31:48.817 --> 02:31:54.865 -// The Senate lawyer, Questadt. -// He belongs to Roth. - -// 1153 -// 02:32:04.541 --> 02:32:06.293 -// Fredo, - -// 1154 -// 02:32:08.754 --> 02:32:11.381 -// you're nothing to me now. - -// 1155 -// 02:32:13.217 --> 02:32:15.677 -// Not a brother, not a friend. - -// 1156 -// 02:32:17.471 --> 02:32:20.474 -// I don't want to know you, -// or what you do. - -// 1157 -// 02:32:21.558 --> 02:32:24.561 -// I don't want to see you at the hotels. - -// 1158 -// 02:32:24.645 --> 02:32:27.231 -// I don't want you near my house. - -// 1159 -// 02:32:29.191 --> 02:32:33.862 -// When you see our mother, I want -// to know in advance, so I won't be there. - -// 1160 -// 02:32:35.447 --> 02:32:37.074 -// You understand? - -// 1161 -// 02:32:46.875 --> 02:32:48.836 -// Mikey. - -// 1162 -// 02:32:55.425 --> 02:32:59.263 -// I don't want anything to happen to him -// while my mother's alive. - -// 1163 -// 02:33:49.146 --> 02:33:52.649 -// There's more people -// than at a ballgame in here. - -// 1164 -// 02:33:52.816 --> 02:33:56.987 -// -Hey, there's Willi Cicci! -// -Frankie Five-Angels... - -// 1165 -// 02:34:16.381 --> 02:34:18.967 -// This committee wiII come to order! - -// 1166 -// 02:34:21.720 --> 02:34:24.515 -// -State your name, pIease. -// -Frank PentangeIi. - -// 1167 -// 02:34:24.598 --> 02:34:28.352 -// -Where were you born? -// -Partinico, it's outside of Palermo. - -// 1168 -// 02:34:28.519 --> 02:34:30.562 -// Where do you Iive now? - -// 1169 -// 02:34:30.729 --> 02:34:35.943 -// I Iive in an army barracks -// with the FBI guys. - -// 1170 -// 02:34:36.985 --> 02:34:41.448 -// We have here a witness -// that wiII further testify - -// 1171 -// 02:34:41.573 --> 02:34:47.955 -// to MichaeI CorIeone's ruIe of a criminaI -// empire that controIs aII gambIing. - -// 1172 -// 02:34:48.205 --> 02:34:53.127 -// This witness has had no buffer -// between himseIf and MichaeI CorIeone. - -// 1173 -// 02:34:53.210 --> 02:34:56.421 -// He can corroborate enough charges - -// 1174 -// 02:34:56.505 --> 02:35:01.176 -// for us to recommend a charge -// of perjury against MichaeI CorIeone. - -// 1175 -// 02:35:01.343 --> 02:35:03.303 -// -Senator. -// -Thank you, Chairman. - -// 1176 -// 02:35:04.680 --> 02:35:06.223 -// Mr. PentangeIi. - -// 1177 -// 02:35:07.432 --> 02:35:13.105 -// Mr. PentangeIi. Were you a member -// of the CorIeone famiIy? - -// 1178 -// 02:35:13.272 --> 02:35:18.318 -// Did you serve under Caporegime, -// Peter Clemenza, - -// 1179 -// 02:35:18.402 --> 02:35:22.948 -// and under Vito Corleone, -// aIso known as the Godfather? - -// 1180 -// 02:35:28.662 --> 02:35:31.290 -// I never knew any Godfather. - -// 1181 -// 02:35:33.834 --> 02:35:35.961 -// I have my own famiIy. - -// 1182 -// 02:35:39.381 --> 02:35:41.925 -// Mr. PentangeIi, you... - -// 1183 -// 02:35:42.092 --> 02:35:46.472 -// You are contradicting -// your own sworn statement. - -// 1184 -// 02:35:46.597 --> 02:35:50.350 -// I ask you again, sir, -// here and now under oath... - -// 1185 -// 02:35:50.434 --> 02:35:54.688 -// were you at any time a member of -// a crime organization - -// 1186 -// 02:35:54.772 --> 02:35:56.648 -// Ied by MichaeI CorIeone? - -// 1187 -// 02:35:56.732 --> 02:35:59.735 -// I don't know nothing about that! - -// 1188 -// 02:36:02.738 --> 02:36:06.700 -// I was in the olive oil business -// with his father - -// 1189 -// 02:36:06.784 --> 02:36:09.453 -// but that was a long time ago. - -// 1190 -// 02:36:10.496 --> 02:36:13.582 -// We have a sworn affidavit. - -// 1191 -// 02:36:15.250 --> 02:36:19.963 -// Your sworn affidavit, that you murdered -// on the orders of MichaeI CorIeone. - -// 1192 -// 02:36:20.088 --> 02:36:24.593 -// Do you deny this confession, and do -// you reaIize what wiII happen if you do? - -// 1193 -// 02:36:24.676 --> 02:36:27.846 -// The FBI guys promised me a deaI - -// 1194 -// 02:36:27.971 --> 02:36:33.644 -// so I made up a Iot of stuff about -// MichaeI CorIeone, just to pIease them. - -// 1195 -// 02:36:33.811 --> 02:36:37.815 -// But it was aII Iies. Everything! - -// 1196 -// 02:36:38.482 --> 02:36:40.651 -// They kept saying, - -// 1197 -// 02:36:40.734 --> 02:36:45.781 -// "MichaeI CorIeone did this" -// and "MichaeI CorIeone did that". - -// 1198 -// 02:36:47.324 --> 02:36:51.328 -// So I said, "Yeah, sure. Why not?" - -// 1199 -// 02:36:51.495 --> 02:36:57.709 -// Mr. Corleone, would you kindly identify -// the gentIeman sitting to your left? - -// 1200 -// 02:36:57.793 --> 02:37:00.003 -// I can answer that. - -// 1201 -// 02:37:00.170 --> 02:37:02.548 -// His name is Vincenzo Pentangeli. - -// 1202 -// 02:37:03.549 --> 02:37:07.886 -// -Is he reIated to the witness? -// -He is, I believe, his brother. - -// 1203 -// 02:37:08.220 --> 02:37:12.850 -// -WiII he come forward and be sworn? -// -He doesn't understand EngIish. - -// 1204 -// 02:37:13.016 --> 02:37:16.061 -// He came at his own expense -// to aid his brother. - -// 1205 -// 02:37:16.895 --> 02:37:20.607 -// He's not under subpoena -// and has an impeccable reputation. - -// 1206 -// 02:37:20.691 --> 02:37:24.486 -// -He knows nothing about this? -// -To my knowledge, nothing. - -// 1207 -// 02:37:24.570 --> 02:37:28.824 -// I'm going to find out what happened! -// This committee is now adjourned. - -// 1208 -// 02:37:29.533 --> 02:37:31.618 -// -The witness is excused. -// -Senator! - -// 1209 -// 02:37:32.703 --> 02:37:36.373 -// Senator! This committee -// owes an apology! - -// 1210 -// 02:37:36.874 --> 02:37:40.878 -// This committee owes an apology. -// Apology, Senator! - -// 1211 -// 02:38:08.489 --> 02:38:12.493 -// -Michael, excuse me. -// -Hello, darling. - -// 1212 -// 02:38:12.910 --> 02:38:16.413 -// The children are outside. We're going. - -// 1213 -// 02:38:17.748 --> 02:38:20.417 -// What do you mean? -// We're leaving tomorrow. - -// 1214 -// 02:38:21.251 --> 02:38:23.670 -// Rocco? - -// 1215 -// 02:38:24.713 --> 02:38:27.299 -// I'll be in my room, Mike. - -// 1216 -// 02:38:30.052 --> 02:38:33.138 -// Michael, I'm not going back to Nevada. - -// 1217 -// 02:38:33.222 --> 02:38:36.642 -// I brought the children -// to say goodbye to you. - -// 1218 -// 02:38:39.728 --> 02:38:42.272 -// I'm very happy for you. - -// 1219 -// 02:38:42.439 --> 02:38:46.944 -// I always knew you were too smart -// to let any of them beat you. - -// 1220 -// 02:38:48.403 --> 02:38:52.991 -// -Why don't you sit down? -// -No, I'm not going to stay long. - -// 1221 -// 02:38:53.158 --> 02:38:56.912 -// There are some things -// I'd like to talk to you about. - -// 1222 -// 02:38:57.079 --> 02:39:02.126 -// Things that have been on my mind, -// changes I want to make. - -// 1223 -// 02:39:02.292 --> 02:39:05.337 -// I think it's too late for changes, Michael. - -// 1224 -// 02:39:06.505 --> 02:39:11.218 -// -I wasn't going to say anything... -// -What do you mean, "too late"? - -// 1225 -// 02:39:16.640 --> 02:39:19.309 -// What really happened with Pentangeli? - -// 1226 -// 02:39:25.107 --> 02:39:30.320 -// -His brother came and helped him. -// -I didn't even know he had a brother. - -// 1227 -// 02:39:30.487 --> 02:39:32.281 -// Where is he now? - -// 1228 -// 02:39:33.615 --> 02:39:36.285 -// He's on a plane, back to Sicily. - -// 1229 -// 02:39:36.952 --> 02:39:39.496 -// All he had to do was show his face. - -// 1230 -// 02:39:41.165 --> 02:39:46.003 -// It was between the brothers, Kay. -// I had nothing to do with it. - -// 1231 -// 02:39:53.844 --> 02:39:57.723 -// I don't want you going! -// Not you, not the kids. No. - -// 1232 -// 02:39:58.849 --> 02:40:02.853 -// You're my wife and my children. -// I love you and won't allow it. - -// 1233 -// 02:40:04.146 --> 02:40:07.983 -// You say you love me, -// but talk about allowing me to leave! - -// 1234 -// 02:40:08.150 --> 02:40:11.862 -// Things between men and women -// will not change. - -// 1235 -// 02:40:12.029 --> 02:40:15.908 -// You've become blind! -// Look what's happened to us. - -// 1236 -// 02:40:16.074 --> 02:40:21.246 -// -Look what's happened to our son! -// -Nothing's happened to him. He's fine! - -// 1237 -// 02:40:21.413 --> 02:40:24.625 -// -Anthony is not fine! -// -I don't want to hear about it. - -// 1238 -// 02:40:24.792 --> 02:40:28.712 -// -Anthony is... -// -I don't want to hear about it! - -// 1239 -// 02:40:30.047 --> 02:40:32.090 -// Over! - -// 1240 -// 02:40:44.103 --> 02:40:47.731 -// At this moment -// I feel no love for you at all. - -// 1241 -// 02:40:48.816 --> 02:40:53.821 -// I never thought that would ever happen, -// but it has. - -// 1242 -// 02:41:08.168 --> 02:41:10.254 -// Kay... - -// 1243 -// 02:41:13.090 --> 02:41:15.259 -// We're leaving tomorrow. - -// 1244 -// 02:41:15.968 --> 02:41:19.138 -// Why don't you take the kids -// back to their room? - -// 1245 -// 02:41:19.221 --> 02:41:25.060 -// -Michael, you haven't heard me. -// -Kay, what do you want from me? - -// 1246 -// 02:41:25.310 --> 02:41:31.692 -// Do you expect me to let you go, -// to let you take my children from me? - -// 1247 -// 02:41:32.484 --> 02:41:38.073 -// Don't you know me? Don't you know -// that that's an impossibility? - -// 1248 -// 02:41:38.157 --> 02:41:42.077 -// That I'd use all my power -// to keep that from happening? - -// 1249 -// 02:41:42.911 --> 02:41:45.289 -// Don't you know that? - -// 1250 -// 02:41:46.957 --> 02:41:48.834 -// Kay... - -// 1251 -// 02:41:51.712 --> 02:41:56.341 -// In time, you'll feel differently. - -// 1252 -// 02:41:57.926 --> 02:42:00.846 -// You'll be glad I stopped you now. - -// 1253 -// 02:42:02.764 --> 02:42:04.767 -// I know that. - -// 1254 -// 02:42:06.769 --> 02:42:10.189 -// I know you blame me -// for losing the baby. - -// 1255 -// 02:42:12.024 --> 02:42:13.108 -// Yes. - -// 1256 -// 02:42:14.359 --> 02:42:17.112 -// I know what that meant to you. - -// 1257 -// 02:42:19.156 --> 02:42:21.283 -// I'll make it up to you, Kay. - -// 1258 -// 02:42:22.159 --> 02:42:24.995 -// I swear I'll make it up to you. I'll... - -// 1259 -// 02:42:26.288 --> 02:42:28.207 -// I'm going to change. - -// 1260 -// 02:42:29.666 --> 02:42:33.837 -// I'll change. I've learned that I have -// the strength to change. - -// 1261 -// 02:42:36.006 --> 02:42:39.009 -// Then you'll forget about -// this miscarriage - -// 1262 -// 02:42:39.843 --> 02:42:44.723 -// and we'll have another child. -// And we'll go on, you and I. - -// 1263 -// 02:42:46.058 --> 02:42:50.229 -// -We'll go on. -// -Oh, Michael! - -// 1264 -// 02:42:51.355 --> 02:42:53.732 -// Michael, you are blind. - -// 1265 -// 02:42:55.567 --> 02:42:57.903 -// It wasn't a miscarriage. - -// 1266 -// 02:42:59.947 --> 02:43:01.490 -// It was an abortion. - -// 1267 -// 02:43:03.367 --> 02:43:08.539 -// An abortion, Michael. -// Just like our marriage is an abortion. - -// 1268 -// 02:43:09.456 --> 02:43:12.918 -// Something that's unholy and evil! - -// 1269 -// 02:43:14.545 --> 02:43:16.880 -// I didn't want your son, Michael! - -// 1270 -// 02:43:17.714 --> 02:43:21.552 -// I wouldn't bring another one -// of your sons into this world! - -// 1271 -// 02:43:23.470 --> 02:43:25.973 -// It was an abortion, Michael. - -// 1272 -// 02:43:26.056 --> 02:43:31.728 -// It was a son and I had it killed -// because this must all end! - -// 1273 -// 02:43:33.313 --> 02:43:37.401 -// I know now that it's over. I knew it then. - -// 1274 -// 02:43:38.819 --> 02:43:43.782 -// There would be no way, Michael, -// no way you could ever forgive me. - -// 1275 -// 02:43:44.241 --> 02:43:48.912 -// Not with this Sicilian thing -// that's been going on for 2,000... - -// 1276 -// 02:43:56.837 --> 02:43:59.715 -// -You won't take my children. -// -I will. - -// 1277 -// 02:43:59.798 --> 02:44:04.178 -// -You won't take my children! -// -They're my children too. - -// 1278 -// 02:45:33.976 --> 02:45:37.521 -// Fredo, give this to Grandmother. - -// 1279 -// 02:47:52.322 --> 02:47:54.324 -// Don Ciccio, it's Tommasino. - -// 1280 -// 02:47:58.245 --> 02:48:01.290 -// Allow me the honor of -// introducing someone. - -// 1281 -// 02:48:01.623 --> 02:48:04.460 -// My partner in America, in New York. - -// 1282 -// 02:48:05.127 --> 02:48:06.962 -// His name is Vito Corleone. - -// 1283 -// 02:48:07.671 --> 02:48:10.215 -// We'll send him olive oil from here. - -// 1284 -// 02:48:11.008 --> 02:48:12.468 -// To his company in America. - -// 1285 -// 02:48:17.264 --> 02:48:20.559 -// They're olive oil importers, Don Ciccio. - -// 1286 -// 02:48:30.277 --> 02:48:35.866 -// We'd like your blessing, and your -// permission to start work. - -// 1287 -// 02:48:36.992 --> 02:48:39.870 -// Where is this young man -// from New York? - -// 1288 -// 02:48:43.207 --> 02:48:46.376 -// Have him come closer. - -// 1289 -// 02:48:47.377 --> 02:48:50.214 -// I can't see him so good. - -// 1290 -// 02:48:57.221 --> 02:49:00.891 -// My respects, Don Ciccio. -// Give me your blessing. - -// 1291 -// 02:49:03.393 --> 02:49:05.104 -// Bless you! - -// 1292 -// 02:49:06.980 --> 02:49:08.565 -// What's your name? - -// 1293 -// 02:49:13.987 --> 02:49:17.157 -// You took the name of this town! - -// 1294 -// 02:49:17.699 --> 02:49:19.451 -// And what's your father's name? - -// 1295 -// 02:49:19.576 --> 02:49:23.247 -// His name was...Antonio Andolini. - -// 1296 -// 02:49:23.622 --> 02:49:27.251 -// Louder, I don't hear so good. - -// 1297 -// 02:49:30.712 --> 02:49:33.924 -// My father's name was -// Antonio Andolini... - -// 1298 -// 02:49:34.258 --> 02:49:36.969 -// ...and this is for you! - -// 1299 -// 02:50:58.884 --> 02:51:01.512 -// Michael, say goodbye. - -// 1300 -// 02:52:04.741 --> 02:52:06.160 -// Hi, Al. - -// 1301 -// 02:52:18.213 --> 02:52:21.216 -// Can I speak with you -// for a second, Tom? - -// 1302 -// 02:52:29.141 --> 02:52:30.851 -// Tom, where's Mike? - -// 1303 -// 02:52:32.102 --> 02:52:34.146 -// Waiting for you to leave. - -// 1304 -// 02:52:36.732 --> 02:52:41.278 -// -Can I talk with him? -// -Sorry, Fredo. No chance. - -// 1305 -// 02:52:41.862 --> 02:52:45.157 -// -Can I see him? -// -He's in the boathouse. - -// 1306 -// 02:52:58.253 --> 02:53:00.631 -// Michael, it's Connie. - -// 1307 -// 02:53:21.902 --> 02:53:23.487 -// Michael... - -// 1308 -// 02:53:26.490 --> 02:53:29.993 -// I'd like to stay close to home now, -// if it's all right. - -// 1309 -// 02:53:38.502 --> 02:53:40.754 -// Is Kay coming? - -// 1310 -// 02:53:43.215 --> 02:53:44.883 -// No. - -// 1311 -// 02:53:53.016 --> 02:53:55.853 -// Fredo's in the house with Mama. - -// 1312 -// 02:53:55.936 --> 02:53:59.857 -// He asked for you -// and Tom said you wouldn't see him. - -// 1313 -// 02:54:03.527 --> 02:54:05.362 -// That's right. - -// 1314 -// 02:54:08.198 --> 02:54:11.577 -// Kids, why don't you go outside -// for a while? - -// 1315 -// 02:54:15.164 --> 02:54:17.541 -// Please, I want to talk to you. - -// 1316 -// 02:54:29.052 --> 02:54:33.056 -// Michael, I hated you for so many years. - -// 1317 -// 02:54:33.515 --> 02:54:38.854 -// I think I did things to myself, -// to hurt myself, so that you'd know - -// 1318 -// 02:54:42.065 --> 02:54:44.193 -// that I could hurt you. - -// 1319 -// 02:54:50.282 --> 02:54:54.703 -// You were just being strong for all of us, -// the way Papa was. - -// 1320 -// 02:54:55.287 --> 02:54:57.164 -// And I forgive you. - -// 1321 -// 02:55:01.835 --> 02:55:03.796 -// Can't you forgive Fredo? - -// 1322 -// 02:55:04.838 --> 02:55:09.468 -// He's so sweet, -// and helpless without you. - -// 1323 -// 02:55:15.808 --> 02:55:19.645 -// You need me. -// I want to take care of you now. - -// 1324 -// 02:55:29.488 --> 02:55:31.031 -// Connie. - -// 1325 -// 02:57:13.258 --> 02:57:15.886 -// Tom, sit down. - -// 1326 -// 02:57:27.606 --> 02:57:31.360 -// Our friend and business partner, -// Hyman Roth, is in the news. - -// 1327 -// 02:57:32.736 --> 02:57:37.366 -// -Did you hear about it? -// -I hear that he's in Israel. - -// 1328 -// 02:57:37.908 --> 02:57:42.538 -// The High Court in Israel -// turned down his request to live there. - -// 1329 -// 02:57:42.704 --> 02:57:46.291 -// His passport's been invalidated, -// except to return here. - -// 1330 -// 02:57:46.375 --> 02:57:49.128 -// He landed in Buenos Aires yesterday. - -// 1331 -// 02:57:49.419 --> 02:57:53.340 -// He offered them a million dollars -// if they'd let him live there. - -// 1332 -// 02:57:54.299 --> 02:57:58.303 -// -They turned him down. -// -He's going to try Panama. - -// 1333 -// 02:57:58.429 --> 02:58:03.100 -// Panama won't take him. -// Not for a million, not for ten million. - -// 1334 -// 02:58:03.475 --> 02:58:08.188 -// His condition is reported as terminal. -// He's only got six months left. - -// 1335 -// 02:58:08.355 --> 02:58:11.358 -// He's had the same heart attack -// for 20 years. - -// 1336 -// 02:58:11.525 --> 02:58:15.696 -// -That plane goes to Miami. -// -That's right. That's where I want it met. - -// 1337 -// 02:58:16.822 --> 02:58:22.202 -// Impossible. They'll turn him over to the -// Internal Revenue, Customs and FBI. - -// 1338 -// 02:58:22.369 --> 02:58:25.581 -// It's not impossible. -// Nothing's impossible. - -// 1339 -// 02:58:25.664 --> 02:58:27.124 -// It would be -// like trying to kill the President. - -// 1340 -// 02:58:27.207 --> 02:58:31.712 -// -There's no way we can get to him! -// -Tom, you surprise me. - -// 1341 -// 02:58:34.506 --> 02:58:38.135 -// If anything in this life is certain, - -// 1342 -// 02:58:38.218 --> 02:58:41.430 -// if history has taught us anything, - -// 1343 -// 02:58:41.513 --> 02:58:44.141 -// it's that you can kill anyone. - -// 1344 -// 02:58:49.480 --> 02:58:54.401 -// -Rocco? -// -Difficult. Not impossible. - -// 1345 -// 02:58:54.735 --> 02:58:56.445 -// Good. - -// 1346 -// 02:58:58.906 --> 02:59:02.493 -// Why did you ask me if something -// was wrong when I came in? - -// 1347 -// 02:59:06.163 --> 02:59:12.085 -// I thought you were going to tell me that -// you were moving your family to Vegas - -// 1348 -// 02:59:13.462 --> 02:59:17.341 -// and that you'd been offered the Vice -// Presidency of the Houstan hotels there. - -// 1349 -// 02:59:19.468 --> 02:59:24.306 -// -I thought you'd tell me that. -// -Must I tell you every offer I turn down? - -// 1350 -// 02:59:28.519 --> 02:59:31.313 -// -Let's do business. -// -All right. - -// 1351 -// 02:59:33.190 --> 02:59:36.193 -// Just consider this, Michael. -// Just consider it. - -// 1352 -// 02:59:37.444 --> 02:59:39.571 -// Roth and the Rosatos are on the run. - -// 1353 -// 02:59:39.655 --> 02:59:42.199 -// Are they worth it, -// are they strong enough? - -// 1354 -// 02:59:42.699 --> 02:59:47.579 -// Is it worth it? You've won. -// Do you want to wipe everybody out? - -// 1355 -// 02:59:47.663 --> 02:59:53.001 -// I don't feel I have to wipe everybody -// out, Tom. Just my enemies, that's all. - -// 1356 -// 03:00:00.717 --> 03:00:03.387 -// Are you with me in these things, -// or what? - -// 1357 -// 03:00:05.514 --> 03:00:10.936 -// Because if not, you can take your wife, -// your family and your mistress - -// 1358 -// 03:00:11.103 --> 03:00:14.231 -// and move them all to Las Vegas. - -// 1359 -// 03:00:17.359 --> 03:00:22.406 -// Why do you hurt me, Michael? I've -// always been loyal to you. What is this? - -// 1360 -// 03:00:26.994 --> 03:00:28.662 -// So...you're staying? - -// 1361 -// 03:00:30.706 --> 03:00:33.041 -// Yes, I'm staying. - -// 1362 -// 03:00:35.627 --> 03:00:37.754 -// What do you want me to do? - -// 1363 -// 03:00:38.255 --> 03:00:40.257 -// Hey, Anthony. - -// 1364 -// 03:00:40.799 --> 03:00:45.429 -// How would you like it if I taught you -// how to catch the really big fish? - -// 1365 -// 03:00:45.512 --> 03:00:48.015 -// -Would you like that? -// -Okay. - -// 1366 -// 03:00:48.182 --> 03:00:50.809 -// You know, when I was your age, - -// 1367 -// 03:00:51.268 --> 03:00:58.150 -// I went out fishing with all my brothers -// and my father. Everybody. - -// 1368 -// 03:00:59.318 --> 03:01:02.821 -// I was the only one that caught a fish. - -// 1369 -// 03:01:04.823 --> 03:01:07.868 -// Nobody else could catch one. -// Do you know how I did it? - -// 1370 -// 03:01:09.453 --> 03:01:13.248 -// Every time I put the line in the water -// I said a Hail Mary - -// 1371 -// 03:01:13.415 --> 03:01:17.044 -// and every time I said a Hail Mary, -// I caught a fish. - -// 1372 -// 03:01:19.463 --> 03:01:23.634 -// Do you believe that? It's true. -// That's the secret. - -// 1373 -// 03:01:25.719 --> 03:01:29.556 -// -Do you want to try it out on the lake? -// -Okay. - -// 1374 -// 03:01:31.350 --> 03:01:32.684 -// What else have you got? - -// 1375 -// 03:01:59.253 --> 03:02:01.839 -// Everything will be okay. - -// 1376 -// 03:02:02.005 --> 03:02:05.926 -// -Did my brother go back? -// -Yeah, don't worry. - -// 1377 -// 03:02:06.093 --> 03:02:11.014 -// He's ten times tougher than me, -// my brother. He's old-fashioned. - -// 1378 -// 03:02:12.057 --> 03:02:15.352 -// He didn't want dinner, -// just wanted to go home. - -// 1379 -// 03:02:15.436 --> 03:02:20.482 -// That's my brother! Nothing could get -// him away from that two-mule town. - -// 1380 -// 03:02:20.649 --> 03:02:24.486 -// He could have been big here. -// He could have had his own family. - -// 1381 -// 03:02:29.700 --> 03:02:31.660 -// Tom, - -// 1382 -// 03:02:32.369 --> 03:02:34.955 -// what do I do now? - -// 1383 -// 03:02:35.664 --> 03:02:37.666 -// Frankie. - -// 1384 -// 03:02:42.212 --> 03:02:46.216 -// You were always interested -// in politics and history. - -// 1385 -// 03:02:47.718 --> 03:02:51.180 -// I remember you talking about Hitler -// back in '33. - -// 1386 -// 03:02:51.346 --> 03:02:54.975 -// Yeah, I still read a lot. -// I get good stuff in there. - -// 1387 -// 03:02:57.519 --> 03:03:03.275 -// You were around the old-timers, who -// built the organization of the families, - -// 1388 -// 03:03:03.400 --> 03:03:08.822 -// basing them on the old Roman legions, -// with "regimes," "capos" and "soldiers". - -// 1389 -// 03:03:10.073 --> 03:03:14.077 -// -And it worked. -// -Yeah, it worked. - -// 1390 -// 03:03:14.870 --> 03:03:18.373 -// Those were the great old days, -// you know. - -// 1391 -// 03:03:18.540 --> 03:03:21.668 -// We was like the Roman Empire. - -// 1392 -// 03:03:21.752 --> 03:03:25.255 -// The Corleone family -// was like the Roman Empire. - -// 1393 -// 03:03:27.633 --> 03:03:29.593 -// Yeah, - -// 1394 -// 03:03:29.760 --> 03:03:32.137 -// it was once. - -// 1395 -// 03:03:36.558 --> 03:03:38.102 -// Frankie. - -// 1396 -// 03:03:48.570 --> 03:03:52.116 -// When a plot -// against the Emperor failed - -// 1397 -// 03:03:53.367 --> 03:03:56.829 -// the plotters were always -// given a chance - -// 1398 -// 03:03:58.789 --> 03:04:02.376 -// to let their families keep their fortunes. -// Right? - -// 1399 -// 03:04:02.459 --> 03:04:04.586 -// Only the rich guys. - -// 1400 -// 03:04:04.670 --> 03:04:09.675 -// The little guys got knocked off and all -// their estates went to the Emperors. - -// 1401 -// 03:04:09.842 --> 03:04:15.055 -// Unless they went home and killed -// themselves, then nothing happened. - -// 1402 -// 03:04:16.223 --> 03:04:20.519 -// And their families were taken care of. - -// 1403 -// 03:04:22.146 --> 03:04:25.524 -// That was a good break, a nice deal. - -// 1404 -// 03:04:26.150 --> 03:04:27.609 -// Yeah. - -// 1405 -// 03:04:28.569 --> 03:04:30.654 -// They went home - -// 1406 -// 03:04:31.864 --> 03:04:34.825 -// and sat in a hot bath - -// 1407 -// 03:04:34.992 --> 03:04:37.536 -// opened up their veins - -// 1408 -// 03:04:37.703 --> 03:04:40.414 -// and bled to death. - -// 1409 -// 03:04:41.582 --> 03:04:45.752 -// And sometimes they had a little party -// before they did it. - -// 1410 -// 03:04:51.091 --> 03:04:53.427 -// Don't worry about anything, -// Frankie Five-Angels. - -// 1411 -// 03:04:54.887 --> 03:04:58.182 -// Thanks, Tom. Thanks. - -// 1412 -// 03:05:16.658 --> 03:05:19.787 -// -See you, Tom. -// -Addio, Frankie. - -// 1413 -// 03:05:30.714 --> 03:05:33.842 -// Kay. You have to go. - -// 1414 -// 03:05:35.636 --> 03:05:38.972 -// -So pretty... -// -Kay, please hurry. He's coming. - -// 1415 -// 03:05:47.773 --> 03:05:51.568 -// Anthony. Kiss Mama goodbye. - -// 1416 -// 03:05:54.196 --> 03:05:56.990 -// Anthony, kiss your mother goodbye! - -// 1417 -// 03:05:57.157 --> 03:06:02.246 -// Anthony, say goodbye to Mama. -// Anthony. I love you, Anthony. - -// 1418 -// 03:06:03.372 --> 03:06:05.749 -// Kay, please. - -// 1419 -// 03:06:08.669 --> 03:06:10.629 -// All right. - -// 1420 -// 03:06:23.892 --> 03:06:26.270 -// Mary, come here. - -// 1421 -// 03:06:33.444 --> 03:06:35.028 -// Anthony. - -// 1422 -// 03:06:35.112 --> 03:06:38.115 -// Anthony, please. Kiss me once. - -// 1423 -// 03:08:17.214 --> 03:08:19.299 -// Easy. - -// 1424 -// 03:08:25.013 --> 03:08:28.100 -// Anthony! Anthony! - -// 1425 -// 03:08:28.225 --> 03:08:31.270 -// -He's here, we're going fishing. -// -No! - -// 1426 -// 03:08:31.437 --> 03:08:34.773 -// Michael wants to take him to Reno now. - -// 1427 -// 03:08:34.857 --> 03:08:36.859 -// Shit! - -// 1428 -// 03:08:38.068 --> 03:08:41.530 -// Okay, kid, you have to go to Reno -// with your pop. - -// 1429 -// 03:08:42.489 --> 03:08:46.452 -// -I'll take you fishing tomorrow, okay? -// -Okay. - -// 1430 -// 03:08:50.080 --> 03:08:51.665 -// Hey, Anthony. - -// 1431 -// 03:08:51.748 --> 03:08:56.086 -// Listen, I'll catch one for you in secret. - -// 1432 -// 03:09:00.132 --> 03:09:01.508 -// Let's go. - -// 1433 -// 03:09:40.672 --> 03:09:44.843 -// -Mr. Roth, I must take you into custody. -// -I understand. - -// 1434 -// 03:09:45.010 --> 03:09:48.138 -// What's your reaction -// to the Israeli High Court ruling? - -// 1435 -// 03:09:48.305 --> 03:09:51.100 -// I'm a retired investor on a pension. - -// 1436 -// 03:09:51.266 --> 03:09:56.146 -// I went to Israel to live there as a Jew, -// in the twilight of my life. - -// 1437 -// 03:10:02.486 --> 03:10:06.115 -// Hey, Frankie! Come on out, -// let's play some Hearts. - -// 1438 -// 03:10:14.289 --> 03:10:15.999 -// Frankie! - -// 1439 -// 03:10:31.890 --> 03:10:34.768 -// Is it true you're worth -// over 300 million dollars? - -// 1440 -// 03:10:34.935 --> 03:10:38.564 -// I'm a retired investor, -// living on a pension. - -// 1441 -// 03:10:38.730 --> 03:10:42.276 -// I came home to vote -// in the presidential election - -// 1442 -// 03:10:42.443 --> 03:10:45.863 -// because they wouldn't give me -// an absentee ballot. - -// 1443 -// 03:10:58.208 --> 03:11:00.627 -// Jesus Christ. - -// 1444 -// 03:11:01.670 --> 03:11:06.300 -// Hail Mary, full of grace. -// The Lord is with thee. - -// 1445 -// 03:11:07.760 --> 03:11:10.387 -// Blessed art thou amongst women. - -// 1446 -// 03:11:11.180 --> 03:11:14.308 -// Blessed is the fruit of thy womb, Jesus. - -// 1447 -// 03:11:15.517 --> 03:11:19.730 -// Holy Mary, Mother of God, -// pray for us sinners. - -// 1448 -// 03:12:01.605 --> 03:12:06.777 -// Hey! Everybody, pay attention. -// This is my friend Carlo Rizzi. - -// 1449 -// 03:12:07.569 --> 03:12:10.322 -// -You know my brother Fredo. -// -Sure. - -// 1450 -// 03:12:10.489 --> 03:12:15.244 -// This is my stepbrother Tom, -// and that's his girl Theresa. - -// 1451 -// 03:12:15.327 --> 03:12:18.664 -// This cute little thing is my sister Connie. - -// 1452 -// 03:12:18.747 --> 03:12:21.583 -// Say hello to Carlo. -// He's good-looking, isn't he? - -// 1453 -// 03:12:21.667 --> 03:12:23.252 -// Yes. - -// 1454 -// 03:12:23.418 --> 03:12:27.464 -// The droopy thing is Mike. -// We call him Joe College. - -// 1455 -// 03:12:27.965 --> 03:12:31.844 -// Sit down. Talk to each other. - -// 1456 -// 03:12:32.010 --> 03:12:34.263 -// Hey, Mr. Einstein... - -// 1457 -// 03:12:37.599 --> 03:12:40.102 -// -The cake. -// -Sally, get in here! - -// 1458 -// 03:12:40.269 --> 03:12:42.396 -// -I was scared. -// -Come on. - -// 1459 -// 03:12:43.063 --> 03:12:46.400 -// -Where's your father? -// -Christmas shopping. - -// 1460 -// 03:12:46.567 --> 03:12:48.944 -// Let's see that thing. - -// 1461 -// 03:12:50.654 --> 03:12:52.573 -// That's nice! - -// 1462 -// 03:12:52.656 --> 03:12:56.493 -// -Should I put the candles on now? -// -Yeah. You help her, Carlo. - -// 1463 -// 03:12:57.619 --> 03:13:00.747 -// -What is that? Rum? -// -Yeah. - -// 1464 -// 03:13:05.753 --> 03:13:09.006 -// Don't touch the antipasto -// until Pop sees it. - -// 1465 -// 03:13:09.173 --> 03:13:11.842 -// He's not ugly... - -// 1466 -// 03:13:17.347 --> 03:13:23.604 -// What do you think of the nerve of those -// Japs? Bombing us on Pop's birthday. - -// 1467 -// 03:13:23.687 --> 03:13:27.107 -// They didn't know it was Pop's birthday. - -// 1468 -// 03:13:27.191 --> 03:13:29.860 -// Not surprising after the oil embargo. - -// 1469 -// 03:13:30.027 --> 03:13:34.490 -// They've got no right dropping bombs! -// Are you a Jap-lover? - -// 1470 -// 03:13:34.698 --> 03:13:38.368 -// -30,000 enlisted this morning. -// -Bunch of saps... - -// 1471 -// 03:13:38.535 --> 03:13:42.039 -// -Why are they saps? -// -Let's not talk about the war. - -// 1472 -// 03:13:43.165 --> 03:13:45.000 -// You talk to Carlo. - -// 1473 -// 03:13:46.960 --> 03:13:50.547 -// Only saps risk their lives for strangers. - -// 1474 -// 03:13:50.631 --> 03:13:54.093 -// -That's Pop talking. -// -You're right, that's Pop talking! - -// 1475 -// 03:13:54.218 --> 03:13:58.013 -// -They risk their lives for their country. -// -Country isn't your blood. - -// 1476 -// 03:13:58.097 --> 03:14:04.019 -// -I don't feel that way. -// -Then quit college andjoin the army! - -// 1477 -// 03:14:04.103 --> 03:14:05.604 -// I did. - -// 1478 -// 03:14:06.563 --> 03:14:09.525 -// I've enlisted in the Marines. - -// 1479 -// 03:14:11.735 --> 03:14:14.988 -// -Why didn't you come to us? -// -What do you mean? - -// 1480 -// 03:14:15.072 --> 03:14:19.326 -// -Pop managed to get you a deferment. -// -I didn't ask for it. - -// 1481 -// 03:14:20.077 --> 03:14:22.162 -// I didn't want it. - -// 1482 -// 03:14:23.330 --> 03:14:25.749 -// Come on! Knock it off! - -// 1483 -// 03:14:25.916 --> 03:14:29.670 -// -Punk! -// -Sonny, sit down. - -// 1484 -// 03:14:32.673 --> 03:14:36.176 -// Mommy, Daddy's fighting again! - -// 1485 -// 03:14:39.263 --> 03:14:42.015 -// Go and show Carlo the tree. - -// 1486 -// 03:14:52.317 --> 03:14:53.944 -// Nice. - -// 1487 -// 03:14:55.779 --> 03:14:57.322 -// Nice. - -// 1488 -// 03:14:57.948 --> 03:15:00.617 -// Break your father's heart -// on his birthday. - -// 1489 -// 03:15:01.743 --> 03:15:04.496 -// That's swell, Mike. Congratulations. - -// 1490 -// 03:15:04.580 --> 03:15:06.707 -// Don't encourage him! - -// 1491 -// 03:15:06.790 --> 03:15:09.460 -// Get me a drink. Go on! - -// 1492 -// 03:15:13.338 --> 03:15:16.800 -// You don't understand. -// Your father has plans for you. - -// 1493 -// 03:15:16.967 --> 03:15:21.180 -// Many times he and I have talked -// about your future. - -// 1494 -// 03:15:22.973 --> 03:15:26.810 -// You've talked to my father -// about my future? - -// 1495 -// 03:15:28.103 --> 03:15:32.399 -// -My future. -// -Mikey, he has high hopes for you. - -// 1496 -// 03:15:32.483 --> 03:15:38.030 -// -I have my own plans for my future. -// -Did you go to college to get stupid? - -// 1497 -// 03:15:38.113 --> 03:15:39.990 -// He's here! - -// 1498 -// 03:15:41.950 --> 03:15:43.911 -// Come on. - -// 1499 -// 03:15:46.163 --> 03:15:48.123 -// Stupid! - -// 1500 -// 03:16:05.390 --> 03:16:07.768 -// Surprise! - -// 1501 -// 03:16:10.854 --> 03:16:16.527 -// For he's a joIIy good feIIow -// For he's a joIIy good feIIow - -// 1502 -// 03:16:16.735 --> 03:16:20.531 -// That nobody can deny -// Nobody can deny... -// `; diff --git a/src/routes/Player/Video/stremio-video/utils/parseVtt.js b/src/routes/Player/Video/stremio-video/utils/parseVtt.js deleted file mode 100644 index 58445c11d..000000000 --- a/src/routes/Player/Video/stremio-video/utils/parseVtt.js +++ /dev/null @@ -1,55 +0,0 @@ -var VTTJS = require('vtt.js'); - -function binarySearch(array, element) { - var left = 0; - var right = array.length - 1; - while (left <= right) { - var middle = Math.floor((left + right) / 2); - if (array[middle] < element) { - left = middle + 1; - } else if (array[middle] > element) { - right = middle - 1; - } else { - return middle; - } - } - - return -1; -} - -module.exports = function(text) { - var nativeVTTCue = VTTCue; - global.VTTCue = VTTJS.VTTCue; - var cuesTree = {}; - var cues = []; - var parser = new VTTJS.WebVTT.Parser(window, VTTJS.WebVTT.StringDecoder()); - parser.oncue = function(cue) { - cues.push({ - startTime: cue.startTime * 1000, - endTime: cue.endTime * 1000, - text: cue.text - }); - }; - parser.parse(text); - parser.flush(); - var cueBoundTimes = Object.keys(cuesTree).map(function(time) { - return parseInt(time); - }); - for (var i = 0; i < cues.length; i++) { - var cue = cues[i]; - cuesTree[cue.startTime] = cuesTree[cue.startTime] || []; - cuesTree[cue.startTime].push(cue); - var startTimeBoundIndex = binarySearch(cueBoundTimes, cue.startTime); - for (var j = startTimeBoundIndex + 1; j < cueBoundTimes.length; j++) { - if (cue.endTime <= cueBoundTimes[j]) { - break; - } - - cuesTree[cueBoundTimes[j]] = cuesTree[cueBoundTimes[j]] || []; - cuesTree[cueBoundTimes[j]].push(cue); - } - } - - global.VTTCue = nativeVTTCue; - return cuesTree; -}; diff --git a/src/routes/Player/Video/stremio-video/utils/subtitles.js b/src/routes/Player/Video/stremio-video/utils/subtitles.js new file mode 100644 index 000000000..658402e21 --- /dev/null +++ b/src/routes/Player/Video/stremio-video/utils/subtitles.js @@ -0,0 +1,85 @@ +var VTTJS = require('vtt.js'); + +function binarySearchUpperBound(array, value) { + if (value < array[0] || array[array.length - 1] < value) { + return -1; + } + + var left = 0; + var right = array.length - 1; + var index = -1; + while (left <= right) { + var middle = Math.floor((left + right) / 2); + if (array[middle] > value) { + right = middle - 1; + } else if (array[middle] < value) { + left = middle + 1; + } else { + index = middle; + left = middle + 1; + } + } + + return index !== -1 ? index : right; +} + +function parse(text) { + var nativeVTTCue = VTTCue; + global.VTTCue = VTTJS.VTTCue; + var cues = []; + var cuesForTime = {}; + var parser = new VTTJS.WebVTT.Parser(window, VTTJS.WebVTT.StringDecoder()); + parser.oncue = function(c) { + var cue = { + startTime: c.startTime * 1000, + endTime: c.endTime * 1000, + text: c.text + }; + cues.push(cue); + cuesForTime[cue.startTime] = cuesForTime[cue.startTime] || []; + cuesForTime[cue.endTime] = cuesForTime[cue.endTime] || []; + }; + parser.parse(text); + parser.flush(); + cuesForTime.times = Object.keys(cuesForTime) + .map(function(time) { + return parseInt(time); + }) + .sort(function(t1, t2) { + return t1 - t2; + }); + for (var i = 0; i < cues.length; i++) { + cuesForTime[cues[i].startTime].push(cues[i]); + var startTimeIndex = binarySearchUpperBound(cuesForTime.times, cues[i].startTime); + for (var j = startTimeIndex + 1; j < cuesForTime.times.length; j++) { + if (cues[i].endTime <= cuesForTime.times[j]) { + break; + } + + cuesForTime[cuesForTime.times[j]].push(cues[i]); + } + } + for (var i = 0; i < cuesForTime.times; i++) { + cuesForTime[cuesForTime.times[j]].sort(function(c1, c2) { + return c1.startTime - c2.startTime || + c1.endTime - c2.endTime; + }); + } + global.VTTCue = nativeVTTCue; + return cuesForTime; +} + +function cuesForTime(cues, time) { + var index = binarySearchUpperBound(cues.times, time); + return index !== -1 ? cues[cues.times[index]] : []; +} + +function render(cue) { + return VTTJS.WebVTT.convertCueToDOMTree(window, cue.text); +} + +module.exports = { + parse, + cuesForTime, + render +}; From ed5137f5bc1e05010f41bca12620c875d41768c3 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Sun, 30 Dec 2018 14:39:28 +0200 Subject: [PATCH 64/94] sort subtitle cues fixed --- src/routes/Player/Video/stremio-video/utils/subtitles.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/utils/subtitles.js b/src/routes/Player/Video/stremio-video/utils/subtitles.js index 658402e21..f984e01e2 100644 --- a/src/routes/Player/Video/stremio-video/utils/subtitles.js +++ b/src/routes/Player/Video/stremio-video/utils/subtitles.js @@ -59,8 +59,8 @@ function parse(text) { cuesForTime[cuesForTime.times[j]].push(cues[i]); } } - for (var i = 0; i < cuesForTime.times; i++) { - cuesForTime[cuesForTime.times[j]].sort(function(c1, c2) { + for (var i = 0; i < cuesForTime.times.length; i++) { + cuesForTime[cuesForTime.times[i]].sort(function(c1, c2) { return c1.startTime - c2.startTime || c1.endTime - c2.endTime; }); From 814a999ce3e92e3a93fb884ab3bb0942d7821134 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Sun, 30 Dec 2018 21:44:11 +0200 Subject: [PATCH 65/94] demo subtitles loaded for testing purposes --- src/routes/Player/Player.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 6c5fbfaf9..b230fc86b 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -2,7 +2,6 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import Video from './Video'; import ControlBar from './ControlBar'; -import subtitles from './subtitles'; import styles from './styles'; class Player extends Component { @@ -31,7 +30,12 @@ class Player extends Component { } componentDidMount() { - this.addSubtitleTracks(subtitles); + this.addSubtitleTracks([{ + url: 'https://raw.githubusercontent.com/caitp/ng-media/master/example/assets/captions/bunny-en.vtt', + origin: 'Github', + label: 'English' + }]); + this.setSelectedSubtitleTrackId('https://raw.githubusercontent.com/caitp/ng-media/master/example/assets/captions/bunny-en.vtt'); } onEnded = () => { From 239b4ce1cf3f05a23c846dcf7ba0b686902e022c Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 12:33:08 +0200 Subject: [PATCH 66/94] subtitleSize prop implemented and binded to the ui --- src/routes/Player/ControlBar/ControlBar.js | 7 ++++ .../SubtitlesPicker/SubtitlesPicker.js | 32 +++++++++++++------ src/routes/Player/Player.js | 12 +++++-- .../Player/Video/stremio-video/HTMLVideo.js | 19 +++++++++-- 4 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 646be59a5..3bf4d4017 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -33,6 +33,7 @@ class ControlBar extends Component { nextProps.volume !== this.props.volume || nextProps.subtitleTracks !== this.props.subtitleTracks || nextProps.selectedSubtitleTrackId !== this.props.selectedSubtitleTrackId || + nextProps.subtitleSize !== this.props.subtitleSize || nextState.sharePopupOpen !== this.state.sharePopupOpen || nextState.subtitlesPopupOpen !== this.state.subtitlesPopupOpen; } @@ -49,6 +50,10 @@ class ControlBar extends Component { this.props.setSelectedSubtitleTrackId(selectedSubtitleTrackId); } + setSubtitleSize = (size) => { + this.props.setSubtitleSize(size); + } + mute = () => { this.props.mute(); } @@ -142,8 +147,10 @@ class ControlBar extends Component { diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index e4ceb2861..d4cb4346e 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -39,6 +39,10 @@ class SubtitlesPicker extends PureComponent { this.props.setSelectedSubtitleTrackId(event.currentTarget.dataset.trackId); } + setSubtitleSize = (event) => { + this.props.setSubtitleSize(event.currentTarget.dataset.value); + } + renderToggleButton({ selectedTrack }) { return (
@@ -81,6 +85,24 @@ class SubtitlesPicker extends PureComponent { ); } + renderNumberInput({ value, unit, onChange }) { + if (value === null) { + return null; + } + + return ( +
+
+ +
+
{value}{unit}
+
+ +
+
+ ); + } + renderPreferences({ groupedTracks, selectedTrack }) { if (!selectedTrack) { return ( @@ -120,15 +142,7 @@ class SubtitlesPicker extends PureComponent {
-
-
- -
-
17pt
-
- -
-
+ {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', onChange: this.setSubtitleSize })}
); } diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index b230fc86b..9a6521768 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -16,7 +16,8 @@ class Player extends Component { duration: null, volume: null, subtitleTracks: [], - selectedSubtitleTrackId: null + selectedSubtitleTrackId: null, + subtitleSize: null }; } @@ -26,7 +27,8 @@ class Player extends Component { nextState.duration !== this.state.duration || nextState.volume !== this.state.volume || nextState.subtitleTracks !== this.state.subtitleTracks || - nextState.selectedSubtitleTrackId !== this.state.selectedSubtitleTrackId; + nextState.selectedSubtitleTrackId !== this.state.selectedSubtitleTrackId || + nextState.subtitleSize !== this.state.subtitleSize; } componentDidMount() { @@ -74,6 +76,10 @@ class Player extends Component { this.videoRef.current && this.videoRef.current.dispatch('setProp', 'selectedSubtitleTrackId', selectedSubtitleTrackId); } + setSubtitleSize = (size) => { + this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleSize', size); + } + mute = () => { this.videoRef.current && this.videoRef.current.dispatch('command', 'mute'); } @@ -117,11 +123,13 @@ class Player extends Component { volume={this.state.volume} subtitleTracks={this.state.subtitleTracks} selectedSubtitleTrackId={this.state.selectedSubtitleTrackId} + subtitleSize={this.state.subtitleSize} play={this.play} pause={this.pause} setTime={this.setTime} setVolume={this.setVolume} setSelectedSubtitleTrackId={this.setSelectedSubtitleTrackId} + setSubtitleSize={this.setSubtitleSize} mute={this.mute} unmute={this.unmute} /> diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 541b33c88..29ee189a3 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -20,7 +20,7 @@ var HTMLVideo = function(container) { container.appendChild(styles); styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', styles.sheet.cssRules.length); - styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 120px; left: 0; font-size: 22px; color: white; text-align: center; }', styles.sheet.cssRules.length); + var subtitleStylesIndex = styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 120px; left: 0; font-size: 22px; color: white; text-align: center; }', styles.sheet.cssRules.length); container.appendChild(video); video.crossOrigin = 'anonymous'; video.controls = false; @@ -65,6 +65,9 @@ var HTMLVideo = function(container) { return selectedSubtitleTrackId; } + function getSubtitleSize() { + return parseInt(styles.sheet.cssRules[subtitleStylesIndex].style.fontSize); + } function onEnded() { events.emit('ended'); } @@ -121,6 +124,9 @@ var HTMLVideo = function(container) { function onSelectedSubtitleTrackIdChanged() { events.emit('propChanged', 'selectedSubtitleTrackId', getSelectedSubtitleTrackId()); } + function onSubtitleSizeChanged() { + events.emit('propChanged', 'subtitleSize', getSubtitleSize()); + } function updateSubtitlesText() { while (subtitles.hasChildNodes()) { subtitles.removeChild(subtitles.lastChild); @@ -189,6 +195,9 @@ var HTMLVideo = function(container) { case 'selectedSubtitleTrackId': events.emit('propValue', 'selectedSubtitleTrackId', getSelectedSubtitleTrackId()); return; + case 'subtitleSize': + events.emit('propValue', 'subtitleSize', getSubtitleSize()); + return; default: throw new Error('observeProp not supported: ' + arguments[1]); } @@ -237,6 +246,12 @@ var HTMLVideo = function(container) { onSelectedSubtitleTrackIdChanged(); } break; + case 'subtitleSize': + if (!isNaN(arguments[2])) { + styles.sheet.cssRules[subtitleStylesIndex].style.fontSize = parseInt(arguments[2]) + 'px'; + onSubtitleSizeChanged(); + } + return; case 'volume': if (!isNaN(arguments[2])) { video.muted = false; @@ -353,7 +368,7 @@ var HTMLVideo = function(container) { HTMLVideo.manifest = { name: 'HTMLVideo', embedded: true, - props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrackId'] + props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrackId', 'subtitleSize'] }; module.exports = HTMLVideo; From ab8df39f871e55394b8d47d3d2d645cdceeb60f3 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 12:49:06 +0200 Subject: [PATCH 67/94] floating point suntitle size allowed --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 29ee189a3..132bdd900 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -66,7 +66,7 @@ var HTMLVideo = function(container) { return selectedSubtitleTrackId; } function getSubtitleSize() { - return parseInt(styles.sheet.cssRules[subtitleStylesIndex].style.fontSize); + return parseFloat(styles.sheet.cssRules[subtitleStylesIndex].style.fontSize); } function onEnded() { events.emit('ended'); @@ -248,7 +248,7 @@ var HTMLVideo = function(container) { break; case 'subtitleSize': if (!isNaN(arguments[2])) { - styles.sheet.cssRules[subtitleStylesIndex].style.fontSize = parseInt(arguments[2]) + 'px'; + styles.sheet.cssRules[subtitleStylesIndex].style.fontSize = parseFloat(arguments[2]) + 'px'; onSubtitleSizeChanged(); } return; From 1d1c4116719e6646848c2710dffe2f5c199259c0 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 12:50:49 +0200 Subject: [PATCH 68/94] subtitle size unit changed from px to pt --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 132bdd900..46b7ca9a8 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -20,7 +20,7 @@ var HTMLVideo = function(container) { container.appendChild(styles); styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', styles.sheet.cssRules.length); - var subtitleStylesIndex = styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 120px; left: 0; font-size: 22px; color: white; text-align: center; }', styles.sheet.cssRules.length); + var subtitleStylesIndex = styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 120px; left: 0; font-size: 16pt; color: white; text-align: center; }', styles.sheet.cssRules.length); container.appendChild(video); video.crossOrigin = 'anonymous'; video.controls = false; @@ -248,7 +248,7 @@ var HTMLVideo = function(container) { break; case 'subtitleSize': if (!isNaN(arguments[2])) { - styles.sheet.cssRules[subtitleStylesIndex].style.fontSize = parseFloat(arguments[2]) + 'px'; + styles.sheet.cssRules[subtitleStylesIndex].style.fontSize = parseFloat(arguments[2]) + 'pt'; onSubtitleSizeChanged(); } return; From 1a15f7b11e11c2308899118fec33512fed25b982 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 12:52:30 +0200 Subject: [PATCH 69/94] subtitles size delta changed to 0.5 --- .../ControlBar/SubtitlesPicker/SubtitlesPicker.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index d4cb4346e..79e0dca20 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -85,18 +85,20 @@ class SubtitlesPicker extends PureComponent { ); } - renderNumberInput({ value, unit, onChange }) { + renderNumberInput({ value, unit, delta, onChange }) { if (value === null) { return null; } + const fractionalDigits = delta.toString().split('.')[1]; + const digitsCount = typeof fractionalDigits === 'string' ? fractionalDigits.length : 0; return (
-
+
-
{value}{unit}
-
+
{value.toFixed(digitsCount)}{unit}
+
@@ -142,7 +144,7 @@ class SubtitlesPicker extends PureComponent {
- {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', onChange: this.setSubtitleSize })} + {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', delta: 0.5, onChange: this.setSubtitleSize })}
); } From 7f3efcda850f236676cfa6555f7ad42131973972 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 12:54:02 +0200 Subject: [PATCH 70/94] variants list ui extracted in separate function --- .../SubtitlesPicker/SubtitlesPicker.js | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index 79e0dca20..2d6d683be 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -85,6 +85,28 @@ class SubtitlesPicker extends PureComponent { ); } + renderVariantsList({ groupedTracks, selectedTrack }) { + if (groupedTracks[selectedTrack.origin][selectedTrack.label].length <= 1) { + return null; + } + + return ( +
+ {groupedTracks[selectedTrack.origin][selectedTrack.label].map((track, index) => { + return ( +
+ ); + })} +
+ ); + } + renderNumberInput({ value, unit, delta, onChange }) { if (value === null) { return null; @@ -117,24 +139,7 @@ class SubtitlesPicker extends PureComponent { return (
Preferences
- { - groupedTracks[selectedTrack.origin][selectedTrack.label].length > 1 ? -
- {groupedTracks[selectedTrack.origin][selectedTrack.label].map((track, index) => { - return ( -
- ); - })} -
- : - null - } + {this.renderVariantsList({ groupedTracks, selectedTrack })}
From 692da0b5a93aa4a76727fe97a1e42d005bbf2e1e Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 13:59:19 +0200 Subject: [PATCH 71/94] use lighter font color in subtitles picker --- .../SubtitlesPicker/SubtitlesPicker.js | 12 ++------ .../ControlBar/SubtitlesPicker/styles.less | 29 +++++++++++-------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index 2d6d683be..4f41dcd52 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -138,17 +138,9 @@ class SubtitlesPicker extends PureComponent { return (
-
Preferences
+
Preferences
{this.renderVariantsList({ groupedTracks, selectedTrack })} -
-
- -
-
{(17).toFixed(2)}s
-
- -
-
+ {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', delta: 0.5, onChange: this.setSubtitleSize })} {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', delta: 0.5, onChange: this.setSubtitleSize })}
); diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less index 7c90c41a7..0f9e76db2 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less +++ b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less @@ -1,11 +1,12 @@ .subtitles-picker-container { + --scroll-bar-width: 12px; width: calc(var(--subtitles-picker-button-size) * 14); - height: calc(var(--subtitles-picker-button-size) * 8); - font-size: calc(var(--subtitles-picker-button-size) * 0.5); + height: calc(var(--subtitles-picker-button-size) * 9); + font-size: calc(var(--subtitles-picker-button-size) * 0.45); padding: calc(var(--subtitles-picker-button-size) * 0.3); gap: calc(var(--subtitles-picker-button-size) * 0.3); display: grid; - grid-template-columns: auto calc(var(--subtitles-picker-button-size) * 8); + grid-template-columns: auto calc(var(--subtitles-picker-button-size) * 8 + var(--scroll-bar-width)); grid-template-rows: var(--subtitles-picker-button-size) auto; grid-template-areas: "toggle-button preferences" @@ -25,7 +26,7 @@ justify-content: center; font-weight: 500; line-height: 1; - color: var(--color-surfacelight); + color: var(--color-surfacelighter); &:first-of-type { margin-right: 20%; @@ -69,7 +70,7 @@ .track-origin { padding: 0 0.2em; margin-bottom: 0.2em; - font-size: 80%; + font-size: 85%; font-style: italic; overflow-wrap: break-word; border-bottom: 1px solid var(--color-surfacelighter80); @@ -105,19 +106,20 @@ justify-content: center; .subtitles-disabled-label { - font-size: 170%; + font-size: 150%; line-height: 1.2; text-align: center; word-spacing: calc(var(--subtitles-picker-button-size) * 9); color: var(--color-surfacelighter); } - .preferences-label { + .preferences-title { height: var(--subtitles-picker-button-size); - color: var(--color-surfacelight); + color: var(--color-surfacelighter); display: flex; align-items: center; margin-bottom: calc(var(--subtitles-picker-button-size) * 0.3); + font-size: 110%; } .variants-container { @@ -137,24 +139,27 @@ display: flex; align-items: center; justify-content: center; - color: var(--color-surfacelight); + color: var(--color-surfacelighter); background-color: var(--color-backgroundlighter); &.selected { - color: var(--color-surfacelighter); background-color: var(--color-primarydark); } &:hover { - color: var(--color-surfacelighter); background-color: var(--color-primarylight); } } + + &::-webkit-scrollbar { + // TODO reuse app scrollbar styles + width: var(--scroll-bar-width); + } } .number-input-container { flex: 1; - width: 65%; + width: 60%; display: flex; flex-direction: row; align-items: center; From 9bcbc9c5340e5dcaa59561db32059addde28a75f Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 14:00:46 +0200 Subject: [PATCH 72/94] update subtitle text on change subtitle track --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 46b7ca9a8..d7f1c0180 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -243,6 +243,7 @@ var HTMLVideo = function(container) { } } + updateSubtitlesText(); onSelectedSubtitleTrackIdChanged(); } break; From 05122153eabf8f1e036096e2735d55f647f12b77 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 31 Dec 2018 14:01:41 +0200 Subject: [PATCH 73/94] rename updateSubtitlesText to updateSubtitleText --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index d7f1c0180..e230d7aac 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -127,7 +127,7 @@ var HTMLVideo = function(container) { function onSubtitleSizeChanged() { events.emit('propChanged', 'subtitleSize', getSubtitleSize()); } - function updateSubtitlesText() { + function updateSubtitleText() { while (subtitles.hasChildNodes()) { subtitles.removeChild(subtitles.lastChild); } @@ -243,7 +243,7 @@ var HTMLVideo = function(container) { } } - updateSubtitlesText(); + updateSubtitleText(); onSelectedSubtitleTrackIdChanged(); } break; @@ -304,7 +304,7 @@ var HTMLVideo = function(container) { case 'stop': video.removeEventListener('ended', onEnded); video.removeEventListener('error', onError); - video.removeEventListener('timeupdate', updateSubtitlesText); + video.removeEventListener('timeupdate', updateSubtitleText); loaded = false; dispatchArgsQueue = []; subtitleCues = {}; @@ -318,7 +318,7 @@ var HTMLVideo = function(container) { onDurationChanged(); onSubtitleTracksChanged(); onSelectedSubtitleTrackIdChanged(); - updateSubtitlesText(); + updateSubtitleText(); return; case 'load': var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); @@ -326,7 +326,7 @@ var HTMLVideo = function(container) { dispatchArgsQueue = dispatchArgsQueueCopy; video.addEventListener('ended', onEnded); video.addEventListener('error', onError); - video.addEventListener('timeupdate', updateSubtitlesText); + video.addEventListener('timeupdate', updateSubtitleText); video.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; video.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; video.src = arguments[2].url; @@ -336,7 +336,7 @@ var HTMLVideo = function(container) { onDurationChanged(); onSubtitleTracksChanged(); onSelectedSubtitleTrackIdChanged(); - updateSubtitlesText(); + updateSubtitleText(); flushArgsQueue(); return; case 'destroy': From 69a35a83597a9b1fbfad285e7bbb244d435cf153 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 10:35:34 +0200 Subject: [PATCH 74/94] subs picker styles updated --- src/routes/Player/ControlBar/SubtitlesPicker/styles.less | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less index 7c90c41a7..7d0a032a7 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less +++ b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less @@ -24,7 +24,7 @@ align-items: center; justify-content: center; font-weight: 500; - line-height: 1; + text-transform: uppercase; color: var(--color-surfacelight); &:first-of-type { @@ -114,15 +114,17 @@ .preferences-label { height: var(--subtitles-picker-button-size); - color: var(--color-surfacelight); display: flex; align-items: center; margin-bottom: calc(var(--subtitles-picker-button-size) * 0.3); + font-weight: 500; + font-size: 90%; + color: var(--color-surfacelight); } .variants-container { align-self: stretch; - height: calc(var(--subtitles-picker-button-size) * 2); + height: calc(var(--subtitles-picker-button-size) * 2.4); display: flex; flex-direction: row; align-content: flex-start; From 72f64da7f53f03509b7e7d8a462702509a77478c Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 10:54:18 +0200 Subject: [PATCH 75/94] webkit scrollbar styles updated --- src/app/styles.less | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/app/styles.less b/src/app/styles.less index 7942017be..d53f5f081 100644 --- a/src/app/styles.less +++ b/src/app/styles.less @@ -62,6 +62,18 @@ min-height: 650px; font-family: 'Roboto', 'sans-serif'; line-height: 1; + + ::-webkit-scrollbar { + width: 8px; + } + + ::-webkit-scrollbar-thumb { + background-color: var(--color-secondarylighter80); + } + + ::-webkit-scrollbar-track { + background-color: var(--color-backgroundlight); + } } #app { From 1998811678e68e67b7eb3699ba80fa628e4a53cb Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 11:17:48 +0200 Subject: [PATCH 76/94] scroll-bar-width css variable attached to global --- src/app/styles.less | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/styles.less b/src/app/styles.less index d53f5f081..054ae2fce 100644 --- a/src/app/styles.less +++ b/src/app/styles.less @@ -42,6 +42,10 @@ font-style: normal; } +:root { + --scroll-bar-width: 8px; +} + :global { * { margin: 0px; @@ -64,7 +68,7 @@ line-height: 1; ::-webkit-scrollbar { - width: 8px; + width: var(--scroll-bar-width); } ::-webkit-scrollbar-thumb { From 01aa83b387a578e571ba873318199c1dc32bfc24 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 11:18:19 +0200 Subject: [PATCH 77/94] first variant rendered as 1 instead of 0 --- src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index 4f41dcd52..1518d717b 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -99,7 +99,7 @@ class SubtitlesPicker extends PureComponent { title={track.id} onClick={this.trackOnClick} data-track-id={track.id} - children={index} + children={index + 1} /> ); })} From 3f7cb1245d7a85ed336be11c643446e8852f0f9a Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 12:45:40 +0200 Subject: [PATCH 78/94] scrollbars in subtitles picker aligned better --- .../Player/ControlBar/SubtitlesPicker/styles.less | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less index 1deec3ebd..3200d5ec4 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less +++ b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less @@ -1,12 +1,11 @@ .subtitles-picker-container { - --scroll-bar-width: 12px; width: calc(var(--subtitles-picker-button-size) * 14); height: calc(var(--subtitles-picker-button-size) * 9); font-size: calc(var(--subtitles-picker-button-size) * 0.45); padding: calc(var(--subtitles-picker-button-size) * 0.3); gap: calc(var(--subtitles-picker-button-size) * 0.3); display: grid; - grid-template-columns: auto calc(var(--subtitles-picker-button-size) * 8 + var(--scroll-bar-width)); + grid-template-columns: auto calc(var(--subtitles-picker-button-size) * 8 + var(--scroll-bar-width) * 1.5); grid-template-rows: var(--subtitles-picker-button-size) auto; grid-template-areas: "toggle-button preferences" @@ -64,7 +63,8 @@ display: flex; flex-direction: column; align-items: stretch; - overflow-y: auto; + padding-right: calc(var(--scroll-bar-width) * 0.5); + overflow-y: scroll; overflow-x: hidden; .track-origin { @@ -151,11 +151,6 @@ background-color: var(--color-primarylight); } } - - &::-webkit-scrollbar { - // TODO reuse app scrollbar styles - width: var(--scroll-bar-width); - } } .number-input-container { From 6fe3c7f1eb1b3a23f13b2b5777f1a672e23a3972 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 15:23:06 +0200 Subject: [PATCH 79/94] subtitles bottom alignment setup in player --- src/routes/Player/ControlBar/ControlBar.js | 4 ++-- src/routes/Player/ControlBar/styles.less | 6 +----- src/routes/Player/styles.less | 8 ++++++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 3bf4d4017..f8211806e 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -122,7 +122,7 @@ class ControlBar extends Component { renderShareButton() { return ( - + @@ -139,7 +139,7 @@ class ControlBar extends Component { } return ( - + diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 31c354587..2e075f45e 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -1,7 +1,3 @@ -.control-bar-container, .popup-container { - --control-bar-button-height: 60px; -} - .control-bar-container { top: initial !important; padding: 0 calc(var(--control-bar-button-height) * 0.4); @@ -84,7 +80,7 @@ } } -.popup-container { +:global(.player-popup-container) { --border-color: var(--color-primarylight); .popup-content { diff --git a/src/routes/Player/styles.less b/src/routes/Player/styles.less index e8790b974..4abaa75de 100644 --- a/src/routes/Player/styles.less +++ b/src/routes/Player/styles.less @@ -1,3 +1,7 @@ +.player-container, :global(.player-popup-container) { + --control-bar-button-height: 60px; +} + .player-container { position: relative; z-index: 0; @@ -13,4 +17,8 @@ bottom: 0; z-index: 0; } + + :global(.subtitles) { + bottom: calc(var(--control-bar-button-height) * 2.6) !important; + } } \ No newline at end of file From a72110f472aa3c452478779f3f6237085403f7da Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 16:21:49 +0200 Subject: [PATCH 80/94] subtitles styles updated --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 8 +++++--- src/routes/Player/styles.less | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index e230d7aac..aee8892e6 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -20,7 +20,8 @@ var HTMLVideo = function(container) { container.appendChild(styles); styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', styles.sheet.cssRules.length); - var subtitleStylesIndex = styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 120px; left: 0; font-size: 16pt; color: white; text-align: center; }', styles.sheet.cssRules.length); + var subtitleStylesIndex = styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 0; left: 0; font-size: 26pt; color: white; text-align: center; }', styles.sheet.cssRules.length); + styles.sheet.insertRule('#' + container.id + ' .subtitles .cue { display: inline-block; padding: 0.2em; text-shadow: #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px; }', styles.sheet.cssRules.length); container.appendChild(video); video.crossOrigin = 'anonymous'; video.controls = false; @@ -139,8 +140,9 @@ var HTMLVideo = function(container) { var time = getTime(); var cuesForTime = subtitleUtils.cuesForTime(subtitleCues, time); for (var i = 0; i < cuesForTime.length; i++) { - const cue = subtitleUtils.render(cuesForTime[i]); - subtitles.appendChild(cue); + var cueNode = subtitleUtils.render(cuesForTime[i]); + cueNode.classList.add('cue'); + subtitles.append(cueNode, document.createElement('br')); } } function flushArgsQueue() { diff --git a/src/routes/Player/styles.less b/src/routes/Player/styles.less index 4abaa75de..1e0eb04a5 100644 --- a/src/routes/Player/styles.less +++ b/src/routes/Player/styles.less @@ -19,6 +19,6 @@ } :global(.subtitles) { - bottom: calc(var(--control-bar-button-height) * 2.6) !important; + bottom: calc(var(--control-bar-button-height) * 3) !important; } } \ No newline at end of file From 6b8858642f9d39662557a3392ddb1d9e0d342ad1 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Wed, 2 Jan 2019 17:02:48 +0200 Subject: [PATCH 81/94] subtitle delay implemented --- src/routes/Player/ControlBar/ControlBar.js | 11 ++++++++++ .../SubtitlesPicker/SubtitlesPicker.js | 14 ++++++++++--- src/routes/Player/Player.js | 12 +++++++++-- .../Player/Video/stremio-video/HTMLVideo.js | 21 +++++++++++++++++-- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index f8211806e..fd767f1ee 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -34,6 +34,7 @@ class ControlBar extends Component { nextProps.subtitleTracks !== this.props.subtitleTracks || nextProps.selectedSubtitleTrackId !== this.props.selectedSubtitleTrackId || nextProps.subtitleSize !== this.props.subtitleSize || + nextProps.subtitleDelay !== this.props.subtitleDelay || nextState.sharePopupOpen !== this.state.sharePopupOpen || nextState.subtitlesPopupOpen !== this.state.subtitlesPopupOpen; } @@ -54,6 +55,10 @@ class ControlBar extends Component { this.props.setSubtitleSize(size); } + setSubtitleDelay = (delay) => { + this.props.setSubtitleDelay(delay); + } + mute = () => { this.props.mute(); } @@ -148,9 +153,11 @@ class ControlBar extends Component { className={classnames(styles['popup-content'], styles['subtitles-popup-content'])} subtitleTracks={this.props.subtitleTracks} subtitleSize={this.props.subtitleSize} + subtitleDelay={this.props.subtitleDelay} selectedSubtitleTrackId={this.props.selectedSubtitleTrackId} setSelectedSubtitleTrackId={this.setSelectedSubtitleTrackId} setSubtitleSize={this.setSubtitleSize} + setSubtitleDelay={this.setSubtitleDelay} /> @@ -185,11 +192,15 @@ ControlBar.propTypes = { origin: PropTypes.string.isRequired })).isRequired, selectedSubtitleTrackId: PropTypes.string, + subtitleSize: PropTypes.number, + subtitleDelay: PropTypes.number, play: PropTypes.func.isRequired, pause: PropTypes.func.isRequired, setTime: PropTypes.func.isRequired, setVolume: PropTypes.func.isRequired, setSelectedSubtitleTrackId: PropTypes.func.isRequired, + setSubtitleSize: PropTypes.func.isRequired, + setSubtitleDelay: PropTypes.func.isRequired, mute: PropTypes.func.isRequired, unmute: PropTypes.func.isRequired }; diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index 1518d717b..48cf24d2b 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -43,6 +43,10 @@ class SubtitlesPicker extends PureComponent { this.props.setSubtitleSize(event.currentTarget.dataset.value); } + setSubtitleDelay = (event) => { + this.props.setSubtitleDelay(event.currentTarget.dataset.value * 1000); + } + renderToggleButton({ selectedTrack }) { return (
@@ -141,7 +145,7 @@ class SubtitlesPicker extends PureComponent {
Preferences
{this.renderVariantsList({ groupedTracks, selectedTrack })} {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', delta: 0.5, onChange: this.setSubtitleSize })} - {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', delta: 0.5, onChange: this.setSubtitleSize })} + {this.renderNumberInput({ value: this.props.subtitleDelay / 1000, unit: 's', delta: 0.2, onChange: this.setSubtitleDelay })}
); } @@ -167,14 +171,18 @@ class SubtitlesPicker extends PureComponent { SubtitlesPicker.propTypes = { className: PropTypes.string, - selectedSubtitleTrackId: PropTypes.string, languagePriorities: PropTypes.objectOf(PropTypes.number).isRequired, subtitleTracks: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.string.isRequired, label: PropTypes.string.isRequired, origin: PropTypes.string.isRequired })).isRequired, - setSelectedSubtitleTrackId: PropTypes.func.isRequired + selectedSubtitleTrackId: PropTypes.string, + subtitleSize: PropTypes.number, + subtitleDelay: PropTypes.number, + setSelectedSubtitleTrackId: PropTypes.func.isRequired, + setSubtitleSize: PropTypes.func.isRequired, + setSubtitleDelay: PropTypes.func.isRequired }; SubtitlesPicker.defaultProps = { languagePriorities: Object.freeze({ diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 9a6521768..15425f39e 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -17,7 +17,8 @@ class Player extends Component { volume: null, subtitleTracks: [], selectedSubtitleTrackId: null, - subtitleSize: null + subtitleSize: null, + subtitleDelay: null }; } @@ -28,7 +29,8 @@ class Player extends Component { nextState.volume !== this.state.volume || nextState.subtitleTracks !== this.state.subtitleTracks || nextState.selectedSubtitleTrackId !== this.state.selectedSubtitleTrackId || - nextState.subtitleSize !== this.state.subtitleSize; + nextState.subtitleSize !== this.state.subtitleSize || + nextState.subtitleDelay !== this.state.subtitleDelay; } componentDidMount() { @@ -80,6 +82,10 @@ class Player extends Component { this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleSize', size); } + setSubtitleDelay = (delay) => { + this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleDelay', delay); + } + mute = () => { this.videoRef.current && this.videoRef.current.dispatch('command', 'mute'); } @@ -124,12 +130,14 @@ class Player extends Component { subtitleTracks={this.state.subtitleTracks} selectedSubtitleTrackId={this.state.selectedSubtitleTrackId} subtitleSize={this.state.subtitleSize} + subtitleDelay={this.state.subtitleDelay} play={this.play} pause={this.pause} setTime={this.setTime} setVolume={this.setVolume} setSelectedSubtitleTrackId={this.setSelectedSubtitleTrackId} setSubtitleSize={this.setSubtitleSize} + setSubtitleDelay={this.setSubtitleDelay} mute={this.mute} unmute={this.unmute} /> diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index aee8892e6..6b66a64e3 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -14,6 +14,7 @@ var HTMLVideo = function(container) { var subtitleCues = {}; var subtitleTracks = []; var selectedSubtitleTrackId = null; + var subtitleDelay = 0; var styles = document.createElement('style'); var video = document.createElement('video'); var subtitles = document.createElement('div'); @@ -66,6 +67,9 @@ var HTMLVideo = function(container) { return selectedSubtitleTrackId; } + function getSubtitleDelay() { + return subtitleDelay; + } function getSubtitleSize() { return parseFloat(styles.sheet.cssRules[subtitleStylesIndex].style.fontSize); } @@ -125,6 +129,9 @@ var HTMLVideo = function(container) { function onSelectedSubtitleTrackIdChanged() { events.emit('propChanged', 'selectedSubtitleTrackId', getSelectedSubtitleTrackId()); } + function onSubtitleDelayChanged() { + events.emit('propChanged', 'subtitleDelay', getSubtitleDelay()); + } function onSubtitleSizeChanged() { events.emit('propChanged', 'subtitleSize', getSubtitleSize()); } @@ -137,7 +144,7 @@ var HTMLVideo = function(container) { return; } - var time = getTime(); + var time = getTime() + getSubtitleDelay(); var cuesForTime = subtitleUtils.cuesForTime(subtitleCues, time); for (var i = 0; i < cuesForTime.length; i++) { var cueNode = subtitleUtils.render(cuesForTime[i]); @@ -200,6 +207,9 @@ var HTMLVideo = function(container) { case 'subtitleSize': events.emit('propValue', 'subtitleSize', getSubtitleSize()); return; + case 'subtitleDelay': + events.emit('propValue', 'subtitleDelay', getSubtitleDelay()); + return; default: throw new Error('observeProp not supported: ' + arguments[1]); } @@ -255,6 +265,13 @@ var HTMLVideo = function(container) { onSubtitleSizeChanged(); } return; + case 'subtitleDelay': + if (!isNaN(arguments[2])) { + subtitleDelay = parseFloat(arguments[2]); + onSubtitleDelayChanged(); + updateSubtitleText(); + } + return; case 'volume': if (!isNaN(arguments[2])) { video.muted = false; @@ -371,7 +388,7 @@ var HTMLVideo = function(container) { HTMLVideo.manifest = { name: 'HTMLVideo', embedded: true, - props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrackId', 'subtitleSize'] + props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrackId', 'subtitleSize', 'subtitleDelay'] }; module.exports = HTMLVideo; From b84eaf4eeca42cefa6c8aaeedb23123d61f1a475 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 10:06:15 +0200 Subject: [PATCH 82/94] Checkbox "reimplemented" --- src/common/Checkbox/Checkbox.js | 29 ++++++++++++++++++-------- src/common/Checkbox/styles.less | 37 ++++++++++++++------------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/common/Checkbox/Checkbox.js b/src/common/Checkbox/Checkbox.js index 06a177086..78bac0384 100644 --- a/src/common/Checkbox/Checkbox.js +++ b/src/common/Checkbox/Checkbox.js @@ -5,22 +5,33 @@ import Icon from 'stremio-icons/dom'; import styles from './styles'; class Checkbox extends Component { - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return nextProps.checked !== this.props.checked || - nextProps.enabled !== this.props.enabled; + nextProps.disabled !== this.props.disabled || + nextProps.className !== this.props.className; } - onClick = () => { - if (this.props.enabled && typeof this.props.onClick === 'function') { + onClick = (event) => { + event.preventDefault(); + if (typeof this.props.onClick === 'function') { this.props.onClick(); } } render() { return ( -
- - +
+ +
); } @@ -28,13 +39,13 @@ class Checkbox extends Component { Checkbox.propTypes = { className: PropTypes.string, - enabled: PropTypes.bool.isRequired, + disabled: PropTypes.bool.isRequired, checked: PropTypes.bool.isRequired, onClick: PropTypes.func }; Checkbox.defaultProps = { - enabled: true, + disabled: false, checked: false }; diff --git a/src/common/Checkbox/styles.less b/src/common/Checkbox/styles.less index ddd98d566..220a1c349 100644 --- a/src/common/Checkbox/styles.less +++ b/src/common/Checkbox/styles.less @@ -1,18 +1,14 @@ -.root { - cursor: pointer; +.checkbox-container { + position: relative; + z-index: 0; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--background-color); - &.checkbox-checked { - background-color: var(--color-primarylight); - - .icon { - padding: 10%; - fill: var(--color-surfacelighter); - } - } - - &.checkbox-disabled { - opacity: 0.5; - cursor: not-allowed; + .icon { + height: 100%; + fill: var(--icon-color); } .native-checkbox { @@ -20,14 +16,13 @@ opacity: 0; height: 0; width: 0; - top: -9999px; - left: -9999px; + top: -99999999px; + left: -99999999px; } - .icon { - width: 100%; - height: 100%; - margin: auto; - fill: var(--color-surfacelighter60); + &:global(.checked) { + .icon { + height: 55%; + } } } \ No newline at end of file From b9c02d62d9baa50edae7957ab1ac90d620eb7963 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 10:39:22 +0200 Subject: [PATCH 83/94] subtitleDarkBackground implemented --- src/routes/Player/ControlBar/ControlBar.js | 9 +++++ .../SubtitlesPicker/SubtitlesPicker.js | 27 +++++++++++++- .../ControlBar/SubtitlesPicker/styles.less | 37 ++++++++++++++++++- src/routes/Player/Player.js | 14 ++++++- .../Player/Video/stremio-video/HTMLVideo.js | 21 ++++++++++- 5 files changed, 103 insertions(+), 5 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index fd767f1ee..4aa8084eb 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -35,6 +35,7 @@ class ControlBar extends Component { nextProps.selectedSubtitleTrackId !== this.props.selectedSubtitleTrackId || nextProps.subtitleSize !== this.props.subtitleSize || nextProps.subtitleDelay !== this.props.subtitleDelay || + nextProps.subtitleDarkBackground !== this.props.subtitleDarkBackground || nextState.sharePopupOpen !== this.state.sharePopupOpen || nextState.subtitlesPopupOpen !== this.state.subtitlesPopupOpen; } @@ -59,6 +60,10 @@ class ControlBar extends Component { this.props.setSubtitleDelay(delay); } + setSubtitleDarkBackground = (value) => { + this.props.setSubtitleDarkBackground(value); + } + mute = () => { this.props.mute(); } @@ -154,10 +159,12 @@ class ControlBar extends Component { subtitleTracks={this.props.subtitleTracks} subtitleSize={this.props.subtitleSize} subtitleDelay={this.props.subtitleDelay} + subtitleDarkBackground={this.props.subtitleDarkBackground} selectedSubtitleTrackId={this.props.selectedSubtitleTrackId} setSelectedSubtitleTrackId={this.setSelectedSubtitleTrackId} setSubtitleSize={this.setSubtitleSize} setSubtitleDelay={this.setSubtitleDelay} + setSubtitleDarkBackground={this.setSubtitleDarkBackground} /> @@ -194,6 +201,7 @@ ControlBar.propTypes = { selectedSubtitleTrackId: PropTypes.string, subtitleSize: PropTypes.number, subtitleDelay: PropTypes.number, + subtitleDarkBackground: PropTypes.bool, play: PropTypes.func.isRequired, pause: PropTypes.func.isRequired, setTime: PropTypes.func.isRequired, @@ -201,6 +209,7 @@ ControlBar.propTypes = { setSelectedSubtitleTrackId: PropTypes.func.isRequired, setSubtitleSize: PropTypes.func.isRequired, setSubtitleDelay: PropTypes.func.isRequired, + setSubtitleDarkBackground: PropTypes.func.isRequired, mute: PropTypes.func.isRequired, unmute: PropTypes.func.isRequired }; diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index 48cf24d2b..feb1fac21 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -2,6 +2,7 @@ import React, { PureComponent, Fragment } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import Icon from 'stremio-icons/dom'; +import { Checkbox } from 'stremio-common'; import styles from './styles'; const ORIGIN_PRIORITIES = { @@ -47,6 +48,10 @@ class SubtitlesPicker extends PureComponent { this.props.setSubtitleDelay(event.currentTarget.dataset.value * 1000); } + setSubtitleDarkBackground = () => { + this.props.setSubtitleDarkBackground(!this.props.subtitleDarkBackground); + } + renderToggleButton({ selectedTrack }) { return (
@@ -111,6 +116,23 @@ class SubtitlesPicker extends PureComponent { ); } + renderDarkBackgroundToggle() { + if (this.props.subtitleDarkBackground === null) { + return null; + } + + return ( + + ); + } + renderNumberInput({ value, unit, delta, onChange }) { if (value === null) { return null; @@ -144,6 +166,7 @@ class SubtitlesPicker extends PureComponent {
Preferences
{this.renderVariantsList({ groupedTracks, selectedTrack })} + {this.renderDarkBackgroundToggle()} {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', delta: 0.5, onChange: this.setSubtitleSize })} {this.renderNumberInput({ value: this.props.subtitleDelay / 1000, unit: 's', delta: 0.2, onChange: this.setSubtitleDelay })}
@@ -180,9 +203,11 @@ SubtitlesPicker.propTypes = { selectedSubtitleTrackId: PropTypes.string, subtitleSize: PropTypes.number, subtitleDelay: PropTypes.number, + subtitleDarkBackground: PropTypes.bool, setSelectedSubtitleTrackId: PropTypes.func.isRequired, setSubtitleSize: PropTypes.func.isRequired, - setSubtitleDelay: PropTypes.func.isRequired + setSubtitleDelay: PropTypes.func.isRequired, + setSubtitleDarkBackground: PropTypes.func.isRequired }; SubtitlesPicker.defaultProps = { languagePriorities: Object.freeze({ diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less index 3200d5ec4..7a7aa71d4 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less +++ b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less @@ -153,6 +153,41 @@ } } + .background-toggle-container { + align-self: stretch; + height: var(--subtitles-picker-button-size); + display: flex; + flex-direction: row; + align-items: center; + cursor: pointer; + + .background-toggle-checkbox { + --icon-color: var(--color-surfacelighter); + --background-color: transparent; + width: calc(var(--subtitles-picker-button-size) * 0.6); + height: calc(var(--subtitles-picker-button-size) * 0.6); + + &:global(.checked) { + --background-color: var(--color-primarydark); + } + } + + .background-toggle-label { + margin-left: 0.5em; + max-height: 2em; + overflow: hidden; + color: var(--color-surfacelighter); + } + + &:hover { + .background-toggle-checkbox { + &:global(.checked) { + --background-color: var(--color-primarylight); + } + } + } + } + .number-input-container { flex: 1; width: 60%; @@ -166,7 +201,7 @@ display: flex; align-items: center; justify-content: center; - background-color: var(--color-primary); + background-color: var(--color-primarydark); cursor: pointer; .number-input-icon { diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 15425f39e..cb95935c5 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -18,7 +18,8 @@ class Player extends Component { subtitleTracks: [], selectedSubtitleTrackId: null, subtitleSize: null, - subtitleDelay: null + subtitleDelay: null, + subtitleDarkBackground: null }; } @@ -30,7 +31,8 @@ class Player extends Component { nextState.subtitleTracks !== this.state.subtitleTracks || nextState.selectedSubtitleTrackId !== this.state.selectedSubtitleTrackId || nextState.subtitleSize !== this.state.subtitleSize || - nextState.subtitleDelay !== this.state.subtitleDelay; + nextState.subtitleDelay !== this.state.subtitleDelay || + nextState.subtitleDarkBackground !== this.state.subtitleDarkBackground; } componentDidMount() { @@ -40,6 +42,8 @@ class Player extends Component { label: 'English' }]); this.setSelectedSubtitleTrackId('https://raw.githubusercontent.com/caitp/ng-media/master/example/assets/captions/bunny-en.vtt'); + this.addSubtitleTracks(require('./subtitles').default); + this.setSelectedSubtitleTrackId('https://raw.githubusercontent.com/NikolaBorislavovHristov/test-resources/master/1.vtt?token=AFrNArKXTTDZRHR16bqQBFQmJlB8FIUSks5cNgCGwA%3D%3D') } onEnded = () => { @@ -86,6 +90,10 @@ class Player extends Component { this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleDelay', delay); } + setSubtitleDarkBackground = (value) => { + this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleDarkBackground', value); + } + mute = () => { this.videoRef.current && this.videoRef.current.dispatch('command', 'mute'); } @@ -131,6 +139,7 @@ class Player extends Component { selectedSubtitleTrackId={this.state.selectedSubtitleTrackId} subtitleSize={this.state.subtitleSize} subtitleDelay={this.state.subtitleDelay} + subtitleDarkBackground={this.state.subtitleDarkBackground} play={this.play} pause={this.pause} setTime={this.setTime} @@ -138,6 +147,7 @@ class Player extends Component { setSelectedSubtitleTrackId={this.setSelectedSubtitleTrackId} setSubtitleSize={this.setSubtitleSize} setSubtitleDelay={this.setSubtitleDelay} + setSubtitleDarkBackground={this.setSubtitleDarkBackground} mute={this.mute} unmute={this.unmute} /> diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 6b66a64e3..4af691d56 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -22,6 +22,7 @@ var HTMLVideo = function(container) { container.appendChild(styles); styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', styles.sheet.cssRules.length); var subtitleStylesIndex = styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 0; left: 0; font-size: 26pt; color: white; text-align: center; }', styles.sheet.cssRules.length); + styles.sheet.insertRule('#' + container.id + ' .subtitles.dark-background .cue { text-shadow: none; background-color: #222222; }', styles.sheet.cssRules.length); styles.sheet.insertRule('#' + container.id + ' .subtitles .cue { display: inline-block; padding: 0.2em; text-shadow: #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px; }', styles.sheet.cssRules.length); container.appendChild(video); video.crossOrigin = 'anonymous'; @@ -73,6 +74,9 @@ var HTMLVideo = function(container) { function getSubtitleSize() { return parseFloat(styles.sheet.cssRules[subtitleStylesIndex].style.fontSize); } + function getSubtitleDarkBackground() { + return subtitles.classList.contains('dark-background'); + } function onEnded() { events.emit('ended'); } @@ -135,6 +139,9 @@ var HTMLVideo = function(container) { function onSubtitleSizeChanged() { events.emit('propChanged', 'subtitleSize', getSubtitleSize()); } + function onSubtitleDarkBackgroundChanged() { + events.emit('propChanged', 'subtitleDarkBackground', getSubtitleDarkBackground()); + } function updateSubtitleText() { while (subtitles.hasChildNodes()) { subtitles.removeChild(subtitles.lastChild); @@ -210,6 +217,9 @@ var HTMLVideo = function(container) { case 'subtitleDelay': events.emit('propValue', 'subtitleDelay', getSubtitleDelay()); return; + case 'subtitleDarkBackground': + events.emit('propValue', 'subtitleDarkBackground', getSubtitleDarkBackground()); + return; default: throw new Error('observeProp not supported: ' + arguments[1]); } @@ -265,6 +275,15 @@ var HTMLVideo = function(container) { onSubtitleSizeChanged(); } return; + case 'subtitleDarkBackground': + if (arguments[2]) { + subtitles.classList.add('dark-background'); + } else { + subtitles.classList.remove('dark-background'); + } + + onSubtitleDarkBackgroundChanged(); + return; case 'subtitleDelay': if (!isNaN(arguments[2])) { subtitleDelay = parseFloat(arguments[2]); @@ -388,7 +407,7 @@ var HTMLVideo = function(container) { HTMLVideo.manifest = { name: 'HTMLVideo', embedded: true, - props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrackId', 'subtitleSize', 'subtitleDelay'] + props: ['paused', 'time', 'duration', 'volume', 'subtitleTracks', 'selectedSubtitleTrackId', 'subtitleSize', 'subtitleDelay', 'subtitleDarkBackground'] }; module.exports = HTMLVideo; From 4d49d44310d2e731939617504bcda46a1ffb8e45 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 10:46:47 +0200 Subject: [PATCH 84/94] subtitles delay wait for loaded and reset on stop --- .../Player/Video/stremio-video/HTMLVideo.js | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 4af691d56..e51ff1500 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -69,6 +69,10 @@ var HTMLVideo = function(container) { return selectedSubtitleTrackId; } function getSubtitleDelay() { + if (!loaded) { + return null; + } + return subtitleDelay; } function getSubtitleSize() { @@ -240,6 +244,7 @@ var HTMLVideo = function(container) { case 'selectedSubtitleTrackId': if (loaded) { selectedSubtitleTrackId = null; + subtitleDelay = 0; subtitleCues = {}; for (var i = 0; i < subtitleTracks.length; i++) { var subtitleTrack = subtitleTracks[i]; @@ -265,8 +270,18 @@ var HTMLVideo = function(container) { } } - updateSubtitleText(); + onSubtitleDelayChanged(); onSelectedSubtitleTrackIdChanged(); + updateSubtitleText(); + } + break; + case 'subtitleDelay': + if (loaded) { + if (!isNaN(arguments[2])) { + subtitleDelay = parseFloat(arguments[2]); + onSubtitleDelayChanged(); + updateSubtitleText(); + } } break; case 'subtitleSize': @@ -284,13 +299,6 @@ var HTMLVideo = function(container) { onSubtitleDarkBackgroundChanged(); return; - case 'subtitleDelay': - if (!isNaN(arguments[2])) { - subtitleDelay = parseFloat(arguments[2]); - onSubtitleDelayChanged(); - updateSubtitleText(); - } - return; case 'volume': if (!isNaN(arguments[2])) { video.muted = false; @@ -348,6 +356,7 @@ var HTMLVideo = function(container) { subtitleCues = {}; subtitleTracks = []; selectedSubtitleTrackId = null; + subtitleDelay = 0; video.removeAttribute('src'); video.load(); video.currentTime = 0; @@ -356,6 +365,7 @@ var HTMLVideo = function(container) { onDurationChanged(); onSubtitleTracksChanged(); onSelectedSubtitleTrackIdChanged(); + onSubtitleDelayChanged(); updateSubtitleText(); return; case 'load': From a2696248ef7b33acd78a034b4326e6c4b14f1c7a Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 10:47:05 +0200 Subject: [PATCH 85/94] update subtitles text on fetching cues --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index e51ff1500..3393529b7 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -257,6 +257,7 @@ var HTMLVideo = function(container) { .then(function(text) { if (selectedSubtitleTrackId === subtitleTrack.id) { subtitleCues = subtitleUtils.parse(text); + updateSubtitleText(); } }) .catch(function() { From 6bfe202af08952eaf968d65a727e3efb0026f8aa Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 10:47:37 +0200 Subject: [PATCH 86/94] demo subtitles tracks removed --- src/routes/Player/Player.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index cb95935c5..93d56d1e7 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -42,8 +42,6 @@ class Player extends Component { label: 'English' }]); this.setSelectedSubtitleTrackId('https://raw.githubusercontent.com/caitp/ng-media/master/example/assets/captions/bunny-en.vtt'); - this.addSubtitleTracks(require('./subtitles').default); - this.setSelectedSubtitleTrackId('https://raw.githubusercontent.com/NikolaBorislavovHristov/test-resources/master/1.vtt?token=AFrNArKXTTDZRHR16bqQBFQmJlB8FIUSks5cNgCGwA%3D%3D') } onEnded = () => { From 0ca77b28e6a99ea61d2d85fc54361c267eed3ae6 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 12:48:50 +0200 Subject: [PATCH 87/94] minor refactor in Popup --- src/common/Popup/Popup.js | 30 +++++++++++++++--------------- src/common/Popup/styles.less | 8 ++++---- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/common/Popup/Popup.js b/src/common/Popup/Popup.js index c054a3ee8..372d4f3b0 100644 --- a/src/common/Popup/Popup.js +++ b/src/common/Popup/Popup.js @@ -10,7 +10,6 @@ class Popup extends Component { constructor(props) { super(props); - this.hiddenBorderRef = React.createRef(); this.labelRef = React.createRef(); this.labelBorderTopRef = React.createRef(); this.labelBorderRightRef = React.createRef(); @@ -22,6 +21,7 @@ class Popup extends Component { this.menuBorderRightRef = React.createRef(); this.menuBorderBottomRef = React.createRef(); this.menuBorderLeftRef = React.createRef(); + this.hiddenBorderRef = React.createRef(); this.state = { open: false @@ -61,7 +61,7 @@ class Popup extends Component { const bodyRect = document.body.getBoundingClientRect(); const menuRect = this.menuRef.current.getBoundingClientRect(); const labelRect = this.labelRef.current.getBoundingClientRect(); - const borderWidth = parseFloat(window.getComputedStyle(this.hiddenBorderRef.current).getPropertyValue('border-top-width')); + const borderSize = parseFloat(window.getComputedStyle(this.hiddenBorderRef.current).getPropertyValue('border-top-width')); const labelPosition = { left: labelRect.x - bodyRect.x, top: labelRect.y - bodyRect.y, @@ -106,23 +106,23 @@ class Popup extends Component { } if (this.props.border) { - this.menuBorderTopRef.current.style.height = `${borderWidth}px`; - this.menuBorderRightRef.current.style.width = `${borderWidth}px`; - this.menuBorderBottomRef.current.style.height = `${borderWidth}px`; - this.menuBorderLeftRef.current.style.width = `${borderWidth}px`; - this.labelBorderTopRef.current.style.height = `${borderWidth}px`; + this.menuBorderTopRef.current.style.height = `${borderSize}px`; + this.menuBorderRightRef.current.style.width = `${borderSize}px`; + this.menuBorderBottomRef.current.style.height = `${borderSize}px`; + this.menuBorderLeftRef.current.style.width = `${borderSize}px`; + this.labelBorderTopRef.current.style.height = `${borderSize}px`; this.labelBorderTopRef.current.style.top = `${labelPosition.top}px`; this.labelBorderTopRef.current.style.right = `${labelPosition.right}px`; this.labelBorderTopRef.current.style.left = `${labelPosition.left}px`; - this.labelBorderRightRef.current.style.width = `${borderWidth}px`; + this.labelBorderRightRef.current.style.width = `${borderSize}px`; this.labelBorderRightRef.current.style.top = `${labelPosition.top}px`; this.labelBorderRightRef.current.style.right = `${labelPosition.right}px`; this.labelBorderRightRef.current.style.bottom = `${labelPosition.bottom}px`; - this.labelBorderBottomRef.current.style.height = `${borderWidth}px`; + this.labelBorderBottomRef.current.style.height = `${borderSize}px`; this.labelBorderBottomRef.current.style.right = `${labelPosition.right}px`; this.labelBorderBottomRef.current.style.bottom = `${labelPosition.bottom}px`; this.labelBorderBottomRef.current.style.left = `${labelPosition.left}px`; - this.labelBorderLeftRef.current.style.width = `${borderWidth}px`; + this.labelBorderLeftRef.current.style.width = `${borderSize}px`; this.labelBorderLeftRef.current.style.top = `${labelPosition.top}px`; this.labelBorderLeftRef.current.style.bottom = `${labelPosition.bottom}px`; this.labelBorderLeftRef.current.style.left = `${labelPosition.left}px`; @@ -130,16 +130,16 @@ class Popup extends Component { if (menuDirections.top) { this.labelBorderTopRef.current.style.display = 'none'; if (menuDirections.left) { - this.menuBorderBottomRef.current.style.right = `${labelRect.width - borderWidth}px`; + this.menuBorderBottomRef.current.style.right = `${labelRect.width - borderSize}px`; } else { - this.menuBorderBottomRef.current.style.left = `${labelRect.width - borderWidth}px`; + this.menuBorderBottomRef.current.style.left = `${labelRect.width - borderSize}px`; } } else { this.labelBorderBottomRef.current.style.display = 'none'; if (menuDirections.left) { - this.menuBorderTopRef.current.style.right = `${labelRect.width - borderWidth}px`; + this.menuBorderTopRef.current.style.right = `${labelRect.width - borderSize}px`; } else { - this.menuBorderTopRef.current.style.left = `${labelRect.width - borderWidth}px`; + this.menuBorderTopRef.current.style.left = `${labelRect.width - borderSize}px`; } } } @@ -186,11 +186,11 @@ class Popup extends Component {
-
+
); } diff --git a/src/common/Popup/styles.less b/src/common/Popup/styles.less index 9dbd79d5f..9f542e699 100644 --- a/src/common/Popup/styles.less +++ b/src/common/Popup/styles.less @@ -35,9 +35,9 @@ right: 0; bottom: 0; } -} -.hidden-border { - display: none; - border: 1px solid; + &-hidden { + display: none; + border: 1px solid; + } } \ No newline at end of file From f78cc683472c5c47c7f489ea6dabbcc46c7d6bda Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 17:15:46 +0200 Subject: [PATCH 88/94] refactor callbacks in player --- src/routes/Player/ControlBar/ControlBar.js | 88 ++++---------- .../PlayPauseButton/PlayPauseButton.js | 23 ++++ .../ControlBar/PlayPauseButton/index.js | 3 + .../Player/ControlBar/SeekBar/SeekBar.js | 4 +- .../Player/ControlBar/SeekBar/styles.less | 2 +- .../SubtitlesPicker/SubtitlesPicker.js | 109 ++++++++++-------- .../Player/ControlBar/VolumeBar/VolumeBar.js | 12 +- src/routes/Player/ControlBar/styles.less | 35 +++--- src/routes/Player/Player.js | 70 ++--------- src/routes/Player/styles.less | 8 +- 10 files changed, 152 insertions(+), 202 deletions(-) create mode 100644 src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js create mode 100644 src/routes/Player/ControlBar/PlayPauseButton/index.js diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 4aa8084eb..f24539088 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -4,12 +4,12 @@ import classnames from 'classnames'; import Icon from 'stremio-icons/dom'; import { Popup } from 'stremio-common'; import SeekBar from './SeekBar'; +import PlayPauseButton from './PlayPauseButton'; import VolumeBar from './VolumeBar'; import SubtitlesPicker from './SubtitlesPicker'; import styles from './styles'; -//TODO move this in separate file -const ControlBarButton = React.forwardRef(({ active, icon, onClick }, ref) => ( +const ControlBarButton = React.forwardRef(({ icon, active, onClick }, ref) => (
@@ -40,40 +40,8 @@ class ControlBar extends Component { nextState.subtitlesPopupOpen !== this.state.subtitlesPopupOpen; } - setTime = (time) => { - this.props.setTime(time); - } - - setVolume = (volume) => { - this.props.setVolume(volume); - } - - setSelectedSubtitleTrackId = (selectedSubtitleTrackId) => { - this.props.setSelectedSubtitleTrackId(selectedSubtitleTrackId); - } - - setSubtitleSize = (size) => { - this.props.setSubtitleSize(size); - } - - setSubtitleDelay = (delay) => { - this.props.setSubtitleDelay(delay); - } - - setSubtitleDarkBackground = (value) => { - this.props.setSubtitleDarkBackground(value); - } - - mute = () => { - this.props.mute(); - } - - unmute = () => { - this.props.unmute(); - } - - togglePaused = () => { - this.props.paused ? this.props.play() : this.props.pause(); + dispatch = (...args) => { + this.props.dispatch(...args); } onSharePopupOpen = () => { @@ -98,21 +66,17 @@ class ControlBar extends Component { className={styles['seek-bar']} time={this.props.time} duration={this.props.duration} - setTime={this.setTime} + dispatch={this.dispatch} /> ); } renderPlayPauseButton() { - if (this.props.paused === null) { - return null; - } - - const icon = this.props.paused ? 'ic_play' : 'ic_pause'; return ( - ); } @@ -123,9 +87,7 @@ class ControlBar extends Component { className={styles['volume-bar']} toggleButtonComponent={ControlBarButton} volume={this.props.volume} - setVolume={this.setVolume} - mute={this.mute} - unmute={this.unmute} + dispatch={this.dispatch} /> ); } @@ -134,7 +96,10 @@ class ControlBar extends Component { return ( - +
@@ -151,20 +116,20 @@ class ControlBar extends Component { return ( - + @@ -178,7 +143,7 @@ class ControlBar extends Component {
{this.renderPlayPauseButton()} {this.renderVolumeBar()} -
+
{this.renderSubtitlesButton()} {this.renderShareButton()}
@@ -202,16 +167,7 @@ ControlBar.propTypes = { subtitleSize: PropTypes.number, subtitleDelay: PropTypes.number, subtitleDarkBackground: PropTypes.bool, - play: PropTypes.func.isRequired, - pause: PropTypes.func.isRequired, - setTime: PropTypes.func.isRequired, - setVolume: PropTypes.func.isRequired, - setSelectedSubtitleTrackId: PropTypes.func.isRequired, - setSubtitleSize: PropTypes.func.isRequired, - setSubtitleDelay: PropTypes.func.isRequired, - setSubtitleDarkBackground: PropTypes.func.isRequired, - mute: PropTypes.func.isRequired, - unmute: PropTypes.func.isRequired + dispatch: PropTypes.func.isRequired }; export default ControlBar; diff --git a/src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js b/src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js new file mode 100644 index 000000000..02d64c5b6 --- /dev/null +++ b/src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js @@ -0,0 +1,23 @@ +import React, { Component } from 'react'; + +class PlayPauseButton extends Component { + shouldComponentUpdate(nextProps, nextState) { + return nextProps.paused !== this.props.paused || + nextProps.toggleButtonComponent !== this.props.toggleButtonComponent; + } + + togglePaused = () => { + this.props.dispatch('setProp', 'paused', !this.props.paused); + } + + render() { + if (this.props.paused === null) { + return null; + } + + const icon = this.props.paused ? 'ic_play' : 'ic_pause'; + return React.createElement(this.props.toggleButtonComponent, { icon, onClick: this.togglePaused }, null); + } +} + +export default PlayPauseButton; diff --git a/src/routes/Player/ControlBar/PlayPauseButton/index.js b/src/routes/Player/ControlBar/PlayPauseButton/index.js new file mode 100644 index 000000000..712cb531e --- /dev/null +++ b/src/routes/Player/ControlBar/PlayPauseButton/index.js @@ -0,0 +1,3 @@ +import PlayPauseButton from './PlayPauseButton'; + +export default PlayPauseButton; diff --git a/src/routes/Player/ControlBar/SeekBar/SeekBar.js b/src/routes/Player/ControlBar/SeekBar/SeekBar.js index a6a4ab5c6..4dee23d5d 100644 --- a/src/routes/Player/ControlBar/SeekBar/SeekBar.js +++ b/src/routes/Player/ControlBar/SeekBar/SeekBar.js @@ -37,7 +37,7 @@ class SeekBar extends Component { onComplete = (time) => { this.resetTimeDebounced(); this.setState({ time }); - this.props.setTime(time); + this.props.dispatch('setProp', 'time', time); } onCancel = () => { @@ -112,7 +112,7 @@ SeekBar.propTypes = { className: PropTypes.string, time: PropTypes.number, duration: PropTypes.number, - setTime: PropTypes.func.isRequired + dispatch: PropTypes.func.isRequired }; export default SeekBar; diff --git a/src/routes/Player/ControlBar/SeekBar/styles.less b/src/routes/Player/ControlBar/SeekBar/styles.less index 6e82c158f..99af619ad 100644 --- a/src/routes/Player/ControlBar/SeekBar/styles.less +++ b/src/routes/Player/ControlBar/SeekBar/styles.less @@ -4,7 +4,7 @@ align-items: center; .label { - font-size: var(--seek-bar-font-size); + font-size: 1em; color: var(--color-surfacelight); } diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js index feb1fac21..929eac930 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js +++ b/src/routes/Player/ControlBar/SubtitlesPicker/SubtitlesPicker.js @@ -1,4 +1,4 @@ -import React, { PureComponent, Fragment } from 'react'; +import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import Icon from 'stremio-icons/dom'; @@ -10,51 +10,81 @@ const ORIGIN_PRIORITIES = { 'EMBEDDED': 2 }; -class SubtitlesPicker extends PureComponent { - subtitlesComparator = (PRIORITIES) => { +const NumberInput = ({ value, unit, delta, onChange }) => { + if (value === null) { + return null; + } + + const fractionalDigits = delta.toString().split('.')[1]; + const digitsCount = typeof fractionalDigits === 'string' ? fractionalDigits.length : 0; + return ( +
+
+ +
+
{value.toFixed(digitsCount)}{unit}
+
+ +
+
+ ); +}; + +class SubtitlesPicker extends Component { + shouldComponentUpdate(nextProps, nextState) { + return nextProps.className !== this.props.className || + nextProps.subtitleTracks !== this.props.subtitleTracks || + nextProps.selectedSubtitleTrackId !== this.props.selectedSubtitleTrackId || + nextProps.subtitleSize !== this.props.subtitleSize || + nextProps.subtitleDelay !== this.props.subtitleDelay || + nextProps.subtitleDarkBackground !== this.props.subtitleDarkBackground; + } + + subtitlesComparator = (priorities) => { return (a, b) => { - const valueA = PRIORITIES[a]; - const valueB = PRIORITIES[b]; + const valueA = priorities[a]; + const valueB = priorities[b]; if (!isNaN(valueA) && !isNaN(valueB)) return valueA - valueB; if (!isNaN(valueA)) return -1; if (!isNaN(valueB)) return 1; return a - b; - } + }; } - toggleOnClick = () => { - this.props.setSelectedSubtitleTrackId(this.props.selectedSubtitleTrackId === null ? this.props.subtitleTracks[0].id : null); + toggleSubtitleEnabled = () => { + const selectedSubtitleTrackId = this.props.selectedSubtitleTrackId === null ? this.props.subtitleTracks[0].id : null + this.props.dispatch('setProp', 'selectedSubtitleTrackId', selectedSubtitleTrackId); } labelOnClick = (event) => { - const selectedTrack = this.props.subtitleTracks.find(({ label, origin }) => { + const subtitleTrack = this.props.subtitleTracks.find(({ label, origin }) => { return label === event.currentTarget.dataset.label && origin === event.currentTarget.dataset.origin; }); - if (selectedTrack) { - this.props.setSelectedSubtitleTrackId(selectedTrack.id); + if (subtitleTrack) { + this.props.dispatch('setProp', 'selectedSubtitleTrackId', subtitleTrack.id); } } - trackOnClick = (event) => { - this.props.setSelectedSubtitleTrackId(event.currentTarget.dataset.trackId); + variantOnClick = (event) => { + this.props.dispatch('setProp', 'selectedSubtitleTrackId', event.currentTarget.dataset.trackId); } setSubtitleSize = (event) => { - this.props.setSubtitleSize(event.currentTarget.dataset.value); + this.props.dispatch('setProp', 'subtitleSize', event.currentTarget.dataset.value); } setSubtitleDelay = (event) => { - this.props.setSubtitleDelay(event.currentTarget.dataset.value * 1000); + this.props.dispatch('setProp', 'subtitleDelay', event.currentTarget.dataset.value * 1000); } - setSubtitleDarkBackground = () => { - this.props.setSubtitleDarkBackground(!this.props.subtitleDarkBackground); + toggleSubtitleDarkBackground = () => { + this.props.dispatch('setProp', 'subtitleDarkBackground', !this.props.subtitleDarkBackground); } renderToggleButton({ selectedTrack }) { return ( -
+
ON
OFF
@@ -106,7 +136,7 @@ class SubtitlesPicker extends PureComponent {
@@ -126,33 +156,13 @@ class SubtitlesPicker extends PureComponent {
Dark background
); } - renderNumberInput({ value, unit, delta, onChange }) { - if (value === null) { - return null; - } - - const fractionalDigits = delta.toString().split('.')[1]; - const digitsCount = typeof fractionalDigits === 'string' ? fractionalDigits.length : 0; - return ( -
-
- -
-
{value.toFixed(digitsCount)}{unit}
-
- -
-
- ); - } - renderPreferences({ groupedTracks, selectedTrack }) { if (!selectedTrack) { return ( @@ -167,8 +177,18 @@ class SubtitlesPicker extends PureComponent {
Preferences
{this.renderVariantsList({ groupedTracks, selectedTrack })} {this.renderDarkBackgroundToggle()} - {this.renderNumberInput({ value: this.props.subtitleSize, unit: 'pt', delta: 0.5, onChange: this.setSubtitleSize })} - {this.renderNumberInput({ value: this.props.subtitleDelay / 1000, unit: 's', delta: 0.2, onChange: this.setSubtitleDelay })} + +
); } @@ -204,10 +224,7 @@ SubtitlesPicker.propTypes = { subtitleSize: PropTypes.number, subtitleDelay: PropTypes.number, subtitleDarkBackground: PropTypes.bool, - setSelectedSubtitleTrackId: PropTypes.func.isRequired, - setSubtitleSize: PropTypes.func.isRequired, - setSubtitleDelay: PropTypes.func.isRequired, - setSubtitleDarkBackground: PropTypes.func.isRequired + dispatch: PropTypes.func.isRequired }; SubtitlesPicker.defaultProps = { languagePriorities: Object.freeze({ diff --git a/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js b/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js index d12a14248..9d66e3a6f 100644 --- a/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js +++ b/src/routes/Player/ControlBar/VolumeBar/VolumeBar.js @@ -16,8 +16,9 @@ class VolumeBar extends Component { shouldComponentUpdate(nextProps, nextState) { return nextState.volume !== this.state.volume || + nextProps.className !== this.props.className || nextProps.volume !== this.props.volume || - nextProps.className !== this.props.className; + nextProps.toggleButtonComponent !== this.props.toggleButtonComponent; } componentWillUnmount() { @@ -25,7 +26,8 @@ class VolumeBar extends Component { } toogleVolumeMute = () => { - this.props.volume === 0 ? this.props.unmute() : this.props.mute(); + const command = this.props.volume > 0 ? 'mute' : 'unmute'; + this.props.dispatch('command', command); } resetVolumeDebounced = debounce(() => { @@ -40,7 +42,7 @@ class VolumeBar extends Component { onComplete = (volume) => { this.resetVolumeDebounced(); this.setState({ volume }); - this.props.setVolume(volume); + this.props.dispatch('setProp', 'volume', volume); } onCancel = () => { @@ -80,9 +82,7 @@ VolumeBar.propTypes = { className: PropTypes.string, volume: PropTypes.number, toggleButtonComponent: PropTypes.oneOfType([PropTypes.object, PropTypes.func]).isRequired, - setVolume: PropTypes.func.isRequired, - mute: PropTypes.func.isRequired, - unmute: PropTypes.func.isRequired + dispatch: PropTypes.func.isRequired }; export default VolumeBar; diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 2e075f45e..5cb2d305d 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -1,27 +1,26 @@ .control-bar-container { - top: initial !important; - padding: 0 calc(var(--control-bar-button-height) * 0.4); + padding: 0 calc(var(--control-bar-button-size) * 0.4); display: flex; flex-direction: column; justify-content: flex-end; align-items: stretch; .seek-bar { - --seek-bar-thumb-size: calc(var(--control-bar-button-height) * 0.40); - --seek-bar-track-size: calc(var(--control-bar-button-height) * 0.12); - --seek-bar-font-size: calc(var(--control-bar-button-height) * 0.35); - height: calc(var(--control-bar-button-height) * 0.6); + --seek-bar-thumb-size: calc(var(--control-bar-button-size) * 0.40); + --seek-bar-track-size: calc(var(--control-bar-button-size) * 0.12); + height: calc(var(--control-bar-button-size) * 0.6); + font-size: calc(var(--control-bar-button-size) * 0.35); } .control-bar-buttons-container { - height: var(--control-bar-button-height); + height: var(--control-bar-button-size); display: flex; flex-direction: row; align-items: center; .control-bar-button { - width: var(--control-bar-button-height); - height: var(--control-bar-button-height); + width: var(--control-bar-button-size); + height: var(--control-bar-button-size); display: flex; justify-content: center; align-items: center; @@ -50,10 +49,10 @@ } .volume-bar { - --volume-bar-thumb-size: calc(var(--control-bar-button-height) * 0.36); - --volume-bar-track-size: calc(var(--control-bar-button-height) * 0.10); - height: var(--control-bar-button-height); - width: calc(var(--control-bar-button-height) * 5); + --volume-bar-thumb-size: calc(var(--control-bar-button-size) * 0.36); + --volume-bar-track-size: calc(var(--control-bar-button-size) * 0.10); + height: var(--control-bar-button-size); + width: calc(var(--control-bar-button-size) * 5); &:hover, &:global(.active) { .control-bar-button { @@ -64,7 +63,7 @@ } } - .flex-spacing { + .spacing { flex: 1 } } @@ -75,7 +74,7 @@ bottom: 0; left: 0; z-index: -1; - box-shadow: 0 0 calc(var(--control-bar-button-height) * 2) calc(var(--control-bar-button-height) * 2.3) var(--color-backgrounddarker); + box-shadow: 0 0 calc(var(--control-bar-button-size) * 2) calc(var(--control-bar-button-size) * 2.3) var(--color-backgrounddarker); content: ""; } } @@ -87,12 +86,12 @@ background-color: var(--color-backgrounddark); &.share-popup-content { - width: calc(var(--control-bar-button-height) * 5); - height: calc(var(--control-bar-button-height) * 3); + width: calc(var(--control-bar-button-size) * 5); + height: calc(var(--control-bar-button-size) * 3); } &.subtitles-popup-content { - --subtitles-picker-button-size: calc(var(--control-bar-button-height) * 0.6); + --subtitles-picker-button-size: calc(var(--control-bar-button-size) * 0.6); } } } \ No newline at end of file diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 93d56d1e7..9bba9aa74 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -1,5 +1,6 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; +import classnames from 'classnames'; import Video from './Video'; import ControlBar from './ControlBar'; import styles from './styles'; @@ -36,12 +37,12 @@ class Player extends Component { } componentDidMount() { - this.addSubtitleTracks([{ + this.dispatch('command', 'addSubtitleTracks', [{ url: 'https://raw.githubusercontent.com/caitp/ng-media/master/example/assets/captions/bunny-en.vtt', origin: 'Github', label: 'English' }]); - this.setSelectedSubtitleTrackId('https://raw.githubusercontent.com/caitp/ng-media/master/example/assets/captions/bunny-en.vtt'); + this.dispatch('setProp', 'selectedSubtitleTrackId', 'https://raw.githubusercontent.com/caitp/ng-media/master/example/assets/captions/bunny-en.vtt'); } onEnded = () => { @@ -60,52 +61,8 @@ class Player extends Component { this.setState({ [propName]: propValue }); } - play = () => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'paused', false); - } - - pause = () => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'paused', true); - } - - setTime = (time) => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'time', time); - } - - setVolume = (volume) => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'volume', volume); - } - - setSelectedSubtitleTrackId = (selectedSubtitleTrackId) => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'selectedSubtitleTrackId', selectedSubtitleTrackId); - } - - setSubtitleSize = (size) => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleSize', size); - } - - setSubtitleDelay = (delay) => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleDelay', delay); - } - - setSubtitleDarkBackground = (value) => { - this.videoRef.current && this.videoRef.current.dispatch('setProp', 'subtitleDarkBackground', value); - } - - mute = () => { - this.videoRef.current && this.videoRef.current.dispatch('command', 'mute'); - } - - unmute = () => { - this.videoRef.current && this.videoRef.current.dispatch('command', 'unmute'); - } - - addSubtitleTracks = (subtitleTracks) => { - this.videoRef.current && this.videoRef.current.dispatch('command', 'addSubtitleTracks', subtitleTracks); - } - - stop = () => { - this.videoRef.current && this.videoRef.current.dispatch('command', 'stop'); + dispatch = (...args) => { + this.videoRef.current && this.videoRef.current.dispatch(...args); } renderVideo() { @@ -128,7 +85,7 @@ class Player extends Component { renderControlBar() { return ( ); } @@ -166,10 +114,10 @@ Player.propTypes = { stream: PropTypes.object.isRequired }; Player.defaultProps = { - stream: { + stream: Object.freeze({ // ytId: 'E4A0bcCQke0', url: 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4' - } + }) }; export default Player; diff --git a/src/routes/Player/styles.less b/src/routes/Player/styles.less index 1e0eb04a5..c964b290e 100644 --- a/src/routes/Player/styles.less +++ b/src/routes/Player/styles.less @@ -1,5 +1,5 @@ .player-container, :global(.player-popup-container) { - --control-bar-button-height: 60px; + --control-bar-button-size: 60px; } .player-container { @@ -16,9 +16,13 @@ right: 0; bottom: 0; z-index: 0; + + &.control-bar-layer { + top: initial; + } } :global(.subtitles) { - bottom: calc(var(--control-bar-button-height) * 3) !important; + bottom: calc(var(--control-bar-button-size) * 3) !important; } } \ No newline at end of file From 400b9c46a0720f9d34127ad15f39870f1693a97d Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 17:49:22 +0200 Subject: [PATCH 89/94] dark background label fixed --- .../Player/ControlBar/SubtitlesPicker/styles.less | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less index 7a7aa71d4..c55964f4a 100644 --- a/src/routes/Player/ControlBar/SubtitlesPicker/styles.less +++ b/src/routes/Player/ControlBar/SubtitlesPicker/styles.less @@ -155,7 +155,7 @@ .background-toggle-container { align-self: stretch; - height: var(--subtitles-picker-button-size); + flex: 1; display: flex; flex-direction: row; align-items: center; @@ -173,8 +173,12 @@ } .background-toggle-label { - margin-left: 0.5em; - max-height: 2em; + flex: 1; + padding: 0 0.5em; + font-size: 1em; + line-height: 1.1em; + max-height: 2.2em; + word-break: break-all; overflow: hidden; color: var(--color-surfacelighter); } From 2dc9e8480420d74fe9ff6d8914c118027e151284 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 18:35:13 +0200 Subject: [PATCH 90/94] round cue times --- src/routes/Player/Video/stremio-video/utils/subtitles.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/utils/subtitles.js b/src/routes/Player/Video/stremio-video/utils/subtitles.js index f984e01e2..5380c5195 100644 --- a/src/routes/Player/Video/stremio-video/utils/subtitles.js +++ b/src/routes/Player/Video/stremio-video/utils/subtitles.js @@ -31,8 +31,8 @@ function parse(text) { var parser = new VTTJS.WebVTT.Parser(window, VTTJS.WebVTT.StringDecoder()); parser.oncue = function(c) { var cue = { - startTime: c.startTime * 1000, - endTime: c.endTime * 1000, + startTime: (c.startTime * 1000) | 0, + endTime: (c.endTime * 1000) | 0, text: c.text }; cues.push(cue); From 1c062dac7f46205b9b011fec16586ee3edc9f93c Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Fri, 4 Jan 2019 18:35:43 +0200 Subject: [PATCH 91/94] throw more accurate errors when fetch/parse subtitles --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 3393529b7..add6c1f0d 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -254,6 +254,13 @@ var HTMLVideo = function(container) { .then(function(resp) { return resp.text(); }) + .catch(function() { + events.emit('error', { + code: 70, + message: 'Failed to fetch subtitles from ' + subtitleTrack.origin, + critical: false + }); + }) .then(function(text) { if (selectedSubtitleTrackId === subtitleTrack.id) { subtitleCues = subtitleUtils.parse(text); @@ -262,8 +269,8 @@ var HTMLVideo = function(container) { }) .catch(function() { events.emit('error', { - code: 68, - message: 'Failed to fetch subtitles from ' + subtitleTrack.origin, + code: 71, + message: 'Failed to parse subtitles from ' + subtitleTrack.origin, critical: false }); }); From 36cf29be5bf61d1a78a5a9db2cbcbbb0b8125033 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 7 Jan 2019 09:41:55 +0200 Subject: [PATCH 92/94] html element variables renamed suffix Element --- .../Player/Video/stremio-video/HTMLVideo.js | 134 +++++++++--------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index add6c1f0d..995bae255 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -1,8 +1,8 @@ var EventEmitter = require('events'); var subtitleUtils = require('./utils/subtitles'); -var HTMLVideo = function(container) { - if (!(container instanceof HTMLElement)) { +var HTMLVideo = function(containerElement) { + if (!(containerElement instanceof HTMLElement)) { throw new Error('Instance of HTMLElement required as a first argument'); } @@ -15,44 +15,44 @@ var HTMLVideo = function(container) { var subtitleTracks = []; var selectedSubtitleTrackId = null; var subtitleDelay = 0; - var styles = document.createElement('style'); - var video = document.createElement('video'); - var subtitles = document.createElement('div'); + var stylesElement = document.createElement('style'); + var videoElement = document.createElement('video'); + var subtitlesElement = document.createElement('div'); - container.appendChild(styles); - styles.sheet.insertRule('#' + container.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', styles.sheet.cssRules.length); - var subtitleStylesIndex = styles.sheet.insertRule('#' + container.id + ' .subtitles { position: absolute; right: 0; bottom: 0; left: 0; font-size: 26pt; color: white; text-align: center; }', styles.sheet.cssRules.length); - styles.sheet.insertRule('#' + container.id + ' .subtitles.dark-background .cue { text-shadow: none; background-color: #222222; }', styles.sheet.cssRules.length); - styles.sheet.insertRule('#' + container.id + ' .subtitles .cue { display: inline-block; padding: 0.2em; text-shadow: #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px; }', styles.sheet.cssRules.length); - container.appendChild(video); - video.crossOrigin = 'anonymous'; - video.controls = false; - container.appendChild(subtitles); - subtitles.classList.add('subtitles'); + containerElement.appendChild(stylesElement); + stylesElement.sheet.insertRule('#' + containerElement.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', stylesElement.sheet.cssRules.length); + var subtitleStylesIndex = stylesElement.sheet.insertRule('#' + containerElement.id + ' .subtitles { position: absolute; right: 0; bottom: 0; left: 0; font-size: 26pt; color: white; text-align: center; }', stylesElement.sheet.cssRules.length); + stylesElement.sheet.insertRule('#' + containerElement.id + ' .subtitles.dark-background .cue { text-shadow: none; background-color: #222222; }', stylesElement.sheet.cssRules.length); + stylesElement.sheet.insertRule('#' + containerElement.id + ' .subtitles .cue { display: inline-block; padding: 0.2em; text-shadow: #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px; }', stylesElement.sheet.cssRules.length); + containerElement.appendChild(videoElement); + videoElement.crossOrigin = 'anonymous'; + videoElement.controls = false; + containerElement.appendChild(subtitlesElement); + subtitlesElement.classList.add('subtitles'); function getPaused() { if (!loaded) { return null; } - return !!video.paused; + return !!videoElement.paused; } function getTime() { if (!loaded) { return null; } - return Math.floor(video.currentTime * 1000); + return Math.floor(videoElement.currentTime * 1000); } function getDuration() { - if (!loaded || isNaN(video.duration)) { + if (!loaded || isNaN(videoElement.duration)) { return null; } - return Math.floor(video.duration * 1000); + return Math.floor(videoElement.duration * 1000); } function getVolume() { - return video.muted ? 0 : Math.floor(video.volume * 100); + return videoElement.muted ? 0 : Math.floor(videoElement.volume * 100); } function getSubtitleTracks() { if (!loaded) { @@ -76,10 +76,10 @@ var HTMLVideo = function(container) { return subtitleDelay; } function getSubtitleSize() { - return parseFloat(styles.sheet.cssRules[subtitleStylesIndex].style.fontSize); + return parseFloat(stylesElement.sheet.cssRules[subtitleStylesIndex].style.fontSize); } function getSubtitleDarkBackground() { - return subtitles.classList.contains('dark-background'); + return subtitlesElement.classList.contains('dark-background'); } function onEnded() { events.emit('ended'); @@ -87,7 +87,7 @@ var HTMLVideo = function(container) { function onError() { var message; var critical; - switch (video.error.code) { + switch (videoElement.error.code) { case 1: message = 'Fetching process aborted'; critical = false; @@ -110,7 +110,7 @@ var HTMLVideo = function(container) { } events.emit('error', { - code: video.error.code, + code: videoElement.error.code, message: message, critical: critical }); @@ -147,8 +147,8 @@ var HTMLVideo = function(container) { events.emit('propChanged', 'subtitleDarkBackground', getSubtitleDarkBackground()); } function updateSubtitleText() { - while (subtitles.hasChildNodes()) { - subtitles.removeChild(subtitles.lastChild); + while (subtitlesElement.hasChildNodes()) { + subtitlesElement.removeChild(subtitlesElement.lastChild); } if (!loaded || !Array.isArray(subtitleCues.times)) { @@ -160,7 +160,7 @@ var HTMLVideo = function(container) { for (var i = 0; i < cuesForTime.length; i++) { var cueNode = subtitleUtils.render(cuesForTime[i]); cueNode.classList.add('cue'); - subtitles.append(cueNode, document.createElement('br')); + subtitlesElement.append(cueNode, document.createElement('br')); } } function flushArgsQueue() { @@ -189,25 +189,25 @@ var HTMLVideo = function(container) { switch (arguments[1]) { case 'paused': events.emit('propValue', 'paused', getPaused()); - video.removeEventListener('pause', onPausedChanged); - video.removeEventListener('play', onPausedChanged); - video.addEventListener('pause', onPausedChanged); - video.addEventListener('play', onPausedChanged); + videoElement.removeEventListener('pause', onPausedChanged); + videoElement.removeEventListener('play', onPausedChanged); + videoElement.addEventListener('pause', onPausedChanged); + videoElement.addEventListener('play', onPausedChanged); return; case 'time': events.emit('propValue', 'time', getTime()); - video.removeEventListener('timeupdate', onTimeChanged); - video.addEventListener('timeupdate', onTimeChanged); + videoElement.removeEventListener('timeupdate', onTimeChanged); + videoElement.addEventListener('timeupdate', onTimeChanged); return; case 'duration': events.emit('propValue', 'duration', getDuration()); - video.removeEventListener('durationchange', onDurationChanged); - video.addEventListener('durationchange', onDurationChanged); + videoElement.removeEventListener('durationchange', onDurationChanged); + videoElement.addEventListener('durationchange', onDurationChanged); return; case 'volume': events.emit('propValue', 'volume', getVolume()); - video.removeEventListener('volumechange', onVolumeChanged); - video.addEventListener('volumechange', onVolumeChanged); + videoElement.removeEventListener('volumechange', onVolumeChanged); + videoElement.addEventListener('volumechange', onVolumeChanged); return; case 'subtitleTracks': events.emit('propValue', 'subtitleTracks', getSubtitleTracks()); @@ -231,13 +231,13 @@ var HTMLVideo = function(container) { switch (arguments[1]) { case 'paused': if (loaded) { - arguments[2] ? video.pause() : video.play(); + arguments[2] ? videoElement.pause() : videoElement.play(); } break; case 'time': if (loaded) { if (!isNaN(arguments[2])) { - video.currentTime = arguments[2] / 1000; + videoElement.currentTime = arguments[2] / 1000; } } break; @@ -294,23 +294,23 @@ var HTMLVideo = function(container) { break; case 'subtitleSize': if (!isNaN(arguments[2])) { - styles.sheet.cssRules[subtitleStylesIndex].style.fontSize = parseFloat(arguments[2]) + 'pt'; + stylesElement.sheet.cssRules[subtitleStylesIndex].style.fontSize = parseFloat(arguments[2]) + 'pt'; onSubtitleSizeChanged(); } return; case 'subtitleDarkBackground': if (arguments[2]) { - subtitles.classList.add('dark-background'); + subtitlesElement.classList.add('dark-background'); } else { - subtitles.classList.remove('dark-background'); + subtitlesElement.classList.remove('dark-background'); } onSubtitleDarkBackgroundChanged(); return; case 'volume': if (!isNaN(arguments[2])) { - video.muted = false; - video.volume = arguments[2] / 100; + videoElement.muted = false; + videoElement.volume = arguments[2] / 100; } return; default: @@ -349,25 +349,25 @@ var HTMLVideo = function(container) { } break; case 'mute': - video.muted = true; + videoElement.muted = true; return; case 'unmute': - video.volume = video.volume !== 0 ? video.volume : 0.5; - video.muted = false; + videoElement.volume = videoElement.volume !== 0 ? videoElement.volume : 0.5; + videoElement.muted = false; return; case 'stop': - video.removeEventListener('ended', onEnded); - video.removeEventListener('error', onError); - video.removeEventListener('timeupdate', updateSubtitleText); + videoElement.removeEventListener('ended', onEnded); + videoElement.removeEventListener('error', onError); + videoElement.removeEventListener('timeupdate', updateSubtitleText); loaded = false; dispatchArgsQueue = []; subtitleCues = {}; subtitleTracks = []; selectedSubtitleTrackId = null; subtitleDelay = 0; - video.removeAttribute('src'); - video.load(); - video.currentTime = 0; + videoElement.removeAttribute('src'); + videoElement.load(); + videoElement.currentTime = 0; onPausedChanged(); onTimeChanged(); onDurationChanged(); @@ -380,12 +380,12 @@ var HTMLVideo = function(container) { var dispatchArgsQueueCopy = dispatchArgsQueue.slice(); self.dispatch('command', 'stop'); dispatchArgsQueue = dispatchArgsQueueCopy; - video.addEventListener('ended', onEnded); - video.addEventListener('error', onError); - video.addEventListener('timeupdate', updateSubtitleText); - video.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; - video.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; - video.src = arguments[2].url; + videoElement.addEventListener('ended', onEnded); + videoElement.addEventListener('error', onError); + videoElement.addEventListener('timeupdate', updateSubtitleText); + videoElement.autoplay = typeof arguments[3].autoplay === 'boolean' ? arguments[3].autoplay : true; + videoElement.currentTime = !isNaN(arguments[3].time) ? arguments[3].time / 1000 : 0; + videoElement.src = arguments[2].url; loaded = true; onPausedChanged(); onTimeChanged(); @@ -398,14 +398,14 @@ var HTMLVideo = function(container) { case 'destroy': self.dispatch('command', 'stop'); events.removeAllListeners(); - video.removeEventListener('pause', onPausedChanged); - video.removeEventListener('play', onPausedChanged); - video.removeEventListener('timeupdate', onTimeChanged); - video.removeEventListener('durationchange', onDurationChanged); - video.removeEventListener('volumechange', onVolumeChanged); - container.removeChild(video); - container.removeChild(styles); - container.removeChild(subtitles); + videoElement.removeEventListener('pause', onPausedChanged); + videoElement.removeEventListener('play', onPausedChanged); + videoElement.removeEventListener('timeupdate', onTimeChanged); + videoElement.removeEventListener('durationchange', onDurationChanged); + videoElement.removeEventListener('volumechange', onVolumeChanged); + containerElement.removeChild(videoElement); + containerElement.removeChild(stylesElement); + containerElement.removeChild(subtitlesElement); destroyed = true; return; default: From dc0bba730bfb704b7e502c31a5df88e4b1ee3c59 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 7 Jan 2019 10:19:24 +0200 Subject: [PATCH 93/94] prevent raise not needed events on stop --- src/routes/Player/Video/stremio-video/HTMLVideo.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 995bae255..229135d19 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -22,8 +22,8 @@ var HTMLVideo = function(containerElement) { containerElement.appendChild(stylesElement); stylesElement.sheet.insertRule('#' + containerElement.id + ' video { width: 100%; height: 100%; position: relative; z-index: 0; }', stylesElement.sheet.cssRules.length); var subtitleStylesIndex = stylesElement.sheet.insertRule('#' + containerElement.id + ' .subtitles { position: absolute; right: 0; bottom: 0; left: 0; font-size: 26pt; color: white; text-align: center; }', stylesElement.sheet.cssRules.length); - stylesElement.sheet.insertRule('#' + containerElement.id + ' .subtitles.dark-background .cue { text-shadow: none; background-color: #222222; }', stylesElement.sheet.cssRules.length); stylesElement.sheet.insertRule('#' + containerElement.id + ' .subtitles .cue { display: inline-block; padding: 0.2em; text-shadow: #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px, #222222 0px 0px 1.8px; }', stylesElement.sheet.cssRules.length); + stylesElement.sheet.insertRule('#' + containerElement.id + ' .subtitles.dark-background .cue { text-shadow: none; background-color: #222222; }', stylesElement.sheet.cssRules.length); containerElement.appendChild(videoElement); videoElement.crossOrigin = 'anonymous'; videoElement.controls = false; @@ -390,8 +390,6 @@ var HTMLVideo = function(containerElement) { onPausedChanged(); onTimeChanged(); onDurationChanged(); - onSubtitleTracksChanged(); - onSelectedSubtitleTrackIdChanged(); updateSubtitleText(); flushArgsQueue(); return; From 49957e5053d8c4b6f238660770ab7630ce34d885 Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Mon, 7 Jan 2019 10:29:22 +0200 Subject: [PATCH 94/94] reset settings props on destroy --- .../Player/Video/stremio-video/HTMLVideo.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/Video/stremio-video/HTMLVideo.js b/src/routes/Player/Video/stremio-video/HTMLVideo.js index 229135d19..5b7f74357 100644 --- a/src/routes/Player/Video/stremio-video/HTMLVideo.js +++ b/src/routes/Player/Video/stremio-video/HTMLVideo.js @@ -52,6 +52,10 @@ var HTMLVideo = function(containerElement) { return Math.floor(videoElement.duration * 1000); } function getVolume() { + if (destroyed) { + return null; + } + return videoElement.muted ? 0 : Math.floor(videoElement.volume * 100); } function getSubtitleTracks() { @@ -76,9 +80,17 @@ var HTMLVideo = function(containerElement) { return subtitleDelay; } function getSubtitleSize() { + if (destroyed) { + return null; + } + return parseFloat(stylesElement.sheet.cssRules[subtitleStylesIndex].style.fontSize); } function getSubtitleDarkBackground() { + if (destroyed) { + return null; + } + return subtitlesElement.classList.contains('dark-background'); } function onEnded() { @@ -395,6 +407,10 @@ var HTMLVideo = function(containerElement) { return; case 'destroy': self.dispatch('command', 'stop'); + destroyed = true; + onVolumeChanged(); + onSubtitleSizeChanged(); + onSubtitleDarkBackgroundChanged(); events.removeAllListeners(); videoElement.removeEventListener('pause', onPausedChanged); videoElement.removeEventListener('play', onPausedChanged); @@ -404,7 +420,6 @@ var HTMLVideo = function(containerElement) { containerElement.removeChild(videoElement); containerElement.removeChild(stylesElement); containerElement.removeChild(subtitlesElement); - destroyed = true; return; default: throw new Error('command not supported: ' + arguments[1]);