merge conflicts
authorPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Mon, 23 Jul 2018 12:14:16 +0000 (14:14 +0200)
committerPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Mon, 23 Jul 2018 12:14:16 +0000 (14:14 +0200)
Feature #13781

Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>

1  2 
package.json
src/common/api/common-resource-service.ts
src/store/project/project-action.ts
src/store/project/project-reducer.ts
src/store/store.ts
src/views-components/create-project-dialog/create-project-dialog.tsx
src/views-components/dialog-create/dialog-project-create.tsx
src/views/workbench/workbench.tsx
yarn.lock

diff --combined package.json
index a8c56177bfeaf5e4dadcbb3c063709ab1a4d98e7,0c06a6f17a357115da8c6897f0f159de7da51084..06fa893f97abe1dbcd18523df1deebf0d2660a3e
@@@ -3,12 -3,11 +3,12 @@@
    "version": "0.1.0",
    "private": true,
    "dependencies": {
-     "@material-ui/core": "1.2.1",
+     "@material-ui/core": "1.4.0",
      "@material-ui/icons": "1.1.0",
-     "@types/lodash": "4.14.109",
+     "@types/lodash": "4.14.112",
 +    "@types/redux-form": "^7.4.1",
      "axios": "0.18.0",
-     "classnames": "^2.2.6",
+     "classnames": "2.2.6",
      "lodash": "4.17.10",
      "react": "16.4.1",
      "react-dom": "16.4.1",
    },
    "devDependencies": {
      "@types/classnames": "^2.2.4",
-     "@types/enzyme": "3.1.10",
+     "@types/enzyme": "3.1.12",
      "@types/enzyme-adapter-react-16": "1.0.2",
-     "@types/jest": "23.1.0",
-     "@types/node": "10.3.3",
-     "@types/react": "16.3",
+     "@types/jest": "23.3.0",
+     "@types/node": "10.5.2",
+     "@types/react": "16.4",
      "@types/react-dom": "16.0.6",
-     "@types/react-redux": "6.0.2",
-     "@types/react-router": "4.0.26",
+     "@types/react-redux": "6.0.4",
+     "@types/react-router": "4.0.29",
      "@types/react-router-dom": "4.2.7",
      "@types/react-router-redux": "5.0.15",
      "@types/redux-devtools": "3.0.44",
-     "axios-mock-adapter": "^1.15.0",
-     "enzyme": "^3.3.0",
-     "enzyme-adapter-react-16": "^1.1.1",
 +    "@types/redux-form": "^7.4.1",
+     "axios-mock-adapter": "1.15.0",
+     "enzyme": "3.3.0",
+     "enzyme-adapter-react-16": "1.1.1",
      "jest-localstorage-mock": "2.2.0",
      "redux-devtools": "3.4.1",
 +    "redux-form": "^7.4.2",
      "typescript": "2.9.2"
    },
    "moduleNameMapper": {
index 39825c0e3eb8ae661212161325f7673df7cb095b,2541feab026989228c2cf14521c762c78be97d5c..3956fb7390983824a402456abc2144850b85cda2
@@@ -3,9 -3,9 +3,9 @@@
  // SPDX-License-Identifier: AGPL-3.0
  
  import * as _ from "lodash";
- import FilterBuilder from "./filter-builder";
- import OrderBuilder from "./order-builder";
+ import { FilterBuilder } from "./filter-builder";
+ import { OrderBuilder } from "./order-builder";
 -import { AxiosInstance } from "axios";
 +import { AxiosInstance, AxiosPromise } from "axios";
  import { Resource } from "../../models/resource";
  
  export interface ListArguments {
@@@ -26,12 -26,7 +26,12 @@@ export interface ListResults<T> 
      itemsAvailable: number;
  }
  
- export default class CommonResourceService<T extends Resource> {
 +export interface Errors {
 +    errors: string[];
 +    errorToken: string;
 +}
 +
+ export class CommonResourceService<T extends Resource> {
  
      static mapResponseKeys = (response: any): Promise<any> =>
          CommonResourceService.mapKeys(_.camelCase)(response.data)
              }
          }
  
 +    static defaultResponse<R>(promise: AxiosPromise<R>): Promise<R> {
 +        return promise
 +            .then(CommonResourceService.mapResponseKeys)
 +            .catch(({ response }) => Promise.reject<Errors>(CommonResourceService.mapResponseKeys(response)));
 +    }
 +
      protected serverApi: AxiosInstance;
      protected resourceType: string;
  
      }
  
      create(data: Partial<T>) {
 -        return this.serverApi
 -            .post<T>(this.resourceType, CommonResourceService.mapKeys(_.snakeCase)(data))
 -            .then(CommonResourceService.mapResponseKeys);
 +        return CommonResourceService.defaultResponse(
 +            this.serverApi
 +                .post<T>(this.resourceType, CommonResourceService.mapKeys(_.snakeCase)(data)));
      }
  
      delete(uuid: string): Promise<T> {
 -        return this.serverApi
 -            .delete(this.resourceType + uuid)
 -            .then(CommonResourceService.mapResponseKeys);
 +        return CommonResourceService.defaultResponse(
 +            this.serverApi
 +                .delete(this.resourceType + uuid));
      }
  
      get(uuid: string) {
 -        return this.serverApi
 -            .get<T>(this.resourceType + uuid)
 -            .then(CommonResourceService.mapResponseKeys);
 +        return CommonResourceService.defaultResponse(
 +            this.serverApi
 +                .get<T>(this.resourceType + uuid));
      }
  
      list(args: ListArguments = {}): Promise<ListResults<T>> {
              filters: filters ? filters.serialize() : undefined,
              order: order ? order.getOrder() : undefined
          };
 -        return this.serverApi
 -            .get(this.resourceType, {
 -                params: CommonResourceService.mapKeys(_.snakeCase)(params)
 -            })
 -            .then(CommonResourceService.mapResponseKeys);
 +        return CommonResourceService.defaultResponse(
 +            this.serverApi
 +                .get(this.resourceType, {
 +                    params: CommonResourceService.mapKeys(_.snakeCase)(params)
 +                }));
      }
  
      update(uuid: string) {
          throw new Error("Not implemented");
      }
  }
  
