diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..2b7bafa --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env", "@babel/preset-react"] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..12b0846 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build/ +node_modules/ +config.js diff --git a/config.example.js b/config.example.js new file mode 100644 index 0000000..140f041 --- /dev/null +++ b/config.example.js @@ -0,0 +1,17 @@ +module.exports = { + title: 'EXAMPLE_TITLE', + SERVER_ROOT: 'http://localhost:4040', + EVENT_EXT: '/api//MAP2D_dev/rows', + CATEGORY_EXT: '/api//MAP2D_dev_category/rows', + EVENT_DESC_ROOT: '/api//MAP2D_dev/ids', + TAG_TREE_EXT: '/api//MAP2D_dev_tags/tree', + SITES_EXT: '/api//MAP2D_dev_sites/rows', + MAP_ANCHOR: [27.5813121, -18.5161798], + INCOMING_DATETIME_FORMAT: '%m/%d/%YT%H:%M', + MAPBOX_TOKEN: 'SOME_MAPBOX_TOKEN', + features: { + USE_TAGS: false, + USE_SEARCH: false, + USE_SITES: false + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..c6a9001 --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + TimeMap - Forensic Architecture + + + + +
+
+
+
+
+ + diff --git a/package.json b/package.json new file mode 100644 index 0000000..34953ed --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "guerrero", + "version": "0.1.0", + "description": "", + "homepage": "", + "private": true, + "scripts": { + "dev": "webpack-dev-server --content-base static --mode development", + "build": "NODE_ENV=production webpack --mode production" + }, + "dependencies": { + "babel-polyfill": "^6.26.0", + "d3": "^4.9.1", + "es6-promise": "^4.1.1", + "joi": "^14.0.1", + "leaflet": "^1.0.3", + "leaflet-polylinedecorator": "^1.3.2", + "normalizr": "^3.2.3", + "object-hash": "^1.3.0", + "react": "^15.5.4", + "react-dom": "^15.5.4", + "react-redux": "^5.0.4", + "react-tabs": "^1.0.0", + "redux": "^3.6.0", + "redux-thunk": "^2.2.0", + "reselect": "^3.0.1", + "uuid": "^3.1.0", + "video.js": "^5.19.2", + "whatwg-fetch": "^2.0.3" + }, + "devDependencies": { + "@babel/core": "^7.1.2", + "@babel/preset-env": "^7.1.0", + "@babel/preset-react": "^7.0.0", + "babel-loader": "^8.0.4", + "css-loader": "^1.0.0", + "file-loader": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "mini-css-extract-plugin": "^0.4.4", + "node-sass": "^4.9.4", + "redux-devtools": "^3.4.0", + "sass-loader": "^7.1.0", + "style-loader": "^0.23.1", + "webpack": "^4.20.2", + "webpack-cli": "^3.1.2", + "webpack-dev-server": "^3.1.9" + } +} diff --git a/src/actions/index.js b/src/actions/index.js new file mode 100644 index 0000000..70c501d --- /dev/null +++ b/src/actions/index.js @@ -0,0 +1,242 @@ +// TODO: relegate these URLs entirely to environment variables +const EVENT_DATA_URL = `${process.env.SERVER_ROOT}${process.env.EVENT_EXT}`; +const CATEGORY_URL = `${process.env.SERVER_ROOT}${process.env.CATEGORY_EXT}`; +const TAG_TREE_URL = `${process.env.SERVER_ROOT}${process.env.TAG_TREE_EXT}`; +const SITES_URL = `${process.env.SERVER_ROOT}${process.env.SITES_EXT}`; +const eventUrlMap = (event) => `${process.env.SERVER_ROOT}${process.env.EVENT_DESC_ROOT}/${(event.id) ? event.id : event}` + +/* +* Create an error notification object +* Types: ['error', 'warning', 'good', 'neural'] +*/ +function makeError(type, id, message) { + return { + type: 'error', + id, + message: `${type} ${id}: ${message}` + } +} + +export function fetchDomain() { + let events = []; + let categories = []; + let sites = []; + let notifications = []; + let tags = {}; + + function makeError(domainType) { + notifications.push({ + message: `Something went wrong fetching ${domainType}. Check the URL or try disabling them in the config file.`, + type: 'error' + }); + } + + return dispatch => { + dispatch(toggleFetchingDomain()); + const promises = []; + + const eventPromise = fetch(EVENT_DATA_URL) + .then(response => response.json()) + .then(jsonEv => { events = jsonEv; }) + .catch(err => { makeError('events')}); + promises.push(eventPromise); + + const catPromise = fetch(CATEGORY_URL) + .then(response => response.json()) + .then(jsonCat => { categories = jsonCat; }) + .catch(err => { makeError('categories')}); + promises.push(catPromise); + + if (process.env.features.USE_SITES) { + const sitesPromise = fetch(SITES_URL) + .then(response => response.json()) + .then(jsonSites => { sites = jsonSites; }) + .catch(err => { makeError('sites')}); + promises.push(sitesPromise); + } + + if (process.env.features.USE_TAGS) { + const tagTreePromise = fetch(TAG_TREE_URL) + .then(response => response.json()) + .then(jsonTagTree => { tags = jsonTagTree; }) + .catch(err => { makeError('tags')}); + promises.push(tagTreePromise); + } + + return Promise.all(promises) + .then(reponse => { + dispatch(toggleFetchingDomain()); + return { events, categories, sites, tags, notifications }; + }) + .catch(err => { + dispatch(fetchError(err.message)) + dispatch(toggleFetchingDomain()); + }) + }; +} + +export const FETCH_ERROR = 'FETCH_ERROR'; +export function fetchError(message) { + return { + type: FETCH_ERROR, + message, + } +} + +export const UPDATE_DOMAIN = 'UPDATE_DOMAIN'; +export function updateDomain(domain) { + return { + type: UPDATE_DOMAIN, + domain: { + events: domain.events, + categories: domain.categories, + tags: domain.tags, + sites: domain.sites, + notifications: domain.notifications + } + }; +} + +export function fetchEvents(events) { + return dispatch => { + dispatch(toggleFetchingEvents()); + const urls = events.map(eventUrlMap); + return Promise.all(urls.map(url => fetch(url) + .then(response => response.json()) + ) + ) + .then(json => { + dispatch(toggleFetchingEvents()); + return json; + }); + }; +} + +export const UPDATE_HIGHLIGHTED = 'UPDATE_HIGHLIGHTED'; +export function updateHighlighted(highlighted) { + return { + type: UPDATE_HIGHLIGHTED, + highlighted: highlighted + }; +} + +export const UPDATE_SELECTED = 'UPDATE_SELECTED'; +export function updateSelected(selected) { + return { + type: UPDATE_SELECTED, + selected: selected + }; +} + +export const UPDATE_DISTRICT = 'UPDATE_DISTRICT'; +export function updateDistrict(district) { + return { + type: UPDATE_DISTRICT, + district + }; +} + +export const UPDATE_FILTERS = 'UPDATE_FILTERS'; +export function updateFilters(filters) { + return { + type: UPDATE_FILTERS, + filters: filters + }; +} + +export const UPDATE_TIMERANGE = 'UPDATE_TIMERANGE'; +export function updateTimeRange(range) { + return { + type: UPDATE_TIMERANGE, + range + }; +} + +export const RESET_ALLFILTERS = 'RESET_ALLFILTERS'; +export function resetAllFilters() { + return { + type: RESET_ALLFILTERS + }; +} + +// UI + +export const TOGGLE_FETCHING_DOMAIN = 'TOGGLE_FETCHING_DOMAIN'; +export function toggleFetchingDomain() { + return { + type: TOGGLE_FETCHING_DOMAIN + }; +} + +export const TOGGLE_FETCHING_EVENTS = 'TOGGLE_FETCHING_EVENTS'; +export function toggleFetchingEvents() { + return { + type: TOGGLE_FETCHING_EVENTS + }; +} + +export const TOGGLE_VIEW = 'TOGGLE_VIEW'; +export function toggleView() { + return { + type: TOGGLE_VIEW + }; +} + +export const TOGGLE_TIMELINE = 'TOGGLE_TIMELINE'; +export function toggleTimeline() { + return { + type: TOGGLE_TIMELINE + }; +} + +export const TOGGLE_LANGUAGE = 'TOGGLE_LANGUAGE'; +export function toggleLanguage(language) { + return { + type: TOGGLE_LANGUAGE, + language, + } +} + +export const OPEN_TOOLBAR = 'OPEN_TOOLBAR'; +export function openToolbar(toolbarTab = 0) { + return { + type: OPEN_TOOLBAR, + toolbarTab: toolbarTab, + }; +} + +export const CLOSE_TOOLBAR = 'CLOSE_TOOLBAR'; +export function closeToolbar() { + return { + type: CLOSE_TOOLBAR + }; +} + +export const OPEN_CABINET = 'OPEN_CABINET'; +export function openCabinet(tabNum) { + return { + type: OPEN_CABINET, + tabNum: tabNum, + }; +} + +export const CLOSE_CABINET = 'CLOSE_CABINET'; +export function closeCabinet() { + return { + type: CLOSE_CABINET + }; +} + +export const TOGGLE_INFOPOPUP = 'TOGGLE_INFOPOPUP'; +export function toggleInfoPopup() { + return { + type: TOGGLE_INFOPOPUP + }; +} + +export const TOGGLE_NOTIFICATIONS = 'TOGGLE_NOTIFICATIONS'; +export function toggleNotifications() { + return { + type: TOGGLE_NOTIFICATIONS + }; +} diff --git a/src/assets/arrowdown.svg b/src/assets/arrowdown.svg new file mode 100644 index 0000000..d161a68 --- /dev/null +++ b/src/assets/arrowdown.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/assets/checkbox.svg b/src/assets/checkbox.svg new file mode 100644 index 0000000..59b25af --- /dev/null +++ b/src/assets/checkbox.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/assets/close.svg b/src/assets/close.svg new file mode 100644 index 0000000..32334cb --- /dev/null +++ b/src/assets/close.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/components/App.jsx b/src/components/App.jsx new file mode 100644 index 0000000..5dc0868 --- /dev/null +++ b/src/components/App.jsx @@ -0,0 +1,16 @@ +import '../scss/main.scss'; +import React from 'react'; +import Dashboard from './Dashboard.jsx'; + +class App extends React.Component { + + render() { + return ( +
+ +
+ ); + } +} + +export default App; diff --git a/src/components/Card.jsx b/src/components/Card.jsx new file mode 100644 index 0000000..010aacf --- /dev/null +++ b/src/components/Card.jsx @@ -0,0 +1,230 @@ +import '../scss/main.scss'; +import copy from '../js/data/copy.json'; +import {isNotNullNorUndefined} from '../js/data/utilities'; +import React from 'react'; + +class Card extends React.Component { + + constructor(props) { + super(props); + this.state = { + isFolded: true + }; + + this.toggle = this.toggle.bind(this); + } + + toggle() { + if (this.state.isFolded) { + this.props.highlight(this.props.event); + } else { + this.props.highlight(); + } + this.setState({ + isFolded: !this.state.isFolded + }); + } + + getCategoryColorClass(category) { + if (category) + return this.props.getCategoryGroup(category); + return 'other'; + } + + renderWarning() { + const warning_lang = copy[this.props.language].cardstack.warning; + + if (this.props.event.tags) { + const tagsArray = this.props.event.tags.split(","); + /* TODO: This needs to be generalized */ + if (tagsArray.some(tag => { + return (tag.name === 'contradicción' || + tag.name === 'declaración con sospecha de tortura') + })) { + return (
{warning_lang}
); + } + } + } + + renderCategory() { + const category_lang = copy[this.props.language].cardstack.category; + + const colorType = this.getCategoryColorClass(this.props.event.category); + const categoryLabel = this.props.getCategoryLabel(this.props.event.category); + + return (
+

{category_lang}

+

{categoryLabel}

+
); + } + + // NB: is this function for a future feature? + renderIncidents() { + const incident_type_lang = copy[this.props.language].cardstack.incident_type; + const incidentTags = []; //this.props.event.tags.filter(tag => tag.type === 'incident_type'); + + return (
+

{incident_type_lang}

+ { + incidentTags.map((tag, idx) => { + return ( + {tag.name}{ + (idx < incidentTags.length - 1) + ? ',' + : '' + } + ); + }) + } +
); + } + + renderSummary() { + const summary = copy[this.props.language].cardstack.description; + const desc = this.props.event.description; + const description = (this.state.isFolded) ? `${desc.substring(0, 40)}...` : desc; + return (
+

{summary}

+

{description}

+
); + } + + renderTags() { + const people_lang = copy[this.props.language].cardstack.people; + const peopleTags = []; //this.props.event.tags.filter(tag => tag.type === 'people'); + + return (
+

{people_lang}

+

{ + peopleTags.map((tag, idx) => { + return ( + {tag.name} + { + (idx < peopleTags.length - 1) + ? ',' + : '' + } + ); + }) + }

+
); + } + + // NB: is this function for a future feature? Should also be internaionalized. + renderLocation() { + const location_lang = copy[this.props.language].cardstack.location; + if (isNotNullNorUndefined(this.props.event.location)) { + return (

+

{location_lang}

+

{this.props.event.location}

+

); + } else { + return (

+

{location_lang}

+

Sin localización conocida.

+

); + } + } + + renderSource() { + const source_lang = copy[this.props.language].cardstack.source; + return (
+

{source_lang}

+

{this.props.event.source}

+
); + } + + // NB: should be internaionalized. + renderTimestamp() { + const daytime_lang = copy[this.props.language].cardstack.timestamp; + const estimated_lang = copy[this.props.language].cardstack.estimated; + + if (isNotNullNorUndefined(this.props.event.timestamp)) { + const timestamp = this.props.tools.parser(this.props.event.timestamp); + const timelabel = this.props.tools.formatterWithYear(timestamp); + return (
+

{daytime_lang}