index 3da60f65c9ae9c3d7a14ccbfe0806ba2d6990394,2a7a5c126860253af5929695d05ef9020978e53a..075e77d15483746a751d59553299546f01bd1460
@@@ -6,14 -6,15 +6,14 @@@ import { default as unionize, ofType, U
  import { ProjectResource } from "../../models/project";
  import { projectService } from "../../services/services";
  import { Dispatch } from "redux";
- import FilterBuilder from "../../common/api/filter-builder";
+ import { FilterBuilder } from "../../common/api/filter-builder";
  import { RootState } from "../store";
  
const actions = unionize({
export const projectActions = unionize({
      OPEN_PROJECT_CREATOR: ofType<{ ownerUuid: string }>(),
      CLOSE_PROJECT_CREATOR: ofType<{}>(),
      CREATE_PROJECT: ofType<Partial<ProjectResource>>(),
      CREATE_PROJECT_SUCCESS: ofType<ProjectResource>(),
 -    CREATE_PROJECT_ERROR: ofType<string>(),
      REMOVE_PROJECT: ofType<string>(),
      PROJECTS_REQUEST: ofType<string>(),
      PROJECTS_SUCCESS: ofType<{ projects: ProjectResource[], parentItemId?: string }>(),
      });
  
  export const getProjectList = (parentUuid: string = '') => (dispatch: Dispatch) => {
-     dispatch(actions.PROJECTS_REQUEST(parentUuid));
+     dispatch(projectActions.PROJECTS_REQUEST(parentUuid));
      return projectService.list({
          filters: FilterBuilder
              .create<ProjectResource>()
              .addEqual("ownerUuid", parentUuid)
      }).then(({ items: projects }) => {
-         dispatch(actions.PROJECTS_SUCCESS({ projects, parentItemId: parentUuid }));
+         dispatch(projectActions.PROJECTS_SUCCESS({ projects, parentItemId: parentUuid }));
          return projects;
      });
  };
@@@ -41,11 -42,11 +41,10 @@@ export const createProject = (project: 
      (dispatch: Dispatch, getState: () => RootState) => {
          const { ownerUuid } = getState().projects.creator;
          const projectData = { ownerUuid, ...project };
-         dispatch(actions.CREATE_PROJECT(projectData));
+         dispatch(projectActions.CREATE_PROJECT(projectData));
          return projectService
              .create(projectData)
-             .then(project => dispatch(actions.CREATE_PROJECT_SUCCESS(project)));
 -            .then(project => dispatch(projectActions.CREATE_PROJECT_SUCCESS(project)))
 -            .catch(() => dispatch(projectActions.CREATE_PROJECT_ERROR("Could not create a project")));
++            .then(project => dispatch(projectActions.CREATE_PROJECT_SUCCESS(project)));
      };
  
- export type ProjectAction = UnionOf<typeof actions>;
- export default actions;
+ export type ProjectAction = UnionOf<typeof projectActions>;
index a329e81242f4b8d7e4fd0ab37555281297a16c56,40356c0c90123d7775484849d8fcf937fdbce87d..94a451a86574e70de24f6d143ede7217ce25cf9c
@@@ -4,7 -4,7 +4,7 @@@
  
  import * as _ from "lodash";
  
- import actions, { ProjectAction } from "./project-action";
+ import { projectActions, ProjectAction } from "./project-action";
  import { TreeItem, TreeItemStatus } from "../../components/tree/tree";
  import { ProjectResource } from "../../models/project";
  
@@@ -18,7 -18,6 +18,7 @@@ interface ProjectCreator 
      opened: boolean;
      pending: boolean;
      ownerUuid: string;
 +    error?: string;
  }
  
  export function findTreeItem<T>(tree: Array<TreeItem<T>>, itemId: string): TreeItem<T> | undefined {
@@@ -112,12 -111,13 +112,12 @@@ const initialState: ProjectState = 
  };
  
  
- const projectsReducer = (state: ProjectState = initialState, action: ProjectAction) => {
-     return actions.match(action, {
-         OPEN_PROJECT_CREATOR: ({ ownerUuid }) => updateCreator(state, { ownerUuid, opened: true }),
export const projectsReducer = (state: ProjectState = initialState, action: ProjectAction) => {
+     return projectActions.match(action, {
+         OPEN_PROJECT_CREATOR: ({ ownerUuid }) => updateCreator(state, { ownerUuid, opened: true, pending: false }),
          CLOSE_PROJECT_CREATOR: () => updateCreator(state, { opened: false }),
 -        CREATE_PROJECT: () => updateCreator(state, { opened: false, pending: true }),
 -        CREATE_PROJECT_SUCCESS: () => updateCreator(state, { ownerUuid: "", pending: false }),
 -        CREATE_PROJECT_ERROR: () => updateCreator(state, { ownerUuid: "", pending: false }),
 +        CREATE_PROJECT: () => updateCreator(state, { error: undefined }),
 +        CREATE_PROJECT_SUCCESS: () => updateCreator(state, { opened: false, ownerUuid: "" }),
          REMOVE_PROJECT: () => state,
          PROJECTS_REQUEST: itemId => {
              const items = _.cloneDeep(state.items);
          default: () => state
      });
  };
- export default projectsReducer;
diff --combined src/store/store.ts
index 956fb46011bf3d2fd95cd98fafc4b8637a476186,adb7ddde133d8ac0b6c07e82d6d702017ed0bd10..01b06b9528a727cd3cb9642a16bffeb0e17954ea
@@@ -7,13 -7,13 +7,14 @@@ import { routerMiddleware, routerReduce
  import thunkMiddleware from 'redux-thunk';
  import { History } from "history";
  
- import projectsReducer, { ProjectState } from "./project/project-reducer";
- import sidePanelReducer, { SidePanelState } from './side-panel/side-panel-reducer';
- import authReducer, { AuthState } from "./auth/auth-reducer";
- import dataExplorerReducer, { DataExplorerState } from './data-explorer/data-explorer-reducer';
- import { projectPanelMiddleware } from '../store/project-panel/project-panel-middleware';
- import detailsPanelReducer, { DetailsPanelState } from './details-panel/details-panel-reducer';
+ import { projectsReducer, ProjectState } from "./project/project-reducer";
+ import { sidePanelReducer, SidePanelState } from './side-panel/side-panel-reducer';
+ import { authReducer, AuthState } from "./auth/auth-reducer";
+ import { dataExplorerReducer, DataExplorerState } from './data-explorer/data-explorer-reducer';
+ import { projectPanelMiddleware } from './project-panel/project-panel-middleware';
+ import { detailsPanelReducer, DetailsPanelState } from './details-panel/details-panel-reducer';
+ import { contextMenuReducer, ContextMenuState } from './context-menu/context-menu-reducer';
 +import { reducer as formReducer } from 'redux-form';
  
  const composeEnhancers =
      (process.env.NODE_ENV === 'development' &&
@@@ -27,6 -27,7 +28,7 @@@ export interface RootState 
      dataExplorer: DataExplorerState;
      sidePanel: SidePanelState;
      detailsPanel: DetailsPanelState;
+     contextMenu: ContextMenuState;
  }
  
  const rootReducer = combineReducers({
      dataExplorer: dataExplorerReducer,
      sidePanel: sidePanelReducer,
      detailsPanel: detailsPanelReducer,
 -    contextMenu: contextMenuReducer
++    contextMenu: contextMenuReducer,
 +    form: formReducer
  });
  
  
- export default function configureStore(history: History) {
+ export function configureStore(history: History) {
      const middlewares: Middleware[] = [
          routerMiddleware(history),
          thunkMiddleware,
index f75c459347500da68ea97b196d7be098691b8bbd,2f3e0b7fe319a349165da8b86affd683234ebbbf..43621bf73c0739edcc3d99bcf3077477e1b70d4f
@@@ -4,22 -4,20 +4,22 @@@
  
  import { connect } from "react-redux";
  import { Dispatch } from "redux";
 +import { SubmissionError } from "redux-form";
 +
  import { RootState } from "../../store/store";
- import DialogProjectCreate from "../dialog-create/dialog-project-create";
- import actions, { createProject, getProjectList } from "../../store/project/project-action";
- import dataExplorerActions from "../../store/data-explorer/data-explorer-action";
 -import { DialogProjectCreate as DialogProjectCreateComponent } from "../dialog-create/dialog-project-create";
++import  DialogProjectCreate from "../dialog-create/dialog-project-create";
+ import { projectActions, createProject, getProjectList } from "../../store/project/project-action";
+ import { dataExplorerActions } from "../../store/data-explorer/data-explorer-action";
  import { PROJECT_PANEL_ID } from "../../views/project-panel/project-panel";
  
  const mapStateToProps = (state: RootState) => ({
      open: state.projects.creator.opened
  });
  
 -const submit = (data: { name: string, description: string }) =>
 +export const addProject = (data: { name: string, description: string }) =>
      (dispatch: Dispatch, getState: () => RootState) => {
          const { ownerUuid } = getState().projects.creator;
 -        dispatch<any>(createProject(data)).then(() => {
 +        return dispatch<any>(createProject(data)).then(() => {
              dispatch(dataExplorerActions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID }));
              dispatch<any>(getProjectList(ownerUuid));
          });
  
  const mapDispatchToProps = (dispatch: Dispatch) => ({
      handleClose: () => {
-         dispatch(actions.CLOSE_PROJECT_CREATOR());
+         dispatch(projectActions.CLOSE_PROJECT_CREATOR());
      },
      onSubmit: (data: { name: string, description: string }) => {
 -        dispatch<any>(submit(data));
 +        return dispatch<any>(addProject(data))
 +            .catch((e: any) => {
 +                throw new SubmissionError({ name: e.errors.join("").includes("UniqueViolation") ? "Project with this name already exists." : "" });
 +            });
      }
  });
  
- export default connect(mapStateToProps, mapDispatchToProps)(DialogProjectCreate);
 -export const CreateProjectDialog = connect(mapStateToProps, mapDispatchToProps)(DialogProjectCreateComponent);
++export const CreateProjectDialog = connect(mapStateToProps, mapDispatchToProps)(DialogProjectCreate);
index 6fb8a699df64e01f35dc5a60a49c35063cd827ff,aefb8159871677ce2de8fb8ba13f4442d3d7133d..34c655e2b9922ff9da8c338cac14e59785795c32
@@@ -3,91 -3,16 +3,91 @@@
  // SPDX-License-Identifier: AGPL-3.0
  
  import * as React from 'react';
 +import { reduxForm, Field } from 'redux-form';
 +import { compose } from 'redux';
  import TextField from '@material-ui/core/TextField';
  import Dialog from '@material-ui/core/Dialog';
  import DialogActions from '@material-ui/core/DialogActions';
  import DialogContent from '@material-ui/core/DialogContent';
  import DialogTitle from '@material-ui/core/DialogTitle';
 -import { Button, StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core';
 +import { Button, StyleRulesCallback, WithStyles, withStyles, CircularProgress } from '@material-ui/core';
  
 -import { Validator } from '../../utils/dialog-validator';
 +import { NAME, DESCRIPTION } from '../../validators/create-project/create-project-validator';
  
 -type CssRules = "button" | "lastButton" | "dialogContent" | "textField" | "dialog" | "dialogTitle";
 +interface DialogProjectProps {
 +    open: boolean;
 +    handleClose: () => void;
 +    onSubmit: (data: { name: string, description: string }) => void;
 +    handleSubmit: any;
 +    submitting: boolean;
 +}
 +
 +interface TextFieldProps {
 +    label: string;
 +    floatinglabeltext: string;
 +    className?: string;
 +    input?: string;
 +    meta?: any;
 +}
 +
 +class DialogProjectCreate extends React.Component<DialogProjectProps & WithStyles<CssRules>> {
 +    render() {
 +        const { classes, open, handleClose, handleSubmit, onSubmit, submitting } = this.props;
 +
 +        return (
 +            <Dialog
 +                open={open}
 +                onClose={handleClose}
 +                disableBackdropClick={true}
 +                disableEscapeKeyDown={true}>
 +                <div className={classes.dialog}>
 +                    <form onSubmit={handleSubmit((data: any) => onSubmit(data))}>
 +                        <DialogTitle id="form-dialog-title" className={classes.dialogTitle}>Create a project</DialogTitle>
 +                        <DialogContent className={classes.formContainer}>
 +                            <Field name="name"
 +                                component={this.renderTextField}
 +                                floatinglabeltext="Project Name"
 +                                validate={NAME}
 +                                className={classes.textField}
 +                                label="Project Name" />
 +                            <Field name="description"
 +                                component={this.renderTextField}
 +                                floatinglabeltext="Description - optional"
 +                                validate={DESCRIPTION}
 +                                className={classes.textField}
 +                                label="Description - optional" />
 +                        </DialogContent>
 +                        <DialogActions className={classes.dialogActions}>
 +                            <Button onClick={handleClose} className={classes.button} color="primary" disabled={submitting}>CANCEL</Button>
 +                            <Button type="submit"
 +                                className={classes.lastButton}
 +                                color="primary"
 +                                disabled={submitting}
 +                                variant="contained">
 +                                CREATE A PROJECT
 +                            </Button>
 +                            {submitting && <CircularProgress size={20} className={classes.createProgress} />}
 +                        </DialogActions>
 +                    </form>
 +                </div>
 +            </Dialog>
 +        );
 +    }
 +
 +    renderTextField = ({ input, label, meta: { touched, error }, ...custom }: TextFieldProps) => (
 +        <TextField
 +            helperText={touched && error}
 +            label={label}
 +            className={this.props.classes.textField}
 +            error={touched && !!error}
 +            autoComplete='off'
 +            {...input}
 +            {...custom}
 +        />
 +    )
 +}
 +
 +type CssRules = "button" | "lastButton" | "formContainer" | "textField" | "dialog" | "dialogTitle" | "createProgress" | "dialogActions";
  
  const styles: StyleRulesCallback<CssRules> = theme => ({
      button: {
@@@ -97,9 -22,7 +97,9 @@@
          marginLeft: theme.spacing.unit,
          marginRight: "20px",
      },
 -    dialogContent: {
 +    formContainer: {
 +        display: "flex",
 +        flexDirection: "column",
          marginTop: "20px",
      },
      dialogTitle: {
      dialog: {
          minWidth: "600px",
          minHeight: "320px"
 +    },
 +    createProgress: {
 +        position: "absolute",
 +        minWidth: "20px",
 +        right: "95px"
 +    },
 +    dialogActions: {
 +        marginBottom: "24px"
      }
  });
  
 -interface ProjectCreateProps {
 -    open: boolean;
 -    handleClose: () => void;
 -    onSubmit: (data: { name: string, description: string }) => void;
 -}
 -
 -interface DialogState {
 -    name: string;
 -    description: string;
 -    isNameValid: boolean;
 -    isDescriptionValid: boolean;
 -}
 -
 -export const DialogProjectCreate = withStyles(styles)(
 -    class extends React.Component<ProjectCreateProps & WithStyles<CssRules>> {
 -        state: DialogState = {
 -            name: '',
 -            description: '',
 -            isNameValid: false,
 -            isDescriptionValid: true
 -        };
 -
 -        render() {
 -            const { name, description } = this.state;
 -            const { classes, open, handleClose } = this.props;
 -
 -            return (
 -                <Dialog
 -                    open={open}
 -                    onClose={handleClose}>
 -                    <div className={classes.dialog}>
 -                        <DialogTitle id="form-dialog-title" className={classes.dialogTitle}>Create a project</DialogTitle>
 -                        <DialogContent className={classes.dialogContent}>
 -                            <Validator
 -                                value={name}
 -                                onChange={e => this.isNameValid(e)}
 -                                isRequired={true}
 -                                render={hasError =>
 -                                    <TextField
 -                                        margin="dense"
 -                                        className={classes.textField}
 -                                        id="name"
 -                                        onChange={e => this.handleProjectName(e)}
 -                                        label="Project name"
 -                                        error={hasError}
 -                                        fullWidth/>}/>
 -                            <Validator
 -                                value={description}
 -                                onChange={e => this.isDescriptionValid(e)}
 -                                isRequired={false}
 -                                render={hasError =>
 -                                    <TextField
 -                                        margin="dense"
 -                                        className={classes.textField}
 -                                        id="description"
 -                                        onChange={e => this.handleDescriptionValue(e)}
 -                                        label="Description - optional"
 -                                        error={hasError}
 -                                        fullWidth/>}/>
 -                        </DialogContent>
 -                        <DialogActions>
 -                            <Button onClick={handleClose} className={classes.button} color="primary">CANCEL</Button>
 -                            <Button onClick={this.handleSubmit} className={classes.lastButton} color="primary"
 -                                    disabled={!this.state.isNameValid || (!this.state.isDescriptionValid && description.length > 0)}
 -                                    variant="raised">CREATE A PROJECT</Button>
 -                        </DialogActions>
 -                    </div>
 -                </Dialog>
 -            );
 -        }
 -
 -        handleSubmit = () => {
 -            this.props.onSubmit({
 -                name: this.state.name,
 -                description: this.state.description
 -            });
 -        }
 -
 -        handleProjectName(e: React.ChangeEvent<HTMLInputElement>) {
 -            this.setState({
 -                name: e.target.value,
 -            });
 -        }
 -
 -        handleDescriptionValue(e: React.ChangeEvent<HTMLInputElement>) {
 -            this.setState({
 -                description: e.target.value,
 -            });
 -        }
 -
 -        isNameValid(value: boolean | string) {
 -            this.setState({
 -                isNameValid: value,
 -            });
 -        }
 -
 -        isDescriptionValid(value: boolean | string) {
 -            this.setState({
 -                isDescriptionValid: value,
 -            });
 -        }
 -    }
 -);
 +export default compose(
 +    reduxForm({ form: 'projectCreateDialog' }),
 +    withStyles(styles)
- )(DialogProjectCreate);
++)(DialogProjectCreate);
index b2bdac802f7fd5bc1d173fcd1085f41db04fe2e7,a62b713a52aeb7b4149e49248dc1ac4a7fe7fea1..b1e7cd78659efe4cfa88239adaa591d7cda4813b
@@@ -7,34 -7,31 +7,31 @@@ import { StyleRulesCallback, WithStyles
  import Drawer from '@material-ui/core/Drawer';
  import { connect, DispatchProp } from "react-redux";
  import { Route, Switch, RouteComponentProps } from "react-router";
- import authActions from "../../store/auth/auth-action";
+ import { authActions } from "../../store/auth/auth-action";
  import { User } from "../../models/user";
  import { RootState } from "../../store/store";
- import MainAppBar, {
-     MainAppBarActionProps,
-     MainAppBarMenuItem
- } from '../../views-components/main-app-bar/main-app-bar';
+ import { MainAppBar, MainAppBarActionProps, MainAppBarMenuItem } from '../../views-components/main-app-bar/main-app-bar';
  import { Breadcrumb } from '../../components/breadcrumbs/breadcrumbs';
  import { push } from 'react-router-redux';
- import ProjectTree from '../../views-components/project-tree/project-tree';
+ import { ProjectTree } from '../../views-components/project-tree/project-tree';
  import { TreeItem } from "../../components/tree/tree";
  import { getTreePath } from '../../store/project/project-reducer';
- import sidePanelActions from '../../store/side-panel/side-panel-action';
- import SidePanel, { SidePanelItem } from '../../components/side-panel/side-panel';
+ import { sidePanelActions } from '../../store/side-panel/side-panel-action';
+ import { SidePanel, SidePanelItem } from '../../components/side-panel/side-panel';
  import { ItemMode, setProjectItem } from "../../store/navigation/navigation-action";
- import projectActions from "../../store/project/project-action";
- import ProjectPanel from "../project-panel/project-panel";
- import DetailsPanel from '../../views-components/details-panel/details-panel';
+ import { projectActions } from "../../store/project/project-action";
+ import { ProjectPanel } from "../project-panel/project-panel";
+ import { DetailsPanel } from '../../views-components/details-panel/details-panel';
  import { ArvadosTheme } from '../../common/custom-theme';
- import ContextMenu, { ContextMenuAction } from '../../components/context-menu/context-menu';
- import { mockAnchorFromMouseEvent } from '../../components/popover/helpers';
- import DialogProjectCreate from "../../views-components/create-project-dialog/create-project-dialog";
+ import { CreateProjectDialog } from "../../views-components/create-project-dialog/create-project-dialog";
  import { authService } from '../../services/services';
  
- import detailsPanelActions, { loadDetails } from "../../store/details-panel/details-panel-action";
+ import { detailsPanelActions, loadDetails } from "../../store/details-panel/details-panel-action";
+ import { contextMenuActions } from "../../store/context-menu/context-menu-actions";
  import { SidePanelIdentifiers } from '../../store/side-panel/side-panel-reducer';
  import { ProjectResource } from '../../models/project';
  import { ResourceKind } from '../../models/resource';
+ import { ContextMenu, ContextMenuKind } from "../../views-components/context-menu/context-menu";
  
  const drawerWidth = 240;
  const appBarHeight = 100;
@@@ -98,10 -95,6 +95,6 @@@ interface NavMenuItem extends MainAppBa
  }
  
  interface WorkbenchState {
-     contextMenu: {
-         anchorEl?: HTMLElement;
-         itemUuid?: string;
-     };
      anchorEl: any;
      searchText: string;
      menuItems: {
      };
  }
  
- class Workbench extends React.Component<WorkbenchProps, WorkbenchState> {
-     state = {
-         contextMenu: {
-             anchorEl: undefined,
-             itemUuid: undefined
-         },
-         isCreationDialogOpen: false,
-         anchorEl: null,
-         searchText: "",
-         breadcrumbs: [],
-         menuItems: {
-             accountMenu: [
-                 {
-                     label: "Logout",
-                     action: () => this.props.dispatch(authActions.LOGOUT())
-                 },
-                 {
-                     label: "My account",
-                     action: () => this.props.dispatch(push("/my-account"))
-                 }
-             ],
-             helpMenu: [
-                 {
-                     label: "Help",
-                     action: () => this.props.dispatch(push("/help"))
+ export const Workbench = withStyles(styles)(
+     connect<WorkbenchDataProps>(
+         (state: RootState) => ({
+             projects: state.projects.items,
+             currentProjectId: state.projects.currentItemId,
+             user: state.auth.user,
+             sidePanelItems: state.sidePanel
+         })
+     )(
+         class extends React.Component<WorkbenchProps, WorkbenchState> {
+             state = {
+                 isCreationDialogOpen: false,
+                 anchorEl: null,
+                 searchText: "",
+                 breadcrumbs: [],
+                 menuItems: {
+                     accountMenu: [
+                         {
+                             label: "Logout",
+                             action: () => this.props.dispatch(authActions.LOGOUT())
+                         },
+                         {
+                             label: "My account",
+                             action: () => this.props.dispatch(push("/my-account"))
+                         }
+                     ],
+                     helpMenu: [
+                         {
+                             label: "Help",
+                             action: () => this.props.dispatch(push("/help"))
+                         }
+                     ],
+                     anonymousMenu: [
+                         {
+                             label: "Sign in",
+                             action: () => this.props.dispatch(authActions.LOGIN())
+                         }
+                     ]
                  }
-             ],
-             anonymousMenu: [
-                 {
-                     label: "Sign in",
-                     action: () => this.props.dispatch(authActions.LOGIN())
-                 }
-             ]
-         }
-     };
+             };
  
-     mainAppBarActions: MainAppBarActionProps = {
-         onBreadcrumbClick: ({ itemId }: NavBreadcrumb) => {
-             this.props.dispatch<any>(setProjectItem(itemId, ItemMode.BOTH));
-             this.props.dispatch<any>(loadDetails(itemId, ResourceKind.Project));
-         },
-         onSearch: searchText => {
-             this.setState({ searchText });
-             this.props.dispatch(push(`/search?q=${searchText}`));
-         },
-         onMenuItemClick: (menuItem: NavMenuItem) => menuItem.action(),
-         onDetailsPanelToggle: () => {
-             this.props.dispatch(detailsPanelActions.TOGGLE_DETAILS_PANEL());
-         },
-         onContextMenu: (event: React.MouseEvent<HTMLElement>, breadcrumb: NavBreadcrumb) => {
-             this.openContextMenu(event, breadcrumb.itemId);
-         }
-     };
+             render() {
+                 const path = getTreePath(this.props.projects, this.props.currentProjectId);
+                 const breadcrumbs = path.map(item => ({
+                     label: item.data.name,
+                     itemId: item.data.uuid,
+                     status: item.status
+                 }));
  
-     toggleSidePanelOpen = (itemId: string) => {
-         this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_OPEN(itemId));
-     }
+                 const { classes, user } = this.props;
+                 return (
+                     <div className={classes.root}>
+                         <div className={classes.appBar}>
+                             <MainAppBar
+                                 breadcrumbs={breadcrumbs}
+                                 searchText={this.state.searchText}
+                                 user={this.props.user}
+                                 menuItems={this.state.menuItems}
+                                 {...this.mainAppBarActions} />
+                         </div>
+                         {user &&
+                             <Drawer
+                                 variant="permanent"
+                                 classes={{
+                                     paper: classes.drawerPaper,
+                                 }}>
+                                 <div className={classes.toolbar} />
+                                 <SidePanel
+                                     toggleOpen={this.toggleSidePanelOpen}
+                                     toggleActive={this.toggleSidePanelActive}
+                                     sidePanelItems={this.props.sidePanelItems}
+                                     onContextMenu={(event) => this.openContextMenu(event, authService.getUuid() || "", ContextMenuKind.RootProject)}>
+                                     <ProjectTree
+                                         projects={this.props.projects}
+                                         toggleOpen={itemId => this.props.dispatch<any>(setProjectItem(itemId, ItemMode.OPEN))}
+                                         onContextMenu={(event, item) => this.openContextMenu(event, item.data.uuid, ContextMenuKind.Project)}
+                                         toggleActive={itemId => {
+                                             this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE));
+                                             this.props.dispatch<any>(loadDetails(itemId, ResourceKind.Project));
+                                             this.props.dispatch<any>(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.Projects));
+                                         }} />
+                                 </SidePanel>
+                             </Drawer>}
+                         <main className={classes.contentWrapper}>
+                             <div className={classes.content}>
+                                 <Switch>
+                                     <Route path="/projects/:id" render={this.renderProjectPanel} />
+                                 </Switch>
+                             </div>
 -                            { user && <DetailsPanel /> }
++                            {user && <DetailsPanel />}
+                         </main>
+                         <ContextMenu />
+                         <CreateProjectDialog />
+                     </div>
+                 );
+             }
  
-     toggleSidePanelActive = (itemId: string) => {
-         this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(itemId));
-         this.props.dispatch(projectActions.RESET_PROJECT_TREE_ACTIVITY(itemId));
-         this.props.dispatch(push("/"));
-     }
+             renderProjectPanel = (props: RouteComponentProps<{ id: string }>) => <ProjectPanel
+                 onItemRouteChange={itemId => this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE))}
+                 onContextMenu={(event, item) => this.openContextMenu(event, item.uuid, ContextMenuKind.Project)}
+                 onDialogOpen={this.handleCreationDialogOpen}
+                 onItemClick={item => {
+                     this.props.dispatch<any>(loadDetails(item.uuid, item.kind as ResourceKind));
+                 }}
+                 onItemDoubleClick={item => {
+                     this.props.dispatch<any>(setProjectItem(item.uuid, ItemMode.ACTIVE));
+                     this.props.dispatch<any>(loadDetails(item.uuid, ResourceKind.Project));
+                 }}
+                 {...props} />
  
-     handleCreationDialogOpen = (itemUuid: string) => {
-         this.closeContextMenu();
-         this.props.dispatch(projectActions.OPEN_PROJECT_CREATOR({ ownerUuid: itemUuid }));
-     }
+             mainAppBarActions: MainAppBarActionProps = {
+                 onBreadcrumbClick: ({ itemId }: NavBreadcrumb) => {
+                     this.props.dispatch<any>(setProjectItem(itemId, ItemMode.BOTH));
+                     this.props.dispatch<any>(loadDetails(itemId, ResourceKind.Project));
+                 },
+                 onSearch: searchText => {
+                     this.setState({ searchText });
+                     this.props.dispatch(push(`/search?q=${searchText}`));
+                 },
+                 onMenuItemClick: (menuItem: NavMenuItem) => menuItem.action(),
+                 onDetailsPanelToggle: () => {
+                     this.props.dispatch(detailsPanelActions.TOGGLE_DETAILS_PANEL());
+                 },
+                 onContextMenu: (event: React.MouseEvent<HTMLElement>, breadcrumb: NavBreadcrumb) => {
+                     this.openContextMenu(event, breadcrumb.itemId, ContextMenuKind.Project);
+                 }
+             };
  
+             toggleSidePanelOpen = (itemId: string) => {
+                 this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_OPEN(itemId));
+             }
  
-     openContextMenu = (event: React.MouseEvent<HTMLElement>, itemUuid: string) => {
-         event.preventDefault();
-         this.setState({
-             contextMenu: {
-                 anchorEl: mockAnchorFromMouseEvent(event),
-                 itemUuid
+             toggleSidePanelActive = (itemId: string) => {
+                 this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(itemId));
+                 this.props.dispatch(projectActions.RESET_PROJECT_TREE_ACTIVITY(itemId));
+                 this.props.dispatch(push("/"));
              }
-         });
-     }
  
-     closeContextMenu = () => {
-         this.setState({ contextMenu: {} });
-     }
+             handleCreationDialogOpen = (itemUuid: string) => {
+                 this.props.dispatch(projectActions.OPEN_PROJECT_CREATOR({ ownerUuid: itemUuid }));
+             }
  
-     openCreateDialog = (item: ContextMenuAction) => {
-         const { itemUuid } = this.state.contextMenu;
-         if (item.openCreateDialog && itemUuid) {
-             this.handleCreationDialogOpen(itemUuid);
+             openContextMenu = (event: React.MouseEvent<HTMLElement>, itemUuid: string, kind: ContextMenuKind) => {
+                 event.preventDefault();
+                 this.props.dispatch(
+                     contextMenuActions.OPEN_CONTEXT_MENU({
+                         position: { x: event.clientX, y: event.clientY },
+                         resource: { uuid: itemUuid, kind }
+                     })
+                 );
+             }
          }
-     }
-     render() {
-         const path = getTreePath(this.props.projects, this.props.currentProjectId);
-         const breadcrumbs = path.map(item => ({
-             label: item.data.name,
-             itemId: item.data.uuid,
-             status: item.status
-         }));
-         const { classes, user } = this.props;
-         return (
-             <div className={classes.root}>
-                 <div className={classes.appBar}>
-                     <MainAppBar
-                         breadcrumbs={breadcrumbs}
-                         searchText={this.state.searchText}
-                         user={this.props.user}
-                         menuItems={this.state.menuItems}
-                         {...this.mainAppBarActions} />
-                 </div>
-                 {user &&
-                     <Drawer
-                         variant="permanent"
-                         classes={{
-                             paper: classes.drawerPaper,
-                         }}>
-                         <div className={classes.toolbar} />
-                         <SidePanel
-                             toggleOpen={this.toggleSidePanelOpen}
-                             toggleActive={this.toggleSidePanelActive}
-                             sidePanelItems={this.props.sidePanelItems}
-                             onContextMenu={(event) => this.openContextMenu(event, authService.getUuid() || "")}>
-                             <ProjectTree
-                                 projects={this.props.projects}
-                                 toggleOpen={itemId => this.props.dispatch<any>(setProjectItem(itemId, ItemMode.OPEN))}
-                                 onContextMenu={(event, item) => this.openContextMenu(event, item.data.uuid)}
-                                 toggleActive={itemId => {
-                                     this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE));
-                                     this.props.dispatch<any>(loadDetails(itemId, ResourceKind.Project));
-                                     this.props.dispatch<any>(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.Projects));
-                                 }} />
-                         </SidePanel>
-                     </Drawer>}
-                 <main className={classes.contentWrapper}>
-                     <div className={classes.content}>
-                         <Switch>
-                             <Route path="/projects/:id" render={this.renderProjectPanel} />
-                         </Switch>
-                     </div>
-                     <DetailsPanel />
-                 </main>
-                 <ContextMenu
-                     anchorEl={this.state.contextMenu.anchorEl}
-                     actions={contextMenuActions}
-                     onActionClick={this.openCreateDialog}
-                     onClose={this.closeContextMenu} />
-                 <DialogProjectCreate />
-             </div>
-         );
-     }
-     renderProjectPanel = (props: RouteComponentProps<{ id: string }>) => <ProjectPanel
-         onItemRouteChange={itemId => this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE))}
-         onContextMenu={(event, item) => this.openContextMenu(event, item.uuid)}
-         onDialogOpen={this.handleCreationDialogOpen}
-         onItemClick={item => {
-             this.props.dispatch<any>(loadDetails(item.uuid, item.kind as ResourceKind));
-         }}
-         onItemDoubleClick={item => {
-             this.props.dispatch<any>(setProjectItem(item.uuid, ItemMode.ACTIVE));
-             this.props.dispatch<any>(loadDetails(item.uuid, ResourceKind.Project));
-         }}
-         {...props} />
- }
- const contextMenuActions = [[{
-     icon: "fas fa-plus fa-fw",
-     name: "New project",
-     openCreateDialog: true
- }, {
-     icon: "fas fa-users fa-fw",
-     name: "Share"
- }, {
-     icon: "fas fa-sign-out-alt fa-fw",
-     name: "Move to"
- }, {
-     icon: "fas fa-star fa-fw",
-     name: "Add to favourite"
- }, {
-     icon: "fas fa-edit fa-fw",
-     name: "Rename"
- }, {
-     icon: "fas fa-copy fa-fw",
-     name: "Make a copy"
- }, {
-     icon: "fas fa-download fa-fw",
-     name: "Download"
- }], [{
-     icon: "fas fa-trash-alt fa-fw",
-     name: "Remove"
- }
- ]];
- export default connect<WorkbenchDataProps>(
-     (state: RootState) => ({
-         projects: state.projects.items,
-         currentProjectId: state.projects.currentItemId,
-         user: state.auth.user,
-         sidePanelItems: state.sidePanel
-     })
- )(
-     withStyles(styles)(Workbench)
+     )
  );
diff --combined yarn.lock
index 0034169d75448de4aa4c61606da529be798bb14c,6960aaf60099961087c01579ef83f78ffd28bdd9..3557ebefe81e4c1e197f30077f9e8c6892ce28a9
+++ b/yarn.lock
@@@ -3,29 -3,29 +3,29 @@@
  
  
  "@babel/code-frame@^7.0.0-beta.35":
-   version "7.0.0-beta.51"
-   resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz#bd71d9b192af978df915829d39d4094456439a0c"
+   version "7.0.0-beta.54"
+   resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.54.tgz#0024f96fdf7028a21d68e273afd4e953214a1ead"
    dependencies:
-     "@babel/highlight" "7.0.0-beta.51"
+     "@babel/highlight" "7.0.0-beta.54"
  
- "@babel/highlight@7.0.0-beta.51":
-   version "7.0.0-beta.51"
-   resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.51.tgz#e8844ae25a1595ccfd42b89623b4376ca06d225d"
+ "@babel/highlight@7.0.0-beta.54":
+   version "7.0.0-beta.54"
+   resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.54.tgz#155d507358329b8e7068970017c3fd74a9b08584"
    dependencies:
      chalk "^2.0.0"
      esutils "^2.0.2"
      js-tokens "^3.0.0"
  
  "@babel/runtime@^7.0.0-beta.42":
-   version "7.0.0-beta.51"
-   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.51.tgz#48b8ed18307034c6620f643514650ca2ccc0165a"
+   version "7.0.0-beta.54"
+   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.54.tgz#39ebb42723fe7ca4b3e1b00e967e80138d47cadf"
    dependencies:
      core-js "^2.5.7"
-     regenerator-runtime "^0.11.1"
+     regenerator-runtime "^0.12.0"
  
- "@material-ui/core@1.2.1":
-   version "1.2.1"
-   resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-1.2.1.tgz#f8c73da10b875762b37be7167ec2ac79b027499f"
+ "@material-ui/core@1.4.0":
+   version "1.4.0"
+   resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-1.4.0.tgz#e535fef84576b096c46e1fb7d6c4c61895155fd3"
    dependencies:
      "@babel/runtime" "^7.0.0-beta.42"
      "@types/jss" "^9.5.3"
@@@ -37,6 -37,7 +37,7 @@@
      deepmerge "^2.0.1"
      dom-helpers "^3.2.1"
      hoist-non-react-statics "^2.5.0"
+     is-plain-object "^2.0.4"
      jss "^9.3.3"
      jss-camel-case "^6.0.0"
      jss-default-unit "^8.0.2"
      jss-vendor-prefixer "^7.0.0"
      keycode "^2.1.9"
      normalize-scroll-left "^0.1.2"
+     popper.js "^1.0.0"
      prop-types "^15.6.0"
      react-event-listener "^0.6.0"
      react-jss "^8.1.0"
-     react-popper "^0.10.0"
      react-transition-group "^2.2.1"
-     recompose "^0.26.0 || ^0.27.0"
+     recompose "^0.27.0"
      scroll "^2.0.3"
      warning "^4.0.1"
  
      recompose "^0.26.0 || ^0.27.0"
  
  "@types/cheerio@*":
-   version "0.22.7"
-   resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce"
+   version "0.22.8"
+   resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.8.tgz#5702f74f78b73e13f1eb1bd435c2c9de61a250d4"
  
  "@types/classnames@^2.2.4":
-   version "2.2.4"
-   resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.4.tgz#d3ee9ebf714aa34006707b8f4a58fd46b642305a"
+   version "2.2.5"
+   resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.5.tgz#62945b24b48dc02fb32e89252bde3daf942c4235"
  
  "@types/enzyme-adapter-react-16@1.0.2":
    version "1.0.2"
@@@ -75,9 -76,9 +76,9 @@@
    dependencies:
      "@types/enzyme" "*"
  
- "@types/enzyme@*", "@types/enzyme@3.1.10":
-   version "3.1.10"
-   resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.10.tgz#28108a9864e65699751469551a803a35d2e26160"
+ "@types/enzyme@*", "@types/enzyme@3.1.12":
+   version "3.1.12"
+   resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.12.tgz#293bb07c1ef5932d37add3879e72e0f5bc614f3c"
    dependencies:
      "@types/cheerio" "*"
      "@types/react" "*"
@@@ -86,9 -87,9 +87,9 @@@
    version "4.6.2"
    resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0"
  
- "@types/jest@23.1.0":
-   version "23.1.0"
-   resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.0.tgz#8054dd838ba23dc331794d26456b86c7e50bf0f6"
+ "@types/jest@23.3.0":
+   version "23.3.0"
+   resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.0.tgz#5dd70033b616a6228042244ebd992f6426808810"
  
  "@types/jss@^9.5.3":
    version "9.5.3"
      csstype "^2.0.0"
      indefinite-observable "^1.0.1"
  
- "@types/lodash@4.14.109":
-   version "4.14.109"
-   resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.109.tgz#b1c4442239730bf35cabaf493c772b18c045886d"
+ "@types/lodash@4.14.112":
+   version "4.14.112"
+   resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.112.tgz#4a8d8e5716b97a1ac01fe1931ad1e4cba719de5a"
  
- "@types/node@*", "@types/node@10.3.3":
-   version "10.3.3"
-   resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3"
+ "@types/node@*", "@types/node@10.5.2":
+   version "10.5.2"
+   resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707"
  
  "@types/react-dom@16.0.6":
    version "16.0.6"
      "@types/node" "*"
      "@types/react" "*"
  
- "@types/react-redux@6.0.2":
-   version "6.0.2"
-   resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.2.tgz#10069b53db8e0920fd8656e068dcf10c53c9ad2a"
+ "@types/react-redux@6.0.4":
+   version "6.0.4"
+   resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.4.tgz#c1cfce0a0bd88983c75dbf393576f8dc59181586"
    dependencies:
      "@types/react" "*"
      redux "^4.0.0"
      "@types/react-router" "*"
      redux ">= 3.7.2"
  
- "@types/react-router@*", "@types/react-router@4.0.26":
-   version "4.0.26"
-   resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.26.tgz#4489c873642baa633014294a6d0a290001ba9860"
+ "@types/react-router@*", "@types/react-router@4.0.29":
+   version "4.0.29"
+   resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.29.tgz#1a906dd99abf21297a5b7cf003d1fd36e7a92069"
    dependencies:
      "@types/history" "*"
      "@types/react" "*"
    dependencies:
      "@types/react" "*"
  
- "@types/react@*", "@types/react@16.3":
-   version "16.3.18"
-   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.18.tgz#bf195aed4d77dc86f06e4c9bb760214a3b822b8d"
+ "@types/react@*", "@types/react@16.4":
+   version "16.4.6"
+   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada"
    dependencies:
      csstype "^2.2.0"
  
      "@types/react" "*"
      redux "^3.6.0"
  
 +"@types/redux-form@^7.4.1":
 +  version "7.4.1"
 +  resolved "https://registry.yarnpkg.com/@types/redux-form/-/redux-form-7.4.1.tgz#df84bbda5f06e4d517210797c3cfdc573c3bda36"
 +  dependencies:
 +    "@types/react" "*"
 +    redux "^3.6.0 || ^4.0.0"
 +
  abab@^1.0.4:
    version "1.0.4"
    resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
@@@ -226,8 -220,8 +227,8 @@@ ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5
      json-schema-traverse "^0.3.0"
  
  ajv@^6.1.0:
-   version "6.5.1"
-   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d"
+   version "6.5.2"
+   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
    dependencies:
      fast-deep-equal "^2.0.1"
      fast-json-stable-stringify "^2.0.0"
@@@ -659,8 -653,8 +660,8 @@@ babel-jest@^22.1.0, babel-jest@^22.4.4
      babel-preset-jest "^22.4.4"
  
  babel-loader@^7.1.2:
-   version "7.1.4"
-   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015"
+   version "7.1.5"
+   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"
    dependencies:
      find-cache-dir "^1.0.0"
      loader-utils "^1.0.2"
@@@ -1040,8 -1034,8 +1041,8 @@@ babel-preset-jest@^22.0.1, babel-preset
      babel-plugin-syntax-object-rest-spread "^6.13.0"
  
  babel-preset-react-app@^3.1.1:
-   version "3.1.1"
-   resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.1.tgz#d3f06a79742f0e89d7afcb72e282d9809c850920"
+   version "3.1.2"
+   resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.2.tgz#49ba3681b917c4e5c73a5249d3ef4c48fae064e2"
    dependencies:
      babel-plugin-dynamic-import-node "1.1.0"
      babel-plugin-syntax-dynamic-import "6.18.0"
@@@ -1153,8 -1147,8 +1154,8 @@@ batch@0.6.1
    resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
  
  bcrypt-pbkdf@^1.0.0:
-   version "1.0.1"
-   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+   version "1.0.2"
+   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
    dependencies:
      tweetnacl "^0.14.3"
  
@@@ -1259,8 -1253,8 +1260,8 @@@ browser-process-hrtime@^0.1.2
    resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
  
  browser-resolve@^1.11.2:
-   version "1.11.2"
-   resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+   version "1.11.3"
+   resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
    dependencies:
      resolve "1.1.7"
  
@@@ -1284,12 -1278,13 +1285,13 @@@ browserify-cipher@^1.0.0
      evp_bytestokey "^1.0.0"
  
  browserify-des@^1.0.0:
-   version "1.0.1"
-   resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c"
+   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"
@@@ -1444,12 -1439,12 +1446,12 @@@ caniuse-api@^1.5.2
      lodash.uniq "^4.5.0"
  
  caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
-   version "1.0.30000856"
-   resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f"
+   version "1.0.30000867"
+   resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000867.tgz#b55a6ecfac3107988940c9c7dfe1866315312c97"
  
  caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000792:
-   version "1.0.30000856"
-   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000856.tgz#ecc16978135a6f219b138991eb62009d25ee8daa"
+   version "1.0.30000865"
+   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
  
  capture-exit@^1.2.0:
    version "1.2.0"
@@@ -1529,8 -1524,8 +1531,8 @@@ chokidar@^1.6.0, chokidar@^1.7.0
      fsevents "^1.0.0"
  
  chokidar@^2.0.2:
-   version "2.0.3"
-   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
+   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"
      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.0"
+     upath "^1.0.5"
    optionalDependencies:
-     fsevents "^1.1.2"
+     fsevents "^1.2.2"
  
  chownr@^1.0.1:
    version "1.0.1"
@@@ -1699,9 -1695,9 +1702,9 @@@ combined-stream@1.0.6, combined-stream@
    dependencies:
      delayed-stream "~1.0.0"
  
- commander@2.15.x, commander@^2.12.1, commander@~2.15.0:
-   version "2.15.1"
-   resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+ commander@2.16.x, commander@^2.12.1, commander@~2.16.0:
+   version "2.16.0"
+   resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50"
  
  commander@~2.13.0:
    version "2.13.0"
@@@ -1719,22 -1715,22 +1722,22 @@@ 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.13:
+ compressible@~2.0.14:
    version "2.0.14"
    resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7"
    dependencies:
      mime-db ">= 1.34.0 < 2"
  
  compression@^1.5.2:
-   version "1.7.2"
-   resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69"
+   version "1.7.3"
+   resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db"
    dependencies:
-     accepts "~1.3.4"
+     accepts "~1.3.5"
      bytes "3.0.0"
-     compressible "~2.0.13"
+     compressible "~2.0.14"
      debug "2.6.9"
      on-headers "~1.0.1"
-     safe-buffer "5.1.1"
+     safe-buffer "5.1.2"
      vary "~1.1.2"
  
  concat-map@0.0.1:
@@@ -2015,8 -2011,8 +2018,8 @@@ csso@~2.3.1
      source-map "^0.5.3"
  
  cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
-   version "0.3.2"
-   resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+   version "0.3.4"
+   resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797"
  
  "cssstyle@>= 0.3.1 < 0.4.0":
    version "0.3.1"
    dependencies:
      cssom "0.3.x"
  
- csstype@^2.0.0, csstype@^2.5.2:
-   version "2.5.3"
-   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.3.tgz#2504152e6e1cc59b32098b7f5d6a63f16294c1f7"
- csstype@^2.2.0:
+ csstype@^2.0.0, csstype@^2.2.0, csstype@^2.5.2:
    version "2.5.5"
    resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.5.tgz#4125484a3d42189a863943f23b9e4b80fedfa106"
  
@@@ -2369,8 -2361,8 +2368,8 @@@ ee-first@1.1.1
    resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
  
  electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30:
-   version "1.3.48"
-   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900"
+   version "1.3.52"
+   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
  
  elliptic@^6.0.0:
    version "6.4.0"
@@@ -2430,11 -2422,10 +2429,10 @@@ enzyme-adapter-react-16@^1.1.1
      react-test-renderer "^16.0.0-0"
  
  enzyme-adapter-utils@^1.3.0:
-   version "1.3.0"
-   resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.3.0.tgz#d6c85756826c257a8544d362cc7a67e97ea698c7"
+   version "1.4.0"
+   resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz#c403b81e8eb9953658569e539780964bdc98de62"
    dependencies:
-     lodash "^4.17.4"
-     object.assign "^4.0.4"
+     object.assign "^4.1.0"
      prop-types "^15.6.0"
  
  enzyme@^3.3.0:
@@@ -2465,8 -2456,8 +2463,8 @@@ errno@^0.1.3, errno@~0.1.7
      prr "~1.0.1"
  
  error-ex@^1.2.0:
-   version "1.3.1"
-   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+   version "1.3.2"
+   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
    dependencies:
      is-arrayish "^0.2.1"
  
@@@ -2496,10 -2487,6 +2494,10 @@@ es5-ext@^0.10.14, es5-ext@^0.10.35, es5
      es6-symbol "~3.1.1"
      next-tick "1"
  
 +es6-error@^4.1.1:
 +  version "4.1.1"
 +  resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
 +
  es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
    version "2.0.3"
    resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
@@@ -2558,8 -2545,8 +2556,8 @@@ escape-string-regexp@1.0.5, escape-stri
    resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
  
  escodegen@^1.9.0:
-   version "1.10.0"
-   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e"
+   version "1.11.0"
+   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
    dependencies:
      esprima "^3.1.3"
      estraverse "^4.2.0"
@@@ -2586,8 -2573,8 +2584,8 @@@ esprima@^3.1.3
    resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
  
  esprima@^4.0.0:
-   version "4.0.0"
-   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+   version "4.0.1"
+   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
  
  esrecurse@^4.1.0:
    version "4.2.1"
@@@ -2636,10 -2623,10 +2634,10 @@@ evp_bytestokey@^1.0.0, evp_bytestokey@^
      safe-buffer "^5.1.1"
  
  exec-sh@^0.2.0:
-   version "0.2.1"
-   resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
+   version "0.2.2"
+   resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
    dependencies:
-     merge "^1.1.3"
+     merge "^1.2.0"
  
  execa@^0.7.0:
    version "0.7.0"
@@@ -2939,8 -2926,8 +2937,8 @@@ flush-write-stream@^1.0.0
      readable-stream "^2.0.4"
  
  follow-redirects@^1.0.0, follow-redirects@^1.3.0:
-   version "1.5.0"
-   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.0.tgz#234f49cf770b7f35b40e790f636ceba0c3a0ab77"
+   version "1.5.1"
+   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291"
    dependencies:
      debug "^3.1.0"
  
@@@ -3049,7 -3036,7 +3047,7 @@@ 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.0.0, fsevents@^1.1.2, fsevents@^1.1.3, fsevents@^1.2.3:
+ fsevents@^1.0.0, fsevents@^1.1.3, fsevents@^1.2.2, fsevents@^1.2.3:
    version "1.2.4"
    resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
    dependencies:
@@@ -3082,8 -3069,8 +3080,8 @@@ gauge@~2.7.3
      wide-align "^1.1.0"
  
  get-caller-file@^1.0.1:
-   version "1.0.2"
-   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+   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"
@@@ -3318,11 -3305,11 +3316,11 @@@ hash-base@^3.0.0
      safe-buffer "^5.0.1"
  
  hash.js@^1.0.0, hash.js@^1.0.3:
-   version "1.1.4"
-   resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c"
+   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.0"
+     minimalistic-assert "^1.0.1"
  
  he@1.1.x:
    version "1.1.1"
@@@ -3347,13 -3334,9 +3345,13 @@@ hmac-drbg@^1.0.0
      minimalistic-crypto-utils "^1.0.1"
  
  hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0:
-   version "2.5.4"
-   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.4.tgz#fc3b1ac05d2ae3abedec84eba846511b0d4fcc4f"
+   version "2.5.5"
+   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
  
 +hoist-non-react-statics@^2.5.4:
 +  version "2.5.5"
 +  resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
 +
  home-or-tmp@^2.0.0:
    version "2.0.0"
    resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
@@@ -3368,8 -3351,8 +3366,8 @@@ homedir-polyfill@^1.0.1
      parse-passwd "^1.0.0"
  
  hosted-git-info@^2.1.4:
-   version "2.6.0"
-   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
+   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"
@@@ -3395,16 -3378,16 +3393,16 @@@ html-entities@^1.2.0
    resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
  
  html-minifier@^3.2.3:
-   version "3.5.16"
-   resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175"
+   version "3.5.19"
+   resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.19.tgz#ed53c4b7326fe507bc3a1adbcc3bbb56660a2ebd"
    dependencies:
      camel-case "3.0.x"
      clean-css "4.1.x"
-     commander "2.15.x"
+     commander "2.16.x"
      he "1.1.x"
      param-case "2.1.x"
      relateurl "0.2.x"
-     uglify-js "3.3.x"
+     uglify-js "3.4.x"
  
  html-webpack-plugin@2.29.0:
    version "2.29.0"
@@@ -3679,8 -3662,8 +3677,8 @@@ is-builtin-module@^1.0.0
      builtin-modules "^1.0.0"
  
  is-callable@^1.1.1, is-callable@^1.1.3:
-   version "1.1.3"
-   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+   version "1.1.4"
+   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
  
  is-ci@^1.0.10:
    version "1.1.0"
@@@ -3833,12 -3816,6 +3831,6 @@@ is-obj@^1.0.0
    version "1.0.1"
    resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
  
- is-odd@^2.0.0:
-   version "2.0.0"
-   resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
-   dependencies:
-     is-number "^4.0.0"
  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"
@@@ -4304,13 -4281,17 +4296,17 @@@ jest@22.4.2
      jest-cli "^22.4.2"
  
  js-base64@^2.1.9:
-   version "2.4.5"
-   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92"
+   version "2.4.8"
+   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033"
  
  js-tokens@^3.0.0, js-tokens@^3.0.2:
    version "3.0.2"
    resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
  
+ "js-tokens@^3.0.0 || ^4.0.0":
+   version "4.0.0"
+   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
  js-yaml@^3.4.3, js-yaml@^3.7.0:
    version "3.12.0"
    resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
@@@ -4501,8 -4482,8 +4497,8 @@@ jss-vendor-prefixer@^7.0.0
      css-vendor "^0.3.8"
  
  jss@^9.3.3, jss@^9.7.0:
-   version "9.8.3"
-   resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.3.tgz#399da571c4b2c8f4cf418ca7e8627e44fc287fc8"
+   version "9.8.7"
+   resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.7.tgz#ed9763fc0f2f0260fc8260dac657af61e622ce05"
    dependencies:
      is-in-browser "^1.1.3"
      symbol-observable "^1.1.0"
@@@ -4620,7 -4601,7 +4616,7 @@@ locate-path@^2.0.0
      p-locate "^2.0.0"
      path-exists "^3.0.0"
  
 -lodash-es@^4.17.5, lodash-es@^4.2.1:
 +lodash-es@^4.17.10, lodash-es@^4.17.5, lodash-es@^4.2.1:
    version "4.17.10"
    resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05"
  
@@@ -4632,6 -4613,10 +4628,10 @@@ lodash.camelcase@^4.3.0
    version "4.3.0"
    resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
  
+ lodash.debounce@^4.0.8:
+   version "4.0.8"
+   resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
  lodash.defaults@^4.2.0:
    version "4.2.0"
    resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
@@@ -4694,10 -4679,10 +4694,10 @@@ longest@^1.0.1
    resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
  
  loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
-   version "1.3.1"
-   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+   version "1.4.0"
+   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
    dependencies:
-     js-tokens "^3.0.0"
+     js-tokens "^3.0.0 || ^4.0.0"
  
  loud-rejection@^1.0.0:
    version "1.6.0"
@@@ -4804,7 -4789,7 +4804,7 @@@ merge-stream@^1.0.1
    dependencies:
      readable-stream "^2.0.1"
  
- merge@^1.1.3:
+ merge@^1.2.0:
    version "1.2.0"
    resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
  
@@@ -4855,19 -4840,15 +4855,15 @@@ miller-rabin@^4.0.0
      bn.js "^4.0.0"
      brorand "^1.0.1"
  
- "mime-db@>= 1.34.0 < 2":
-   version "1.34.0"
-   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a"
- mime-db@~1.33.0:
-   version "1.33.0"
-   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+ "mime-db@>= 1.34.0 < 2", mime-db@~1.35.0:
+   version "1.35.0"
+   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47"
  
  mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18:
-   version "2.1.18"
-   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+   version "2.1.19"
+   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0"
    dependencies:
-     mime-db "~1.33.0"
+     mime-db "~1.35.0"
  
  mime@1.4.1:
    version "1.4.1"
@@@ -4887,7 -4868,7 +4883,7 @@@ min-document@^2.19.0
    dependencies:
      dom-walk "^0.1.0"
  
- minimalistic-assert@^1.0.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"
  
@@@ -4995,15 -4976,14 +4991,14 @@@ nan@^2.9.2
    resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
  
  nanomatch@^1.2.9:
-   version "1.2.9"
-   resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
+   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-odd "^2.0.0"
      is-windows "^1.0.2"
      kind-of "^6.0.2"
      object.pick "^1.3.0"
@@@ -5024,7 -5004,7 +5019,7 @@@ nearley@^2.7.10
      randexp "0.4.6"
      semver "^5.4.1"
  
- needle@^2.2.0:
+ needle@^2.2.1:
    version "2.2.1"
    resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
    dependencies:
@@@ -5103,16 -5083,16 +5098,16 @@@ node-notifier@^5.2.1
      which "^1.3.0"
  
  node-pre-gyp@^0.10.0:
-   version "0.10.0"
-   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46"
+   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.0"
+     needle "^2.2.1"
      nopt "^4.0.1"
      npm-packlist "^1.1.6"
      npmlog "^4.0.2"
-     rc "^1.1.7"
+     rc "^1.2.7"
      rimraf "^2.6.1"
      semver "^5.3.0"
      tar "^4"
@@@ -5204,8 -5184,8 +5199,8 @@@ number-is-nan@^1.0.0
    resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
  
  nwsapi@^2.0.0:
-   version "2.0.3"
-   resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959"
+   version "2.0.6"
+   resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.6.tgz#5fb7f5b828b97fe1de47eb2a6f8703036b6cb71a"
  
  oauth-sign@~0.8.2:
    version "0.8.2"
@@@ -5232,8 -5212,8 +5227,8 @@@ object-is@^1.0.1
    resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6"
  
  object-keys@^1.0.11, object-keys@^1.0.8:
-   version "1.0.11"
-   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+   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"
@@@ -5581,7 -5561,7 +5576,7 @@@ pn@^1.1.0
    version "1.1.0"
    resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
  
- popper.js@^1.14.1:
+ popper.js@^1.0.0:
    version "1.14.3"
    resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095"
  
@@@ -5873,8 -5853,8 +5868,8 @@@ postcss@^5.0.10, postcss@^5.0.11, postc
      supports-color "^3.2.3"
  
  postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13:
-   version "6.0.22"
-   resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3"
+   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"
@@@ -5942,11 -5922,10 +5937,10 @@@ promise@^7.1.1
    dependencies:
      asap "~2.0.3"
  
- prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1:
-   version "15.6.1"
-   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
+ prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2:
+   version "15.6.2"
+   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
    dependencies:
-     fbjs "^0.8.16"
      loose-envify "^1.3.1"
      object-assign "^4.1.1"
  
@@@ -6094,7 -6073,7 +6088,7 @@@ raw-body@2.3.2
      iconv-lite "0.4.19"
      unpipe "1.0.0"
  
- rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
+ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
    version "1.2.8"
    resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
    dependencies:
@@@ -6152,8 -6131,8 +6146,8 @@@ react-is@^16.4.1
    resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e"
  
  react-jss@^8.1.0:
-   version "8.5.1"
-   resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-8.5.1.tgz#f97c72f6a1c86aa6408932a2a2836ce40c0ab9fc"
+   version "8.6.1"
+   resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-8.6.1.tgz#a06e2e1d2c4d91b4d11befda865e6c07fbd75252"
    dependencies:
      hoist-non-react-statics "^2.5.0"
      jss "^9.7.0"
@@@ -6165,13 -6144,6 +6159,6 @@@ react-lifecycles-compat@^3.0.2, react-l
    version "3.0.4"
    resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
  
- react-popper@^0.10.0:
-   version "0.10.4"
-   resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-0.10.4.tgz#af2a415ea22291edd504678d7afda8a6ee3295aa"
-   dependencies:
-     popper.js "^1.14.1"
-     prop-types "^15.6.1"
  react-reconciler@^0.7.0:
    version "0.7.0"
    resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d"
@@@ -6277,12 -6249,13 +6264,13 @@@ react-test-renderer@^16.0.0-0
      react-is "^16.4.1"
  
  react-transition-group@^2.2.1:
-   version "2.3.1"
-   resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.3.1.tgz#31d611b33e143a5e0f2d94c348e026a0f3b474b6"
+   version "2.4.0"
+   resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.4.0.tgz#1d9391fabfd82e016f26fabd1eec329dbd922b5a"
    dependencies:
      dom-helpers "^3.3.1"
      loose-envify "^1.3.1"
-     prop-types "^15.6.1"
+     prop-types "^15.6.2"
+     react-lifecycles-compat "^3.0.4"
  
  react@16.4.1:
    version "16.4.1"
@@@ -6354,12 -6327,12 +6342,12 @@@ readdirp@^2.0.0
      set-immediate-shim "^1.0.1"
  
  realpath-native@^1.0.0:
-   version "1.0.0"
-   resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0"
+   version "1.0.1"
+   resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633"
    dependencies:
      util.promisify "^1.0.0"
  
- "recompose@^0.26.0 || ^0.27.0":
+ "recompose@^0.26.0 || ^0.27.0", recompose@^0.27.0:
    version "0.27.1"
    resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.27.1.tgz#1a49e931f183634516633bbb4f4edbfd3f38a7ba"
    dependencies:
@@@ -6398,8 -6371,8 +6386,8 @@@ reduce-function-call@^1.0.1
      balanced-match "^0.4.2"
  
  redux-devtools-instrument@^1.0.1:
-   version "1.8.3"
-   resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.8.3.tgz#c510d67ab4e5e4525acd6e410c25ab46b85aca7c"
+   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"
@@@ -6412,24 -6385,11 +6400,24 @@@ redux-devtools@3.4.1
      prop-types "^15.5.7"
      redux-devtools-instrument "^1.0.1"
  
 +redux-form@^7.4.2:
 +  version "7.4.2"
 +  resolved "https://registry.yarnpkg.com/redux-form/-/redux-form-7.4.2.tgz#d6061088fb682eb9fc5fb9749bd8b102f03154b0"
 +  dependencies:
 +    es6-error "^4.1.1"
 +    hoist-non-react-statics "^2.5.4"
 +    invariant "^2.2.4"
 +    is-promise "^2.1.0"
 +    lodash "^4.17.10"
 +    lodash-es "^4.17.10"
 +    prop-types "^15.6.1"
 +    react-lifecycles-compat "^3.0.4"
 +
  redux-thunk@2.3.0:
    version "2.3.0"
    resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
  
 -redux@4.0.0, "redux@>= 3.7.2", redux@^4.0.0:
 +redux@4.0.0, "redux@>= 3.7.2", "redux@^3.6.0 || ^4.0.0", redux@^4.0.0:
    version "4.0.0"
    resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03"
    dependencies:
@@@ -6449,10 -6409,14 +6437,14 @@@ regenerate@^1.2.1
    version "1.4.0"
    resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
  
- regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1:
+ regenerator-runtime@^0.11.0:
    version "0.11.1"
    resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
  
+ regenerator-runtime@^0.12.0:
+   version "0.12.0"
+   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.0.tgz#8052ac952d85b10f3425192cd0c53f45cf65c6cb"
  regenerator-transform@^0.10.0:
    version "0.10.1"
    resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
@@@ -6636,8 -6600,8 +6628,8 @@@ resolve@1.6.0
      path-parse "^1.0.5"
  
  resolve@^1.1.7, resolve@^1.3.2:
-   version "1.8.0"
-   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e"
+   version "1.8.1"
+   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
    dependencies:
      path-parse "^1.0.5"
  
@@@ -6708,7 -6672,7 +6700,7 @@@ safe-buffer@5.1.1
    version "5.1.1"
    resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
  
- 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:
+ 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"
  
@@@ -7418,8 -7382,8 +7410,8 @@@ toposort@^1.0.0
    resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
  
  tough-cookie@>=2.3.3, tough-cookie@^2.3.3:
-   version "2.4.2"
-   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c"
+   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"
@@@ -7476,8 -7440,8 +7468,8 @@@ tsconfig-paths-webpack-plugin@^2.0.0
      tsconfig-paths "^3.1.1"
  
  tsconfig-paths@^3.1.1:
-   version "3.4.0"
-   resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.4.0.tgz#d19fe80c5b245f99d17363471971eab54e65a8a7"
+   version "3.4.2"
+   resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.4.2.tgz#4640bffaeee3fc0ab986607edae203859156a8c3"
    dependencies:
      deepmerge "^2.0.1"
      minimist "^1.2.0"
      strip-json-comments "^2.0.1"
  
  tslib@^1.8.0, tslib@^1.8.1:
-   version "1.9.2"
-   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e"
+   version "1.9.3"
+   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
  
  tslint-config-prettier@^1.10.0:
    version "1.13.0"
@@@ -7499,8 -7463,8 +7491,8 @@@ tslint-react@^3.2.0
      tsutils "^2.13.1"
  
  tslint@^5.7.0:
-   version "5.10.0"
-   resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3"
+   version "5.11.0"
+   resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed"
    dependencies:
      babel-code-frame "^6.22.0"
      builtin-modules "^1.1.1"
      resolve "^1.3.2"
      semver "^5.3.0"
      tslib "^1.8.0"
-     tsutils "^2.12.1"
+     tsutils "^2.27.2"
  
- tsutils@^2.12.1, tsutils@^2.13.1:
-   version "2.27.1"
-   resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.1.tgz#ab0276ac23664f36ce8fd4414daec4aebf4373ee"
+ tsutils@^2.13.1, tsutils@^2.27.2:
+   version "2.28.0"
+   resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1"
    dependencies:
      tslib "^1.8.1"
  
@@@ -7567,11 -7531,11 +7559,11 @@@ uglify-es@^3.3.4
      commander "~2.13.0"
      source-map "~0.6.1"
  
- uglify-js@3.3.x:
-   version "3.3.28"
-   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06"
+ uglify-js@3.4.x, uglify-js@^3.0.13:
+   version "3.4.5"
+   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.5.tgz#650889c0766cf0f6fd5346cea09cd212f544be69"
    dependencies:
-     commander "~2.15.0"
+     commander "~2.16.0"
      source-map "~0.6.1"
  
  uglify-js@^2.6, uglify-js@^2.8.29:
    optionalDependencies:
      uglify-to-browserify "~1.0.0"
  
- uglify-js@^3.0.13:
-   version "3.4.0"
-   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d"
-   dependencies:
-     commander "~2.15.0"
-     source-map "~0.6.1"
  uglify-to-browserify@~1.0.0:
    version "1.0.2"
    resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
@@@ -7603,8 -7560,8 +7588,8 @@@ uglifyjs-webpack-plugin@^0.4.6
      webpack-sources "^1.0.1"
  
  uglifyjs-webpack-plugin@^1.1.8:
-   version "1.2.5"
-   resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641"
+   version "1.2.7"
+   resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00"
    dependencies:
      cacache "^10.0.4"
      find-cache-dir "^1.0.0"
@@@ -7659,8 -7616,8 +7644,8 @@@ unique-string@^1.0.0
      crypto-random-string "^1.0.0"
  
  universalify@^0.1.0:
-   version "0.1.1"
-   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
+   version "0.1.2"
+   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
  
  unpipe@1.0.0, unpipe@~1.0.0:
    version "1.0.0"
@@@ -7677,7 -7634,7 +7662,7 @@@ unzip-response@^2.0.1
    version "2.0.1"
    resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
  
- upath@^1.0.0:
+ upath@^1.0.5:
    version "1.1.0"
    resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
  
@@@ -7743,10 -7700,8 +7728,8 @@@ url@^0.11.0
      querystring "0.2.0"
  
  use@^3.1.0:
-   version "3.1.0"
-   resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
-   dependencies:
-     kind-of "^6.0.2"
+   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"
@@@ -7788,8 -7743,8 +7771,8 @@@ uuid@^2.0.2
    resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
  
  uuid@^3.1.0:
-   version "3.2.1"
-   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+   version "3.3.2"
+   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
  
  validate-npm-package-license@^3.0.1:
    version "3.0.3"