+ {timelabel} +
); + } else { + return (
+

{daytime_lang}

+ Hora no conocida +
); + } + } + + renderHeader() { + return (
+ {this.renderWarning()} + {this.renderCategory()} + {this.renderTimestamp()} + {this.renderSummary()} +
); + } + + renderContent() { + if (this.state.isFolded) { + return (
); + } else if (this.props.isFetchingEvents) { + return (
+ {this.renderSpinner()} +
); + } else { + if (!this.props.event.hasOwnProperty('receiver') && !this.props.event.hasOwnProperty('transmitter')) { + return (
+ {this.renderTimestamp()} + {this.renderLocation()} + {this.renderTags()} + {this.renderSource()} +
); + } else { + return (
+ {this.renderTimestamp()} + {this.renderTags()} + {this.renderSource()} +
); + } + } + } + + + renderSpinner() { + return (
+
+
+
); + } + + renderArrow() { + let classes = (this.state.isFolded) + ? 'arrow-down folded' + : 'arrow-down'; + return (
this.toggle()}> +

+ +

+
); + } + + render() { + if (this.props.isLoading) { + return (
  • +
    + {this.renderSpinner()} +
    +
  • ); + } else { + return (
  • + {this.renderHeader()} + {this.renderContent()} + {this.renderArrow()} +
  • ); + } + } +} + +export default Card; diff --git a/src/components/CardStack.jsx b/src/components/CardStack.jsx new file mode 100644 index 0000000..84b8d6f --- /dev/null +++ b/src/components/CardStack.jsx @@ -0,0 +1,99 @@ +import '../scss/main.scss'; +import React from 'react'; +import Card from './Card.jsx'; +import copy from '../js/data/copy.json'; +import { + isNotNullNorUndefined +} from '../js/data/utilities.js'; + +class CardStack extends React.Component { + + constructor(props) { + super(props); + } + + renderCards() { + if (this.props.selected.length > 0) { + return this.props.selected.map((event) => { + // if event has property 'name', update with event details + const shouldCardUpdate = (event.name); + + return ( + + ); + }); + } else { + return ''; + } + } + + renderLocation() { + let locationName = copy[this.props.language].cardstack.unknown_location; + if (this.props.selected.length > 0) { + if (isNotNullNorUndefined(this.props.selected[0].location)) { + locationName = this.props.selected[0].location; + } + return (

    in:{` ${locationName}`}

    ) + } + return ''; + } + + render() { + const header_lang = copy[this.props.language].cardstack.header; + + if (this.props.isFetchingEvents) { + return ( +
    +
    this.props.toggle('TOGGLE_CARDSTACK')} + > + +

    {copy[this.props.language].loading}

    +
    +
    +
      + +
    +
    +
    + ); + } else if (this.props.selected.length > 0) { + return ( +
    +
    this.props.toggle('TOGGLE_CARDSTACK')} + > + +

    {`${this.props.selected.length} ${header_lang}`}

    + {this.renderLocation()} +
    +
    +
      + {this.renderCards()} +
    +
    +
    + ); + } + return
    ; + } +} + +export default CardStack; diff --git a/src/components/Checkbox.jsx b/src/components/Checkbox.jsx new file mode 100644 index 0000000..1d186b2 --- /dev/null +++ b/src/components/Checkbox.jsx @@ -0,0 +1,11 @@ +import '../scss/main.scss'; +import React from 'react'; + +export default ({ label, isActive, onClickLabel, onClickCheckbox }) => ( +
    + onClickLabel()}>{label} + +
    +); diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx new file mode 100644 index 0000000..f16a91b --- /dev/null +++ b/src/components/Dashboard.jsx @@ -0,0 +1,236 @@ +import '../scss/main.scss'; +import React from 'react'; + +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import * as actions from '../actions'; +import * as selectors from '../selectors'; + +import LoadingOverlay from './LoadingOverlay.jsx'; +import Viewport from './Viewport.jsx'; +import Toolbar from './Toolbar.jsx'; +import CardStack from './CardStack.jsx'; +import InfoPopUp from './InfoPopup.jsx'; +import Timeline from './Timeline.jsx'; +import Notification from './Notification.jsx'; + +class Dashboard extends React.Component { + constructor(props) { + super(props); + + this.handleHighlight = this.handleHighlight.bind(this); + this.handleSelect = this.handleSelect.bind(this); + this.handleToggle = this.handleToggle.bind(this); + this.handleFilter = this.handleFilter.bind(this); + } + + componentDidMount() { + if (!this.props.app.isMobile) { + this.props.actions.fetchDomain() + .then((domain) => this.props.actions.updateDomain(domain)); + } + } + + handleHighlight(highlighted) { + this.props.actions.updateHighlighted((highlighted) ? highlighted : null); + } + + handleSelect(selected) { + if (selected) { + // attacks are not susceptible to tag filters, so make sure this happens only when they are found + // in the domain + let eventsToSelect = selected.map(eventId => this.props.domain.events[eventId]); + eventsToSelect = eventsToSelect.sort((a, b) => { + return this.props.ui.tools.parser(a.timestamp) - this.props.ui.tools.parser(b.timestamp); + }); + + if (eventsToSelect.every(event => (event))) { + this.props.actions.updateSelected(eventsToSelect); + } + + // Now fetch detail data for each event + // Add transmitter and receiver data for coevents + this.props.actions.fetchEvents(selected) + .then((events) => { + let eventsSelected = events.map(ev => { + return Object.assign({}, ev, this.props.domain.events[ev.id]); + }); + + eventsSelected = eventsSelected.sort((a, b) => { + return this.props.ui.tools.parser(a.timestamp) - this.props.ui.tools.parser(b.timestamp); + }); + + this.props.actions.updateSelected(eventsSelected); + }); + } else { + this.props.actions.updateSelected([]); + } + } + + handleFilter(filters) { + this.props.actions.updateFilters(filters); + } + + handleToggle( key ) { + switch( key ) { + case 'TOGGLE_CARDSTACK': { + this.props.actions.updateSelected([]); + break; + } + case 'TOGGLE_INFOPOPUP': { + this.props.actions.toggleInfoPopup(); + break; + } + case 'TOGGLE_NOTIFICATIONS': { + this.props.actions.toggleNotifications(); + break; + } + } + } + + getCategoryGroup(category) { + const cat = this.props.domain.categories.find(t => t.category === category) + if (cat) return cat.group; + return 'other'; + } + + getCategoryGroupColor(category) { + const group = this.getCategoryGroup(category); + return this.props.ui.style.groupColors[group]; + } + + getCategoryLabel(category) { + const label = this.props.domain.categories.find(t => t.category === category).category_label; + return label; + } + + renderTool() { + return (
    + this.getCategoryGroup(category)} + getCategoryGroupColor={category => this.getCategoryGroupColor(category)} + /> + this.handleToggle(key) } + actions={this.props.actions} + /> + this.getCategoryGroup(category)} + getCategoryGroupColor={category => this.getCategoryGroupColor(category)} + getCategoryLabel={category => this.getCategoryLabel(category)} + /> + item)} + categoryGroups={this.props.domain.categoryGroups} + + range={this.props.app.filters.range} + selected={this.props.app.selected} + language={this.props.app.language} + + tools={this.props.ui.tools} + dom={this.props.ui.dom} + + select={this.handleSelect} + filter={this.handleFilter} + highlight={this.handleHighlight} + toggle={() => this.handleToggle('TOGGLE_CARDSTACK')} + getCategoryGroup={category => this.getCategoryGroup(category)} + getCategoryGroupColor={category => this.getCategoryGroupColor(category)} + getCategoryLabel={category => this.getCategoryLabel(category)} + /> + this.handleToggle('TOGGLE_INFOPOPUP')} + /> + this.handleToggle('TOGGLE_NOTIFICATIONS')} + /> + +
    + ) + } + + render() { + return (
    {this.renderTool()}
    ); + } +} + +function mapStateToProps(state) { + return Object.assign({}, state, { + domain: Object.assign({}, state.domain, { + + events: selectors.getFilteredEvents(state), + locations: selectors.getFilteredLocations(state), + categories: selectors.getFilteredCategories(state), + categoryGroups: selectors.getCategoryGroups(state), + sites: selectors.getSites(state), + tags: selectors.getTags(state), + + notifications: state.domain.notifications, + }), + app: Object.assign({}, state.app, { + error: state.app.error, + filters: Object.assign({}, state.app.filters, { + range: selectors.getRangeFilter(state), + tags: selectors.getTagFilters(state) + }) + }), + ui: state.ui + }); +} + +function mapDispatchToProps(dispatch) { + return { + actions: bindActionCreators(actions, dispatch) + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps, +)(Dashboard); diff --git a/src/components/Icon.jsx b/src/components/Icon.jsx new file mode 100644 index 0000000..39cb53c --- /dev/null +++ b/src/components/Icon.jsx @@ -0,0 +1,83 @@ +import React from 'react'; + +const Icon = ({ iconType }) => { + if (iconType === 'personas') { + return ( + + + + + + + + + + ); + } else if (iconType === 'tipos') { + return ( + + + + + + ); + } else if (iconType === 'hardware') { + return ( + + + + ); + } else if (iconType === 'escenas') { + return ( + + + + + + ); + } else if (iconType === 'docs') { + return ( + + + + + + + + + + + + ) + } else if (iconType === 'search') { + return ( + + + + + ); + } +} + +export default Icon; diff --git a/src/components/InfoPopup.jsx b/src/components/InfoPopup.jsx new file mode 100644 index 0000000..e795af0 --- /dev/null +++ b/src/components/InfoPopup.jsx @@ -0,0 +1,104 @@ +import React from 'react'; +import copy from '../js/data/copy.json'; +// NB: should we make this componetn part of a future feature? + +export default class InfoPopUp extends React.Component{ + + renderView2DCopy() { + return copy[this.props.app.language].legend.view2d.paragraphs.map(paragraph =>

    {paragraph}

    ); + } + + renderCategoryColors() { + const colors = copy[this.props.app.language].legend.view2d.colors.slice(0); + colors.reverse(); + return ( +
    + {colors.map((color, idx) => { + return ( +
    +
    + {color.label} +
    + ) + })} +
    + ) + } + + renderView2DLegend() { + return ( +
    + + {this.renderView2DCopy()} +
    +
    + + + + + + + + {this.renderCategoryColors()} +
    +
    + + + + + +
    +
    Comunicaciones
    +
    +
    +
    + + + +
    +
    Ataques
    +
    +
    +
    + + + + + + + +
    +
    Rutas de bus
    +
    +
    +
    +
    + ) + } + + renderView3DLegend() { + const lang = copy[this.props.app.language].legend.view3d; + return ( +
    + + {lang.paragraphs.map(paragraph =>

    {paragraph}

    )} + {lang.colors.map(color => ( +
    +
    +
    {color.label}
    +
    + ))} +
    + ) + } + + render() { + if (!this.props.ui.flags.isView2d) { + return (
    {this.renderView3DLegend()}
    ) + } + return ( +
    {this.renderView2DLegend()}
    + ) + } +} diff --git a/src/components/LoadingOverlay.jsx b/src/components/LoadingOverlay.jsx new file mode 100644 index 0000000..ab7145e --- /dev/null +++ b/src/components/LoadingOverlay.jsx @@ -0,0 +1,21 @@ +import React from 'react'; +import copy from '../js/data/copy.json'; + +const LoadingOverlay = ({ ui, language }) => { + let classes = 'loading-overlay'; + classes += (!ui.flags.isFetchingDomain) ? ' hidden' : ''; + + return ( +
    +
    + {copy[language].loading} +
    +
    +
    +
    +
    +
    + ); +}; + +export default LoadingOverlay; diff --git a/src/components/Notification.jsx b/src/components/Notification.jsx new file mode 100644 index 0000000..e718b9d --- /dev/null +++ b/src/components/Notification.jsx @@ -0,0 +1,48 @@ +import React from 'react'; + +export default class Notification extends React.Component{ + + constructor(props) { + super(); + this.state = { + isExtended: false + } + } + + toggleDetails() { + this.setState({ isExtended: !this.state.isExtended }); + } + + renderItems(items) { + if (!items) return ''; + return ( +
    + {items.map((item) => { + if (item.error) { + return (

    {item.error.message}

    ); + } + return ''; + })} +
    + ) + } + + render() { + if (this.props.isNotification) { + return ( +
    + {this.props.notifications.map(not => ( +
    this.toggleDetails() }> + +
    {`${not.message}`}
    +
    + {(not.items !== null) ? this.renderItems(not.items) : ''} +
    +
    + ))} +
    + ) + } + return (
    ); + } +} diff --git a/src/components/Search.jsx b/src/components/Search.jsx new file mode 100644 index 0000000..3cbc40e --- /dev/null +++ b/src/components/Search.jsx @@ -0,0 +1,71 @@ +import React from 'react'; +import copy from '../js/data/copy.json'; +import TagFilter from './TagFilter.jsx'; + +export default class Search extends React.Component { + constructor(props) { + super(props); + this.state = { + searchValue: undefined, + searchResults: [] + } + + this.handleSearchChange = this.handleSearchChange.bind(this); + this.handleSearchSubmit = this.handleSearchSubmit.bind(this); + } + + handleSearchSubmit(e) { + e.preventDefault(); + fetch(`api/search/${this.state.searchValue}`) + .then(response => response.json()) + .then(json => { + this.setState({ + searchResults: json.tags + }) + }); + } + + handleSearchChange(event) { + this.setState({ searchValue: event.target.value }); + } + + renderSearchResults() { + return ( + this.state.searchResults.map(tag => { + return ( + + ); + }) + ); + } + + render() { + return ( +
    +

    {copy[this.props.language].toolbar.panels.search.title}

    +
    + +
    +
      + {this.renderSearchResults()} +
    +
    + ); + } + } diff --git a/src/components/TagFilter.jsx b/src/components/TagFilter.jsx new file mode 100644 index 0000000..0d91001 --- /dev/null +++ b/src/components/TagFilter.jsx @@ -0,0 +1,91 @@ +import '../scss/main.scss'; +import React from 'react'; +import Checkbox from './Checkbox.jsx'; + +class TagFilter extends React.Component { + constructor(props) { + super(props); + } + + isActive() { + if (this.props.isCategory) { + return this.props.categoryFilters.includes(this.props.tag.id); + } + return this.props.tagFilters.includes(this.props.tag.id); + } + + onClickTag() { + if (this.isActive()) { + this.props.filter({ + tags: this.props.tagFilters.filter(element => element !== this.props.tag.id) + }); + } else { + this.props.filter({ + tags: this.props.tagFilters.concat(this.props.tag.id) + }); + } + } + + onClickCategory() { + if (this.isActive()) { + this.props.filter({ + categories: this.props.categoryFilters.filter(element => element !== this.props.tag.id) + }); + } else { + this.props.filter({ + categories: this.props.categoryFilters.concat(this.props.tag.id) + }); + } + } + + renderTag() { + const tag = this.props.tag; + let classes = (this.isActive()) ? 'tag-filter active' : 'tag-filter'; + let label = `${tag.name} ( ${tag.mentions} )`; + if (this.props.isShowTree) { + label = `${tag.group} > ${tag.subgroup} > ${tag.name} ( ${tag.mentions} )`; + } + return ( +
  • + this.onClickTag()} + onClickCheckbox={() => this.onClickTag()} + /> +
  • + ); + } + + renderCategory() { + const category = this.props.categories[this.props.tag.id]; + let classes = (this.isActive()) ? 'tag-filter active' : 'tag-filter'; + + if (category) { + return ( +
  • + this.onClickCategory()} + onClickCheckbox={() => this.onClickCategory()} + /> +
  • + ); + } + return (
    ); + } + + render() { + if (this.props.isCategory) return (this.renderCategory()); + return (this.renderTag()); + } +} + +export default TagFilter; diff --git a/src/components/TagListPanel.jsx b/src/components/TagListPanel.jsx new file mode 100644 index 0000000..cfcb774 --- /dev/null +++ b/src/components/TagListPanel.jsx @@ -0,0 +1,94 @@ +import '../scss/main.scss'; +import React from 'react'; +import Checkbox from './Checkbox.jsx'; + +class TagListPanel extends React.Component { + + constructor(props) { + super(props); + this.state = { + treeComponents: [] + } + this.treeComponents = []; + this.newTagFilters = []; + } + + componentDidMount() { + this.computeTree(this.props.tags.children[this.props.tagType]); + } + + componentWillReceiveProps(nextProps) { + this.computeTree(nextProps.tags.children[nextProps.tagType]); + } + + traverseNodeAndCheckIt(node, depth, active) { + // do something to node + const tagFilter = this.newTagFilters.find(tagFilter => tagFilter.key === node.key) + tagFilter.active = (depth === 0) ? !node.active : active; + tagFilter.depth = depth; + depth = depth + 1; + + if (Object.keys(tagFilter.children).length > 0) { + Object.values(tagFilter.children).forEach((childNode) => { + this.traverseNodeAndCheckIt(childNode, depth, tagFilters, tagFilter.active); + }); + } + } + + onClickCheckbox(tag) { + this.newTagFilters = this.props.tagFilters.slice(0); + let depth = 0; + if (tag.key && tag.children) this.traverseNodeAndCheckIt(tag, depth); + + this.props.filter({ tags: this.newTagFilters }); + } + + createNodeComponent (node, depth) { + return ( +
  • + this.onClickCheckbox(node)} + /> +
  • + ); + } + + traverseNodeAndCreateComponent(node, depth) { + // add and create node component + const newComponent = this.createNodeComponent(node, depth); + this.treeComponents.push(newComponent) + depth = depth + 1; + if (Object.keys(node.children).length > 0) { + Object.values(node.children).forEach((childNode) => { + this.traverseNodeAndCreateComponent(childNode, depth); + }); + } + } + + computeTree (node) { + this.treeComponents = []; + let depth = 0; + this.traverseNodeAndCreateComponent(node, depth); + this.setState({ treeComponents: this.treeComponents }); + } + + renderTree() { + return this.state.treeComponents.map(c => c); + } + + render() { + return ( +
    + {this.renderTree()} +
    + ); + } +} + +export default TagListPanel; diff --git a/src/components/Timeline.jsx b/src/components/Timeline.jsx new file mode 100644 index 0000000..48471b5 --- /dev/null +++ b/src/components/Timeline.jsx @@ -0,0 +1,97 @@ +import '../scss/main.scss'; +import copy from '../js/data/copy.json'; +import React from 'react'; +import TimelineLogic from '../js/timeline/timeline.js'; + +class Timeline extends React.Component { + constructor(props) { + super(props); + this.state = {isFolded: false}; + } + + componentDidMount() { + const domain = { + events: this.props.events, + categoryGroups: this.props.categoryGroups + } + const app = { + range: this.props.range, + selected: this.props.selected, + language: this.props.language, + select: this.props.select, + filter: this.props.filter, + getCategoryLabel: this.props.getCategoryLabel, + getCategoryGroup: this.props.getCategoryGroup, + getCategoryGroupColor: this.props.getCategoryGroupColor + } + const ui = { + tools: this.props.tools, + dom: this.props.dom + } + + this.timeline = new TimelineLogic(app, ui); + this.timeline.update(domain, app); + this.timeline.render(domain); + } + + componentWillReceiveProps(nextProps) { + const domain = { + events: nextProps.events, + categoryGroups: nextProps.categoryGroups + } + + const app = { + range: nextProps.range, + selected: nextProps.selected, + language: nextProps.language, + select: nextProps.select, + filter: nextProps.filter, + getCategoryLabel: nextProps.getCategoryLabel, + getCategoryGroup: nextProps.getCategoryGroup, + getCategoryGroupColor: nextProps.getCategoryGroupColor + } + + this.timeline.update(domain, app); + this.timeline.render(domain); + } + + onClickArrow() { + this.setState((prevState, props) => { + return {isFolded: !prevState.isFolded}; + }); + } + + renderLabels() { + const labels = copy[this.props.language].timeline.labels; + return this.props.categoryGroups.map((label) => { + const groupLen = this.props.categoryGroups.length + return (
    {label}
    ); + }); + } + + render() { + const labels_title_lang = copy[this.props.language].timeline.labels_title; + const info_lang = copy[this.props.language].timeline.info; + let classes = `timeline-wrapper ${(this.state.isFolded) ? ' folded' : ''}`; + const date0 = this.props.tools.formatterWithYear(this.props.range[0]); + const date1 = this.props.tools.formatterWithYear(this.props.range[1]); + return ( +
    +
    +
    this.onClickArrow()}> +

    +
    +
    +

    {info_lang}

    +

    {date0} - {date1}

    +
    +
    +
    +
    +
    +
    + ); + } +} + +export default Timeline; diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx new file mode 100644 index 0000000..3f96a71 --- /dev/null +++ b/src/components/Toolbar.jsx @@ -0,0 +1,235 @@ +import '../scss/main.scss'; +import React from 'react'; +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import Search from './Search.jsx'; +import TagListPanel from './TagListPanel.jsx'; +import Icon from './Icon.jsx'; +import copy from '../js/data/copy.json'; +// NB: i think this entire component can actually be part of a future feature... + +class Toolbar extends React.Component { + + constructor(props) { + super(props); + + this.state = { + tab: -1 + }; + } + + toggleTab(tabIndex) { + if ( this.state.tab === tabIndex ) { + this.setState({ tab: -1 }); + } else { + this.setState({ tab: tabIndex }); + } + } + + openCabinet() { + this.props.actions.openCabinet(); + } + + resetAllFilters() { + this.props.actions.resetAllFilters(); + } + + toggleInfoPopup() { + this.props.actions.toggleInfoPopup(); + } + + toggleLanguage() { + this.props.actions.toggleLanguage(); + } + + toggleMapViews(layer) { + const isLayerInView = !this.props.viewFilters[layer]; + const newViews = {}; + newViews[layer] = isLayerInView; + const views = Object.assign({}, this.props.viewFilters, newViews); + this.props.actions.updateFilters({ views }); + } + + renderMapActions() { + const isViewLayer = this.props.viewFilters; + const routeClass = (isViewLayer.routes) ? 'action-button active disabled' : 'action-button disabled' + const sitesClass = (isViewLayer.sites) ? 'action-button active disabled' : 'action-button disabled'; + const coeventsClass = (isViewLayer.coevents) ? 'action-button active disabled' : 'action-button disabled'; + if (this.props.isView2d) { + return ( +
    + + + +
    + ); + } + return (
    ) + } + + renderBottomActions() { + return ( +
    + {this.renderMapActions()} +
    + + + +
    +
    + ); + } + + + renderPanelHeader() { + return ( +
    this.toggleTab(-1)}> +
    +
    + ); + } + + renderToolbarTab(tabNum, key) { + const isActive = (tabNum === this.state.tab); + //let caption_lang = copy[this.props.language].toolbar.tabs[tabNum]; + let classes = (isActive) ? 'toolbar-tab active' : 'toolbar-tab'; + return ( +
    { this.toggleTab(tabNum); }}> + {/**/} +
    {key}
    +
    + ); + } + + renderToolbarTagRoot() { + if (this.props.features.USE_TAGS && + this.props.tags.children) { + const roots = Object.values(this.props.tags.children); + return roots.map((root, idx) => { + return this.renderToolbarTab(idx, root.key); + }) + } + return ''; + } + + renderToolbarTabs() { + const title = copy[this.props.language].toolbar.title; + return ( +
    +
    this.openCabinet()}>

    {title}

    +
    + {/*this.renderToolbarTab(0, 'search')*/} + {this.renderToolbarTagRoot()} +
    + {/* {this.renderBottomActions()} */} +
    + ) + } + + renderTagListPanel(tagType) { + const panels_lang = copy[this.props.language].toolbar.panels; + const title = (panels_lang[tagType]) ? panels_lang[tagType].title : tagType; + const overview = (panels_lang[tagType]) ? panels_lang[tagType].overview : ''; + + return ( + + ); + } + + renderSearch() { + if (this.props.features.USE_SEARCH) { + return ( + + + + ) + } + } + + renderToolbarTagList() { + if (this.props.features.USE_TAGS && + this.props.tags.children) { + const roots = Object.values(this.props.tags.children); + return roots.map((root, idx) => { + return ( + + {this.renderTagListPanel(root.key)} + + ) + }) + } + return ''; + } + + render() { + let classes = (this.state.tab !== -1) ? 'toolbar-panels' : 'toolbar-panels folded'; + + return ( +
    + {this.renderToolbarTabs()} +
    + {this.renderPanelHeader()} + + {this.renderToolbarTagList()} + +
    +
    + ); + } +} + +export default Toolbar; diff --git a/src/components/View2D.jsx b/src/components/View2D.jsx new file mode 100644 index 0000000..da35994 --- /dev/null +++ b/src/components/View2D.jsx @@ -0,0 +1,61 @@ +import '../scss/main.scss'; +import React from 'react'; +import Map from '../js/map/map.js'; +import { areEqual } from '../js/data/utilities.js'; + +class View2D extends React.Component { + constructor(props) { + super(props); + } + + componentDidMount() { + const domain = { + locations: this.props.locations, + sites: this.props.sites, + categoryGroups: this.props.categoryGroups + } + const app = { + views: this.props.views, + selected: this.props.selected, + highlighted: this.props.highlighted, + getCategoryGroup: this.props.getCategoryGroup, + getCategoryGroupColor: this.props.getCategoryGroupColor, + mapAnchor: this.props.mapAnchor + } + const ui = { + style: this.props.uiStyle, + dom: this.props.dom + } + + this.map = new Map(app, ui, this.props.select); + this.map.update(domain, app); + } + + componentWillReceiveProps(nextProps) { + const domain = { + locations: nextProps.locations, + sites: nextProps.sites, + categoryGroups: nextProps.categoryGroups + } + const app = { + views: nextProps.views, + selected: nextProps.selected, + highlighted: nextProps.highlighted, + getCategoryGroup: nextProps.getCategoryGroup, + getCategoryGroupColor: nextProps.getCategoryGroupColor, + mapAnchor: this.props.mapAnchor + } + + this.map.update(domain, app); + } + + render() { + return ( +
    +
    +
    + ); + } +} + +export default View2D; diff --git a/src/components/Viewport.jsx b/src/components/Viewport.jsx new file mode 100644 index 0000000..78e17d6 --- /dev/null +++ b/src/components/Viewport.jsx @@ -0,0 +1,36 @@ +import '../scss/main.scss'; +import React from 'react'; +import View2D from './View2D.jsx'; + +class Viewport extends React.Component { + constructor(props) { + super(props); + } + + render() { + if( this.props.isView2d ) { + return ( + this.props.getCategoryGroupColor(category)} + getCategoryGroup={category => this.props.getCategoryGroup(category)} + /> + ); + } + } +} + +export default Viewport; diff --git a/src/index.jsx b/src/index.jsx new file mode 100644 index 0000000..7342aea --- /dev/null +++ b/src/index.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Provider } from 'react-redux'; +import store from './store/index.js'; +import App from './components/App.jsx'; + +ReactDOM.render( + + + , + document.getElementById('explore-app') +); diff --git a/src/js/data/copy.json b/src/js/data/copy.json new file mode 100644 index 0000000..2138326 --- /dev/null +++ b/src/js/data/copy.json @@ -0,0 +1,144 @@ +{ + "es-MX": { + "loading": "Cargando...", + "legend": { + "view2d": { + "paragraphs": [ + "Seleccionando una serie de filtros verá aparecer eventos en el mapa y en la línea del tiempo.", + "Cada evento estará coloreado según la persona que dio el testimonio del evento." + ], + "colors": [ + { "class": "category_group00", "label": "Category Group 00" }, + { "class": "category_group01", "label": "Category Group 01" }, + { "class": "category_group02", "label": "Category Group 02" }, + { "class": "category_group03", "label": "Category Group 03" }, + { "class": "other", "label": "Other categories" } + ] + } + }, + "toolbar": { + "title": "TITLE", + "panels": { + "mentions": { + "title": "Personas", + "overview": "Seleccionar los nombres de personas mostrará eventos en los que esta persona o organización ha sido mencionada, incluyendo el propio testimonio. Entre paréntesis encontrará el número de menciones. Ej. (34)." + }, + "categories": { + "title": "Testimonios", + "overview": "Seleccionar el nombre de una persona mostrará los eventos descritos por su testimonio. Entre paréntesis encontrará el número de eventos descritos. Ej. (34)." + }, + "search": { + "title": "Directorio de etiquetas", + "placeholder": "Búsqueda" + } + } + }, + "timeline": { + "zooms": [ + "3 años", + "3 meses", + "3 días", + "12 horas", + "2 horas", + "30 min", + "10 min" + ], + "labels_title": "Testimonios", + "labels": [ + "Testimony Group 00", + "Testimony Group 01", + "Testimony Group 02", + "Testimony Group 03", + "Other categories" + ], + "info": "Viendo eventos ocurridos entre" + }, + "cardstack": { + "header": "eventos seleccionados", + "unknown_location": "Localización desconocida", + "timestamp": "Día y hora", + "estimated": "aproximado", + "location": "Localización", + "incident_type": "Tipo de acción", + "description": "Hechos", + "people": "Personas en el evento", + "source": "Fuente", + "category": "Según el testimonio de", + "communication": "Comunicación", + "transmitter": "Transmisor", + "receiver": "Receptor", + "warning": "(!) HECHOS CUESTIONADOS" + } + }, + "en-US": { + "loading": "Loading...", + "legend": { + "view2d": { + "paragraphs": [ + "Selecting a series of tags, you will be able to explore events on the map of Iguala and on the timeline.", + "Each event is colored according the person that gave category of the event." + ], + "colors": [ + { "class": "category_group00", "label": "Category Group 00" }, + { "class": "category_group01", "label": "Category Group 01" }, + { "class": "category_group02", "label": "Category Group 02" }, + { "class": "category_group03", "label": "Category Group 03" }, + { "class": "other", "label": "Other categories" } + ] + } + }, + "toolbar": { + "title": "TITLE", + "panels": { + "mentions": { + "title": "Mentions", + "overview": "Selecting the names of people/organisation will show events in which these have been mentioned in their own testistimony and by others. The number in the parentheses shows how many events contain a mention of a person or organisation, e.g. (34)" + }, + "categories": { + "title": "Testimonies", + "overview": "Selecting the name of a person will show the events only according to a person’s category or category. The number in the parentheses show how many events are contained in each category, e.g. (34)." + }, + "search": { + "title": "Directory of tags", + "placeholder": "Search" + } + } + }, + "timeline": { + "zooms": [ + "3 years", + "3 months", + "3 days", + "12 hours", + "2 hours", + "30 min", + "10 min" + ], + "labels_title": "Testimonies", + "labels": [ + "Testimony Group 00", + "Testimony Group 01", + "Testimony Group 02", + "Testimony Group 03", + "Other" + ], + "info": "Seeing events occurred between" + }, + "cardstack": { + "header": "selected events", + "timestamp": "Day and time", + "unknown_location": "Unknown location", + "estimated": "estimated", + "location": "Localization", + "incident_type": "Type of action", + "description": "Summary of facts", + "people": "People involved", + "source": "Source", + "category": "According to", + "communication": "Communication", + "transmitter": "Transmitter", + "receiver": "Receiver", + "warning": "(!) Highly questioned" + } + } +} diff --git a/src/js/data/es-MX.json b/src/js/data/es-MX.json new file mode 100644 index 0000000..4dc2077 --- /dev/null +++ b/src/js/data/es-MX.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x, %X", + "date": "%d/%m/%Y", + "time": "%-I:%M:%S %p", + "periods": ["AM", "PM"], + "days": ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], + "shortDays": ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], + "months": ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + "shortMonths": ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"] +} diff --git a/src/js/data/utilities.js b/src/js/data/utilities.js new file mode 100644 index 0000000..da8462d --- /dev/null +++ b/src/js/data/utilities.js @@ -0,0 +1,37 @@ +/** + * Get URI params to start with predefined set of + * https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript + * @param {string} name: name of paramater to search + * @param {string} url: url passed as variable, defaults to window.location.href + */ +export function getParameterByName(name, url) { + if (!url) url = window.location.href; + name = name.replace(/[\[\]]/g, `\\$&`); + + const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`); + const results = regex.exec(url); + + if (!results) return null; + if (!results[2]) return ''; + + return decodeURIComponent(results[2].replace(/\+/g, ' ')); +} + +/** + * Compare two arrays of scalars + * @param {array} arr1: array of numbers + * @param {array} arr2: array of numbers + */ +export function areEqual(arr1, arr2) { + return ((arr1.length === arr2.length) && arr1.every((element, index) => { + return element === arr2[index]; + })); +} + +/** +* Return whether the variable is neither null nor undefined +* @param {object} variable +*/ +export function isNotNullNorUndefined(variable) { + return (typeof variable !== 'undefined' && variable !== null); +} diff --git a/src/js/map/map.js b/src/js/map/map.js new file mode 100644 index 0000000..4996228 --- /dev/null +++ b/src/js/map/map.js @@ -0,0 +1,393 @@ +import { + areEqual, + isNotNullNorUndefined +} from '../data/utilities'; +import hash from 'object-hash'; +import 'leaflet-polylinedecorator'; + +export default function(newApp, ui, select) { + let svg, g, defs; + + let categoryColorGroups = {}; + + const domain = { + locations: [], + categoryGroups: [], + sites: [] + } + const app = { + selected: [], + highlighted: null, + views: Object.assign({}, newApp.views), + } + + const getCategoryGroup = newApp.getCategoryGroup; + const getCategoryGroupColor = newApp.getCategoryGroupColor; + const groupColors = ui.style.groupColors; + + // Map Settings + const center = newApp.mapAnchor; + const maxBoundaries = [[180, -180], [-180, 180]]; + const zoomLevel = 14; + + // Initialize layer + const sitesLayer = L.layerGroup(); + const pathLayer = L.layerGroup(); + + // Icons for markPoint flags (a yellow ring around a location) + const eventCircleMarkers = {}; + + // Styles for elements in map + const settingsSiteLabel = { + className: 'site-label', + opacity: 1, + permanent: true, + direction: 'top', + }; + + + /** + * Creates a Leaflet map and a tilelayer for the map background + * @param {string} id: DOM element to create map onto + * @param {array} center: [lat, long] coordinates the map will be centered on + * @param {number} zoom: zoom level + */ + function initBackgroundMap(id, zoom) { + /* http://bl.ocks.org/sumbera/10463358 */ + + const map = L.map(id) + .setView(center, zoom) + .setMinZoom(10) + .setMaxZoom(18) + .setMaxBounds(maxBoundaries); + + // NB: configure tile endpoint + let s; + if (process.env.MAPBOX_TOKEN) { + s = L.tileLayer( + `http://a.tiles.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}@2x.png?access_token=${process.env.MAPBOX_TOKEN}` + ); + } else { + s = L.tileLayer(`${process.env.SERVER_ROOT}/mapbox/{z}/{x}/{y}`); + } + s = s.addTo(map); + + map.keyboard.disable(); + const pane = d3.select(map.getPanes().overlayPane); + const boundingClient = d3.select(`#${id}`).node().getBoundingClientRect(); + const width = boundingClient.width; + const height = boundingClient.height; + + svg = pane.append('svg') + .attr('class', 'leaflet-svg') + .attr('width', width) + .attr('height', height); + + g = svg.append('g'); + + svg.insert('defs', 'g') + .append('marker') + .attr('id', 'arrow') + .attr('viewBox', '0 0 6 6') + .attr('refX', 3) + .attr('refY', 3) + .attr('markerWidth', 14) + .attr('markerHeight', 14) + .attr('orient', 'auto') + .append('path') + .attr('d', 'M0,3v-3l6,3l-6,3z'); + + map.on('zoomstart', () => { + svg.classed('hide', true); + }); + map.on('zoomend', () => { + svg.classed('hide', false); + }); + + return map; + } + + // Initialize leaflet map and layers for each type of data + const lMap = initBackgroundMap(ui.dom.map, zoomLevel); + + function projectPoint(location) { + const latLng = new L.LatLng(location[0], location[1]); + return lMap.latLngToLayerPoint(latLng); + } + + function getSVGBoundaries() { + return { + topLeft: projectPoint(maxBoundaries[0]), + bottomRight: projectPoint(maxBoundaries[1]) + } + } + + function updateSVG() { + const boundaries = getSVGBoundaries(); + const { + topLeft, + bottomRight + } = boundaries; + svg.attr('width', bottomRight.x - topLeft.x + 200) + .attr('height', bottomRight.y - topLeft.y + 200) + .style('left', `${topLeft.x - 100}px`) + .style('top', `${topLeft.y - 100}px`); + + g.attr('transform', `translate(${-(topLeft.x - 100)},${-(topLeft.y - 100)})`); + + g.selectAll('.location').attr('transform', (d) => { + const newPoint = projectPoint([+d.latitude, +d.longitude]); + return `translate(${newPoint.x},${newPoint.y})`; + }); + + const busLine = d3.line() + .x(d => lMap.latLngToLayerPoint(d).x) + .y(d => lMap.latLngToLayerPoint(d).y) + .curve(d3.curveMonotoneX); + } + + lMap.on("zoom viewreset move", updateSVG); + + /** + * Returns latitud / longitude + * @param {Object} eventPoint: data for an evenPoint - time, loc, tags, etc + */ + function getEventLocation(eventPoint) { + return { + latitude: +eventPoint.location.latitude, + longitude: +eventPoint.location.longitude, + }; + } + + /* + * INTERACTIVE FUNCTIONS + */ + + /** + * Removes the circular ring to mark a particular location + */ + function unmarkPoint() { + Object.keys(eventCircleMarkers).forEach(markerId => { + lMap.removeLayer(eventCircleMarkers[markerId]); + delete eventCircleMarkers[markerId]; + }); + } + + /** + * Makes a circular ring mark in one particular location at a time + * @param {object} location object, with lat and long + */ + function renderSelected() { + unmarkPoint(); + app.selected.forEach(eventPoint => { + if (isNotNullNorUndefined(eventPoint) && isNotNullNorUndefined(eventPoint.location)) { + if (eventPoint.latitude && eventPoint.longitude) { + const location = new L.LatLng(eventPoint.latitude, eventPoint.longitude); + eventCircleMarkers[eventPoint.id] = L.circleMarker(location, { + radius: 32, + fill: false, + color: '#ffffff', + weight: 3, + lineCap: '', + dashArray: '5,2' + }); + eventCircleMarkers[eventPoint.id].addTo(lMap); + } + } + }) + } + + function renderHighlighted() { + // Fly to first of events selected + const eventPoint = (app.selected.length > 0) ? app.selected[0] : null; + if (isNotNullNorUndefined(eventPoint) && isNotNullNorUndefined(eventPoint.location)) { + if (eventPoint.latitude && eventPoint.longitude) { + const location = new L.LatLng(eventPoint.latitude, eventPoint.longitude); + lMap.flyTo(location); + } + } + } + + /* + * RENDERING FUNCTIONS + */ + + function getLocationEventsDistribution(location) { + const eventsHere = {}; + const categoryGroups = domain.categoryGroups; + categoryGroups.sort((a, b) => { + return (+a.slice(-2) > +b.slice(-2)); + }); + categoryGroups.forEach(group => { + eventsHere[group] = 0 + }); + + location.events.forEach((event) => { + const group = getCategoryGroup(event.category); + eventsHere[group] += 1; + }); + + let i = 0; + const events = []; + + while (i < categoryGroups.length) { + let eventsCount = eventsHere[categoryGroups[i]]; + for (let j = i + 1; j < categoryGroups.length; j++) { + eventsCount += eventsHere[categoryGroups[j]]; + } + events.push(eventsCount); + i++; + } + + return events; + } + + /** + * Clears existing event layer + * Renders all events as markers + * Adds eventlayer to map + */ + function renderEvents() { + const locationsDom = g.selectAll('.location') + .data(domain.locations, d => d.id) + + locationsDom + .exit() + .remove(); + + locationsDom + .enter().append('g') + .attr('class', 'location') + .attr('transform', (d) => { + d.LatLng = new L.LatLng(+d.latitude, +d.longitude); + return `translate(${lMap.latLngToLayerPoint(d.LatLng).x}, + ${lMap.latLngToLayerPoint(d.LatLng).y})`; + }) + .on('click', (location) => { + select(location.events); + }); + + const eventsDom = g.selectAll('.location').selectAll('.location-event-marker') + .data((d, i) => getLocationEventsDistribution(domain.locations[i]), + (d, i) => 'location-' + i); + + eventsDom + .exit() + .attr('r', 0) + .remove(); + + eventsDom + .transition() + .duration(500) + .attr('r', d => (d) ? Math.sqrt(16 * d) + 3 : 0); + + eventsDom + .enter().append('circle') + .attr('class', 'location-event-marker') + .style('fill', (d, i) => groupColors[domain.categoryGroups[i]]) + .transition() + .duration(500) + .attr('r', d => (d) ? Math.sqrt(16 * d) + 3 : 0); + } + + // NB: is this a function to be removed for future features? + function renderSites() { + sitesLayer.clearLayers(); + lMap.removeLayer(sitesLayer); + + // Create a label for each attack site, persistent across filtering + if (app.views.sites) { + domain.sites.forEach((site) => { + if (isNotNullNorUndefined(site)) { + // Create an invisible marker for each site label + const siteMarker = L.circleMarker([+site.latitude, +site.longitude], { + radius: 0, + stroke: 0 + }); + + siteMarker.bindTooltip(site.site, settingsSiteLabel).openTooltip(); + + // Add this one attack marker to group attack layer + sitesLayer.addLayer(siteMarker); + } + }); + + lMap.addLayer(sitesLayer); + } + } + + // NB: is this a function to be removed for future features? + /** + * Creats a marker for an eventPoint along a path + * @param {Object} eventPoint: data for an evenPoint - time, loc, tags, etc + * @param {number} step: the portion of the entire path this event corresponds to + */ + function createPathEventMarker(eventPoint, step) { + const { + latitude, + longitude + } = getEventLocation(eventPoint); + const pathEventMarker = L.circleMarker( + [latitude, longitude], { + color: ui.colors.DARKGREY, + fill: ui.colors.DARKGREY, + weight: 2, + fillOpacity: 0.6, + radius: 10 * step, + }, + ); + + // Add marker event handlers + pathEventMarker.bindPopup(''); + pathEventMarker.on('popupopen', () => { + select([eventPoint]); + }); + pathEventMarker.on('popupclose', () => { + select(); + }); + + return pathEventMarker; + } + + /** + * Updates displayable data on the map: events, coevents and paths + * @param {Object} domain: object of arrays of events, coevs, attacks, paths, sites + */ + function update(newDomain, newApp) { + updateSVG(); + + if (hash(domain) !== hash(newDomain)) { + domain.locations = newDomain.locations; + domain.categoryGroups = newDomain.categoryGroups; + domain.sites = newDomain.sites; + renderDomain(); + } + + if (hash(app) !== hash(newApp)) { + app.selected = newApp.selected; + app.highlighted = newApp.highlighted; + app.views = newApp.views; + + renderSelectedAndHighlight(); + } + } + + /** + * Renders events on the map: takes data, and enters, updates and exits + */ + function renderDomain () { + renderSites(); + renderEvents(); + } + function renderSelectedAndHighlight () { + renderSelected(); + renderHighlighted(); + } + + /** + * Expose only relevant functions + */ + return { + update + }; +} diff --git a/src/js/timeline/timeline.js b/src/js/timeline/timeline.js new file mode 100644 index 0000000..7226b28 --- /dev/null +++ b/src/js/timeline/timeline.js @@ -0,0 +1,645 @@ +/* + TIMELINE + Displays events over the course of the night + Allows brushing and selecting periods of time in it + TODO: is it possible to express this idiomatically as React? +*/ +import { + areEqual +} from '../data/utilities'; +import esLocale from '../data/es-MX.json'; +import copy from '../data/copy.json'; + +export default function(app, ui) { + d3.timeFormatDefaultLocale(esLocale); + const formatterWithYear = ui.tools.formatterWithYear; + const parser = ui.tools.parser; + const zoomLevels = [{ + label: '3 años', + duration: 1576800, + active: false + }, + { + label: '3 meses', + duration: 129600, + active: false + }, + { + label: '3 días', + duration: 4320, + active: true + }, + { + label: '12 horas', + duration: 720, + active: false + }, + { + label: '2 horas', + duration: 120, + active: false + }, + { + label: '30 min', + duration: 30, + active: false + }, + { + label: '10 min', + duration: 10, + active: false + }, + ]; + + let events = []; + let categoryGroups = []; + let selected = []; + let range = app.range; + + const filter = app.filter; + const select = app.select; + const getCategoryLabel = app.getCategoryLabel; + const getCategoryGroupColor = app.getCategoryGroupColor; + const getCategoryGroup = app.getCategoryGroup; + + // Play functions + window.playInterval; + let isPlaying = false; + const playDuration = 1000; + + // Drag behavior + let dragPos0; + let transitionDuration = 500; + + // Dimension of the client + const WIDTH_CONTROLS = 180; + const boundingClient = d3.select(`#${ui.dom.timeline}`).node().getBoundingClientRect(); + let WIDTH = boundingClient.width - WIDTH_CONTROLS; + const HEIGHT = 140; + const markerRadius = 15; + // margin + // NB: is it possible to do this with SCSS? + // A: Maybe, although we are using it programmatically here for now + const mg = { + l: 120 + }; + + /** + * Create scales + */ + const scale = {}; + + scale.x = d3.scaleTime() + .domain(range) + .range([mg.l, WIDTH]); + + const groupStep = (106 - 30) / categoryGroups.length; + const groupYs = new Array(categoryGroups.length); + groupYs.map((g, i) => { + return 30 + i * groupStep; + }); + + scale.y = d3.scaleOrdinal() + .domain(categoryGroups) + .range(groupYs); + + /** + * Initilize SVG elements and groups + */ + const dom = {}; + + dom.svg = + d3.select(`#${ui.dom.timeline}`) + .append('svg') + .attr('width', WIDTH) + .attr('height', HEIGHT); + + dom.controls = + d3.select(`#${ui.dom.timeline}`) + .append('svg') + .attr('class', 'time-controls') + .attr('width', WIDTH_CONTROLS) + .attr('height', HEIGHT); + + /* + * Axis group elements + */ + + dom.axis = {}; + + dom.axis.x0 = dom.svg.append('g') + .attr('transform', `translate(0, 25)`) + .attr('class', 'axis xAxis'); + + dom.axis.x1 = dom.svg.append('g') + .attr('transform', `translate(0, 105)`) + .attr('class', 'axis axisHourText'); + + dom.axis.y = dom.svg.append('g') + .attr('transform', `translate(${WIDTH}, 0)`) + .attr('class', 'yAxis'); + + dom.axis.boundaries = dom.svg.selectAll('.axisBoundaries') + .data([0, 1]) + .enter().append('line') + .attr('class', 'axisBoundaries'); + + dom.axis.label0 = dom.svg.append('text') + .attr('class', 'timeLabel0 timeLabel'); + + dom.axis.label1 = dom.svg.append('text') + .attr('class', 'timelabelF timeLabel'); + + /* + * Plottable elements + */ + dom.dataset = dom.svg.append('g'); + dom.events = dom.dataset.append('g'); + + /* + * Time Controls + */ + dom.forward = dom.svg.append('g').attr('class', 'time-controls-inline'); + dom.forward.append('circle'); + dom.forward.append('path'); + + dom.backwards = dom.svg.append('g').attr('class', 'time-controls-inline'); + dom.backwards.append('circle'); + dom.backwards.append('path'); + + dom.playGroup = dom.controls.append('g'); + dom.playGroup.append('circle'); + + dom.play = dom.playGroup.append('g'); + dom.play.append('path'); + + dom.pause = dom.playGroup.append('g').style('opacity', 0); + dom.pause.append('rect'); + dom.pause.append('rect'); + + dom.zooms = dom.controls.append('g'); + + dom.zooms.selectAll('.zoom-level-button') + .data(zoomLevels) + .enter().append('text') + .attr('class', 'zoom-level-button'); + + /* + * Initialize axis function and element group + */ + const axis = {}; + + axis.x0 = + d3.axisBottom(scale.x) + .ticks(10) + .tickPadding(5) + .tickSize(80) + .tickFormat(d3.timeFormat('%d %b')); + + axis.x1 = + d3.axisBottom(scale.x) + .ticks(10) + .tickPadding(20) + .tickSize(0) + .tickFormat(d3.timeFormat('%H:%M')); + + axis.y = + d3.axisLeft(scale.y) + .tickValues([]); + + /* + * Setup drag behavior + */ + const drag = + d3.drag() + .on('start', () => { + d3.event.sourceEvent.stopPropagation(); + dragPos0 = d3.event.x; + toggleTransition(false); + }) + .on('drag', () => { + const drag0 = scale.x.invert(dragPos0).getTime(); + const dragNow = scale.x.invert(d3.event.x).getTime(); + const timeShift = (drag0 - dragNow) / 1000; + + const newDomain0 = d3.timeSecond.offset(range[0], timeShift); + const newDomainF = d3.timeSecond.offset(range[1], timeShift); + + scale.x.domain([newDomain0, newDomainF]) + render(); + }) + .on('end', () => { + toggleTransition(true); + filter({ + range: scale.x.domain() + }); + }); + + /* + * SVG groups for marker + */ + + dom.markers = dom.svg.append('g'); + + /** + * Adapt dimensions when resizing + */ + function getCurrentWidth() { + return d3.select(`#${ui.dom.timeline}`).node() + .getBoundingClientRect().width; + } + + /** + * Resize timeline one window resice + */ + function addResizeListener() { + window.addEventListener('resize', () => { + if (d3.select(`#${ui.dom.timeline}`).node() !== null) { + WIDTH = getCurrentWidth() - WIDTH_CONTROLS; + + dom.svg.attr('width', WIDTH); + scale.x.range([mg.l, WIDTH]); + axis.y.tickSize(WIDTH - mg.l); + dom.axis.y.attr('transform', `translate(${WIDTH}, 0)`) + render(null); + } + }); + } + addResizeListener(); + + /** + * PLAY FUNCTIONALITY + */ + function stopBrushTransition() { + clearInterval(window.playInterval); + isPlaying = false; + dom.play.style('opacity', 1); + dom.pause.style('opacity', 0); + } + + /** + * START PLAY SERIES OF TRANSITIONS + */ + function playBrushTransition() { + isPlaying = true; + dom.play.style('opacity', 0); + dom.pause.style('opacity', 1); + window.playInterval = setInterval(() => { + moveTime('forward'); + }, playDuration); + } + + /** + * Return which color event circle should be based on incident type + * @param {object} eventPoint data object + */ + function getEventPointFillColor(eventPoint) { + return getCategoryGroupColor(eventPoint.category); + } + + /** + * Given an event, get all the filtered events that happen simultaneously + * @param {object} eventPoint: regular eventPoint data + */ + function getAllEventsAtOnce(eventPoint) { + const timestamp = eventPoint.timestamp; + const categoryGroup = getCategoryGroup(eventPoint.category); + return events.filter(event => { + return (event.timestamp === timestamp && + categoryGroup === getCategoryGroup(event.category)) + }).map(event => event.id); + } + + /* + * Get y height of eventPoint, considering the ordinal Y scale + * @param {object} eventPoint: regular eventPoint data + */ + function getEventY(eventPoint) { + const yGroup = getCategoryGroup(eventPoint.category); + return scale.y(yGroup); + } + + /* + * Get x position of eventPoint, considering the time scale + * @param {object} eventPoint: regular eventPoint data + */ + function getEventX(eventPoint) { + return scale.x(parser(eventPoint.timestamp)); + } + + function getTimeScaleExtent() { + return (scale.x.domain()[1].getTime() - scale.x.domain()[0].getTime()) / 60000; + } + + /* + * Given a number of minutes, calculate the width based on current scale.x + * @param {number} minutes: number of minutes + */ + function getWidthOfTime(minutes) { + const allMins = getTimeScaleExtent(); + return (minutes * WIDTH) / allMins; + } + + function highlightZoomLevel(zoom) { + zoomLevels.forEach((level) => { + if (level.label === zoom.label) { + level.active = true; + } else { + level.active = false; + } + }); + + dom.zooms.selectAll('text') + .classed('active', level => level.active); + } + + /** + * Apply zoom level to timeline + * @param {object} zoom: zoom level from zoomLevels + */ + function applyZoom(zoom) { + highlightZoomLevel(zoom); + + const extent = getTimeScaleExtent(); + const newCentralTime = d3.timeMinute.offset(scale.x.domain()[0], extent / 2); + + const domain0 = d3.timeMinute.offset(newCentralTime, -zoom.duration / 2); + const domainF = d3.timeMinute.offset(newCentralTime, zoom.duration / 2); + + scale.x.domain([domain0, domainF]); + filter({ + range: scale.x.domain() + }); + } + + /** + * Shift time range by moving forward or backwards + * @param {Stirng} direction: 'forward' / 'backwards' + */ + function moveTime(direction) { + select(); + const extent = getTimeScaleExtent(); + const newCentralTime = d3.timeMinute.offset(scale.x.domain()[0], extent / 2); + + // if forward + let domain0 = newCentralTime; + let domainF = d3.timeMinute.offset(newCentralTime, extent); + + // if backwards + if (direction === 'backwards') { + domain0 = d3.timeMinute.offset(newCentralTime, -extent); + domainF = newCentralTime; + } + + scale.x.domain([domain0, domainF]); + filter({ + range: scale.x.domain() + }); + } + + function toggleTransition(isTransition) { + transitionDuration = (isTransition) ? 500 : 0; + } + + /** + * Highlight event circle on hover + */ + function handleMouseOver() { + d3.select(this) + .attr('r', 7) + .classed('mouseover', true); + } + + /** + * Unhighlight event when mouse out + */ + function handleMouseOut() { + d3.select(this) + .attr('r', 5) + .classed('mouseover', false); + } + + /** + * It automatically sets brush timeline to a domain set by the params + */ + function updateTimeRange() { + scale.x.domain(range); + axis.x0.scale(scale.x); + axis.x1.scale(scale.x); + } + + + /** + * Display the current time range in the time label above the timeline + */ + function renderTimeLabels() { + dom.axis.label0 + .attr('x', 5) + .attr('y', 15) + .text(formatterWithYear(range[0])); + + dom.axis.label1 + .attr('x', WIDTH - 5) + .attr('y', 15) + .text(formatterWithYear(range[1])) + .style('text-anchor', 'end'); + } + + /** + * Makes a circular rinig mark in one particular location at a time + * @param {object} eventPoint: object with eventPoint data (time, loc, tags) + */ + function renderHighlight() { + const markers = dom.markers + .selectAll('circle') + .data(selected); + + markers + .enter() + .append('circle') + .attr('class', 'timeline-marker') + .merge(markers) + .attr('cy', eventPoint => getEventY(eventPoint)) + .attr('cx', eventPoint => getEventX(eventPoint)) + .attr('r', 10) + .style('opacity', .9); + + markers.exit().remove(); + } + + /** + * Return event circles of different groups + */ + function renderEvents() { + const eventsDom = dom.events + .selectAll('.event') + .data(events, d => d.id); + + eventsDom + .exit() + .remove(); + + eventsDom + .transition() + .duration(transitionDuration) + .attr('cx', eventPoint => getEventX(eventPoint)); + + eventsDom + .enter() + .append('circle') + .attr('class', 'event') + .attr('cx', eventPoint => getEventX(eventPoint)) + .attr('cy', eventPoint => getEventY(eventPoint)) + .style('fill', eventPoint => getEventPointFillColor(eventPoint)) + .on('click', eventPoint => select(getAllEventsAtOnce(eventPoint))) + .on('mouseover', handleMouseOver) + .on('mouseout', handleMouseOut) + .transition() + .delay(300) + .duration(200) + .attr('r', 5); + } + + /** + * Render axis on timeline and viewbox boundaries + */ + function renderAxis() { + dom.axis.x0 + .call(drag); + + dom.axis.x1 + .call(drag); + + dom.axis.x0 + .transition() + .duration(transitionDuration) + .call(axis.x0); + + dom.axis.x1 + .transition() + .duration(transitionDuration) + .call(axis.x1); + + axis.y.tickSize(WIDTH - mg.l); + + dom.axis.y + .call(axis.y) + .call(drag); + + dom.axis.boundaries + .attr('x1', (d, i) => scale.x.range()[i]) + .attr('x2', (d, i) => scale.x.range()[i]) + .attr('y1', 10) + .attr('y2', 20); + + dom.axis.label1 + .attr('x', scale.x.range()[1] - 5); + } + + /** + * Render left and right time shifting controls + */ + function renderTimeControls() { + const zoomLabels = copy[app.language].timeline.zooms; + zoomLevels.forEach((level, i) => { + level.label = zoomLabels[i]; + }); + + // These controls on timeline svg + dom.backwards.select('circle') + .attr('transform', `translate(${scale.x.range()[0] + 20}, 62)`) + .attr('r', 15); + + dom.backwards.select('path') + .attr('d', d3.symbol().type(d3.symbolTriangle).size(80)) + .attr('transform', `translate(${scale.x.range()[0] + 20}, 62)rotate(270)`); + + dom.forward.select('circle') + .attr('transform', `translate(${scale.x.range()[1] - 20}, 62)`) + .attr('r', 15); + + dom.forward.select('path') + .attr('d', d3.symbol().type(d3.symbolTriangle).size(80)) + .attr('transform', `translate(${scale.x.range()[1] - 20}, 62)rotate(90)`); + + // These controls on separate svg + dom.playGroup.select('circle') + .attr('transform', 'translate(135, 60)rotate(90)') + .attr('r', 25); + + dom.play.select('path') + .attr('d', d3.symbol().type(d3.symbolTriangle).size(260)) + .attr('transform', 'translate(135, 60)rotate(90)'); + + dom.pause.selectAll('rect') + .attr('transform', (d, i) => `translate(${125 + (i * 15)}, 47)`) + .attr('height', 25) + .attr('width', 5); + + dom.zooms.selectAll('text') + .text(d => d.label) + .attr('x', 60) + .attr('y', (d, i) => (i * 15) + 20) + .classed('active', level => level.active); + + dom.forward + .on('click', () => moveTime('forward')); + + dom.backwards + .on('click', () => moveTime('backwards')); + + dom.playGroup + .on('click', () => { + return (isPlaying) ? stopBrushTransition() : playBrushTransition(); + }); + + dom.zooms.selectAll('text') + .on('click', zoom => applyZoom(zoom)); + } + + /** + * Updates data displayed by this timeline, but only render if necessary + * @param {Object} domain: Redux state domain subtree + * @param {Object} app: Redux state app subtree + */ + function updateAxis(domain) { + categoryGroups = domain.categoryGroups + const groupStep = (106 - 30) / categoryGroups.length; + let groupYs = Array.apply(null, Array(categoryGroups.length)); + groupYs = groupYs.map((g, i) => { + return 30 + i * groupStep; + }); + + scale.y = d3.scaleOrdinal() + .domain(categoryGroups) + .range(groupYs); + + axis.y = + d3.axisLeft(scale.y) + .tickValues(categoryGroups); + } + + function update(domain, app) { + updateAxis(domain); + renderAxis(); + + events = domain.events; + range = app.range; + selected = app.selected.slice(0); + updateTimeRange(); + } + + function render() { + renderAxis(); + renderTimeControls(); + renderTimeLabels(); + + renderEvents(); + renderHighlight(); + } + + return { + update, + render, + }; +} diff --git a/src/reducers/app.js b/src/reducers/app.js new file mode 100644 index 0000000..c252f82 --- /dev/null +++ b/src/reducers/app.js @@ -0,0 +1,88 @@ +import initial from '../store/initial.js'; + +import { + UPDATE_HIGHLIGHTED, + UPDATE_SELECTED, + UPDATE_FILTERS, + UPDATE_TIMERANGE, + RESET_ALLFILTERS, + TOGGLE_LANGUAGE, + FETCH_ERROR, +} from '../actions'; + +function updateHighlighted(appState, action) { + return Object.assign({}, appState, { + highlighted: action.highlighted + }); +} + +function updateSelected(appState, action) { + return Object.assign({}, appState, { + selected: action.selected + }); +} + +function updateFilters(appState, action) { // XXX + return Object.assign({}, appState, { + filters: Object.assign({}, appState.filters, action.filters) + }); +} + +function updateTimeRange(appState, action) { // XXX + return Object.assign({}, appState, { + filters: Object.assign({}, appState.filters, action.range), + }); +} + +function resetAllFilters(appState) { // XXX + return Object.assign({}, appState, { + filters: Object.assign({}, appState.filters, { + tags: [], + categories: [], + range: [ + d3.timeParse("%Y-%m-%dT%H:%M:%S")("2014-09-25T12:00:00"), + d3.timeParse("%Y-%m-%dT%H:%M:%S")("2014-09-28T12:00:00") + ], + }), + selected: [], + }); +} + +function toggleLanguage(appState, action) { + let otherLanguage = (appState.language === 'es-MX') ? 'en-US' : 'es-MX'; + return Object.assign({}, appState, { + language: action.language || otherLanguage + }); +} + +function fetchError(state, action) { + return { + ...state, + error: action.message, + notifications: [{ type: 'error', message: action.message }] + } +} + + +function app(appState = initial.app, action) { + switch (action.type) { + case UPDATE_HIGHLIGHTED: + return updateHighlighted(appState, action); + case UPDATE_SELECTED: + return updateSelected(appState, action); + case UPDATE_FILTERS: + return updateFilters(appState, action); + case UPDATE_TIMERANGE: + return updateTimeRange(appState, action); + case RESET_ALLFILTERS: + return resetAllFilters(appState, action); + case TOGGLE_LANGUAGE: + return toggleLanguage(appState, action); + case FETCH_ERROR: + return fetchError(appState, action); + default: + return appState; + } +} + +export default app; diff --git a/src/reducers/domain.js b/src/reducers/domain.js new file mode 100644 index 0000000..11a64d9 --- /dev/null +++ b/src/reducers/domain.js @@ -0,0 +1,25 @@ +import initial from '../store/initial.js'; + +import { + UPDATE_DOMAIN, +} from '../actions'; + +import { parseDateTimes } from './utils/helpers.js'; +import { validate } from './utils/validators.js'; + +function updateDomain(domainState, action) { + action.domain.events = parseDateTimes(action.domain.events); + + return Object.assign({}, domainState, validate(action.domain)); +} + +function domain(domainState = initial.domain, action) { + switch (action.type) { + case UPDATE_DOMAIN: + return updateDomain(domainState, action); + default: + return domainState; + } +} + +export default domain; diff --git a/src/reducers/index.js b/src/reducers/index.js new file mode 100644 index 0000000..c940079 --- /dev/null +++ b/src/reducers/index.js @@ -0,0 +1,13 @@ +import { + combineReducers +} from 'redux' + +import domain from './domain.js' +import app from './app.js' +import ui from './ui.js' + +export default combineReducers({ + app, + domain, + ui +});; diff --git a/src/reducers/schema/categorySchema.js b/src/reducers/schema/categorySchema.js new file mode 100644 index 0000000..4156379 --- /dev/null +++ b/src/reducers/schema/categorySchema.js @@ -0,0 +1,12 @@ +import Joi from 'joi'; + +const categorySchema = Joi.object().keys({ + category: Joi.string().required(), + category_label: Joi.string().allow('').required(), + group: Joi.string(), + group_label: Joi.string(), +}); + +const optionalSchema = categorySchema.optionalKeys('group', 'group_label'); + +export default categorySchema; diff --git a/src/reducers/schema/eventSchema.js b/src/reducers/schema/eventSchema.js new file mode 100644 index 0000000..c01528e --- /dev/null +++ b/src/reducers/schema/eventSchema.js @@ -0,0 +1,20 @@ +import Joi from 'joi'; + +const eventSchema = Joi.object().keys({ + id: Joi.string().required(), + description: Joi.string().allow('').required(), + date: Joi.string().required(), + time: Joi.string().required(), + time_precision: Joi.string().allow(''), + location: Joi.string().allow('').required(), + latitude: Joi.string().required(), + longitude: Joi.string().required(), + type: Joi.string().allow(''), + category: Joi.string().required(), + source: Joi.string().allow(''), + tags: Joi.string().allow(''), + comments: Joi.string().allow(''), + timestamp: Joi.string().required(), +}); + +export default eventSchema; diff --git a/src/reducers/schema/siteSchema.js b/src/reducers/schema/siteSchema.js new file mode 100644 index 0000000..f58a71c --- /dev/null +++ b/src/reducers/schema/siteSchema.js @@ -0,0 +1,11 @@ +import Joi from 'joi'; + +const siteSchema = Joi.object().keys({ + id: Joi.string().required(), + description: Joi.string().allow('').required(), + site: Joi.string().required(), + latitude: Joi.string().required(), + longitude: Joi.string().required() +}); + +export default siteSchema; diff --git a/src/reducers/ui.js b/src/reducers/ui.js new file mode 100644 index 0000000..2180304 --- /dev/null +++ b/src/reducers/ui.js @@ -0,0 +1,104 @@ +import initial from '../store/initial.js'; + +import { + TOGGLE_FETCHING_DOMAIN, + TOGGLE_FETCHING_EVENTS, + TOGGLE_VIEW, + TOGGLE_TIMELINE, + OPEN_CABINET, + CLOSE_CABINET, + TOGGLE_INFOPOPUP, + TOGGLE_NOTIFICATIONS +} from '../actions' + +function toggleFetchingDomain(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isFetchingDomain: !uiState.flags.isFetchingDomain + }) + }); +} + +function toggleFetchingEvents(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isFetchingEvents: !uiState.flags.isFetchingEvents + }) + }); +} + +function toggleView(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isView2d: !uiState.flags.isView2d + }) + }); +} + +function toggleTimeline(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isTimeline: !uiState.flags.isTimeline + }) + }); +} + +function closeCabinet(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isCabinet: false + }) + }); +} + +function openCabinet(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isCabinet: true + }), + components: Object.assign({}, uiState.components, { + cabinetFileTab: action.tabNum, + }) + }); +} + +function toggleInfoPopup(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isInfopopup: !uiState.flags.isInfopopup + }) + }); +} + +function toggleNotifications(uiState, action) { + return Object.assign({}, uiState, { + flags: Object.assign({}, uiState.flags, { + isNotification: !uiState.flags.isNotification + }) + }); +} + +function ui(uiState = initial.ui, action) { + switch (action.type) { + case TOGGLE_FETCHING_DOMAIN: + return toggleFetchingDomain(uiState, action); + case TOGGLE_FETCHING_EVENTS: + return toggleFetchingEvents(uiState, action); + case TOGGLE_VIEW: + return toggleView(uiState, action); + case TOGGLE_TIMELINE: + return toggleTimeline(uiState, action); + case OPEN_CABINET: + return openCabinet(uiState, action); + case CLOSE_CABINET: + return closeCabinet(uiState, action); + case TOGGLE_INFOPOPUP: + return toggleInfoPopup(uiState, action); + case TOGGLE_NOTIFICATIONS: + return toggleNotifications(uiState, action); + default: + return uiState; + } +} + +export default ui; diff --git a/src/reducers/utils/helpers.js b/src/reducers/utils/helpers.js new file mode 100644 index 0000000..0a0509a --- /dev/null +++ b/src/reducers/utils/helpers.js @@ -0,0 +1,18 @@ +export function parseDateTimes(arrayToParse) { + const parsedArray = []; + + arrayToParse.forEach(item => { + let incoming_datetime = `${item.date}T00:00`; + if (item.time) incoming_datetime = `${item.date}T${item.time}`; + const parser = d3.timeParse(process.env.INCOMING_DATETIME_FORMAT); + item.timestamp = d3.timeFormat("%Y-%m-%dT%H:%M:%S")(parser(incoming_datetime)); + + parsedArray.push(item); + }); + + return parsedArray; +} + +export function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} diff --git a/src/reducers/utils/validators.js b/src/reducers/utils/validators.js new file mode 100644 index 0000000..b6c38b9 --- /dev/null +++ b/src/reducers/utils/validators.js @@ -0,0 +1,75 @@ +import Joi from 'joi'; + +import eventSchema from '../schema/eventSchema.js'; +import categorySchema from '../schema/categorySchema.js'; +import siteSchema from '../schema/siteSchema.js'; + +import { capitalize } from './helpers.js'; + +/* +* Create an error notification object +* Types: ['error', 'warning', 'good', 'neural'] +*/ +function makeError(type, id, message) { + return { + type: 'error', + id, + message: `${type} ${id}: ${message}` + } +} + +/* +* Validate domain schema +*/ +export function validate(domain) { + const sanitizedDomain = { + events: [], + categories: [], + sites: [], + notifications: domain.notifications, + tags: domain.tags + } + + const discardedDomain = { + events: [], + categories: [], + sites: [] + } + + function validateItem(item, domainClass, schema) { + const result = Joi.validate(item, schema); + if (result.error !== null) { + const id = item.id || '-'; + const domainStr = capitalize(domainClass); + const error = makeError(domainStr, id, result.error.message); + + discardedDomain[domainClass].push(Object.assign(item, { error })); + } else { + sanitizedDomain[domainClass].push(item); + } + } + + domain.events.forEach(event => { + validateItem(event, 'events', eventSchema); + }); + domain.categories.forEach(category => { + validateItem(category, 'categories', categorySchema); + }); + domain.sites.forEach(site => { + validateItem(site, 'sites', siteSchema); + }); + + // Message the number of failed items + Object.keys(discardedDomain).forEach(disc => { + const len = discardedDomain[disc].length; + if (len) { + sanitizedDomain.notifications.push({ + message: `${len} invalid ${disc} not displayed.`, + items: discardedDomain[disc], + type: 'error' + }); + } + }) + + return sanitizedDomain; +} diff --git a/src/scss/_animations.scss b/src/scss/_animations.scss new file mode 100644 index 0000000..1662964 --- /dev/null +++ b/src/scss/_animations.scss @@ -0,0 +1,21 @@ +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fallFadeIn { + from { + transform: translate(0, -40px); + opacity: 0; + } + + to { + transform: none; + opacity: 1; + } +} diff --git a/src/scss/_burger.scss b/src/scss/_burger.scss new file mode 100644 index 0000000..29c0e1d --- /dev/null +++ b/src/scss/_burger.scss @@ -0,0 +1,114 @@ + +// Burger transition +.side-menu-burg { + position: absolute; + overflow: hidden; + float: right; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + appearance: none; + box-shadow: none; + border-radius: none; + border: none; + cursor: pointer; + background: none; + + &.hidden { + display: none; + } + + span { + display: block; + position: absolute; + top: 9px; + left: 0px; + right: 0px; + height: 2px; + background: $offwhite; + border-radius: 4px; + } + + span::before, + span::after { + position: absolute; + display: block; + left: 0; + width: 100%; + height: 2px; + background: $offwhite; + border-radius: 4px; + content: ""; + transition-duration: 0.2s, 0.2s; + transition-delay: 0.2s, 0s; + } + + span::before { + transition-property: top, transform; + top: -8px; + } + + span::after { + transition-property: bottom, transform; + bottom: -8px; + } + + &:hover { + span::before { + top: -6px; + } + + span::after { + bottom: -6px; + } + } + + &.is-active { + span { + background: $midwhite; + transform: rotate(45deg); + transition-delay: 0s, 0.2s; + } + + span::before, + span::after { + background: $midwhite; + transition-delay: 0s, 0.2s; + } + + span::before { + top: 0; + transform: rotate(0deg); + -webkit-transform: rotate(0deg); + } + + span::after { + bottom: 0; + transform: rotate(-90deg); + -webkit-transform: rotate(-90deg); + } + + &:hover { + span, + span::before, + span::after { + transition: 0.2s ease; + background: $offwhite; + } + } + + &.over-white:hover { + span, + span:before, + span:after { + transition: 0.2s ease; + background: $darkgrey; + } + } + } +} + +.side-menu-burg:focus { + outline: none; +} diff --git a/src/scss/_colors.scss b/src/scss/_colors.scss new file mode 100644 index 0000000..8182e8d --- /dev/null +++ b/src/scss/_colors.scss @@ -0,0 +1,15 @@ +$offwhite: #efefef; +$midwhite: #a0a0a0; +$darkwhite: darken($midwhite, 15%); +$yellow: #ffd800; +$red: rgb(233, 0, 19); +$green: rgb(61, 241, 79); +$midgrey: rgb(44, 44, 44); +$darkgrey: #232323; +$black: #000000; + +$category_group00: #FF0000; +$category_group01: #226b22; +$category_group02: #671f6f; +$category_group03: #0000bf; +$category_group04: #d3ce2a; diff --git a/src/scss/_fonts.scss b/src/scss/_fonts.scss new file mode 100644 index 0000000..55463e9 --- /dev/null +++ b/src/scss/_fonts.scss @@ -0,0 +1,9 @@ +$xsmall: 10px;//0.7em; +$small: 11px;//0.9em; +$normal: 12px;//1em; +$large: 14px;//1.1em; +$xlarge: 16px;//1.2em; +$xxlarge: 20px;//1.4em; +$xxxlarge: 32px; +$title: 36px; +$cover-title: 68px; diff --git a/src/scss/_icons.scss b/src/scss/_icons.scss new file mode 100644 index 0000000..6d7689e --- /dev/null +++ b/src/scss/_icons.scss @@ -0,0 +1,16 @@ +.icon { + display: inline-block; + width: 32px; + height: 1em; + stroke-width: 0; + stroke: $offwhite; + fill: $offwhite; + transform: scale(1.4); + cursor: pointer; + + &:hover { + transition: 0.2s ease; + stroke: $yellow; + fill: $yellow; + } +} diff --git a/src/scss/_levels.scss b/src/scss/_levels.scss new file mode 100644 index 0000000..b2e56ce --- /dev/null +++ b/src/scss/_levels.scss @@ -0,0 +1,12 @@ +/* z-index levels */ +$final-level: 10000; +$loading-overlay: 1000; +$overheader: 100; +$header: 10; +$map-overlay2: 4; +$map-overlay: 2; +$map: 1; +$scene: 1; +$hidden: -1; +$timeline: 3; +$timeslider: 3; diff --git a/src/scss/_video.scss b/src/scss/_video.scss new file mode 100644 index 0000000..a32d175 --- /dev/null +++ b/src/scss/_video.scss @@ -0,0 +1,44 @@ +.fullscreen-bg { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + z-index: -100; +} + +.fullscreen-bg__video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + -webkit-filter: contrast(70%) brightness(70%) grayscale(30%); /* Webkit */ + filter: gray; /* IE6-9 */ + filter: contrast(70%) brightness(70%) grayscale(30%) /* W3C */ +} + +@media (min-aspect-ratio: 16/9) { + .fullscreen-bg__video { + height: 300%; + top: -100%; + } +} + +@media (max-aspect-ratio: 16/9) { + .fullscreen-bg__video { + width: 300%; + left: -100%; + } +} + +@media (max-width: 767px) { + .fullscreen-bg { + background: url('/static/archive/img/city.jpg') center center / cover no-repeat; + } + + .fullscreen-bg__video { + display: none; + } +} diff --git a/src/scss/cabinet.scss b/src/scss/cabinet.scss new file mode 100644 index 0000000..5c132ea --- /dev/null +++ b/src/scss/cabinet.scss @@ -0,0 +1,827 @@ +@import 'icons'; +@import 'video'; + +.cabinet-wrapper { + overflow: auto; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + display: table; + table-layout: fixed; + color: $offwhite; + background-color: $black; + font-family: 'Merriweather', serif; + transition: opacity 0.5s ease 0.1s, z-index 0.1s ease 0s; + opacity: 1; + z-index: $final-level; + + &.hidden { + transition: opacity 0.5s ease 0s, z-index 0.1s ease 0.5s; + opacity: 0; + z-index: $hidden; + } + + &.show { + z-index: $final-level; + } + + .top-action { + position: fixed; + top: 20px; + right: 20px; + z-index: 1; + + button { + font-family: 'Lato'; + font-size: $xlarge; + text-align: left; + text-transform: uppercase; + background: none; + border: none; + color: $offwhite; + outline: none; + cursor: pointer; + transition: 0.2s ease; + letter-spacing: 0.1em; + + .label { + height: 28px; + float: left; + line-height: 28px; + padding-left: 10px; + } + + svg { + float: left; + path, circle, polygon, + polyline, line { + stroke-width: 2px; + transition: 0.2s ease; + stroke: $offwhite; + fill: none; + stroke-linecap: round; + } + } + + &:hover { + transition: 0.2s ease; + letter-spacing: 0.15em; + } + } + } + + .cabinet-header { + position: fixed; + top: 0px; + width: 100%; + padding: 20px 0; + background: $black; + transition: 1s ease; + text-transform: uppercase; + font-family: 'Merriweather', serif; + + .header-title { + width: 280px; + margin: 0 auto; + cursor: pointer; + + p { + font-size: $normal; + margin: 0; + width: 100%; + text-align: center; + transition: 2s ease; + letter-spacing: normal; + } + p:first-child { + font-size: 8px; + } + + &:hover { + p { + transition: 2s ease; + letter-spacing: 0.1em; + } + } + } + } + + .share-sm { + position: fixed; + bottom: 20px; + right: 20px; + } + + .side-menu-file-cabinet { + position: fixed; + top: 20px; + left: 20px; + z-index: 1; + } + + .logo-fa { + background: url('/static/archive/img/logo-fa-square.png'); + margin: 0px 0 30px 20px; + height: 30px; + width: 30px; + background-size: 30px; + animation-name: fadeIn; + animation-duration: 3s; + position: fixed; + top: 20px; + cursor: pointer; + } + + &.cabinet-wrapper-files { + display: block; + background: $black; + } + + &.cabinet-wrapper-cover { + background-color: $black; + background-repeat:no-repeat; + -webkit-background-size:cover; + -moz-background-size:cover; + -o-background-size:cover; + background-size:cover; + background-position:center; + } +} + +.cabinet-cover { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + vertical-align: middle; + width: 100%; + bottom: 0; + top: 0; + animation-name: fadeIn; + animation-duration: 0.5s; + + .content { + display: inline-block; + width: 90%; + max-width: 800px; + box-sizing: border-box; + padding: 30px; + border-radius: 2px; + overflow: auto; + } + + .cabinet-cover-header { + width: 100%; + margin-bottom: 20px; + animation-name: fallFadeIn; + animation-duration: 3s; + + .main-title { + .title { + font-size: $cover-title; + text-transform: uppercase; + } + margin-top: 0; + margin-bottom: 0; + } + .untertitle { + font-size: $xxlarge; + text-transform: none; + letter-spacing: 0.1em; + } + } + + .cabinet-cover-content { + width: 100%; + + animation-name: fadeIn; + animation-duration: 3s; + + .tile-row { + position: relative; + padding: 10px; + box-sizing: border-box; + + .tile { + position: relative; + display: inline-block; + width: calc(50% - 20px); + height: 90px; + line-height: 90px; + box-sizing: border-box; + background: none; + border: 1px solid $offwhite; + font-family: 'Lato', Helvetica, sans-serif; + font-size: $xxlarge; + text-transform: uppercase; + cursor: pointer; + transition: 1s ease; + letter-spacing: 0.1em; + + span { + z-index: 1; + } + + &:before { + position: absolute; + content: " "; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: block; + z-index: 0; + transition: 1s ease; + background-color: rgba($black, 0.15); + } + + &:hover { + transition: 1s ease; + letter-spacing: 0.15em; + &:before{ + transition: 1s ease; + background-color: rgba($black, 0.3); + } + } + + &:first-child { + margin-right: 20px; + } + + &.full { + width: 100%; + margin-right: 0; + } + + & * { + position: relative; + } + + .tile-content { + margin: 0 auto; + padding: 30px 0; + width: 200px; + + .label { + height: 28px; + float: left; + line-height: 28px; + padding-left: 10px; + } + + svg { + float: left; + path, circle, polygon, + polyline, line { + stroke-width: 2px; + transition: 0.2s ease; + stroke: $offwhite; + fill: none; + stroke-linecap: round; + } + } + } + } + } + } +} + +.secondary-action { + width: 90px; + margin: 0 auto; + letter-spacing: 0.1em; + text-transform: uppercase; + font-family: 'Lato'; + font-size: $small; + padding: 20px 0; + text-align: center; + transition: 0.2s ease; + border-bottom: 2px solid rgba($offwhite, 0); + cursor: pointer; + + &:hover { + transition: 0.2s ease; + letter-spacing: 0.15em; + border-bottom: 2px solid $yellow; + } +} + +.cabinet-files { + animation-name: fadeIn; + animation-duration: 0.5s; + + &.file-tab-list-off { + ul.cabinet-file-tab-list { + transition: 0.2s ease; + left: -300px; + } + } + + ul.cabinet-file-tab-list { + width: 300px; + position: fixed; + float: left; + top: 0; + bottom: 0; + margin: 0; + padding-top: 160px; + border-right: 1px solid $darkgrey; + background: $black; + transition: 0.2s ease; + left: 0; + z-index: 1; + + li.cabinet-file-tab { + width: calc(100% - 40px); + text-align: left; + border: 0; + margin-left: 20px; + margin-right: 20px; + box-sizing: border-box; + font-family: 'Merriweather', serif; + font-size: $large; + font-weight: 100; + border-bottom: 1px solid $darkgrey; + transition: 0.2s ease; + color: $offwhite; + + &:hover { + transition: 0.2s ease; + color: $yellow; + } + + &.react-tabs__tab--selected { + color: $yellow; + + &:after { + content: ' →'; + } + } + } + + .action { + text-align: left; + border: 0; + box-sizing: border-box; + + button { + margin: 20px; + width: calc(100% - 40px); + letter-spacing: 0.1em; + text-transform: uppercase; + font-family: 'Lato'; + font-size: $large; + text-align: left; + padding-left: 0; + } + + &.secondary-action button { + padding: 20px; + border: 1px solid $midwhite; + text-align: center; + &:hover { + transition: 0.2s ease; + border-color: $offwhite; + background: rgba($offwhite, 0.1); + } + } + } + + .language-toggle { + width: 100%; + position: absolute; + bottom: 0; + z-index: 10; + } + } + + + + .react-tabs__tab-panel { + z-index: 0; + } + + .cabinet-file-content { + width: 90%; + max-width: 800px; + box-sizing: border-box; + padding: 140px 30px 60px 30px; + border-radius: 2px; + overflow: auto; + margin: 0 auto; + text-align: left; + animation-name: fadeIn; + animation-duration: 1.5s; + + h1 { + font-size: $title; + text-align: center; + font-weight: 700; + text-transform: uppercase; + margin-bottom: 50px; + } + + .title-separator { + margin: 0 auto; + width: 100px; + border-bottom: 4px solid $yellow; + margin-bottom: 50px; + } + + h2 { + letter-spacing: normal; + text-transform: capitalize; + margin-top: 40px; + } + + .cabinet-body-text { + padding: 10px 0; + + .section { + margin-bottom: 40px; + } + + p { + margin: 20px 0; + font-size: $xlarge; + font-weight: 100; + line-height: 24px; + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + + .highpoint { + font-size: $xxxlarge; + margin: 60px 0; + border-left: 4px solid $yellow; + padding-left: 20px; + } + + img { + width: 100%; + } + + .actions { + width: 100%; + display: inline-block; + } + + .primary-action { + button { + font-size: $large; + height: 140px; + line-height: 140px; + width: 100%; + padding: 0; + border: 1px solid $offwhite; + background-size: 100%; + color: $offwhite; + cursor: pointer; + outline: none; + font-family: 'Lato', Helvetica, sans-serif; + text-transform: uppercase; + margin-bottom: 10px; + transition: 0.2s ease; + letter-spacing: 0.1em; + + &:after { + content: ' →'; + } + + &:hover { + transition: 0.2s ease; + letter-spacing: 0.15em; + } + } + + &.only-on-mobile { + display: none; + + button:after { + content: ''; + } + } + + &.ja { + button { background-image: url("/static/archive/img/scene01.jpg"); } + } + &.pj { + button { background-image: url("/static/archive/img/scene02.jpg"); } + } + &.st { + button { background-image: url("/static/archive/img/scene03.jpg"); } + } + } + } + } + + .actions { + min-width: 200px; + margin: 0 auto; + + .action { + display: inline-block; + float: left; + } + + button { + font-size: $large; + display: block; + width: 100%; + } + + .primary-action { + width: 100%; + animation-name: fadeIn; + animation-duration: 1s; + + &:first-child { + margin-right: 5%; + } + + button { + height: 120px; + margin: 20px auto; + letter-spacing: 0.1em; + text-transform: uppercase; + font-family: 'Lato'; + } + + &.mobile { + width: 100%; + } + } + + .document-action { + width: 100%; + border: 0; + display: block; + margin: 0 auto; + clear: both; + + button { + display: inline-block; + text-align: center; + width: 100%; + height: 40px; + line-height: 40px; + margin: 10px auto; + padding: 0; + letter-spacing: 0.1em; + text-transform: uppercase; + border: 0; + outline: none; + border-bottom: 4px solid rgba($yellow, 0); + background: none; + + a { + text-align: center; + box-sizing: border-box; + padding-bottom: 5px; + cursor: pointer; + text-decoration: none; + color: $offwhite; + + &:after { + content: '↓'; + } + &:hover { + transition: 0.2s ease; + border-bottom: 4px solid rgba($yellow, 1); + color: $yellow; + } + } + } + } + + &:last-child { + margin-bottom: 40px; + } + } +} + +/** +* +* VIDEO ON LANDING +*/ + +.fullscreen { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 2; + background: $black; +} +.video { + display: block; + left: 0px; + overflow: hidden; + padding-bottom: 56.25%; /* 56.25% = 16:9. set ratio */ + position: absolute; + top: 50%; + width: 100%; + -webkit-transform-origin: 50% 0; + transform-origin: 50% 0; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.video .wrapper { + display: block; + height: 300%; + left: 0px; + overflow: hidden; + position: absolute; + top: 50%; + width: 100%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.video iframe { + display: block; + height: 100%; + width: 100%; +} + +/* +* VIDEO ON SITE +*/ + +.video-responsive{ + overflow:hidden; + padding-bottom:56.25%; + position:relative; + height:0; +} +.video-responsive iframe{ + left:0; + top:0; + height:100%; + width:100%; + position:absolute; +} + +/* +* Responsiveness +* +*/ + +@media (max-width: 780px) { + .cabinet-files .cabinet-file-content .cabinet-body-text .primary-action { + &.not-on-mobile { + display: none; + } + &.only-on-mobile { + display: block; + } + } + .cabinet-cover { + .content { + padding: 0; + } + .cabinet-cover-header { + margin-bottom: 40px; + + .main-title { + .title { + font-size: 36px; + } + } + .untertitle { + font-size: $normal; + } + } + + .cabinet-cover-content .tile-row { + padding: 0; + + .tile { + width: 60%; + height: 48px; + line-height: 48px; + margin: 0 20%; + margin-bottom: 10px; + font-size: $normal; + &:first-child { + margin-right: 20%; + } + &.tile00 { + display: none; + } + } + } + } + + .cabinet-files { + ul.cabinet-file-tab-list { + width: 100%; + + li.cabinet-file-tab { + text-align: center; + font-size: $normal; + height: 48px; + line-height: 48px; + } + } + + &.file-tab-list-off { + ul.cabinet-file-tab-list { + transition: 0.2s ease; + left: -100%; + } + } + + .cabinet-file-content { + width: 100%; + margin: 0; + padding: 100px 15px 40px 15px; + box-sizing: border-box; + overflow: auto; + + .cabinet-body-text { + padding: 10px 0; + font-size: $xlarge; + + p { + margin: 20px 0; + } + + img { + width: 100%; + } + } + } + } + .top-action.not-on-mobile { + display: none; + } +} + +/* Tablets with very short heights */ +@media (max-height: 768px) and (min-width: 780px) { + .cabinet-cover .content { + max-width: 640px; + } + + .cabinet-cover .cabinet-cover-header { + margin-bottom: 20px; + + .main-title .title { + font-size: 48px; + } + } + + .cabinet-cover .cabinet-cover-content .tile-row .tile { + height: 50px; + line-height: 50px; + font-size: $xlarge; + + .tile-content { + padding: 10px 0; + } + } +} + +@media (min-width: 1350px) { + .cabinet-files { + animation-name: fadeIn; + animation-duration: 0.5s; + + &.file-tab-list-off { + ul.cabinet-file-tab-list { + left: 0; + } + } + } + + .side-menu-file-cabinet { + display: none; + } +} + +/* ----------- Non-Retina Screens ----------- */ +@media screen + and (min-device-width: 1200px) + and (max-device-width: 1600px) + and (-webkit-min-device-pixel-ratio: 1) { +} + +/* ----------- Retina Screens ----------- */ +@media screen + and (min-device-width: 1200px) + and (max-device-width: 1600px) + and (-webkit-min-device-pixel-ratio: 2) + and (min-resolution: 192dpi) { +} diff --git a/src/scss/card.scss b/src/scss/card.scss new file mode 100644 index 0000000..d649cbd --- /dev/null +++ b/src/scss/card.scss @@ -0,0 +1,190 @@ +.event-card { + box-sizing: border-box; + margin: 1px 0 0 0; + padding: 15px; + border: 1px solid rgba(0, 0, 0, 0); + border-radius: 3px; + transition: 0.2 ease; + background: $offwhite; + color: $darkgrey; + box-shadow: 0 19px 19px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + font-size: $large; + line-height: $xxlarge; + transition: 0.2s ease; + height: auto; + + &:hover { + border: 1px solid $yellow; + } + + .card-bottomhalf { + transition: 0.4s ease; + height: auto; + + &.folded { + transition: 0.4s ease; + height: 0; + overflow: hidden; + } + } + + h4 { + text-transform: normal; + margin-bottom: 0; + + &:first-child { + margin-top: 0; + } + } + + p { + margin: 0; + } + + .event-card-section { + margin-bottom: 10px; + } + + .card-toggle p { + text-align: center; + cursor: pointer; + + .arrow-down { + display: inline-block; + transition: 0.2s ease; + border: solid $darkwhite; + border-width: 0 2px 2px 0; + padding: 3px; + transform: rotate(-135deg); + -webkit-transform: rotate(-135deg); + + &.folded { + transition: 0.2s ease; + transform: rotate(45deg); + -webkit-transform: rotate(45deg); + } + } + + &:hover .arrow-down { + transition: 0.2s ease; + border: solid $darkgrey; + border-width: 0 2px 2px 0; + } + } + + .tags { + width: 100%; + margin: 5px 0; + text-align: left; + } + + .warning { + background: $red; + color: white; + text-transform: uppercase; + width: 100%; + text-align: center; + } + + .timestamp { + font-family: 'Lato', Helvetica, sans-serif; + margin-top: 0; + + .estimated-timestamp { + color: $midwhite; + margin-left: 5px; + } + } + + .category { + .color-category { + width: 12px; + height: 12px; + border-radius: 20px; + display: inline-block; + margin: 0px 5px 0 0; + + &.category_group00 { background: $category_group00; } + &.category_group01 { background: $category_group01; } + &.category_group02 { background: $category_group02; } + &.category_group03 { background: $category_group03; } + &.category_group04 { background: $category_group04; } + } + } + + .event-type { + margin: 0 0 10px 0; + + span { + display: inline-block; + margin: 0 5px 2px 0; + color: $darkgrey; + + &.flagged { + background: $red; + color: $offwhite; + padding: 0 5px; + } + } + } + + .location { + font-family: 'Lato', Helvetica, sans-serif; + } + + .summary { + overflow: auto; + margin-top: 0; + } + + .tag { + display: inline-block; + margin: 0; + margin-right: 5px; + } + + /* + https://github.com/tobiasahlin/SpinKit/blob/master/LICENSE + */ + .spinner { + width: 40px; + height: 40px; + + position: relative; + margin: 20px auto; + } + + .double-bounce1, .double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: $darkgrey; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + + -webkit-animation: sk-bounce 3.0s infinite ease-in-out; + animation: sk-bounce 3.0s infinite ease-in-out; + } + + .double-bounce2 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; + } + + @-webkit-keyframes sk-bounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } + } + + @keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } + } +} diff --git a/src/scss/cardstack.scss b/src/scss/cardstack.scss new file mode 100644 index 0000000..70393db --- /dev/null +++ b/src/scss/cardstack.scss @@ -0,0 +1,92 @@ +@import 'burger'; +@import 'card'; + +.card-stack { + position: absolute; + top: 10px; + right: 10px; + max-height: calc(100% - 208px); + height: auto; + overflow: auto; + box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + z-index: $header; + color: white; + -webkit-font-smoothing: antialiased; + + &.full-height { + max-height: calc(100% - 20px); + } + + .card-stack-header { + min-height: 38px; + line-height: 38px; + width: 360px; + box-sizing: border-box; + padding: 0 5px; + background: $black; + border-radius: 2px; + border: 1px solid $black; + font-size: $large; + transition: 0.2s ease; + text-align: left; + + &:hover { + transition: 0.2s ease; + } + + .header-copy { + margin: 0; + padding: 0 10px; + line-height: 20px; + text-align: right; + + &.top { + padding-top: 10px; + } + + &:last-child { + padding-bottom: 10px; + } + } + + .side-menu-burg { + position: absolute; + left: 8px; + top: 9px; + + span { + width: 20px; + } + } + } + + .card-stack-content { + width: 360px; + + ul { + padding: 0; + margin-top: 1px; + margin-bottom: 0; + } + + .card-list { + height: auto; + } + } + + &.folded { + .card-stack-header { + border: 0; + height: 0; + overflow: hidden; + } + .card-stack-content { + height: 0; + overflow: hidden; + } + } +} + +li { + list-style-type: none; +} diff --git a/src/scss/common.scss b/src/scss/common.scss new file mode 100644 index 0000000..2aa5940 --- /dev/null +++ b/src/scss/common.scss @@ -0,0 +1,137 @@ +@import 'colors'; + +body { + margin: 0; + overflow: hidden; + background: $black; + + a { + text-decoration: none; + + &:hover { + color: $yellow; + } + } +} + +h1 { + font-family: 'Merriweather', serif; +} + +h2 { + text-transform: uppercase; + letter-spacing: 0.1em; +} + +.login-wrapper { + margin-left: 20px; + color: white; + + .login-title { + p.message { + color: $yellow; + } + } + + form span { + width: 120px; + display: inline-block; + } + + form input { + margin: 10px 0; + height: 30px; + box-sizing: border-box; + padding: 0 5px; + outline: none; + font-family: 'Lato', sans-serif; + + &:focus { + border: 3px solid $yellow; + } + } + + form button { + background: $black; + color: white; + width: 120px; + height: 30px; + border: 1px solid $offwhite; + text-transform: uppercase; + letter-spacing: 0.1em; + cursor: pointer; + outline: none; + margin-top: 10px; + margin-left: 320px; + + &:hover, + &:focus { + transition: 0.2s ease; + border: 1px solid $yellow; + color: $yellow; + } + } +} + +.page { + font-family: 'Lato', Helvetica sans-serif; + box-sizing: border-box; + height: 100%; + width: 100%; + + ::-moz-selection { + color: $black; + background: $yellow; + } + ::selection { + color: $black; + background: $yellow; + } +} + +.chart { + background: #000010; +} + +.primary-action { + button { + font-size: 1.2em; + height: 40px; + line-height: 40px; + width: 200px; + padding: 0; + border: 1px solid $offwhite; + background: none; + color: $offwhite; + cursor: pointer; + outline: none; + + &:hover { + transition: 0.2s ease; + color: $yellow; + border: 1px solid $yellow; + background: rgba(white, 0.1); + } + } +} + +/* +Scrollbar +*/ + +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar-track { + background: none; +} + +::-webkit-scrollbar-thumb { + border-radius: 3px; + background: $offwhite; +} + +.hidden { + visibility: hidden; +} diff --git a/src/scss/header.scss b/src/scss/header.scss new file mode 100644 index 0000000..e295bde --- /dev/null +++ b/src/scss/header.scss @@ -0,0 +1,62 @@ +.header { + background: #000000; + position: fixed; + padding: 10px; + z-index: 10; + top: 10px; + right: 10px; + height: 40px; + width: 240px; + box-sizing: border-box; + text-overflow: ellipsis; + box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + cursor: pointer; + + .header-title { + a { + font-family: 'Lato', Helvetica, serif; + color: darken($offwhite, 5%); + font-size: $xlarge; + letter-spacing: 0.1em; + float: left; + text-transform: uppercase; + } + + p { + margin: 0; + } + } + + .side-menu-burg { + right: 10px; + span, + span::before, + span::after { + background: $midwhite; + } + } + + &:hover { + .side-menu-burg { + span { + transition: 0.2s ease; + background: $offwhite; + } + span::before { + transition: 0.2s ease; + top: -6px; + background: $offwhite; + } + + span::after { + transition: 0.2s ease; + bottom: -6px; + background: $offwhite; + } + } + .header-title a { + transition: 0.2s ease; + color: $offwhite; + } + } +} diff --git a/src/scss/infopopup.scss b/src/scss/infopopup.scss new file mode 100644 index 0000000..7c3d56e --- /dev/null +++ b/src/scss/infopopup.scss @@ -0,0 +1,116 @@ +@import 'burger'; + +.infopopup { + width: 400px; + height: 400px; + box-shadow: 10px -10px 38px rgba(0, 0, 0, 0.3), 10px 15px 12px rgba(0, 0, 0, 0.22); + color: $darkgrey; + position: absolute; + background: $offwhite; + border-radius: 5px; + bottom: 20px; + left: 100px; + border: 3px solid $offwhite; + padding: 20px; + box-sizing: border-box; + font-family: 'Lato', 'Helvetica', sans-serif; + font-size: $large; + transition: opacity 0.5s ease 0.1s, z-index 0.1s ease 0s; + opacity: 1; + z-index: $overheader; + + &.hidden { + transition: 0.5s ease; + opacity: 0; + } + + .legend-section { + width: 300px; + padding-left: 60px; + height: 40px; + display: inline-block; + + svg { + width: 100px; + float: left; + display: inline-block; + } + + .legend-labels { + float: left; + display: inline-block; + width: calc(100% - 100px); + + .label { + display: block; + font-size: $xsmall; + margin-top: 10px; + margin-left: 10px; + + .color-category { + width: 8px; + height: 8px; + border-radius: 10px; + display: inline-block; + margin: 0px 5px 0 0; + + &.category_group00 { background: $category_group00; } + &.category_group01 { background: $category_group01; } + &.category_group02 { background: $category_group02; } + &.category_group03 { background: $category_group03; } + &.category_group04 { background: $category_group04; } + } + } + } + + &:first-child { + .legend-labels .label { + margin-top: 0; + } + } + } + + .side-menu-burg { + position: absolute; + right: 8px; + top: 10px; + } + + .legend-item { + display: block; + width: 100%; + display: inline-block; + margin-bottom: 3px; + padding-left: 80px; + + .item-label { + line-height: 15px; + height: 15px; + font-size: $normal; + } + + .color-marker { + display: inline-block; + width: 15px; + height: 15px; + float: left; + margin: 0 10px 0 0; + border-radius: 15px; + + &.victims { background-color: #C90500; } + &.military { background-color: #319C31; } + &.nonstate { background-color: #AC28AC; } + &.state-police { background-color: #0000BF; } + &.iguala-municipal-police { background-color: #00558D; } + &.federal-police { background-color: #5756A2; } + &.huitzuco-municipal-police { background-color: #4ECAC1; } + &.cocula-municipal-police { background-color: #095959; } + &.ambulance { background-color: #ffffff; } + &.other { background-color: #D3CE2A; } + &.drivers { background-color: #822519; } + &.communications { background-color: #a6a6a6; } + &.GIEI { background-color: #ffffff; } + &.PGR { background-color: #000000; } + } + } +} diff --git a/src/scss/loading.scss b/src/scss/loading.scss new file mode 100644 index 0000000..1ccd109 --- /dev/null +++ b/src/scss/loading.scss @@ -0,0 +1,80 @@ +.loading-overlay { + font-family: 'Lato', Helvetica, sans-serif; + font-weight: 300; + width: 100%; + height: 100%; + position: absolute; + background: rgba(0,0,0,0.9); + transition: 0.4s ease; + z-index: $loading-overlay; + opacity: 1; + + .loading-wrapper { + position: fixed; + left: 50%; + top: 40%; + text-align: center; + width: 100%; + margin: 0 0 0 -50%; + height: 100%; + opacity: 1; + + span { + color: $offwhite; + letter-spacing: 0.1em; + text-transform: uppercase; + } + } + + &.hidden { + transition: opacity 0.4s ease, z-index .1s 0.4s; + opacity: 0; + z-index: $hidden; + } + + + /* +https://github.com/tobiasahlin/SpinKit/blob/master/LICENSE + */ + .spinner { + width: 40px; + height: 40px; + + position: relative; + margin: 20px auto; + } + + .double-bounce1, .double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: $offwhite; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + + -webkit-animation: sk-bounce 3.0s infinite ease-in-out; + animation: sk-bounce 3.0s infinite ease-in-out; + } + + .double-bounce2 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; + } + + @-webkit-keyframes sk-bounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } + } + + @keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } + } +} diff --git a/src/scss/main.scss b/src/scss/main.scss new file mode 100644 index 0000000..b36fad6 --- /dev/null +++ b/src/scss/main.scss @@ -0,0 +1,15 @@ +@import 'colors'; +@import 'fonts'; +@import 'levels'; +@import 'animations'; +@import 'common'; +@import 'loading'; +@import 'header'; +@import 'cardstack'; +@import 'map'; +@import 'timeline'; +@import 'tag-filters'; +@import 'toolbar'; +@import 'infopopup'; +@import 'notification'; +@import 'scene'; diff --git a/src/scss/map.scss b/src/scss/map.scss new file mode 100644 index 0000000..f26cace --- /dev/null +++ b/src/scss/map.scss @@ -0,0 +1,223 @@ +@import 'popup'; + +@-webkit-keyframes pulsate { + 0% { opacity: 0.1; } + 50% { opacity: 0.25; } + 100% { opacity: 0.1; } +} + +.map-wrapper { + position: fixed; + top: 0px; + bottom: 0px; + left: 110px; + right: 0; + + .leaflet-container { + height: 100%; + + img.leaflet-tile { + -webkit-filter: contrast(120%) brightness(115%) grayscale(95%); /* Webkit */ + filter: gray; /* IE6-9 */ + filter: contrast(120%) brightness(115%) grayscale(95%); /* W3C */ + } + } + + &.hidden { + z-index: $hidden; + } + &.show { + z-index: $map; + } + .event { + fill: $yellow; + cursor: pointer; + opacity: 0.45; + } + + .link { + stroke: $midgrey; + fill: none; + stroke-width: 2; + stroke-dasharray: 2px 5px; + } + + .site-label { + background: rgba($black,0.6); + color: #fff; + padding: 2px 7px; + font-weight: 500; + font-size: 11px; + font-family: 'Lato', Helvetica, sans-serif; + border: rgba($black,0.6); + letter-spacing: 0.05em; + + &::before { + border-top-color: rgba($black,0.6); + } + } +} + +/* +* Leaflet mapping controls +*/ +.leaflet-touch .leaflet-bar { + .leaflet-control-zoom { + border: 0; + margin-left: 20px; + margin-top: 20px; + } + + a.leaflet-control-zoom-in, + a.leaflet-control-zoom-out { + border: 0; + border-radius: 2px; + color: $yellow; + } + + a.leaflet-control-zoom-in { + border-bottom: 1px solid $yellow; + } +} + +/* +* Leaflet marker and popups +*/ + +.leaflet-svg { + display: block; + + &.hide { + display: none; + } +} + +.leaflet-popup { + display: none; + + &.do-display { + display: block; + } +} + +.leaflet-popup-content-wrapper { + border-radius: 3px; + background: $black; + + .leaflet-popup-content { + color: white; + margin: 0; + padding: 3px 5px; + + .event-card { + margin: 0; + } + } +} + +.leaflet-popup-close-button { + display: none; + + & + .leaflet-popup-content-wrapper .leaflet-popup-content { + padding-top: 3px; + } +} + +.leaflet-popup-tip-container { + display: none; +} + +.leaflet-pane > svg path.bus-route, +.leaflet-pane > svg path.district { + pointer-events: auto; +} + +.eventLocationMarker { + fill: none; + stroke: $yellow; + stroke-width: 2; +} + +/* +* +* Elements +*/ + +.location-event-marker { + stroke-width: 0; + transition: 0.2s ease; + fill-opacity: 0.8; + cursor: pointer; + + &:hover { + transition: 0.2s ease; + fill-opacity: 1; + } +} + +.coevent-marker { + fill-opacity: 0.1; + stroke-dasharray: 8px 4px; + stroke-width: 2px; + opacity: 1; +} +.coevent-path { + stroke-dasharray: 8px 4px; + stroke-width: 2; +} + +.district-boundaries { + fill: $red; + fill-opacity: 0.3; + stroke-width: 2; + stroke: $red; +} + +.path-polyline { + stroke: $darkgrey; + stroke-width: 2px; +} + +.route-polyline { + transition: 0.2s ease; + stroke: $darkgrey; + + &:hover { + transition: 0.2s ease; + stroke: $black; + } +} + +.district-popup { + button { + height: 80px; + line-height: 80px; + width: 200px; + padding: 0; + border: none; + background: none; + background-size: 100%; + color: $offwhite; + cursor: pointer; + outline: none; + font-family: 'Lato', Helvetica, sans-serif; + text-transform: uppercase; + + p { + font-size: $normal; + margin: 0; + transition: 0.2s ease; + letter-spacing: 0.1em; + &:first-child { + font-size: $xsmall; + } + } + + &:hover { + p:last-child { + transition: 0.2s ease; + letter-spacing: 0.15em; + } + } + } +} diff --git a/src/scss/notification.scss b/src/scss/notification.scss new file mode 100644 index 0000000..4b25d46 --- /dev/null +++ b/src/scss/notification.scss @@ -0,0 +1,71 @@ +@import 'burger'; + +.notification-wrapper { + top: 60px; + right: 60px; + width: 400px; + height: auto; + position: absolute; + display: flex; + flex-direction: column; +} + +.notification { + width: 100%; + min-height: 40px; + box-shadow: 10px -10px 38px rgba(0, 0, 0, 0.3), 10px 15px 12px rgba(0, 0, 0, 0.22); + color: $darkgrey; + background: $offwhite; + border-radius: 5px; + border: 3px solid $offwhite; + padding: 20px; + margin-bottom: 10px; + box-sizing: border-box; + font-family: 'Lato', 'Helvetica', sans-serif; + font-size: $large; + transition: opacity 0.5s ease 0.1s, z-index 0.1s ease 0s; + opacity: 1; + z-index: $overheader; + cursor: pointer; + + &:hover { + background: lighten($offwhite, 5%); + transition: background-color 0.4s; + } + + &.hidden { + transition: 0.5s ease; + opacity: 0; + } + + .side-menu-burg { + position: absolute; + right: 8px; + top: 10px; + } + + .message { + display: inline-block; + + &.error { color: red; } + &.warning { color: orange; } + &.good { color: green; } + &.neutral { color: $darkgrey; } + } + + .details { + overflow: hidden; + display: flex; + flex-direction: column; + + &.true { + height: auto; + transition: height 0.4s; + } + + &.false { + height: 0; + transition: height 0.4s; + } + } +} diff --git a/src/scss/popup.scss b/src/scss/popup.scss new file mode 100644 index 0000000..b28686d --- /dev/null +++ b/src/scss/popup.scss @@ -0,0 +1,81 @@ +.popup { + box-sizing: border-box; + margin: 0; + padding: 15px; + border: 0; + opacity: 0; + border-radius: 2px; + transition: 0.2 ease; + background: rgba(0, 0, 0, 0.9); + transition: 0.4s ease; + box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + + &:hover { + transition: 0.4s ease; + box-shadow: 0 29px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + } + + .card-tophalf { + height: 100px; + + .left { + float: left; + width: 120px; + padding-right: 5px; + box-sizing: border-box; + border-right: 1px dotted $midwhite; + } + .right { + float: left; + width: 225px; + padding-left: 5px; + height: 90px; + overflow: hidden; + } + } + + .tag, + p.see-more { + cursor: pointer; + + &:hover { + color: $yellow; + } + } + + p { + margin: 5px 0 0 0; + } + + .timestamp { + font-family: 'Lato', Helvetica, sans-serif; + text-transform: uppercase; + font-size: $xlarge; + margin-top: 0; + } + + .location { + font-family: 'Lato', Helvetica, sans-serif; + font-size: $normal; + color: $offwhite; + } + + .estimated-timestamp { + margin-top: 3px; + margin-left: 3px; + font-size: $xsmall; + color: $midwhite; + text-transform: lowercase; + } + + .summary { + max-height: 200px; + text-overflow: ellipsis; + overflow: scroll; + font-weight: 500; + } + + .source { + text-align: right; + } +} diff --git a/src/scss/scene.scss b/src/scss/scene.scss new file mode 100644 index 0000000..e79ac20 --- /dev/null +++ b/src/scss/scene.scss @@ -0,0 +1,177 @@ +.scene-wrapper { + #container { + position: absolute; + top: 0; + left: 0; + right: 0; + display: block; + } + &.hidden { + z-index: $hidden; + } + &.show { + z-index: $scene; + } +} +#loadingText { + text-align: center; + position:relative; + margin: 0 auto; + margin-top: 20px; + clear:left; + height:auto; + z-index: 0; + color: rgba( 255, 255, 255, 255 ); + font-size: $normal; + font-weight: 700; + color: $offwhite; + letter-spacing: 0.1em; + text-transform: uppercase; +} + + +.back-to-map { + button { + position: fixed; + top: 20px; + left: 130px; + height: 20px; + width: 250px; + text-align: left; + background: none; + padding: 0; + margin-bottom: 10px; + border: none; + background-size: 100%; + line-height: 20px; + color: $offwhite; + cursor: pointer; + outline: none; + font-family: 'Lato', Helvetica, sans-serif; + text-transform: uppercase; + transition: 0.2s ease; + letter-spacing: 0.1em; + + &:hover { + transition: 0.2s ease; + letter-spacing: 0.15em; + } + } +} + +/* +KEYFRAME INFO +*/ +.keyframe-info { + position: fixed; + top: 60px; + left: 130px; + height: auto; + width: 270px; + box-sizing: border-box; + padding: 10px; + max-height: calc(100% - 250px); + overflow: auto; + box-shadow: 0 19px 38px rgba($black, 0.3), 0 15px 12px rgba($black, 0.22); + background: $black; + border: 1px solid $midgrey; + color: $offwhite; + font-family: 'Merriweather', 'Georgia', serif; + + h3, h6 { + text-align: center; + } + + h3 { + font-size: $large; + } + + p { + font-family: 'Lato', 'Helvetica', sans-serif; + font-size: $normal; + line-height: 1.4em; + } + + .actions { + width: 100%; + .action { + width: calc(50% - 5px); + height: 40px; + box-sizing: border-box; + line-height: 40px; + font-family: 'Lato', 'Helvetica', sans-serif; + text-align: center; + display: inline-block; + + &:not(.disabled) { + &:hover { + cursor: pointer; + transition: 0.2s ease; + color: $yellow; + } + } + + &.disabled { + color: $midgrey; + cursor: normal; + } + + &:first-child { + margin-right: 10px; + } + } + } +} + +/* +DAT GUI +*/ +.dg .a { + margin-right: 20px; + margin-top: 20px; +} + +.dg .cr.number { + border: none; + background: none; + + input[type=text] { + display: none; + } +} + +.dg.main .close-button { + display: none; +} + +.dg .c { + width: 66%; + .slider { + width: 100%; + border-radius: 10px; + height: 12px; + + .slider-fg { + border-radius: 10px; + } + + &:hover { + .slider-fg { + background: $offwhite; + } + } + } +} + +.dg .c .slider-fg { + background: $midwhite; +} + +.dg .property-name { + width: 33%; + font-family: 'Lato', Helvetica, sans-serif; + text-transform: uppercase; + letter-spacing: 0.1em; + line-height: 20px; + color: white; +} diff --git a/src/scss/tabs.scss b/src/scss/tabs.scss new file mode 100644 index 0000000..e4eb769 --- /dev/null +++ b/src/scss/tabs.scss @@ -0,0 +1,47 @@ +.react-tabs { + padding-top: 0; + box-sizing: border-box; + height: 100%; + + [role=tablist] { + padding: 0; + } + + + [role=tab] { + font-family: 'Lato', Helvetica, sans-serif; + font-size: $xlarge; + width: 33%; + background: none; + color: $midwhite; + outline: none; + float: left; + cursor: pointer; + text-align: center; + height: 40px; + line-height: 40px; + border-bottom: 1px solid rgba(255, 255, 255, 0.4); + list-style-type: none; + box-sizing: border-box; + &:hover { + color: $offwhite; + } + } + + [role=tab][aria-selected=true] { + font-weight: 700; + border-radius: 0; + border: 0; + color: $offwhite; + border: 1px solid; + box-sizing: border-box; + text-align: center; + border: 1px solid rgba(255, 255, 255, 0.4); + border-bottom: 0; + } + + .react-innertabpanel { + box-sizing: border-box; + padding-top: 20px; + } +} diff --git a/src/scss/tag-filters.scss b/src/scss/tag-filters.scss new file mode 100644 index 0000000..da3bb8a --- /dev/null +++ b/src/scss/tag-filters.scss @@ -0,0 +1,85 @@ +.applied-tagFilters { + position: fixed; + top: 135px; + right: 5px; + max-width: 260px; + background: $black; + color: $offwhite; + padding: 10px; + font-size: $small; + z-index: $map-overlay; + + .caption { + font-size: $small; + display: block; + text-align: center; + text-transform: uppercase; + letter-spacing: 0.1em; + } + + .tag-chip-group { + display: inline-block; + width: 100%; + max-height: 150px; + background: $midgrey; + border-radius: 5px; + margin-top: 5px; + padding: 0 5px 5px 5px; + box-sizing: border-box; + overflow: auto; + + h3 { + margin: 5px 0; + } + } + + .applied-tagFilter-chip { + width: auto; + border-radius: 10px; + border: 0; + color: $black; + min-height: 16px; + line-height: 16px; + margin-top: 5px; + margin-left: 5px; + padding: 1px 5px; + transition: 0.2s ease; + background: $yellow; + float: right; + + &:hover { + transition: 0.2s ease; + background: lighten($yellow, 15%); + } + + &:first-child { + margin-top: 5px; + } + + .detail { + cursor: pointer; + max-width: 350px; + margin-right: 15px; + } + + svg { + display: inline-block; + position: relative; + float: right; + margin-top: -14px; + height: 12px; + width: 12px; + user-select: none; + cursor: pointer; + color: rgba($black, 0.25); + fill: rgba($black, 0.25); + transition: all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; + + &:hover { + color: rgba($black, 0.6); + fill: rgba($black, 0.6); + transition: all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; + } + } + } +} diff --git a/src/scss/timeline.scss b/src/scss/timeline.scss new file mode 100644 index 0000000..c4d9f5e --- /dev/null +++ b/src/scss/timeline.scss @@ -0,0 +1,288 @@ + +.timeline-wrapper { + position: fixed; + box-sizing: border-box; + left: 110px; + right: 0px; + height: 170px; + background: rgba($black, 0.8); + box-shadow: 0 -10px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + color: white; + transition: 0.2s ease; + bottom: 0px; + z-index: $timeline; + + &.folded { + transition: 0.2s ease; + bottom: -170px; + + .timeline-header .timeline-toggle p .arrow-down { + transform: translate(0, 5px)rotate(-135deg); + -webkit-transform: translate(0, 5px)rotate(-135deg); + } + } + + .timeline-header { + height: 0px; + width: 100%; + font-size: $large; + font-weight: 700; + + .timeline-toggle { + position: absolute; + margin: 0 auto; + width: 100%; + text-align: center; + + p { + width: 60px; + height: 25px; + margin: 0 auto; + background: rgba($black, 0.8); + margin-top: -25px; + cursor: pointer; + + &:hover { + .arrow-down { + transition: 0.2s ease; + border-right: 2px solid $offwhite; + border-bottom: 2px solid $offwhite; + } + } + } + + .arrow-down { + display: inline-block; + padding: 3px; + transition: 0.2s ease; + transform: rotate(45deg); + -webkit-transform: rotate(45deg); + border-right: 2px solid $midwhite; + border-bottom: 2px solid $midwhite; + } + } + + .timeline-info { + position: absolute; + margin-top: -70px; + margin-left: 10px; + background: rgba($black, 0.8); + padding: 10px; + min-height: 20px; + p { + margin: 0; + height: 20px; + text-transform: uppercase; + letter-spacing: 0.1em; + + &:first-child { + text-transform: none; + font-size: $normal; + letter-spacing: 0.05; + } + } + } + } + + .timeline-content { + height: 160px; + padding-top: 20px; + + .timeline-labels { + padding-top: 2px; + padding-left: 20px; + margin-right: 0px; + border-right: 1px solid $midgrey; + width: 175px; + height: 180px; + float: left; + text-align: left; + box-sizing: border-box; + + .timeline-label-title { + font-size: $normal; + font-weight: 700; + fill: $offwhite; + letter-spacing: 0.1em; + height: 20px; + text-transform: uppercase; + } + + .timeline-label { + font-size: $small; + line-height: 16px; + color: $offwhite; + text-align: right; + padding-right: 10px; + letter-spacing: 0.05em; + } + } + + .timeLabel { + font-size: $normal; + fill: $midwhite; + letter-spacing: 0.05em; + } + + .timeline { + /*width: calc(100% - 200px);*/ + width: calc(100% - 40px); + margin-left: 20px; + box-sizing: border-box; + float: left; + + svg { + display: inline-block; + float: left; + } + + .domain { + opacity: 0; + } + + .tick { + cursor: -webkit-grab; + cursor: -moz-grab; + line { + stroke: rgb(199, 199, 199); + shape-rendering: crispEdges; + opacity: 0.6; + } + + text { + font-family: 'Lato', Helvetica, sans-serif; + fill: $midwhite; + text-transform: capitalize; + } + } + + .xAxis { + line { + stroke-dasharray: 1px 4px; + } + } + + .yAxis { + .tick line { + stroke-width: 15px; + cursor: -webkit-grab; + cursor: -moz-grab; + } + } + + .axisBoundaries { + stroke: $offwhite; + stroke-width: 1; + stroke-dasharray: 1px 4px; + } + + .event { + cursor: pointer; + opacity: .7; + + &.mouseover { + opacity: 1; + } + } + + .timeline-marker { + fill: none; + stroke: $offwhite; + stroke-width: 2; + stroke-dasharray: 5px 2px; + } + + .coevent { + opacity: .7; + cursor: pointer; + } + + .time-controls path, + .time-controls rect { + cursor: pointer; + transition: 0.2s ease; + fill: $midwhite; + + &:hover path, + &:hover path, { + transition: 0.2s ease; + fill: $offwhite; + } + } + + .time-controls-inline path { + cursor: pointer; + fill: $offwhite; + } + + .time-controls circle, + .time-controls-inline circle { + fill: $midwhite; + fill-opacity: 0.01; + cursor: pointer; + stroke: $midwhite; + stroke-width: 1; + } + + .time-controls-inline circle { stroke: none; } + + .time-controls g, + .time-controls-inline { + &:hover { + cursor: pointer; + circle { + transition: 0.2s ease; + fill-opacity: 0.2; + fill: $offwhite; + } + path, + rect { + transition: 0.2s ease; + fill: $offwhite; + } + } + } + + .zoom-level-button { + font-size: $xsmall; + cursor: pointer; + text-anchor: middle; + letter-spacing: 0.05em; + transition: 0.2s ease; + fill: $midwhite; + + &:hover, + &.active { + transition: 0.2s ease; + fill: $offwhite; + } + } + } + } +} + +/* +* Slider +* https://bl.ocks.org/mbostock/6452972 +*/ +.track, +.track-overlay { + stroke-linecap: round; +} + +.track { + stroke: $offwhite; + stroke-opacity: 1; + stroke-width: 1px; +} + +.track-overlay { + pointer-events: stroke; + stroke-width: 15px; + stroke: transparent; + cursor: pointer; +} + +.handle { + fill: $offwhite; +} diff --git a/src/scss/toolbar.scss b/src/scss/toolbar.scss new file mode 100644 index 0000000..f1590b3 --- /dev/null +++ b/src/scss/toolbar.scss @@ -0,0 +1,660 @@ +@import 'burger'; +@import 'tabs'; + +.toolbar-wrapper { + position: fixed; + top: 0px; + left: 0px; + bottom: 0px; + z-index: $header; + background: $midgrey; + + .toolbar { + position: relative; + width: 110px; + height: 100%; + padding: 20px 0px; + margin: 0; + box-sizing: border-box; + color: $offwhite; + background: $darkgrey; + text-align: center; + font-size: $normal; + font-weight: 100; + transition: 0.2s ease; + z-index: $header; + + .toolbar-header { + margin: 0 15px 10px 15px; + padding: 10px 0 25px 0; + transition: 0.2s ease; + border-bottom: 2px solid $midwhite; + text-transform: uppercase; + font-family: 'Merriweather', serif; + cursor: pointer; + + p { + font-size: $normal; + margin: 0; + } + p:first-child { + font-size: $xsmall; + } + + &:hover { + transition: 0.2s ease; + border-bottom: 2px solid $offwhite; + } + } + + .toolbar-tabs { + padding: 0; + } + + .bottom-actions { + position: absolute; + width: 110px; + bottom: 10px; + box-sizing: border-box; + + .bottom-action-block { + display: block; + + &:last-child { + padding-left: 8px; + } + } + + .action-button { + width: 60px; + height: 25px; + border-radius: 30px; + background: none; + margin: 0 auto; + margin-top: 10px; + display: block; + outline: none; + font-family: 'Lato'; + font-size: $xsmall; + cursor: pointer; + transition: 0.2s ease; + border: 1px solid $midwhite; + color: $midwhite; + + &.tiny { + height: 30px; + width: 30px; + display: inline-block; + float: left; + margin-right: 2px; + &:last-child { + margin-right: 0; + } + } + + &:hover:not(.disabled) { + transition: 0.2s ease; + border: 1px solid $offwhite; + color: $offwhite; + + svg path { stroke: $offwhite; } + svg polyline { stroke: $offwhite; } + svg polygon { fill: $offwhite; } + } + + svg { + + &.reset { + margin-left: -4px; + margin-top: -1px; + -webkit-transform: scale(0.9); + -moz-transform: translate(-2px,1px)scale(0.9); + transform: scale(0.9); + } + + path, polyline { + fill: none; + stroke: $midwhite; + stroke-width: 2px; + } + + polygon { + fill: $midwhite; + } + + &.coevents { + margin: 0; + -webkit-transform: scale(0.9); + transform: scale(1.2); + + path { stroke-width: 2px; } + rect { + fill: $midwhite; + &.no-fill { fill: $darkgrey; } + } + line { + stroke-width: 1px; + stroke: $midwhite; + } + } + } + + &.info { + font-size: $xxlarge; + bottom: 120px; + } + + &.disabled { + cursor: default; + } + + &.active { + border: 1px solid $offwhite; + color: $offwhite; + + svg path { stroke: $offwhite; } + svg polyline { stroke: $offwhite; } + svg polygon { fill: $offwhite; } + } + } + } + } + + .toolbar-tab { + display: inline-block; + height: 60px; + width: 110px; + padding: 10px 0 5px 0; + font-weight: 400; + text-overflow: ellipsis; + overflow: hidden; + cursor: pointer; + transition: 0.2s ease; + color: $midwhite; + + svg { + transform: scale(0.7); + path, circle, polygon, + polyline, line { + stroke-width: 2px; + transition: 0.2s ease; + stroke: $midwhite; + fill: none; + stroke-linecap: round; + } + + &.scenes { + path { + transition: 0.2s ease; + fill: $midwhite; + stroke: none; + } + } + } + + .tab-caption { + display: block; + text-align: center; + font-size: $xsmall; + margin-top: -2px; + letter-spacing: 0.05em; + } + + &.active { + background: $black; + } + + &:hover, + &.active { + transition: 0.2s ease; + color: $offwhite; + + svg { + path, circle, polygon, + polyline, line { + transition: 0.2s ease; + stroke: $offwhite; + } + + &.scenes { + path { + transition: 0.2s ease; + fill: $offwhite; + stroke: none; + } + } + } + } + } +} + +.toolbar-panels { + width: 440px; + top: 15px; + bottom: 0; + box-sizing: border-box; + padding: 30px 10px 10px 30px; + font-size: $normal; + font-family: 'Lato', Helvetica, sans-serif; + background: $black; + color: $offwhite; + position: fixed; + transition: 0.2s ease; + left: 110px; + box-shadow: 10px -10px 38px rgba(0, 0, 0, 0.3), 10px 15px 12px rgba(0, 0, 0, 0.22); + + h2 { + font-family: 'Merriweather', 'Georgia', 'serif'; + font-size: $large; + text-transform: none; + letter-spacing: normal; + } + + p { + font-size: $normal; + font-family: 'Merriweather', 'Georgia', 'serif'; + line-height: 1.4em; + }; + + .panel-header { + display: inline-block; + width: 36px; + float: right; + margin-left: 20px; + margin-right: -45px; + height: 36px; + padding-top: 5px; + box-sizing: border-box; + margin-top: 10px; + border-radius: 3px; + background: $black; + padding: 8px 6px; + cursor: pointer; + + .caret { + position: relative; + transform: translate(8px, 5px)rotate(45deg); + width: 8px; + height: 8px; + transition: 0.2s ease; + border-left: 2px solid $midwhite; + border-bottom: 2px solid $midwhite; + } + + &:hover { + .caret { + transition: 0.2s ease; + border-left: 2px solid $offwhite; + border-bottom: 2px solid $offwhite; + } + } + } + + .people-tab { + width: 50%; + font-family: 'Lato', Helvetica, sans-serif; + font-size: $normal; + text-transform: uppercase; + letter-spacing: 0.1em; + + svg { + transform: translate(-2px,0)scale(0.6); + &:hover { + transition: 0.2s ease; + stroke: $offwhite; + } + } + + &.react-tabs__tab--selected { + svg circle, + svg path { + stroke: $offwhite; + } + } + + svg circle, + svg path { + transition: 0.2s ease; + fill: none; + stroke: $midwhite; + stroke-width: 3; + } + } + + .react-tabs__tab-list { + height: 40px; + overflow: hidden; + } + + .react-tabs__tab-panel { + margin-top: 0px; + } + + .react-tabs__tab-panel--selected { + height: calc(100% - 40px); + overflow-y: auto; + margin-top: 0; + + .react-tabs__tab-panel--selected { + padding-top: 20px; + box-sizing: border-box; + } + } + .react-tabs .react-innertabpanel { + padding-top: 0; + } + + ul { + margin: 0; + padding-left: 0; + height: auto; + transition: 0.2s ease; + height: calc(100% - 310px); + } + + &.folded { + transition: 0.2s ease; + left: -440px; + + ul { + height: 0; + margin: 0; + } + } + + input { + width: 100%; + border: 1px solid; + height: 60px; + color: $offwhite; + background: none; + outline: none; + box-sizing: border-box; + margin: 20px 0; + padding: 5px 10px; + font-size: 18px; + font-family: 'Lato', sans-serif; + letter-spacing: 0.1em; + transition: 0.2s ease; + border-color: $midwhite; + text-align: center; + + &:focus { + transition: 0.2s ease; + border-color: $offwhite; + } + } + + .item { + width: 100%; + height: 36px; + line-height: 36px; + background: none; + font-family: 'Lato', Helvetica, sans-serif; + font-size: $large; + + button { + height: 36px; + border: 1px transparent; + background: none; + cursor: pointer; + color: $offwhite; + outline: none; + transition: 0.2s ease; + padding: 0 10px; + text-align: left; + float: left; + + .checkbox { + display: inline-block; + width: 12px; + height: 12px; + border: 1px solid $offwhite; + box-sizing: border-box; + background: none; + float: left; + } + } + + span { + width: calc(100% - 40px); + display: inline-block; + height: 36px; + line-height: 36px; + float: left; + font-size: $normal; + font-family: 'Merriweather', 'Georgia', 'serif'; + color: $midwhite; + } + + &:hover { + span { + color: $offwhite; + } + } + + &.active { + span { + color: $offwhite; + } + .checkbox { + background: $offwhite; + } + } + } + + .arrow { + display: inline-block; + width: 10px; + height: 10px; + line-height: 10px; + padding: 10px; + float: left; + cursor: pointer; + color: $offwhite; + transition: 0.4s ease; + transform: rotate(0deg); + + &:after { + content: '▾'; + } + + &.folded { + transition: 0.4s ease; + transform: rotate(-90deg); + } + } + + .panel-action { + button { + font-size: 1.2em; + height: 140px; + line-height: 140px; + width: 100%; + padding: 0; + border: 1px solid $offwhite; + background-size: 100%; + color: $offwhite; + cursor: pointer; + outline: none; + font-family: 'Lato', Helvetica, sans-serif; + text-transform: uppercase; + margin-bottom: 10px; + transition: 0.2s ease; + letter-spacing: 0.1em; + + &:hover { + transition: 0.2s ease; + letter-spacing: 0.15em; + } + } + + &:first-child { + button { background-image: url("/static/archive/img/scene01.jpg"); } + } + &:nth-child(2n) { + button { background-image: url("/static/archive/img/scene02.jpg"); } + } + &:nth-child(3n) { + button { background-image: url("/static/archive/img/scene03.jpg"); } + } + + &.back-to-map { + button { background-image: url("/static/archive/img/map.jpg"); } + } + } +} + +.taggroup-wrapper { + margin-top: 30px; + z-index: 10; + border-bottom: none; + + &:last-child { + margin-bottom: 0; + border-bottom: 1px solid rgba(white, 0); + } + + &:hover { + transition: 0.1s ease; + } + + .collapsible-item { + width: calc(100% - 32px); + float: left; + } + + .taggroup-header { + width: 100%; + margin: 0; + font-size: $large; + + h2::first-letter { + margin-top: 0; + } + } + + .taggroup-content { + width: 100%; + display: inline-block; + padding-left: 10px; + box-sizing: border-box; + transition: 0.2s ease; + + .tagsubgroup-wrapper { + border: none; + border-bottom: 1px solid rgba(white, 0.25); + &:first-letter { + text-transform: uppercase; + } + + &:last-child { + border-bottom: 0; + } + + .tagsubgroup-header { + cursor: pointer; + } + + &.folded { + .tagsubgroup-content { + overflow: hidden; + padding: 0 10px; + transition: 0.2s ease; + height: 0; + border-top: 0; + } + } + + .item { + overflow: auto; + min-height: 32px; + height: auto; + + span { + height: auto; + } + } + } + + .tag-filter { + outline: none; + border: 0; + background: none; + color: $offwhite; + margin-left: 20px; + width: calc(100% - 20px); + box-sizing: border-box; + padding: 0; + font-size: $normal; + font-weight: 400; + text-align: left; + cursor: pointer; + border: 1px solid $black; + border-bottom: 1px solid rgba(white, 0.25); + &:first-letter { + text-transform: uppercase; + } + + &:last-child { + border-bottom: 1px solid rgba(white, 0); + } + } + } + + &.folded { + .filter-list-content { + padding: 0 10px; + border-top: 0; + transition: 0.2s ease; + height: 0; + } + } +} + +.search-content { + .item { + overflow: auto; + min-height: 32px; + height: auto; + border-bottom: 1px solid rgba(white, 0.25); + + span { + height: auto; + } + } +} + +.path-list { + margin-bottom: 10px; + + .item { + border-bottom: 1px solid rgba(255, 255, 255, 0.25); + } +} + +@media (max-height: 678px) { + .toolbar-wrapper { + .toolbar-tab { + height: 60px; + padding: 0; + + .tab-caption { + transition: 0.2s ease; + opacity: 0; + } + + &:hover { + .tab-caption { + transition: 0.2s ease; + opacity: 1; + } + } + } + .toolbar .bottom-actions { + .action-button { + margin-top: 5px; + } + } + } +} diff --git a/src/scss/video.scss b/src/scss/video.scss new file mode 100644 index 0000000..a77bf13 --- /dev/null +++ b/src/scss/video.scss @@ -0,0 +1,33 @@ +.video-wrapper { + z-index: 1; + position: relative; + width: 740px; + height: 420px; + transition: opacity 500ms; + background-color: black; + font-family: 'Lato', Helvetica, sans-serif; + overflow: hidden; +} + +.video-js .vjs-big-play-button { + font-size: 3em; + line-height: 40px; + height: 40px; + width: 40px; + display: block; + position: absolute; + background: none; + top: 10px; + left: 10px; + padding: 0; + cursor: pointer; + opacity: 1; + border-radius: 20px; + transition: 0.2s ease; + border: 1px solid $midwhite; + + &:hover { + transition: 0.2s ease; + border: 1px solid $offwhite; + } +} diff --git a/src/selectors/index.js b/src/selectors/index.js new file mode 100644 index 0000000..f30edbd --- /dev/null +++ b/src/selectors/index.js @@ -0,0 +1,134 @@ +import { + createSelector +} from 'reselect' + +// Input selectors +export const getEvents = state => state.domain.events; +export const getLocations = state => state.domain.locations; +export const getCategories = state => state.domain.categories; +export const getSites = (state) => { + if (process.env.features.USE_SITES) return state.domain.sites; + return []; +} +export const getTags = state => state.domain.tags; + +export const getCategoriesFilter = state => state.app.filters.categories; +export const getTagsFilter = state => state.app.filters.tags; +export const getRangeFilter = state => state.app.filters.range; + +// NB: should we stick with the default semantics and name these as selectors? +// e.g. 'selectEvents', 'selectCoevents'. +// Filter events +function isTaggedIn(event, tagFilters) { + if (event.tags) { + const tagsArray = event.tags.split(","); + const isTagged = tagsArray.some((tag) => { + return tagFilters.find((tagFilter) => { + return (tagFilter.key === tag && tagFilter.active); + }) + }); + return isTagged; + } else { + return false; + } +} + + +/** + * Of all available events, selects those that fall within the time range, + * and if TAGS are being used, select them if their tags are enabled + */ +export const getFilteredEvents = createSelector( + [getEvents, getTagsFilter, getRangeFilter], + (events, tagFilters, rangeFilter) => { + + return events.reduce((acc, value) => { + const noTags = (tagFilters.length === 0 || !process.env.features.USE_TAGS || tagFilters.every(t => !t.active)); + + const isTagged = (noTags) || isTaggedIn(value, tagFilters); + + const isRange = (rangeFilter[0] < d3.timeParse("%Y-%m-%dT%H:%M:%S")(value.timestamp)) && + (d3.timeParse("%Y-%m-%dT%H:%M:%S")(value.timestamp) < rangeFilter[1]); + + if (isRange && isTagged) { + const event = Object.assign({}, value); + acc[event.id] = event; + } + return acc; + }, []); +}); + +/** + * Of all the filtered events, group them by location and return a list of + * locations with at least one event in it, based on the time range and tags + */ +export const getFilteredLocations = createSelector( + [getFilteredEvents], + (events) => { + + const filteredLocations = {}; + events.forEach(event => { + const location = event.location; + if (filteredLocations[location]) { + filteredLocations[location].events.push(event); + } else { + filteredLocations[location] = { + label: location, + events: [event], + latitude: event.latitude, + longitude: event.longitude + } + } + }) + + // Make locations an array are remove if any are undefined + return Object.values(filteredLocations).filter(item => item); +}); + +// Filter categories +export const getFilteredCategories = createSelector( + [getCategories], + (categories) => { + + return Object.values(categories); + }); + +/** + * Return categories by group + */ +export const getCategoryGroups = createSelector( + [getFilteredCategories], + (categories) => { + const groups = {}; + categories.forEach((t) => { if (t.group && !groups[t.group]) { groups[t.group] = t.group_label } }); + return Object.keys(groups).concat(['other']); + } +) + +/** + * Given a tree of tags, return those tags as a list, where each node has been + * aware of its depth, and given an 'active' flag + */ +export const getTagFilters = createSelector( + [getTags], + (tags) => { + const allTags = []; + let depth = 0; + function traverseNode(node, depth) { + // do something to node + node.active = (!node.hasOwnProperty('active')) ? false : node.active; + node.depth = depth; + allTags.push(node) + depth = depth + 1; + + if (Object.keys(node.children).length > 0) { + Object.values(node.children).forEach((childNode) => { + traverseNode(childNode, depth); + }); + } + } + + if (tags.key && tags.children) traverseNode(tags, depth) + return allTags; + } +) diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..c60975a --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,16 @@ +import { + createStore, + applyMiddleware, + compose +} from 'redux'; +import thunk from 'redux-thunk'; + +import rootReducer from '../reducers'; +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; + +const store = createStore( + rootReducer, + composeEnhancers(applyMiddleware(thunk)) +); + +export default store; diff --git a/src/store/initial.js b/src/store/initial.js new file mode 100644 index 0000000..1059aa8 --- /dev/null +++ b/src/store/initial.js @@ -0,0 +1,97 @@ +// TODO: annotate sections of this state. + +// NB: why does this canvas document need to be created? +const canvas = document.createElement('canvas'); +const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); + +const initial = { + domain: { + events: [], + locations: [], + + categories: [], + sites: [], + + // Tag tree + tags: { }, + notifications: [], + }, + app: { + error: null, + highlighted: null, + selected: [], + notifications: [], + filters: { + range: [ + d3.timeParse("%Y-%m-%dT%H:%M:%S")("2014-08-22T12:00:00"), + d3.timeParse("%Y-%m-%dT%H:%M:%S")("2014-08-27T12:00:00") + ], + tags: [], + categories: [], + views: { + events: true, + coevents: false, + routes: false, + sites: true + }, + }, + base_uri: 'http://127.0.0.1:8000/', // Modify accordingly on production setup. + isMobile: (/Mobi/.test(navigator.userAgent)), + isWebGL: (gl && gl instanceof WebGLRenderingContext), + language: 'en-US', + mapAnchor: process.env.MAP_ANCHOR, + features: { + USE_TAGS: process.env.features.USE_TAGS, + USE_SEARCH: process.env.features.USE_SEARCH + } + }, + ui: { + style: { + colors: { + WHITE: "#efefef", + YELLOW: "#ffd800", + MIDGREY: "rgb(44, 44, 44)", + DARKGREY: "#232323", + PINK: "#F28B50",//rgb(232, 9, 90)", + ORANGE: "#F25835",//rgb(232, 9, 90)", + RED: "rgb(233, 0, 19)", + BLUE: "#F2DE79",//"rgb(48, 103 , 217)", + GREEN: "#4FF2F2",//"rgb(0, 158, 86)", + }, + groupColors: { + category_group00: "#FF0000", + category_group01: "#226b22", + category_group02: "#671f6f", + category_group03: "#0000bf", + category_group04: "#d3ce2a", + other: "#FF0000" + }, + palette: d3.schemeCategory10, + }, + dom: { + timeline: "timeline", + timeslider: "timeslider", + map: "map" + }, + flags: { + isFetchingDomain: false, + isFetchingEvents: false, + isView2d: true, + isTimeline: true, + isToolbar: false, + isCardstack: true, + isInfopopup: false, + isNotification: true + }, + tools: { + formatter: d3.timeFormat("%d %b, %H:%M"), + formatterWithYear: d3.timeFormat("%d %b %Y, %H:%M"), + parser: d3.timeParse("%Y-%m-%dT%H:%M:%S") + }, + components: { + toolbarTab: false, + } + } +}; + +export default initial; diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..5e7e738 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,83 @@ +const webpack = require('webpack'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const userConfig = require('./config'); +const devMode = process.env.NODE_ENV !== 'production'; +const path = require('path'); + +const APP_DIR = path.resolve(__dirname, './src'); +const BUILD_DIR = path.resolve(__dirname, './build'); + +const config = { + entry: { + index: `${APP_DIR}/index.jsx`, + }, + devtool: 'source-map', + module: { + rules: [ + { + test: /\.scss$/, + include: `${APP_DIR}`, + use: [ + devMode ? 'style-loader' : MiniCssExtractPlugin.loader, + 'css-loader', + 'sass-loader' + ] + }, { + test: /\.js(x)?$/, + exclude: /node_modules/, + include: `${APP_DIR}`, + use: { + loader: 'babel-loader' + }, + }, { + test: /\.(eot|svg|otf|ttf|woff|woff2)$/, + use: { + loader: 'file-loader', + } + }, + ], + }, + node: { + net: 'empty', + tls: 'empty', + dns: 'empty' + }, + resolve: { + extensions: ['*', '.js', ], + }, + output: { + path: BUILD_DIR, + filename: 'js/[name].bundle.js', + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + 'NODE_ENV': JSON.stringify('production'), + 'MAPBOX_TOKEN': JSON.stringify(userConfig.MAPBOX_TOKEN), + 'SERVER_ROOT': JSON.stringify(userConfig.SERVER_ROOT), + 'EVENT_EXT': JSON.stringify(userConfig.EVENT_EXT), + 'CATEGORY_EXT': JSON.stringify(userConfig.CATEGORY_EXT), + 'TAG_TREE_EXT': JSON.stringify(userConfig.TAG_TREE_EXT), + 'SITES_EXT': JSON.stringify(userConfig.SITES_EXT), + 'EVENT_DESC_ROOT': JSON.stringify(userConfig.EVENT_DESC_ROOT), + 'MAP_ANCHOR': JSON.stringify(userConfig.MAP_ANCHOR), + 'INCOMING_DATETIME_FORMAT': JSON.stringify(userConfig.INCOMING_DATETIME_FORMAT), + 'features': { + 'USE_TAGS': JSON.stringify(userConfig.features.USE_TAGS), + 'USE_SEARCH': JSON.stringify(userConfig.features.USE_SEARCH), + 'USE_SITES': JSON.stringify(userConfig.features.USE_SITES) + } + } + }), + new MiniCssExtractPlugin({ + filename: devMode ? '[name].css' : '[name].[hash].css', + chunkFilename: devMode ? '[id].css' : '[id].[hash].css', + }), + new HtmlWebpackPlugin({ + template: './index.html', + }) + ], +}; + +module.exports = config; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..65b1658 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5702 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + 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" + 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/traverse" "^7.1.0" + "@babel/types" "^7.1.2" + convert-source-map "^1.1.0" + debug "^3.1.0" + json5 "^0.5.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.1.2", "@babel/generator@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" + dependencies: + "@babel/types" "^7.1.3" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" + dependencies: + "@babel/types" "^7.0.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.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" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + dependencies: + "@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" + 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" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + dependencies: + "@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" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.2.tgz#ab752e8c35ef7d39987df4e8586c63b8846234b5" + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.1.2" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.2", "@babel/parser@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" + +"@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" + 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-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" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.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" + dependencies: + "@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" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.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" + 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" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^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" + 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" + 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" + 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" + 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" + 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" + 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" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@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" + 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": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + 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" + 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" + 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" + 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" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^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" + 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" + 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" + 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" + 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" + 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" + 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" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + 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" + 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" + 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": + 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" + 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" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.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" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.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" + 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-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + dependencies: + regenerator-transform "^0.13.3" + +"@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" + 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" + 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" + 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" + 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" + 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" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11" + 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.0.0" + "@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-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.1.0" + "@babel/plugin-transform-parameters" "^7.1.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" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.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" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + +"@babel/traverse@^7.1.0": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.3" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.3" + "@babel/types" "^7.1.3" + debug "^3.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@webassemblyjs/ast@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.8.tgz#f31f480debeef957f01b623f27eabc695fa4fe8f" + dependencies: + "@webassemblyjs/helper-module-context" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/wast-parser" "1.7.8" + +"@webassemblyjs/floating-point-hex-parser@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz#1b3ed0e27e384032254e9322fc646dd3e70ef1b9" + +"@webassemblyjs/helper-api-error@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz#a2b49c11f615e736f815ec927f035dcfa690d572" + +"@webassemblyjs/helper-buffer@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz#3fc66bfa09c1c60e824cf3d5887826fac062877d" + +"@webassemblyjs/helper-code-frame@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz#cc5a7e9522b70e7580df056dfd34020cf29645b0" + dependencies: + "@webassemblyjs/wast-printer" "1.7.8" + +"@webassemblyjs/helper-fsm@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz#fe4607430af466912797c21acafd3046080182ea" + +"@webassemblyjs/helper-module-context@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz#3c2e7ee93d14ff4768ba66fb1be42fdc9dc7160a" + +"@webassemblyjs/helper-wasm-bytecode@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz#89bdb78cd6dd5209ae2ed2925de78d0f0e00b6f0" + +"@webassemblyjs/helper-wasm-section@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz#c68ef7d26a6fc12421b2e6e56f9bc810dfb33e87" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + +"@webassemblyjs/ieee754@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz#1f37974b13cb486a9237e73ce04cac7a2f1265ed" + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.8.tgz#1bee83426819192db2ea1a234b84c7ebc6d34c1f" + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.8.tgz#2b489d5cf43e0aebb93d8e2d792aff9879c61f05" + +"@webassemblyjs/wasm-edit@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz#f8bdbe7088718eca27b1c349bb7c06b8a457950c" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/helper-wasm-section" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + "@webassemblyjs/wasm-opt" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" + "@webassemblyjs/wast-printer" "1.7.8" + +"@webassemblyjs/wasm-gen@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz#7e8abf1545eae74ac6781d545c034af3cfd0c7d5" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/ieee754" "1.7.8" + "@webassemblyjs/leb128" "1.7.8" + "@webassemblyjs/utf8" "1.7.8" + +"@webassemblyjs/wasm-opt@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz#7ada6e211914728fce02ff0ff9c344edc6d41f26" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" + +"@webassemblyjs/wasm-parser@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz#dac47c291fb6a3e63529aecd647592cd34afbf94" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-api-error" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/ieee754" "1.7.8" + "@webassemblyjs/leb128" "1.7.8" + "@webassemblyjs/utf8" "1.7.8" + +"@webassemblyjs/wast-parser@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz#f8aab9a450c048c1f9537695c89faeb92fabfba5" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/floating-point-hex-parser" "1.7.8" + "@webassemblyjs/helper-api-error" "1.7.8" + "@webassemblyjs/helper-code-frame" "1.7.8" + "@webassemblyjs/helper-fsm" "1.7.8" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz#e7e965782c1912f6a965f14a53ff43d8ad0403a5" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/wast-parser" "1.7.8" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + dependencies: + acorn "^5.0.0" + +acorn@^5.0.0, acorn@^5.6.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + +ajv-errors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" + +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + +ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.5.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-colors@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.1.0.tgz#dcfaacc90ef9187de413ec3ef8d5eb981a98808f" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async@^1.5.2: + version "1.5.2" + resolved "http://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-loader@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.4.tgz#7bbf20cbe4560629e2e41534147692d3fecbdce6" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + util.promisify "^1.0.0" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-runtime@^6.26.0, babel-runtime@^6.9.2: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +binary-extensions@^1.0.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.2.1.tgz#257a24c879d1cd4016348eee5c25de683260b21d" + dependencies: + caniuse-lite "^1.0.30000890" + electron-to-chromium "^1.3.79" + node-releases "^1.0.0-alpha.14" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-lite@^1.0.30000890: + version "1.0.30000892" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000892.tgz#344d2b51ee3ff5977537da4aa449c90eec40b759" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.0, chokidar@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.0: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + +clean-css@4.2.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + dependencies: + source-map "~0.6.0" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +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" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + dependencies: + delayed-stream "~1.0.0" + +commander@2: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + +commander@2.17.x, commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +compressible@~2.0.14: + version "2.0.15" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" + dependencies: + mime-db ">= 1.36.0 < 2" + +compression@^1.5.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-react-class@^15.6.0: + version "15.6.3" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-loader@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56" + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + postcss "^6.0.23" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +d3-array@1, d3-array@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + +d3-array@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc" + +d3-axis@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.8.tgz#31a705a0b535e65759de14173a31933137f18efa" + +d3-brush@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.0.4.tgz#00c2f238019f24f6c0a194a26d41a1530ffe7bc4" + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3-chord@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.4.tgz#7dec4f0ba886f713fe111c45f763414f6f74ca2c" + dependencies: + d3-array "1" + d3-path "1" + +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + +d3-collection@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" + +d3-color@1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.2.3.tgz#6c67bb2af6df3cc8d79efcc4d3a3e83e28c8048f" + +d3-color@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" + +d3-dispatch@1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.5.tgz#e25c10a186517cd6c82dd19ea018f07e01e39015" + +d3-dispatch@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8" + +d3-drag@1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.3.tgz#46e206ad863ec465d88c588098a1df444cd33c64" + dependencies: + d3-dispatch "1" + d3-selection "1" + +d3-drag@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.1.tgz#df8dd4c502fb490fc7462046a8ad98a5c479282d" + dependencies: + d3-dispatch "1" + d3-selection "1" + +d3-dsv@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.0.10.tgz#4371c489a2a654a297aca16fcaf605a6f31a6f51" + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +d3-dsv@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.0.8.tgz#907e240d57b386618dc56468bacfe76bf19764ae" + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +d3-ease@1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.5.tgz#8ce59276d81241b1b72042d6af2d40e76d936ffb" + +d3-ease@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e" + +d3-force@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.1.0.tgz#cebf3c694f1078fcc3d4daf8e567b2fbd70d4ea3" + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-format@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.3.2.tgz#6a96b5e31bcb98122a30863f7d92365c00603562" + +d3-format@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.2.2.tgz#1a39c479c8a57fe5051b2e67a3bee27061a74e7a" + +d3-geo@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.9.1.tgz#157e3b0f917379d0f73bebfff3be537f49fa7356" + dependencies: + d3-array "1" + +d3-hierarchy@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26" + +d3-interpolate@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68" + dependencies: + d3-color "1" + +d3-interpolate@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6" + dependencies: + d3-color "1" + +d3-path@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.7.tgz#8de7cd693a75ac0b5480d3abaccd94793e58aae8" + +d3-path@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764" + +d3-polygon@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.3.tgz#16888e9026460933f2b179652ad378224d382c62" + +d3-quadtree@1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.5.tgz#305394840b01f51a341a0da5008585e837fe7e9b" + +d3-quadtree@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.3.tgz#ac7987e3e23fe805a990f28e1b50d38fcb822438" + +d3-queue@3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/d3-queue/-/d3-queue-3.0.7.tgz#c93a2e54b417c0959129d7d73f6cf7d4292e7618" + +d3-random@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.0.tgz#6642e506c6fa3a648595d2b2469788a8d12529d3" + +d3-request@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-request/-/d3-request-1.0.6.tgz#a1044a9ef4ec28c824171c9379fae6d79474b19f" + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-dsv "1" + xmlhttprequest "1" + +d3-scale@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d" + dependencies: + d3-array "^1.2.0" + d3-collection "1" + d3-color "1" + d3-format "1" + d3-interpolate "1" + d3-time "1" + d3-time-format "2" + +d3-selection@1, d3-selection@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.2.tgz#6e70a9df60801c8af28ac24d10072d82cbfdf652" + +d3-selection@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d" + +d3-shape@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" + dependencies: + d3-path "1" + +d3-time-format@2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.3.tgz#ae06f8e0126a9d60d6364eac5b1533ae1bac826b" + dependencies: + d3-time "1" + +d3-time-format@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.1.tgz#85b7cdfbc9ffca187f14d3c456ffda268081bb31" + dependencies: + d3-time "1" + +d3-time@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.10.tgz#8259dd71288d72eeacfd8de281c4bf5c7393053c" + +d3-time@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.8.tgz#dbd2d6007bf416fe67a76d17947b784bffea1e84" + +d3-timer@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.9.tgz#f7bb8c0d597d792ff7131e1c24a36dd471a471ba" + +d3-timer@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531" + +d3-transition@1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.3.tgz#3a435b05ce9cef9524fe0d38121cfb6905331ca6" + dependencies: + d3-color "1" + d3-dispatch "1" + d3-ease "1" + d3-interpolate "1" + d3-selection "^1.1.0" + d3-timer "1" + +d3-transition@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.1.tgz#d8ef89c3b848735b060e54a39b32aaebaa421039" + dependencies: + d3-color "1" + d3-dispatch "1" + d3-ease "1" + d3-interpolate "1" + d3-selection "^1.1.0" + d3-timer "1" + +d3-voronoi@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c" + +d3-zoom@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.7.1.tgz#02f43b3c3e2db54f364582d7e4a236ccc5506b63" + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3@^4.9.1: + version "4.13.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-4.13.0.tgz#ab236ff8cf0cfc27a81e69bf2fb7518bc9b4f33d" + dependencies: + d3-array "1.2.1" + d3-axis "1.0.8" + d3-brush "1.0.4" + d3-chord "1.0.4" + d3-collection "1.0.4" + d3-color "1.0.3" + d3-dispatch "1.0.3" + d3-drag "1.2.1" + d3-dsv "1.0.8" + d3-ease "1.0.3" + d3-force "1.1.0" + d3-format "1.2.2" + d3-geo "1.9.1" + d3-hierarchy "1.1.5" + d3-interpolate "1.1.6" + d3-path "1.0.5" + d3-polygon "1.0.3" + d3-quadtree "1.0.3" + d3-queue "3.0.7" + d3-random "1.1.0" + d3-request "1.0.6" + d3-scale "1.0.7" + d3-selection "1.3.0" + d3-shape "1.2.0" + d3-time "1.0.8" + d3-time-format "2.1.1" + d3-timer "1.0.7" + d3-transition "1.1.1" + d3-voronoi "1.1.2" + d3-zoom "1.7.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + dependencies: + xregexp "4.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-node@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@~0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +domelementtype@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + dependencies: + domelementtype "1" + +domutils@1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.3.79: + version "1.3.79" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.79.tgz#774718f06284a4bf8f578ac67e74508fe659f13a" + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.5.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-shim@^4.5.1: + version "4.5.12" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.12.tgz#508c13dda1c87dd3df1b50e69e7b96b82149b649" + +es6-promise@^4.1.1: + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + +events@^1.0.0: + version "1.1.1" + resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.16.2: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + +fbjs@^0.8.9: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +file-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + dependencies: + locate-path "^3.0.0" + +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + 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" + dependencies: + debug "=3.1.0" + +for-each@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + dependencies: + is-callable "^1.1.3" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + +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" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + 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" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + 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" + +global@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.0.tgz#ef7ec4beead579b454f5ebd5e7f303db54f42a2b" + dependencies: + min-document "^2.6.1" + process "~0.5.1" + +global@^4.3.1, global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^11.1.0: + version "11.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + dependencies: + ajv "^5.3.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + 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" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@5.x.x: + version "5.0.4" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" + +hoist-non-react-statics@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +html-minifier@^3.2.3: + version "3.5.20" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14" + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + dependencies: + domelementtype "1" + domhandler "2.1" + domutils "1.1" + readable-stream "1.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + dependencies: + http-proxy "^1.16.2" + is-glob "^4.0.0" + lodash "^4.17.5" + micromatch "^3.1.9" + +http-proxy@^1.16.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +iconv-lite@0.4, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +individual@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + dependencies: + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" + +interpret@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +invariant@^2.0.0, invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +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" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +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" + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isemail@3.x.x: + version "3.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" + dependencies: + punycode "2.x.x" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +joi@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-14.0.1.tgz#5bc53e8fff6e6da19d6cd8c76e2afe5c0815a2d3" + dependencies: + hoek "5.x.x" + isemail "3.x.x" + topo "3.x.x" + +js-base64@^2.1.8: + version "2.4.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" + +js-levenshtein@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0: + version "0.5.1" + resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +killable@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + +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" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + dependencies: + invert-kv "^2.0.0" + +leaflet-polylinedecorator@^1.3.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/leaflet-polylinedecorator/-/leaflet-polylinedecorator-1.6.0.tgz#9ef79fd1b5302d67b72efe959a8ecd2553f27266" + dependencies: + leaflet-rotatedmarker "^0.2.0" + +leaflet-rotatedmarker@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/leaflet-rotatedmarker/-/leaflet-rotatedmarker-0.2.0.tgz#4467f49f98d1bfd56959bd9c6705203dd2601277" + +leaflet@^1.0.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.3.4.tgz#7f006ea5832603b53d7269ef5c595fd773060a40" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-runner@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash-es@^4.17.5, lodash-es@^4.2.1: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@~4.17.10: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +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" + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.36.0 < 2", mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + dependencies: + mime-db "~1.36.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mime@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +min-document@^2.19.0, min-document@^2.6.1: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + 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" + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.10.0, nan@^2.9.2: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +neo-async@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + dependencies: + lower-case "^1.1.1" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.0.0-alpha.14: + version "1.0.0-alpha.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.14.tgz#da9e2780add4bbb59ad890af9e2018a1d9c0034b" + dependencies: + semver "^5.3.0" + +node-sass@^4.9.4: + version "4.9.4" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.4.tgz#349bd7f1c89422ffe7e1e4b60f2055a69fbc5512" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalizr@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalizr/-/normalizr-3.3.0.tgz#6f44b95e8bf2201845a9e551920c4e5861166d27" + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + +npm-packlist@^1.1.6: + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" + +object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +opn@^5.1.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" + dependencies: + is-wsl "^1.1.0" + +original@>=0.0.5: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + dependencies: + execa "^0.10.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + dependencies: + p-limit "^2.0.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-headers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" + dependencies: + for-each "^0.3.2" + trim "0.0.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + dependencies: + find-up "^3.0.0" + +portfinder@^1.0.9: + version "1.0.17" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + +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" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.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" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +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" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + +postcss@^6.0.1, postcss@^6.0.23: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +pretty-error@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@2.x.x, punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^15.5.4: + version "15.6.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +react-redux@^5.0.4: + version "5.0.7" + resolved "http://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" + dependencies: + hoist-non-react-statics "^2.5.0" + invariant "^2.0.0" + lodash "^4.17.5" + lodash-es "^4.17.5" + loose-envify "^1.1.0" + prop-types "^15.6.0" + +react-tabs@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-1.1.0.tgz#f1e3d6136e1d89f70f5ef8835468a2f03a54777a" + dependencies: + classnames "^2.2.0" + prop-types "^15.5.0" + +react@^15.5.4: + version "15.6.2" + resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72" + dependencies: + create-react-class "^15.6.0" + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"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: + version "2.3.6" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@1.0: + version "1.0.34" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redux-devtools-instrument@^1.0.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.0.tgz#2faed9ac3292c783284b21843edfaa0567764a0c" + dependencies: + lodash "^4.2.0" + symbol-observable "^1.0.2" + +redux-devtools@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/redux-devtools/-/redux-devtools-3.4.1.tgz#09d342ce0ab6087be679e953a1d7c530efa1138e" + dependencies: + lodash "^4.2.0" + prop-types "^15.5.7" + redux-devtools-instrument "^1.0.1" + +redux-thunk@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" + +redux@^3.6.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" + dependencies: + lodash "^4.2.1" + lodash-es "^4.2.1" + loose-envify "^1.1.0" + symbol-observable "^1.0.3" + +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.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" + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + 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" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +renderkid@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa" + dependencies: + css-select "^1.1.0" + dom-converter "~0.2" + htmlparser2 "~3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.3.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +rust-result@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72" + dependencies: + individual "^2.0.0" + +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-json-parse@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac" + dependencies: + rust-result "^1.0.0" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + semver "^5.5.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +selfsigned@^1.9.1: + version "1.10.4" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" + dependencies: + node-forge "0.7.5" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + +semver@~5.3.0: + version "5.3.0" + resolved "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spdx-correct@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" + +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +sshpk@^1.7.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.1.tgz#b79a089a732e346c6e0714830f36285cd38191a2" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +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" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.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" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +symbol-observable@^1.0.2, symbol-observable@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" + +tar@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +topo@3.x.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.0.tgz#37e48c330efeac784538e0acd3e62ca5e231fe7a" + dependencies: + hoek "5.x.x" + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + dependencies: + glob "^7.1.2" + +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + +tsml@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +ua-parser-js@^0.7.18: + version "0.7.18" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" + +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@3.4.x: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + +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" + 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" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-filename@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + dependencies: + imurmurhash "^0.1.4" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-parse@^1.1.8, url-parse@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +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" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + +v8-compile-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +video.js@^5.19.2: + version "5.20.5" + resolved "http://registry.npmjs.org/video.js/-/video.js-5.20.5.tgz#445cdae204bce459782d86a31b25a32afd6d8eff" + dependencies: + babel-runtime "^6.9.2" + global "4.3.0" + safe-json-parse "4.0.0" + tsml "1.0.1" + videojs-font "2.0.0" + videojs-ie8 "1.1.2" + videojs-swf "5.4.1" + videojs-vtt.js "0.12.6" + xhr "2.2.2" + +videojs-font@2.0.0: + version "2.0.0" + resolved "http://registry.npmjs.org/videojs-font/-/videojs-font-2.0.0.tgz#af7461ef9d4b95e0334bffb78b2f2ff0364a9034" + +videojs-ie8@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/videojs-ie8/-/videojs-ie8-1.1.2.tgz#a23d3d8608ad7192b69c6077fc4eb848998d35d9" + dependencies: + es5-shim "^4.5.1" + +videojs-swf@5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/videojs-swf/-/videojs-swf-5.4.1.tgz#2077ef71c749f2c7823ef49babae4dd2acb08f87" + +videojs-vtt.js@0.12.6: + version "0.12.6" + resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz#e078600bda899eaa6f9c3307134cd0c811947b8e" + dependencies: + global "^4.3.1" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + global-modules-path "^2.3.0" + import-local "^2.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.2" + +webpack-dev-middleware@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" + dependencies: + memory-fs "~0.4.1" + mime "^2.3.1" + range-parser "^1.0.3" + webpack-log "^2.0.0" + +webpack-dev-server@^3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.9.tgz#8b32167624d2faff40dcedc2cbce17ed1f34d3e0" + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.18.0" + import-local "^2.0.0" + internal-ip "^3.0.1" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + schema-utils "^1.0.0" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.1.5" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "3.4.0" + webpack-log "^2.0.0" + yargs "12.0.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.20.2: + version "4.20.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.20.2.tgz#89f6486b6bb276a91b0823453d377501fc625b5a" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-module-context" "1.7.8" + "@webassemblyjs/wasm-edit" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.1.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + +whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + +whatwg-fetch@^2.0.3: + version "2.0.4" + resolved "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +xhr@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.2.2.tgz#2ee72571869f8686d41559a9ea286c18971435ff" + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xmlhttprequest@1: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@12.0.2, yargs@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + dependencies: + cliui "^4.0.0" + decamelize "^2.0.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 "^10.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0"